From cb57bc6b4abf45dbb0605c94359c63e3b31b4b87 Mon Sep 17 00:00:00 2001 From: licp <lichunping@guanfang.com.cn> Date: 星期二, 10 九月 2024 15:55:57 +0800 Subject: [PATCH] 优化报告生成、修改电路下单传参 --- src/components/view/b1-inspect-order-plan.vue | 501 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 472 insertions(+), 29 deletions(-) diff --git a/src/components/view/b1-inspect-order-plan.vue b/src/components/view/b1-inspect-order-plan.vue index 4cba208..ba7325f 100644 --- a/src/components/view/b1-inspect-order-plan.vue +++ b/src/components/view/b1-inspect-order-plan.vue @@ -1,5 +1,5 @@ <style scoped> - ins-order-plan-main .title { + .ins-order-plan-main .title { font-size: 20px; color: #3A7BFA } @@ -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; } @@ -97,16 +97,25 @@ .view-self-checkbox { margin-left: 50px; } + .draggable-row { + cursor: move; + position: relative; + } </style> <style> .ins-order-plan-main .el-form-item__label{ color: #000; } + + .ins-order-plan-main .el-table th.el-table__cell>.cell{ + height: 46px; + line-height: 30px; + } </style> <template> <div class="ins-order-plan-main"> <div v-show="activeFace == 0&&state==0" style="height: 100%;"> - <p style="font-size: 16px;padding:19.5px 0px">妫�楠屼换鍔�</p> + <p style="font-size: 16px;padding-left: 20px;text-align: left;height: 60px;line-height: 60px;">妫�楠屼换鍔�</p> <div class="search"> <div class="search_thing"> <div class="search_label">濮旀墭缂栧彿锛�</div> @@ -132,7 +141,7 @@ <el-col :span="21"> <div style="display: flex;align-items: center;margin-bottom: 10px;"> <ul class="tab"> - <li v-for="(m,i) in tabList" :key="i" :class="{active:i==tabIndex}" @click="handleTab(m,i)">{{m.label}} + <li v-for="(m,i) in tabList" :key="i" :class="{active:i==tabIndex}" @click="handleTab(m,i)">{{m.label.replace('璇曢獙瀹�','')}} </li> </ul> <div> @@ -144,38 +153,169 @@ <el-col :span="3"> <div class="center-title"> <span>鎬昏浠诲姟鏁伴噺:</span> - <span v-if="$refs.insOrderPlan != undefined">{{$refs.insOrderPlan.total}}</span> + <span>{{total}}</span> </div> </el-col> </el-row> </div> - <ValueTable :tableRowClassName="changeRowClass" class="value-table" ref="insOrderPlan" + <!-- <ValueTable :tableRowClassName="changeRowClass" class="value-table" ref="insOrderPlan" + :isColumnWidth="true" :url="$api.insOrderPlan.selectInsOrderPlanList" :upUrl="$api.user.updateUser" :componentData="componentData" @handleInspection="handleInspection" - :key="upIndex"/> + :key="upIndex"/> --> + <el-table + :data="tableData" + ref="table0" + border + style="width: 100%;" + height="calc(100% - 80px)" + :row-class-name="rowClassName" + v-loading="tableLoading" + row-key="orderStateId" + > + <el-table-column + prop="entrustCode" + label="濮旀墭缂栧彿" + width="140px" + > + <template slot-scope="scope"> + <el-button @click="selectAllByOne(scope.row)" type="text" size="small">{{ scope.row.entrustCode }}</el-button> + </template> + </el-table-column> + <el-table-column + prop="sample" + label="鏍峰搧鍚嶇О" + width="100px" + ></el-table-column> + <el-table-column + prop="type" + label="绱ф�ョ▼搴�" + width="100px" + > + <template slot-scope="scope"> + <el-tag :type="typeList.find(m=>m.value==scope.row.type).type" size="small">{{ typeList.find(m=>m.value==scope.row.type).label }}</el-tag> + </template> + </el-table-column> + <el-table-column + prop="insState" + label="鐘舵��" + width="100px" + > + <template slot-scope="scope"> + <el-tag :type="insStateList.find(m=>m.value==scope.row.insState).type" size="small">{{ insStateList.find(m=>m.value==scope.row.insState).label }}</el-tag> + </template></el-table-column> + <el-table-column + prop="userName" + label="妫�楠屼汉" + width="140px" + ></el-table-column> + <el-table-column + prop="checkName" + label="澶嶆牳浜�" + width="100px" + ></el-table-column> + <el-table-column + prop="appointed" + label="绾﹀畾鏃堕棿" + width="120px" + ></el-table-column> + <el-table-column + prop="sendTime" + label="涓嬪彂鏃堕棿" + width="160px" + ></el-table-column> + <el-table-column + prop="insTime" + label="妫�楠屽紑濮嬫椂闂�" + width="160px" + ></el-table-column> + <el-table-column + prop="verifyTell" + label="鐞嗙敱" + width="150px" + ></el-table-column> + <el-table-column + fixed="right" + align="center" label="鎿嶄綔" + width="250px" + > + <template slot-scope="scope"> + <el-button @click="handleDataLook(scope.row)" type="text" size="small">鏁版嵁鏌ョ湅</el-button> + <el-button @click="handleInspection(scope.row)" type="text" size="small" :disabled="scope.row.userName == null || scope.row.insState == 3 || scope.row.insState == 5||scope.row.insState == 6||(scope.row.userName&&!scope.row.userName.includes(userName))">妫�楠�</el-button> + <el-button @click="handleConnect(scope.row)" type="text" size="small" :disabled="scope.row.userName == null || scope.row.insState == 5 || scope.row.insState == 3||scope.row.insState == 6||(scope.row.userName&&!scope.row.userName.includes(userName))">浜ゆ帴</el-button> + <el-button @click="handleReview(scope.row)" type="text" size="small" :disabled="scope.row.userName == null || scope.row.insState != 3 ||(scope.row.checkName&&!scope.row.checkName.includes(userName))">澶嶆牳</el-button> + <el-button @click="claimFun(scope.row)" type="text" size="small" :disabled="scope.row.userName != null || scope.row.checkName!=null">璁ら</el-button> + </template> + </el-table-column> + </el-table> + <div style="display: flex;justify-content: flex-end;width: 100%;margin-top: 10px;"> + <span></span> + <el-pagination @size-change="refreshTable" @current-change="refreshTable" :current-page="page.current" + :page-sizes="[10, 20, 30, 50, 100]" :page-size="page.size" layout="total, sizes, prev, pager, next, jumper" + :total="total"> + </el-pagination> + </div> </div> </div> <el-dialog title="鎻愮ず" :visible.sync="claimVisible" width="400px"> 鏄惁璁ら濮旀墭缂栧彿<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"><span class="required-span">* </span>浜ゆ帴浜哄憳锛�</div> + <div class="search_input"> + <el-select v-model="connect.connectPerson" placeholder="璇烽�夋嫨" style="width: 100%;" filterable> + <el-option + v-for="item in personList" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </div> + </div> + <!-- <div class="search_thing"> + <div class="search_label" style="width:90px"><span class="required-span">* </span>璇曢獙瀹わ細</div> + <div class="search_input"> + <el-select v-model="connect.sonLaboratory" placeholder="璇烽�夋嫨" style="width: 100%;" filterable> + <el-option + v-for="item in sonLaboratoryList" + :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"/> + <Add :active="activeFace" :currentId="currentId" :examine="examine"/> </div> - <Inspection v-if="state==1" @goback="state=0" :orderId="orderId"/> - </div> + <Inspection v-if="state>0" @goback="goback" :orderId="orderId" :inspectorList="inspectorList" :sonLaboratory="componentData.entity.sonLaboratory" :state="state" :orderStateId="orderStateId" :version="version"/> + <el-dialog title="鏁版嵁鏌ョ湅" :visible.sync="dataDialogVisible" width="80%"> + <div style="height: 70vh;overflow-y: auto;" v-if="dataDialogVisible"> + <ValueTable ref="ValueTableDataLook" :rowKey="'insProductId'" :url="$api.insOrder.selectSampleAndProductByOrderId" + :componentData="componentDataDataLook"/> + </div> + </el-dialog> + </div> </template> <script> import ValueTable from '../tool/value-table.vue' - import Inspection from '../do/b1-inspect-order-plan/Inspection.vue' + import Inspection from '../do/b1-inspect-order-plan/Inspection.vue' import { getYearAndMonthAndDays } from '../../util/date' import Add from '../do/b1-ins-order/add.vue' -import { number } from 'echarts' + import Sortable from 'sortablejs'; export default { components: { ValueTable, @@ -184,6 +324,10 @@ }, data() { return { + orderStateId:null, + version:null, + examine: null, + inspectorList: [],//妫�楠屼汉鍛樺垪琛� alone: false, sampleUserForm: { entrustCode: null, @@ -194,40 +338,119 @@ tabList: [], active: 1, tabIndex: 0, + componentDataDataLook: { + entity: { + id: 0, + orderBy: { + field: 'sampleCode', + order: 'asc' + } + }, + isIndex: false, + showSelect: false, + select: false, + do: [], + tagField: { + insState: { + select: [] + }, + insResult: { + select: [{ + value: 1, + label: '鍚堟牸', + type: 'success' + },{ + value: 0, + label: '涓嶅悎鏍�', + type: 'danger' + },{ + value: 3, + label: '涓嶅垽瀹�', + type: '' + }] + } + }, + selectField: {}, + spanConfig:{ + rows:[ + { + name:'sampleCode', + index:0 + }, + { + name:'sample', + index:1 + }, + { + name:'model', + index:5 + } + ] + }, + requiredAdd: [], + requiredUp: [] + }, + dataDialogVisible: false, componentData: { entity: { sonLaboratory: null, insState: null, userId: null }, + sortable:true, isIndex: true, showSelect: false, select: false, - sort: false, init: false, + needSort: ['createTime', 'sendTime', 'type', 'appointed', 'insState'], do: [{ + id: '', + font: '鏁版嵁鏌ョ湅', + type: 'text', + method: 'handleDataLook', + //disabFun: (row, index) => { + //const user = JSON.parse(localStorage.getItem('user')) + // let currentUserName = '' + // if(user){ + // currentUserName = user.name + //} + //return row.userName.indexOf(currentUserName)<0 && row.checkName.indexOf(currentUserName)<0 + //} + },{ id: '', font: '妫�楠�', type: 'text', - method: 'handleInspection' + method: 'handleInspection', + disabFun: (row, index) => { + return row.userName == null || row.insState == 3 || row.insState == 5||row.insState == 6||(row.userName&&!row.userName.includes(JSON.parse(localStorage.getItem("user")).name)) + } + // disabFun: (row, index) => { + // return row.userId == null || row.insState == 3 || row.insState == 5 + // } }, { id: '', font: '浜ゆ帴', type: 'text', - method: '' + method: 'handleConnect', + disabFun: (row, index) => { + return row.userName == null || row.insState == 5 || row.insState == 3||row.insState == 6||(row.userName&&!row.userName.includes(JSON.parse(localStorage.getItem("user")).name)) + } }, { id: '', font: '澶嶆牳', type: 'text', - method: '' + method: 'handleReview', + disabFun: (row, userName) => { + return row.userName == null || row.insState != 3 ||(row.checkName&&!row.checkName.includes(JSON.parse(localStorage.getItem("user")).name)) + } }, { id: '', font: '璁ら', type: 'text', method: 'claimFun', disabFun: (row, index) => { - return row.userId != null + return row.userName != null || row.checkName!=null } } ], @@ -263,25 +486,146 @@ requiredAdd: [], requiredUp: [] }, + userName:JSON.parse(localStorage.getItem("user")).name, 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 + orderId: 0, + personList:[], + connectVisible:false, + connect:{ + connectPerson:'', + // sonLaboratory:'' + }, + loading:false, + currentTime: null, + sonLaboratoryList:[], + tableData: [], + page:{ + current:1, + size:20, + }, + total:0, + tableLoading:false, + jumpTeam:false, + insResultList:[{ + value: 0, + label: '涓嶅悎鏍�', + type: 'danger' + },{ + value: 1, + label: '鍚堟牸', + type: 'success' + },{ + value: '', + label: '鏈嚭缁撴灉', + type: 'info' + }], + typeList:[] } }, created() { this.getLaboratoryDicts() this.getTypeDicts() this.getInsStateDicts() + this.getAuthorizedPerson() + this.currentTime = getYearAndMonthAndDays() }, mounted() { this.entityCopy = this.HaveJson(this.componentData.entity) + this.getPower() + if(this.jumpTeam){ + this.initializeSortable(); + } }, methods: { + // 鎷栨嫿 + initializeSortable() { + const tableBody = this.$refs.table0.$el.querySelector('.el-table__body-wrapper > table > tbody'); + if (tableBody) { + Sortable.create(tableBody, { + handle: '.el-table__row', // 鎷栧姩鎵嬫焺 + animation: 200, + onEnd: this.handleSortEnd, + }); + } else { + console.error('Table body not found.'); + } + }, + handleSortEnd(evt) { + const oldIndex = evt.oldIndex; + const newIndex = evt.newIndex; + const movedItem = this.tableData[oldIndex]; + if (oldIndex !== newIndex) { + this.tableData.splice(oldIndex, 1); + this.tableData.splice(newIndex, 0, movedItem); + } + this.upIndex++ + this.$axios.post(this.$api.insOrderPlan.jumpTeam, + { + id: movedItem.orderStateId, + sort: newIndex+1, + ...this.page + }, { + headers: { + 'Content-Type': 'application/json' + } + } + ).then(res => { + + }) + }, + rowClassName({ row, rowIndex }) { + return 'draggable-row'; + }, + // 鏁版嵁鏌ョ湅 + handleDataLook(row) { + this.componentDataDataLook.entity.id = row.id + this.dataDialogVisible = true; + }, + // 鏉冮檺鍒嗛厤 + getPower(radio) { + let power = JSON.parse(sessionStorage.getItem('power')) + let inspection = false + let connect = false + let review = false + let claim = false + let jumpTeam = 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 (power[i].menuMethod == 'jumpTeam') { + jumpTeam = 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) + } + this.jumpTeam = jumpTeam + }, changeCheckBox(val) { this.componentData.entity.userId = val?0:null this.refreshTable() @@ -298,37 +642,55 @@ if (row) { this.sampleUserForm = { entrustCode: row.entrustCode, - insSampleId: row.id + insSampleId: row.id, + sonLaboratory: row.sonLaboratory, } this.claimVisible = true } }, 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() + this.refreshTable('page') + } else { + this.loading = false; } }).catch(error => { console.error(error) + this.loading = false; }) }, refreshTable() { - this.$refs.insOrderPlan.selectList() + this.tableLoading = true + this.$axios.post(this.$api.insOrderPlan.selectInsOrderPlanList,{ + entity:this.componentData.entity, + page:this.page + }, { + headers: { + 'Content-Type': 'application/json' + } + }).then((res) => { + this.tableLoading = false + this.total = res.data.body.total + this.tableData = res.data.body.records + // this.$refs.table0.doLayout() + }) }, changeRowClass({ row, rowIndex }) { - let currentTime = getYearAndMonthAndDays() - if (currentTime === row.appointed) { + if (this.currentTime == row.appointed) { return 'highlight-warning-row-border' - } else if (currentTime > row.appointed) { + } else if (this.currentTime > row.appointed) { return 'highlight-danger-row-border' } return '' @@ -369,6 +731,7 @@ } }) this.componentData.tagField.type.select = data + this.typeList = data }) }, getInsStateDicts() { @@ -408,15 +771,95 @@ }, selectAllByOne(row) { this.activeFace = 2; + this.examine = 1; this.currentId = parseInt(row.id) }, playOrder(num) { this.activeFace = num }, + goback() { + this.state = 0 + this.refreshTable('page') + }, handleInspection(row){ - this.state = 1; + //褰撳墠妫�楠屼换鍔$殑妫�楠屼汉鍒楄〃 + let inspectorList = [] + if(row.userName){ + inspectorList = row.userName.split(',') + } + let user = JSON.parse(localStorage.getItem('user')) + if(user){ + inspectorList.push(user.name) + } + this.inspectorList = inspectorList this.orderId = row.id - } + this.version = row.version + this.orderStateId = row.orderStateId + this.state = 1; + }, + handleConnect(row){ + this.orderId = row.id + this.connect = {} + this.connectVisible=true; + // this.$axios.post(this.$api.insOrderPlan.upPlanUser2, { + // orderId:this.orderId, + // }).then(res => { + // if (res.code === 200&&res.data.length>0) { + // this.sonLaboratoryList = []; + // res.data.forEach(m=>{ + // this.sonLaboratoryList.push({ + // value:m, + // label:m + // }) + // }) + // // this.connect.sonLaboratory = this.sonLaboratoryList[0].value + // } + // }) + }, + confirmConnect(){ + if(this.connect.connectPerson==null||this.connect.connectPerson==''||this.connect.connectPerson==undefined){ + this.$message.error('鏈�夋嫨浜ゆ帴浜哄憳') + return + } + // if(this.connect.sonLaboratory==null||this.connect.sonLaboratory==''||this.connect.sonLaboratory==undefined){ + // this.$message.error('鏈�夋嫨璇曢獙瀹�') + // return + // } + this.loading = true; + this.$axios.post(this.$api.insOrderPlan.upPlanUser, { + orderId:this.orderId, + userId:this.connect.connectPerson, + sonLaboratory:this.componentData.entity.sonLaboratory, + }).then(res => { + if (res.code === 200) { + this.loading = false; + this.$message.success("鎿嶄綔鎴愬姛") + this.refreshTable('page') + } + this.connectVisible = false + }).catch(error => { + console.error(error) + this.loading = false; + }) + }, + handleReview(row){ + this.state = 2; + this.orderId = row.id + this.version = row.version + this.orderStateId = row.orderStateId + }, + 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> -- Gitblit v1.9.3