From e02fa5bedb087519dabee9690c13f1b7f8be0787 Mon Sep 17 00:00:00 2001
From: licp <lichunping@guanfang.com.cn>
Date: 星期一, 01 四月 2024 15:31:44 +0800
Subject: [PATCH] 完成交接复核功能

---
 src/components/view/enums.vue                          |    6 +
 src/components/do/b1-ins-order/add.vue                 |    4 
 src/components/tool/value-table.vue                    |   43 ++++++++
 src/main.js                                            |    2 
 src/components/do/b1-inspect-order-plan/Inspection.vue |   95 ++++++++++++++++--
 src/components/view/b1-inspect-order-plan.vue          |  128 +++++++++++++++++++++++-
 src/assets/api/controller.js                           |    2 
 7 files changed, 255 insertions(+), 25 deletions(-)

diff --git a/src/assets/api/controller.js b/src/assets/api/controller.js
index f97a408..e605ddb 100644
--- a/src/assets/api/controller.js
+++ b/src/assets/api/controller.js
@@ -137,6 +137,8 @@
   claimInsOrderPlan: "/insOrderPlan/claimInsOrderPlan",//璁ら妫�楠屼换鍔�
 	doInsOrder: "/insOrderPlan/doInsOrder",//鎵ц妫�楠屾搷浣�
 	saveInsContext: "/insOrderPlan/saveInsContext",//淇濆瓨妫�楠屽唴瀹�
+  upPlanUser: "/insOrderPlan/upPlanUser",//浠诲姟浜ゆ帴
+  verifyPlan: "/insOrderPlan/verifyPlan",//澶嶆牳妫�楠屼换鍔�
 }
 
 const systemLog = {
diff --git a/src/components/do/b1-ins-order/add.vue b/src/components/do/b1-ins-order/add.vue
index 201c3e4..3b58669 100644
--- a/src/components/do/b1-ins-order/add.vue
+++ b/src/components/do/b1-ins-order/add.vue
@@ -107,6 +107,7 @@
 						<span style="color: #3A7BFA;">淇濆瓨妯℃澘</span>
 					</el-button>
 					<el-button size="medium" type="primary" @click="save" :loading="saveLoad" v-show="active==1">鎻愪氦</el-button>
+          <!-- 瀹℃牳 -->
 					<el-button size="medium" @click="upInsOrderOfState(2)" :loading="saveLoad" v-show="active==3">涓嶉�氳繃</el-button>
 					<el-button size="medium" type="primary" @click="upInsOrderOfState(1)" :loading="saveLoad"
 						v-show="active==3">閫氳繃</el-button>
@@ -458,6 +459,7 @@
 				</el-row>
 			</span>
 		</el-dialog>
+
 	</div>
 </template>
 
@@ -1123,7 +1125,7 @@
         this.$nextTick(()=>{
           this.$refs.productTable.doLayout()
         })
-      }
+      },
 		}
 	}
 </script>
diff --git a/src/components/do/b1-inspect-order-plan/Inspection.vue b/src/components/do/b1-inspect-order-plan/Inspection.vue
index 87ce163..7b70bdc 100644
--- a/src/components/do/b1-inspect-order-plan/Inspection.vue
+++ b/src/components/do/b1-inspect-order-plan/Inspection.vue
@@ -18,24 +18,21 @@
 
 	.center {
 		width: calc(100% - 40px);
-		height: calc(100% - 60px - 80px - 40px);
+		max-height: 580px;
 		background-color: #fff;
 		border-radius: 3px;
 		padding: 20px;
-		position: relative;
+    overflow-y: auto;
 	}
 
 	.center-box {
-		height: 100%;
 		display: flex;
 		align-items: center;
 		justify-content: center;
 		flex-wrap: wrap;
-		overflow-y: auto;
 	}
 
 	.tables {
-		/* width: 800px; */
 		margin-bottom: 16px;
 	}
 
@@ -127,6 +124,10 @@
 			<el-col :span="12" style="text-align: right;">
 				<el-button size="small" type="primary" @click="sampleVisible=true">鏍峰搧鍒囨崲</el-button>
 				<el-button size="small" type="primary" @click="taskVisible=true">浠诲姟鍒囨崲</el-button>
+        <!-- 澶嶆牳 -->
+        <el-button size="medium" type="primary" @click="upInsReview(1)" :loading="reviewLoading"
+						v-show="state>1">閫氳繃</el-button>
+          <el-button size="medium" @click="upInsReview(0)" v-show="state>1">涓嶉�氳繃</el-button>
 				<el-button size="small" @click="$emit('goback')">杩斿洖</el-button>
 			</el-col>
 		</el-row>
@@ -169,11 +170,11 @@
 								<div class="content" :class="`content-h-${n.v.ht} content-v-${n.v.vt}`">
 									<template v-if="n.v.ps!=undefined && n.v.ps.value==='妫�楠屽��'">
 										<el-input v-if="getInspectionValueType(n.i) == 1" class="table_input" v-model="n.v.v"
-											:disabled="getInspectionItemType(n.i) == 1 || (n.u != userId && n.u != undefined && n.u != '')"
+											:disabled="getInspectionItemType(n.i) == 1 || (n.u != userId && n.u != undefined && n.u != '')||state>1"
 											@change="m=>changeInput(m,`${item.templateId}-${n.r}-${n.c}-${n.i}`)" />
 										<el-input v-else-if="getInspectionValueType(n.i) == 2" class="table_input" type="textarea"
-											:autosize="{ minRows: 1}" v-model="n.v.v" />
-										<el-select v-else-if="getInspectionValueType(n.i) == 5" class="table_input" v-model="n.v.v">
+											:autosize="{ minRows: 1}" v-model="n.v.v" :disabled="state>1" />
+										<el-select v-else-if="getInspectionValueType(n.i) == 5" class="table_input" v-model="n.v.v" :disabled="state>1">
 											<el-option label="鏄�" value="鏄�"></el-option>
 											<el-option label="鍚�" value="鍚�"></el-option>
 										</el-select>
@@ -181,7 +182,7 @@
 											v-else-if="getInspectionValueType(n.i) == 4">/</span>
 										<el-button type="primary" icon="el-icon-edit" size="mini" circle
 											v-if="getInspectionItemType(n.i) == 1" style="border: 0;margin-left: 2px;"
-											@click="getSystemValue(n)" :disabled="n.u != userId && n.u != undefined && n.u != ''">
+											@click="getSystemValue(n)" :disabled="(n.u != userId && n.u != undefined && n.u != '')||state>1">
 										</el-button>
 									</template>
 									<template v-else-if="n.v.ps!=undefined && n.v.ps.value==='缁撹'">
@@ -190,7 +191,7 @@
 										<span v-else :style="`font-family:${n.v.ff} !important;`">寰呭畾</span>
 									</template>
                   <template v-else-if="n.v.ps!=undefined && n.v.ps.value==='璁惧'">
-										<el-select v-model="n.v.v" placeholder="璇烽�夋嫨" @visible-change="e=>getEquipOptions(e,n.i)">
+										<el-select v-model="n.v.v" placeholder="璇烽�夋嫨" @visible-change="e=>getEquipOptions(e,n.i)" :disabled="state>1">
                       <el-option
                         v-for="item in equipOptions"
                         :key="item.value"
@@ -239,13 +240,25 @@
 			<ValueTable class="value-table" ref="insOrderPlan" :url="$api.insOrderPlan.selectInsOrderPlanList"
 				:componentData="componentData" :key="upIndex" />
 		</el-drawer>
+    <el-dialog title="妫�楠屽鏍�" :visible.sync="reviewDia" width="400px">
+			<div class="body" style="display: flex;align-items: center;" v-if="reviewDia">
+				<div class="search_label" style="width: 120px;"><span class="required-span">* </span>涓嶉�氳繃鍘熷洜锛�</div>
+				<div class="search_input">
+					<el-input size="small" clearable v-model="noReason" type="textarea" :autosize="{ minRows: 3, maxRows: 5}"></el-input>
+				</div>
+			</div>
+			<span slot="footer" class="dialog-footer">
+				<el-button @click="reviewDia = false">鍙� 娑�</el-button>
+				<el-button type="primary" @click="handleReviewDia" :loading="reviewLoading">纭� 瀹�</el-button>
+			</span>
+		</el-dialog>
 	</div>
 </template>
 
 <script>
 	import ValueTable from '../../tool/value-table.vue'
 	export default {
-		props: ['sonLaboratory', 'orderId'],
+		props: ['sonLaboratory', 'orderId','state'],
 		components: {
 			ValueTable,
 		},
@@ -298,7 +311,10 @@
 				comparisonList: [],
 				excelMethodList: [],
         equipOptions:[],
-				userId: 0
+				userId: 0,
+        reviewLoading:false,
+        reviewDia:false,
+        noReason:''
 			}
 		},
 		created() {
@@ -794,6 +810,61 @@
 					this.userId = res.data.id
 				})
 			},
+      // 澶嶆牳
+      upInsReview(e){
+        if(e==1){
+          // 閫氳繃
+          this.reviewLoading = true;
+          this.$axios.post(this.$api.insOrderPlan.verifyPlan, {
+            orderId:this.orderId,
+            type:1,
+            laboratory:this.sonLaboratory,
+            tell:null
+          }, {
+					headers: {
+						'Content-Type': 'application/json'
+					}
+          }).then(res => {
+            if (res.code === 200 && res.data) {
+              this.reviewLoading = false;
+              this.$message.success("澶嶆牳閫氳繃")
+              this.$emit('goback')
+            }
+          }).catch(error => {
+            console.error(error)
+            this.reviewLoading = false;
+          })
+        }else{
+          // 涓嶉�氳繃
+          this.reviewDia = true;
+        }
+      },
+      handleReviewDia(){
+        if(this.noReason){
+          this.reviewLoading = true;
+          this.$axios.post(this.$api.insOrderPlan.verifyPlan, {
+            orderId:this.orderId,
+            type:0,
+            laboratory:this.sonLaboratory,
+            tell:this.noReason
+          }, {
+					headers: {
+						'Content-Type': 'application/json'
+					}
+          }).then(res => {
+            if (res.code === 200 && res.data) {
+              this.reviewLoading = false;
+              this.$message.success("澶嶆牳涓嶉�氳繃")
+              this.$emit('goback')
+            }
+          }).catch(error => {
+            console.error(error)
+            this.reviewLoading = false;
+          })
+        }else{
+          this.$message.error('鏈緭鍏ヤ笉閫氳繃鍘熷洜')
+        }
+      },
   	}
 }
 </script>
diff --git a/src/components/tool/value-table.vue b/src/components/tool/value-table.vue
index fbd1c28..9efd2dd 100644
--- a/src/components/tool/value-table.vue
+++ b/src/components/tool/value-table.vue
@@ -80,7 +80,8 @@
 				@row-click="rowClick" :show-summary="data.countFleid!=undefined && data.countFleid.length > 0"
 				:summary-method="getSummaries" :row-class-name="tableRowClassName"
         :row-key="record=>record.id" :current-row-key="data.currentId"
-        highlight-current-row>
+        highlight-current-row
+        :span-method="spanMethod">
 				<el-table-column type="selection" width="65" v-if="data.showSelect" :key="Math.random()">
 				</el-table-column>
 				<el-table-column type="index" align="center" label="搴忓彿" width="70" v-if="data.isIndex" :key="Math.random()">
@@ -346,7 +347,9 @@
 				uploadDia: false,
 				token: null,
 				fileList: [],
-				init: true
+				init: true,
+        testArr: [],
+        testPosition: 0,
 			}
 		},
 		watch: {
@@ -370,6 +373,37 @@
 			}
 		},
 		methods: {
+      rowspan(spanArr, position, spanName) {
+        this.tableData.forEach((item, index) => {
+          if (index === 0) {
+            spanArr.push(1);
+            position = 0;
+          } else {
+            if (
+              this.tableData[index][spanName] ===
+              this.tableData[index - 1][spanName]
+            ) {
+              spanArr[position] += 1;
+              spanArr.push(0);
+            } else {
+              spanArr.push(1);
+              position = index;
+            }
+          }
+        });
+      },
+      spanMethod({ row, column, rowIndex, columnIndex }){
+        if(this.data.spanConfig!=undefined&&this.data.spanConfig.rows){
+          if (columnIndex === this.data.spanConfig.rows.index) {
+            const _row = this.testArr[rowIndex];
+            const _col = _row > 0 ? 1 : 0;
+            return {
+              rowspan: _row,
+              colspan: _col,
+            };
+          }
+        }
+      },
 			selectChange(val) {
 				if (this.data.select) {
 					this.multipleSelection = val;
@@ -438,6 +472,11 @@
 							})
 						}
 					}
+          if(this.data.spanConfig!=undefined&&this.data.spanConfig.rows){
+            this.testArr = []
+            this.testPosition = 0
+            this.rowspan(this.testArr, this.testPosition, this.data.spanConfig.rows.name);
+          }
 					this.loading = false
 				}).catch(e => {
 					this.loading = false
diff --git a/src/components/view/b1-inspect-order-plan.vue b/src/components/view/b1-inspect-order-plan.vue
index 2b397b2..f344c46 100644
--- a/src/components/view/b1-inspect-order-plan.vue
+++ b/src/components/view/b1-inspect-order-plan.vue
@@ -72,7 +72,7 @@
 		border-radius: 8px 0 0 8px;
 	}
 
-	.tab li:nth-child(3) {
+	.tab li:nth-last-child(1) {
 		border-radius: 0 8px 8px 0;
 	}
 
@@ -158,13 +158,32 @@
 			鏄惁璁ら濮旀墭缂栧彿<span style="color:#33C130">{{sampleUserForm.entrustCode}}</span>鐨勪换鍔�
 			<span slot="footer" class="dialog-footer">
 				<el-button @click="claimVisible = false">鍙� 娑�</el-button>
-				<el-button type="primary" @click="confirmClaim">纭� 瀹�</el-button>
+				<el-button type="primary" @click="confirmClaim" :loading="loading">纭� 瀹�</el-button>
+			</span>
+		</el-dialog>
+    <el-dialog title="妫�楠屼氦鎺�" :visible.sync="connectVisible" width="400px">
+			<div class="search_thing">
+        <div class="search_label" style="width:90px">浜ゆ帴浜哄憳锛�</div>
+        <div class="search_input">
+          <el-select v-model="connectPerson" placeholder="璇烽�夋嫨" style="width: 100%;">
+            <el-option
+              v-for="item in personList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </div>
+      </div>
+			<span slot="footer" class="dialog-footer">
+				<el-button @click="connectVisible = false">鍙� 娑�</el-button>
+				<el-button type="primary" @click="confirmConnect" :loading="loading">纭� 瀹�</el-button>
 			</span>
 		</el-dialog>
 		<div style="width: 100%;height: 100%;" v-if="activeFace >0">
 			<Add :active="activeFace" :currentId="currentId"/>
 		</div>
-    <Inspection v-if="state==1" @goback="goback" :orderId="orderId" :sonLaboratory="componentData.entity.sonLaboratory"/>
+    <Inspection v-if="state>0" @goback="goback" :orderId="orderId" :sonLaboratory="componentData.entity.sonLaboratory" :state="state"/>
 	</div>
 </template>
 
@@ -175,7 +194,6 @@
 		getYearAndMonthAndDays
 	} from '../../util/date'
 	import Add from '../do/b1-ins-order/add.vue'
-import { number } from 'echarts'
 	export default {
 		components: {
 			ValueTable,
@@ -217,13 +235,13 @@
 							id: '',
 							font: '浜ゆ帴',
 							type: 'text',
-							method: ''
+							method: 'handleConnect'
 						},
 						{
 							id: '',
 							font: '澶嶆牳',
 							type: 'text',
-							method: ''
+							method: 'handleReview',
 						}, {
 							id: '',
 							font: '璁ら',
@@ -262,6 +280,10 @@
 							}]
 						}
 					},
+          spanConfig:{
+            rows:'entrustCode',//鍚堝苟琛�,閫氬父娑夊強涓�涓瓧娈�
+            cols:[],//鍚堝苟鍒�,閫氬父娑夊強鍑犱釜瀛楁
+          },
 					selectField: {},
 					requiredAdd: [],
 					requiredUp: []
@@ -269,22 +291,62 @@
 				upIndex: 0,
 				planTotal: 0,
 				insStateList: [],
-        state:0,//0:鍙拌处椤碉紝1锛氭楠岄〉闈紝榛樿涓�0
-				activeFace: 0, //1锛氫笅鍗曪紝2锛氭煡鐪嬶紝3锛氬鏍�
+        state:0,//0:鍙拌处椤碉紝1锛氭楠岄〉闈�,2妫�楠岄〉闈�(澶嶆牳)锛岄粯璁や负0
+				activeFace: 0, //1锛氫笅鍗曪紝2锛氭煡鐪嬶紝3锛氬鏍革紝榛樿涓�0
 				currentId: null,
 				entityCopy: {},
 				orderId: 0,
+        personList:[],
+        connectVisible:false,
+        connectPerson:'',
+        loading:false,
 			}
 		},
 		created() {
 			this.getLaboratoryDicts()
 			this.getTypeDicts()
 			this.getInsStateDicts()
+      this.getAuthorizedPerson()
 		},
 		mounted() {
 			this.entityCopy = this.HaveJson(this.componentData.entity)
+      this.getPower()
 		},
 		methods: {
+      // 鏉冮檺鍒嗛厤
+			getPower(radio) {
+				let power = JSON.parse(sessionStorage.getItem('power'))
+				let inspection = false
+				let connect = false
+				let review = false
+        let claim = false
+				for (var i = 0; i < power.length; i++) {
+					if (power[i].menuMethod == 'doInsOrder') {
+						inspection = true
+					}
+					if (power[i].menuMethod == 'upPlanUser') {
+						connect = true
+					}
+					if (power[i].menuMethod == 'verifyPlan') {
+						review = true
+					}
+          if (power[i].menuMethod == 'claimInsOrderPlan') {
+						claim = true
+					}
+				}
+				if (!claim) {
+					this.componentData.do.splice(3, 1)
+				}
+				if (!review) {
+					this.componentData.do.splice(2, 1)
+				}
+        if (!connect) {
+					this.componentData.do.splice(1, 1)
+				}
+				if (!inspection) {
+					this.componentData.do.splice(0, 1)
+				}
+			},
 			changeCheckBox(val) {
 				this.componentData.entity.userId = val?0:null
 				this.refreshTable()
@@ -307,18 +369,21 @@
 				}
 			},
 			confirmClaim() {
+        this.loading = true;
 				this.$axios.post(this.$api.insOrderPlan.claimInsOrderPlan, this.sampleUserForm, {
 					headers: {
 						'Content-Type': 'application/json'
 					}
 				}).then(res => {
 					if (res.code === 200 && res.data) {
+            this.loading = false;
 						this.$message.success("璁ら鎴愬姛")
 						this.claimVisible = false
 						this.refreshTable()
 					}
 				}).catch(error => {
 					console.error(error)
+          this.loading = false;
 				})
 			},
 			refreshTable() {
@@ -423,7 +488,52 @@
       handleInspection(row){
         this.state = 1;
 				this.orderId = row.id
-      }
+      },
+      handleConnect(row){
+        this.orderId = row.id
+        this.connectVisible=true;
+      },
+      confirmConnect(){
+        if(this.connectPerson){
+          this.loading = true;
+          this.$axios.post(this.$api.insOrderPlan.upPlanUser, {
+            orderId:this.orderId,
+            userId:this.connectPerson
+          }, {
+					headers: {
+						'Content-Type': 'application/json'
+					}
+				}).then(res => {
+					if (res.code === 200 && res.data) {
+            this.loading = false;
+						this.$message.success("浜ゆ帴鎴愬姛")
+						this.connectVisible = false
+						this.refreshTable()
+					}
+				}).catch(error => {
+					console.error(error)
+          this.loading = false;
+				})
+        }else{
+          this.$message.error('鏈�夋嫨浜ゆ帴浜哄憳')
+        }
+      },
+      handleReview(row){
+        this.state = 2;
+				this.orderId = row.id
+      },
+      getAuthorizedPerson() {
+				this.$axios.get(this.$api.user.getUserMenu).then(res => {
+					let data = []
+					res.data.forEach(a => {
+						data.push({
+							label: a.name,
+							value: a.id
+						})
+					})
+					this.personList = data
+				})
+			},
 		}
 	}
 </script>
diff --git a/src/components/view/enums.vue b/src/components/view/enums.vue
index b00c5a2..2084cb7 100644
--- a/src/components/view/enums.vue
+++ b/src/components/view/enums.vue
@@ -102,6 +102,12 @@
 					}],
 					tagField: {},
 					selectField: {},
+          spanConfig:{
+            rows:{
+              name:'category',
+              index:1
+            },//鍚堝苟琛�,閫氬父娑夊強涓�涓瓧娈�
+          },
 					requiredAdd:['category','label','value'],
 					requiredUp:['category','label','value']
 				},
diff --git a/src/main.js b/src/main.js
index 018e938..def9d78 100644
--- a/src/main.js
+++ b/src/main.js
@@ -13,7 +13,7 @@
 
 //鏈湴
 Vue.prototype.LOCATIONVUE = "http://127.0.0.1:80";
-const javaApi = 'http://192.168.0.24:8001';//鏉�
+const javaApi = 'http://192.168.0.10:8001';//鏉�
 // const javaApi = 'http://114.132.189.42:9006';//娴嬭瘯鏈�
 //鑳滀簯鏈嶅姟鍣�
 // Vue.prototype.LOCATIONVUE = "http://syxt.shxiao2.cn";

--
Gitblit v1.9.3