From 811bbc3feb318238214d022cb3a7458176f28e55 Mon Sep 17 00:00:00 2001 From: licp <lichunping@guanfang.com.cn> Date: 星期一, 02 九月 2024 17:17:18 +0800 Subject: [PATCH] 新增插队、扫码枪等功能 --- src/components/do/b1-ins-order/add.vue | 43 +++++- src/components/tool/value-table.vue | 42 +++++- src/main.js | 8 src/components/do/b1-inspect-order-plan/Inspection.vue | 7 + src/components/view/b1-inspect-order-plan.vue | 184 +++++++++++++++++++++++++++++- src/components/view/b1-sample.vue | 57 +++++++++ src/assets/api/controller.js | 1 7 files changed, 314 insertions(+), 28 deletions(-) diff --git a/src/assets/api/controller.js b/src/assets/api/controller.js index aa66f54..9f38e24 100644 --- a/src/assets/api/controller.js +++ b/src/assets/api/controller.js @@ -206,6 +206,7 @@ getReportModel: "/insOrderPlan/getReportModel", // 鍒囨崲鍏夌氦-鍏夌氦甯﹁褰曟ā鐗堟煡璇㈡楠屽唴瀹� write: "/insOrderPlan/write", // 濉啓娓╁害涓庢箍搴� temCycle: "/insOrderPlan/temCycle", // 娓╁害寰幆鏌ョ湅鍒楄〃鏁版嵁(鍖呮嫭閫氳繃鏍峰搧id,寰幆娆℃暟,娓╁害,寰幆娆℃暟杩涜绛涢��) + jumpTeam: "/insOrderPlan/jumpTeam", // 鎻掗槦 } const systemLog = { diff --git a/src/components/do/b1-ins-order/add.vue b/src/components/do/b1-ins-order/add.vue index 1515195..0f3c868 100644 --- a/src/components/do/b1-ins-order/add.vue +++ b/src/components/do/b1-ins-order/add.vue @@ -384,7 +384,7 @@ <el-input size="small" v-model="scope.row.sample" clearable :readonly="active>1"></el-input> </template> </el-table-column> - <el-table-column prop="sampleCode" label="鏍峰搧缂栧彿" min-width="140" align="center"> + <el-table-column prop="sampleCode" label="鏍峰搧缂栧彿" min-width="100" align="center"> <template slot-scope="scope"> <el-input size="small" v-model="scope.row.sampleCode" clearable placeholder="涓嶅~鍐欏垯绯荤粺鑷姩鐢熸垚" :readonly="active>1"></el-input> @@ -399,7 +399,7 @@ </el-select> </template> </el-table-column> - <el-table-column prop="modelNum" label="鍨嬪彿鍙傛暟" width="130" align="center" v-if="!(active>1)"> + <el-table-column prop="modelNum" label="鍨嬪彿鍙傛暟" min-width="100" align="center" v-if="!(active>1)"> <template slot-scope="scope"> <el-input size="small" v-model="scope.row.modelNum" clearable placeholder="闈炲繀濉�" @keyup.enter.native="methodChange(scope.row.standardMethodListId, scope.row)" @@ -412,6 +412,15 @@ placeholder="妫�楠屾爣鍑�" size="small" :loading="methodLoad" @change="(value)=>methodChange(value, scope.row)" @focus="methodFocus" :readonly="active>1" style="width: 100%;" clearable @clear="productList = []"> <el-option v-for="item in methods" :key="item.id" :label="item.code" :value="item.id"> + </el-option> + </el-select> + </template> + </el-table-column> + <el-table-column prop="testRequirements" label="璇曢獙鏍囧噯" align="center" min-width="100"> + <template slot-scope="scope"> + <el-select v-model="scope.row.testRequirements" :disabled="scope.row.model==null||active>1" + placeholder="璇曢獙鏍囧噯" size="small" :readonly="active>1" style="width: 100%;" clearable> + <el-option v-for="item in standard" :key="item.id" :label="item.label" :value="item.value"> </el-option> </el-select> </template> @@ -1127,7 +1136,8 @@ temId: '', sonLaboratoryList:[], selectiveEcho: [], // 妫�楠屼笅鍗曠殑鏃跺�欏嬀閫夋楠岄」鐩�,濡傛灉浣跨敤绛涢�夋彁浜ゆ樉绀烘楠岄」鐩负绌� 鍥炴樉鍒楄〃 - deaprtEnum:[] + deaprtEnum:[], + standard:[] } }, watch: { @@ -1193,6 +1203,7 @@ // this.selectInsOrderTemplate() this.getAuthorizedPerson(); this.selectEnumByCategoryForUnit() + this.selectEnumByCategoryForStandard() this.selectStandardMethods() this.selectEnumByCategoryForOrderType() this.selectDepartmentEnum() @@ -1594,10 +1605,11 @@ }else if(this.addObj.orderType&&this.addObj.orderType!='C'&&!this.addObj.departmentLimsId){ this.addObj.departmentLims = '妫�娴嬩腑蹇�' this.addObj.departmentLimsId = this.deaprtEnum.find(m=>m.name=='妫�娴嬩腑蹇�').id - }else{ - this.$message.error('璇烽�夋嫨妫�楠岀被鍒�') - return } + // else{ + // this.$message.error('璇烽�夋嫨妫�楠岀被鍒�') + // return + // } if (!this.addObj.companyId) { this.$message.error('鏈�夋嫨瀹㈡埛鍗曚綅') return @@ -2137,9 +2149,15 @@ }) }, getProNum() { - this.sampleSelectionList.forEach((m, i) => { - Vue.set(this.sampleSelectionList[i], 'proNum', m.insProduct.filter(a => a.state == 1).length) - }) + if (this.active != 1) { + this.sampleList.forEach((m, i) => { + Vue.set(this.sampleList[i], 'proNum', m.insProduct.filter(a => a.state == 1).length) + }) + }else{ + this.sampleSelectionList.forEach((m, i) => { + Vue.set(this.sampleSelectionList[i], 'proNum', m.insProduct.filter(a => a.state == 1).length) + }) + } this.$refs.sampleTable.doLayout() }, searchFilter() { @@ -2559,6 +2577,13 @@ this.units = res.data }) }, + selectEnumByCategoryForStandard() { + this.$axios.post(this.$api.enums.selectEnumByCategory, { + category: "璇曢獙鏍囧噯" + }).then(res => { + this.standard = res.data + }) + }, selectEnumByCategoryForOrderType() { this.$axios.post(this.$api.enums.selectEnumByCategory, { category: "妫�楠岀被鍒�" diff --git a/src/components/do/b1-inspect-order-plan/Inspection.vue b/src/components/do/b1-inspect-order-plan/Inspection.vue index cbbee28..77318b8 100644 --- a/src/components/do/b1-inspect-order-plan/Inspection.vue +++ b/src/components/do/b1-inspect-order-plan/Inspection.vue @@ -440,6 +440,9 @@ <template v-else-if="n.v.ps!=undefined && n.v.ps.value==='鏍峰搧鍨嬪彿'"> <div :style="`font-family:${n.v.ff} !important;`" v-if="currentSample.model!==undefined&¤tSample.model!==null">{{currentSample.model}}</div> </template> + <template v-else-if="n.v.ps!=undefined && n.v.ps.value==='璇曢獙鏍囧噯'"> + <div :style="`font-family:${n.v.ff} !important;`" v-if="currentSample.testRequirements!==undefined&¤tSample.testRequirements!==null">{{currentSample.testRequirements}}</div> + </template> <template v-else-if="n.v.ps!=undefined && n.v.ps.value==='濂楃'"> <div style="display: flex;flex-wrap: nowrap;align-items: center;"> <!-- <i class="el-icon-caret-left table_caret" @click="caretBushing(-1)"></i> --> @@ -2739,6 +2742,7 @@ } } }) + console.log(4444,a.template) // 鎿嶄綔璧嬪��--涓昏璧嬪�煎崟浣�,璇曢獙鏂规硶绛変俊鎭� ids.forEach(id => { for (let b = 0; b < a.template.length; b++) { @@ -2751,6 +2755,9 @@ .ps.value === '妫�娴嬫柟娉�')) { a.template[b].v.v = id.product.methodS } + // if (a.template[b].v.ps != undefined && (a.template[b].v.ps.value === '璇曢獙鏍囧噯')) { + // a.template[b].v.v = id.product.testRequirements + // } } } }) diff --git a/src/components/tool/value-table.vue b/src/components/tool/value-table.vue index 1892627..4d7ee4a 100644 --- a/src/components/tool/value-table.vue +++ b/src/components/tool/value-table.vue @@ -4,6 +4,10 @@ height: 100%; overflow-y: auto; } + >>>.el-table__row { + cursor: move; + position: relative; + } .table { width: 100%; @@ -118,7 +122,7 @@ @row-click="rowClick" :show-summary="data.countFleid!=undefined && data.countFleid.length > 0" :summary-method="getSummaries" :row-class-name="tableRowClassName" :row-key="record=>record[rowKey]" :current-row-key="data.currentId" :highlight-current-row="data.highlight===undefined||data.highlight" - :span-method="spanMethod" :key="specialKey"> + :span-method="spanMethod" :key="specialKey" :class="{sortable:data.sortable}"> <el-table-column type="selection" :width="selectionWidth" v-if="data.showSelect" :key="Math.random()"> </el-table-column> <el-table-column type="index" align="center" label="搴忓彿" :width="selectionWidth" v-if="data.isIndex" :key="Math.random()"> @@ -332,12 +336,7 @@ </template> <script> - import { - Page - } from 'iview'; - import { - data - } from 'jquery'; + import Sortable from 'sortablejs'; export default { props: { selectionWidth: { @@ -503,8 +502,37 @@ 'token': sessionStorage.getItem('token') } this.specialKey = this.specialKey+Math.random()*100; + // 鏄惁鍙嫋鍔ㄥ垪琛�--姝ゅ姛鑳芥殏鏃舵湭瀹炵幇 + if(this.data.sortable){ + this.$nextTick(() => { + this.initializeSortable() + }) + } }, methods: { + initializeSortable() { + let className =".el-table__body-wrapper > table > tbody"; + const table= document.querySelector(className); + const self = this + Sortable.create(table, { + animation: 150, //鍔ㄧ敾鏃堕暱 + handle: ".el-table__row", //鍙嫋鎷藉尯鍩焎lass + onEnd({ newIndex, oldIndex }) { + console.log(3333,newIndex, oldIndex) + const movedItem = this.tableData[oldIndex]; + this.tableData.splice(oldIndex, 1); + this.tableData.splice(newIndex, 0, movedItem); + } + }) + }, + getUpdatedOrder() { + // 鏍规嵁鎷栨嫿鍚庣殑椤哄簭鑾峰彇鏇存柊鐨勬暟鎹� + // 杩欓噷闇�瑕佸疄鐜颁綘鐨勯�昏緫 + }, + updateTableData(newOrder) { + // 鏍规嵁鏂扮殑椤哄簭鏇存柊琛ㄦ牸鏁版嵁 + // 杩欓噷闇�瑕佸疄鐜颁綘鐨勯�昏緫 + }, rowspan(spanArr, position, spanName) { this.tableData.forEach((item, index) => { if (index === 0) { diff --git a/src/components/view/b1-inspect-order-plan.vue b/src/components/view/b1-inspect-order-plan.vue index 2bd248c..5aa83ee 100644 --- a/src/components/view/b1-inspect-order-plan.vue +++ b/src/components/view/b1-inspect-order-plan.vue @@ -97,6 +97,10 @@ .view-self-checkbox { margin-left: 50px; } + .draggable-row { + cursor: move; + position: relative; + } </style> <style> .ins-order-plan-main .el-form-item__label{ @@ -154,10 +158,101 @@ </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="table" + border + style="width: 100%;" + height="calc(100% - 80px)" + :row-class-name="rowClassName" + v-loading="tableLoading" + > + <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="typeList.find(m=>m.value==scope.row.insState).type" size="small">{{ typeList.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"> @@ -219,7 +314,7 @@ getYearAndMonthAndDays } from '../../util/date' import Add from '../do/b1-ins-order/add.vue' -import { CellGroup } from 'iview' + import Sortable from 'sortablejs'; export default { components: { ValueTable, @@ -299,6 +394,7 @@ insState: null, userId: null }, + sortable:true, isIndex: true, showSelect: false, select: false, @@ -387,6 +483,7 @@ requiredAdd: [], requiredUp: [] }, + userName:JSON.parse(localStorage.getItem("user")).name, upIndex: 0, planTotal: 0, insStateList: [], @@ -403,7 +500,29 @@ }, loading:false, currentTime: null, - sonLaboratoryList:[] + 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() { @@ -416,8 +535,43 @@ mounted() { this.entityCopy = this.HaveJson(this.componentData.entity) this.getPower() + if(this.jumpTeam){ + this.initializeSortable(); + } }, methods: { + initializeSortable() { + const tableBody = this.$refs.table.$el.querySelector('.el-table__body-wrapper > table > tbody'); + + if (tableBody) { + Sortable.create(tableBody, { + handle: '.el-table__row', // 鎷栧姩鎵嬫焺 + animation: 150, + 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]; + this.$axios.post(this.$api.insOrderPlan.jumpTeam, + { + id: movedItem.id, + 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 @@ -430,6 +584,7 @@ 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 @@ -442,6 +597,9 @@ } if (power[i].menuMethod == 'claimInsOrderPlan') { claim = true + } + if (power[i].menuMethod == 'jumpTeam') { + jumpTeam = true } } if (!claim) { @@ -456,6 +614,7 @@ if (!inspection) { this.componentData.do.splice(0, 1) } + this.jumpTeam = jumpTeam }, changeCheckBox(val) { this.componentData.entity.userId = val?0:null @@ -499,8 +658,20 @@ this.loading = false; }) }, - refreshTable(e) { - this.$refs.insOrderPlan.selectList(e) + refreshTable() { + 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 + }) }, changeRowClass({ row, @@ -549,6 +720,7 @@ } }) this.componentData.tagField.type.select = data + this.typeList = data }) }, getInsStateDicts() { diff --git a/src/components/view/b1-sample.vue b/src/components/view/b1-sample.vue index 192a677..1f7589a 100644 --- a/src/components/view/b1-sample.vue +++ b/src/components/view/b1-sample.vue @@ -222,7 +222,7 @@ effect="dark" placement="top" v-for="(n,j) in m.samples" - :key="j" :disabled="`${n.sample}${n.model}`.length<10"> + :key="j" :disabled="`${n.sample}${n.model}`.length<5"> <div slot="content"><span>{{ n.sample }}</span> <span> ({{ n.model }}) [{{ n.sampleCode }}]</span></div> <li class="green" @@ -366,6 +366,7 @@ <el-button type="primary" @click="confirmShelves" :loading="upLoadShelves">纭� 瀹�</el-button> </span> </el-dialog> + <input type="password" id="ScanCodeInfo" v-model="codeInfo" @keyup.enter="keyup" style="opacity: 0;height: 0px;margin: 0px;padding: 0px;position: absolute;top: 0;"></input> </div> </template> @@ -382,6 +383,7 @@ shelfId: null }, warehouse: [], + startTime: null, shelf: [], storageList:[], storageVisible: false, @@ -406,13 +408,64 @@ tableLoading:false, sampleCode:'', currentId:null, - searchSampleCode:'' + searchSampleCode:'', + codeInfo:null, } + }, + watch:{ + storageVisible(newVal){ + if(newVal){ + // this.$message.success('鎵爜锛氭墦寮�') + let input = document.getElementById('ScanCodeInfo'); + input.focus(); + this.startTime = setInterval(()=>{ + input.focus() + },1000) + }else{ + // this.$message.warning('鎵爜锛氬叧闂�') + clearInterval(this.startTime) + } + }, + exportVisible(newVal){ + if(newVal){ + // this.$message.success('鎵爜锛氭墦寮�') + let input = document.getElementById('ScanCodeInfo'); + input.focus(); + this.startTime = setInterval(()=>{ + input.focus() + },1000) + }else{ + // this.$message.warning('鎵爜锛氬叧闂�') + clearInterval(this.startTime) + } + }, }, mounted() { this.selectList() }, methods: { + keyup(e){ + var code = '' + var str = {} + var that = this; + console.log(3333,this.codeInfo) + try{ + code = JSON.parse(this.codeInfo) + if(code.moNo2==null||code.moNo2==undefined||code.moNo2==''){ + this.$message.error('璇ヤ簩缁寸爜鏈夎') + }else{ + str = { + moNo2: code.moNo2, + } + // if(this.storageVisible){ + // }else if(this.exportVisible){} + this.sampleCode = code.moNo2 + } + }catch(e){ + this.$message.error('璇ヤ簩缁寸爜鏈夎') + } + this.codeInfo = null + }, selectList() { this.$axios.get(this.$api.warehouse.selectWarehouse).then(res => { this.warehouse = res.data diff --git a/src/main.js b/src/main.js index e9bae15..bcca7c2 100644 --- a/src/main.js +++ b/src/main.js @@ -18,9 +18,9 @@ Vue.prototype.PROJECT = '妫�娴嬩腑蹇�' // Vue.prototype.PROJECT = '瑁呭鐢电紗' //鏈湴 -Vue.prototype.LOCATIONVUE = "http://127.0.0.1:80"; -const javaApi = 'http://127.0.0.1:8001'; -// const javaApi = 'http://192.168.0.104:8001'; +// Vue.prototype.LOCATIONVUE = "http://127.0.0.1:80"; +// const javaApi = 'http://127.0.0.1:8001'; +const javaApi = 'http://192.168.212.249:8001'; // //閫氫俊娴嬭瘯搴� // Vue.prototype.LOCATIONVUE = "http://10.1.13.77:8080"; @@ -28,7 +28,7 @@ //浜� // Vue.prototype.LOCATIONVUE = "http://114.132.189.42:8080"; -//const javaApi = 'http://114.132.189.42:1234'; +// const javaApi = 'http://114.132.189.42:1234'; // //妫�娴嬩腑蹇冩寮忓簱 // Vue.prototype.LOCATIONVUE = "http://10.1.200.86:8080"; -- Gitblit v1.9.3