From ba77fdc6a30c9ad0941e40319f8c4f6fe6fdf9f1 Mon Sep 17 00:00:00 2001 From: cuilei <ray_tsu1@163.com> Date: 星期四, 07 八月 2025 10:30:42 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/views/mes/modules/MesProductionWorkOrderListModal.vue | 375 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 375 insertions(+), 0 deletions(-) diff --git a/src/views/mes/modules/MesProductionWorkOrderListModal.vue b/src/views/mes/modules/MesProductionWorkOrderListModal.vue new file mode 100644 index 0000000..6075145 --- /dev/null +++ b/src/views/mes/modules/MesProductionWorkOrderListModal.vue @@ -0,0 +1,375 @@ +<template> + <j-modal + :title="title" + :width="width" + :visible="visible" + switchFullscreen + @ok="handleOk" + :okButtonProps="{ class:{'jee-hidden': disableSubmit} }" + @cancel="handleCancel" + cancelText="鍏抽棴"> + + <a-button :style="{ marginBottom: '10px' }" type="primary" @click="handleAdd">鏂板</a-button> + <vxe-table + ref="table" + border + :data="dataSource" + :edit-config="{trigger: 'click', mode: 'cell'}" + :edit-rules="editRules" + > + <vxe-table-column type="seq" width="40"/> + <vxe-table-column width="200" title="宸ュ崟鍙�" field="workOrderCode"> + <template #default="{ row }"> + <span v-if="row.workOrderCode">{{ row.workOrderCode }}</span> + <span v-else class="placeholder-text">绯荤粺鑷姩鐢熸垚</span> + </template> + </vxe-table-column> + <vxe-table-column + title="鐗╂枡缂栧彿" + field="materialNumber" + :edit-render="{name: '$select', options: materialOptions, events: {change: handleMaterialChange}}"> + <template #default="{ row }"> + <span v-if="row.materialNumber">{{ row.materialNumber }}</span> + <span v-else class="placeholder-text">璇烽�夋嫨鐗╂枡缂栧彿</span> + </template> + </vxe-table-column> + <vxe-table-column title="鐗╂枡鍚嶇О" field="materialName"> + <template #default="{ row }"> + <span v-if="row.materialName">{{ row.materialName }}</span> + <span v-else class="placeholder-text">鐗╂枡鍚嶇О鑷姩濉厖</span> + </template> + </vxe-table-column> + <vxe-table-column title="浜х嚎" field="factoryName"></vxe-table-column> + <vxe-table-column + title="鐝粍" + field="groupId" + :edit-render="{name: '$select', options: groupOptions, events: {change: handleGroupChange}}"> + </vxe-table-column> + <vxe-table-column title="鐝id" :visible="false" field="shiftName"></vxe-table-column> + <vxe-table-column title="鐝" field="shiftName"></vxe-table-column> + <vxe-table-column + title="鎺掍骇鏃ユ湡" + field="workOrderDate" + :edit-render="{name: '$select', options: workOrderDateOptions, events: {change: handleWorkOrderDateChange}}"> + </vxe-table-column> + <vxe-table-column + title="璁″垝鐢熶骇鏁伴噺" + field="planQuantity" + width="150" + :edit-render="{name: '$input'}"> + <template #default="{ row }"> + <span v-if="row.planQuantity">{{ row.planQuantity }}</span> + <span v-else class="placeholder-text">璇峰~鍐欒鍒掔敓浜ф暟閲�</span> + </template> + </vxe-table-column> + <vxe-table-column title="鎿嶄綔"> + <template #default="{ row }"> + <vxe-button size="small" class="error-button" @click="handleRemove(row)">鍒犻櫎</vxe-button> + </template> + </vxe-table-column> + </vxe-table> + </j-modal> +</template> + +<script> + +import MesProductionWorkOrderForm from './MesProductionWorkOrderForm' +import { ajaxGetDictItems } from '@api/api' +import { getAction, postAction } from '@api/manage' + +export default { + name: 'MesProductionWorkOrderModal', + components: { + MesProductionWorkOrderForm + }, + data () { + return { + title: '鎺掍骇鏄庣粏', + width: 1300, + visible: false, + disableSubmit: false, + loading: false, + dataSource: [], + groupOptions: [], + groupShiftMap: {}, + materialOptions: [], + materNumberNameMap: {}, + workOrderDateOptions: [], + url: { + queryShiftGroupByFactoryId: '/base/shiftGroup/queryShiftGroupByFactoryId', + addSchedulePlan: '/mesproductionworkorder/mesProductionWorkOrder/addSchedulePlan' + }, + editRules: { + materialNumber: [ + { required: true, message: '鐗╂枡缂栧彿蹇呴』閫夋嫨' } + ], + groupId: [ + { required: true, message: '鐝粍蹇呴』閫夋嫨' } + ], + workOrderDate: [ + { required: true, message: '鎺掍骇鏃ユ湡蹇呴』閫夋嫨' } + ], + planQuantity: [ + { required: true, message: '璁″垝鐢熶骇鏁伴噺涓哄繀濉�' } + ] + } + } + }, + methods: { + // 鐢熸垚鏃ユ湡鑼冨洿鏁扮粍 + generateDateRangeOptions(startDate, endDate) { + const dateOptions = []; + const start = new Date(startDate); + const end = new Date(endDate); + + // 璁剧疆鏃堕棿涓烘瘡澶╃殑0鐐� + start.setHours(0, 0, 0, 0); + end.setHours(0, 0, 0, 0); + + // 鐢熸垚鏃ユ湡鑼冨洿鍐呯殑鎵�鏈夋棩鏈� + for (let date = new Date(start); date <= end; date.setDate(date.getDate() + 1)) { + const formattedDate = this.formatDate(date); + dateOptions.push({ + value: formattedDate, + label: formattedDate + }); + } + return dateOptions; + }, + // 鏍煎紡鍖栨棩鏈熶负 YYYY-MM-DD + formatDate(date) { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; + }, + // 鐢熸垚宸ュ崟鍙风殑鏂规硶 + generateWorkOrderCode(row) { + console.log('row:', row) + // 鑾峰彇鍚勪釜瀛楁鐨勫�� + const factoryCode = row.factoryCode || ''; // 浜х嚎缂栧彿 + const materialNumber = row.materialNumber || ''; // 鐗╂枡缂栧彿 + const workDate = row.workOrderDate || ''; // 鎺掍骇鏃ユ湡 + const shiftCode = row.shiftCode || ''; // 鐝缂栧彿 + + // 鏍煎紡鍖栨帓浜ф棩鏈燂紙濡傛灉闇�瑕佺壒瀹氭牸寮忥紝姣斿鍙彇骞存湀鏃ワ級 + let formattedDate = workDate; + if (workDate && workDate.length >= 10) { + // 濡傛灉鏄畬鏁存棩鏈熸牸寮忥紝鎻愬彇 YYYY-MM-DD 閮ㄥ垎 + formattedDate = workDate.substring(0, 10).replace(/-/g, ''); + } + // 鎷兼帴宸ュ崟鍙� + return `${factoryCode}${materialNumber}${formattedDate}${shiftCode}`; + }, + // 鍦ㄩ�傚綋鏃舵満鏇存柊宸ュ崟鍙� + updateWorkOrderCode(row) { + row.workOrderCode = this.generateWorkOrderCode(row); + }, + handleWorkOrderDateChange($event, value) { + $event.row.workOrderDate = value.value; + this.updateWorkOrderCode($event.row) + }, + handleMaterialChange($event, value) { + const key = value.value + if (key && this.materNumberNameMap[key]) { + $event.row.materialName = this.materNumberNameMap[key] + } else { + $event.row.materialName = ''; + } + // 鏇存柊鐗╂枡缂栧彿 + $event.row.materialNumber = key; + // 閲嶆柊鐢熸垚宸ュ崟鍙� + this.updateWorkOrderCode($event.row); + }, + handleGroupChange($event, value) { + const key = value.value + // 浠� groupShiftMap 涓幏鍙栧搴旂殑鐝淇℃伅 + if (key && this.groupShiftMap[key]) { + // 鏇存柊褰撳墠琛岀殑鐝瀛楁 + $event.row.shiftId = this.groupShiftMap[key].shiftId; + $event.row.shiftCode = this.groupShiftMap[key].shiftCode; + $event.row.shiftName = this.groupShiftMap[key].shiftName; + } else { + // 濡傛灉娌℃湁鍖归厤鐨勭彮娆′俊鎭紝鍒欐竻绌虹彮娆″瓧娈� + $event.row.shiftId = ''; + $event.row.shiftCode = ''; + $event.row.shiftName = ''; + } + // 閲嶆柊鐢熸垚宸ュ崟鍙� + this.updateWorkOrderCode($event.row); + }, + initDictSelectOptions(record) { + return new Promise((resolve) => { + // 骞惰鎵ц澶氫釜寮傛璇锋眰 + const promises = []; + + // 鑾峰彇鐝粍鍜岀彮娆′俊鎭� + if (record && record.length > 0) { + const factoryId = record[0].factoryId + const shiftGroupPromise = getAction(this.url.queryShiftGroupByFactoryId, { factoryId: factoryId }).then(res => { + if (res.success) { + // 淇鏄犲皠閫昏緫 + this.groupOptions = res.result.map(item => { + return { + value: item.id, + label: item.groupName + } + }) + // 淇濆瓨鐝粍鍜岀彮娆$殑鏄犲皠鍏崇郴 + this.groupShiftMap = res.result.reduce((map, item) => { + map[item.id] = { + shiftId: item.shiftId, + shiftCode: item.shiftCode_dictText, + shiftName: item.shiftId_dictText + } + return map + }, {}) + } + }).catch(() => { + // 鍗充娇璇锋眰澶辫触涔熶笉闃诲 + }); + promises.push(shiftGroupPromise); + } + + //鑾峰彇鐗╂枡缂栧彿涓嬫媺閫夐」 + const materialNumberPromise = ajaxGetDictItems("lsw_material,material_name,material_number,del_flag!='1' order by material_number asc", null).then(res => { + if (res.success) { + // 鍋囪鐗╂枡缂栧彿瀛楁涓� materialNumber锛岄渶瑕佹牴鎹疄闄呭瓧娈佃皟鏁� + // 灏嗙墿鏂欓�夐」瀛樺偍鍒扮粍浠舵暟鎹腑锛屼緵琛ㄦ牸浣跨敤 + this.materialOptions = res.result.map(item => { + return { + value: item.value, + label: item.value + } + }); + this.materNumberNameMap = res.result.reduce((map, item) => { + map[item.value] = item.text + return map + }, {}) + } + }).catch(() => { + // 鍗充娇璇锋眰澶辫触涔熶笉闃诲 + }); + promises.push(materialNumberPromise); + + // 绛夊緟鎵�鏈夎姹傚畬鎴� + Promise.all(promises).then(() => { + resolve(); + }); + }) + }, + edit (record, dateRange) { + // 鍏堝姞杞藉瓧鍏告暟鎹紝鍐嶅垵濮嬪寲琛ㄥ崟 + this.initDictSelectOptions(record).then(() => { + this.$nextTick(() => { + // 鏍规嵁鏃ユ湡鑼冨洿鐢熸垚鎺掍骇鏃ユ湡閫夐」 + if (dateRange && dateRange.length === 2) { + this.workOrderDateOptions = this.generateDateRangeOptions(dateRange[0], dateRange[1]); + } + + // 涓烘瘡鏉¤褰曠敓鎴愬伐鍗曞彿 + if (record && record.length > 0) { + record.forEach(row => { + if (!row.workOrderCode) { + this.updateWorkOrderCode(row); + } + }); + } + this.dataSource = record + this.visible = true + // 鏁版嵁鍔犺浇瀹屾垚鍚庢縺娲绘墍鏈夎鐨勭紪杈戠姸鎬� + this.$nextTick(() => { + if (this.$refs.table && this.dataSource.length > 0) { + // 婵�娲荤涓�琛岃繘鍏ョ紪杈戠姸鎬� + this.$refs.table.setActiveRow(this.dataSource[0]) + } + }) + }); + }) + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleAdd() { + // 鍒涘缓鏂拌鏁版嵁 + const newRow = { + workOrderCode: this.dataSource.length > 0 ? this.dataSource[0].factoryCode : '', + materialNumber: '', // 鐗╂枡缂栧彿锛堥渶閫夋嫨锛� + materialName: '', // 鐗╂枡鍚嶇О锛堣嚜鍔ㄥ~鍏咃級 + factoryId: this.dataSource.length > 0 ? this.dataSource[0].factoryId : '', + factoryCode: this.dataSource.length > 0 ? this.dataSource[0].factoryCode : '', + factoryName: this.dataSource.length > 0 ? this.dataSource[0].factoryName : '', + groupId: '', // 鐝粍锛堥渶閫夋嫨锛� + shiftId: '', // 鐝ID + shiftCode: '', // 鐝缂栧彿 + shiftName: '', // 鐝鍚嶇О + workOrderDate: '', // 鎺掍骇鏃ユ湡锛堥渶閫夋嫨锛� + planQuantity: '' // 璁″垝鐢熶骇鏁伴噺锛堥渶濉啓锛� + } + // 灏嗘柊琛屾坊鍔犲埌鏁版嵁婧愪腑 + this.dataSource.push(newRow); + // 婵�娲绘柊澧炵殑琛岃繘鍏ョ紪杈戠姸鎬� + this.$nextTick(() => { + if (this.$refs.table) { + this.$refs.table.setActiveRow(newRow); + } + }); + }, + handleRemove(row) { + let table = this.$refs.table + this.$confirm({ + title: '鎻愮ず', + content: '纭瑕佸垹闄ゅ悧锛�', + okText: '纭畾', + cancelText: '鍙栨秷', + onOk: () => { + // 鍒犻櫎琛� + table.remove(row) + } + }) + }, + handleOk () { + // 琛ㄦ牸鍏ㄨ〃鏍¢獙 + this.$refs.table.validate((valid) => { + if (valid) { + this.$message.error("璇峰畬鎴愭墍鏈夊繀濉俊鎭悗鍐嶆彁浜わ紒") + } else { + let tableData = this.$refs.table.getTableData().fullData + console.log(tableData) + postAction(this.url.addSchedulePlan, tableData).then(res=> { + if (res.success) { + this.$message.success(res.message) + this.submitCallback() + } else { + this.$message.warning(res.message) + } + }) + } + }) + }, + submitCallback(){ + this.$emit('ok'); + this.visible = false; + }, + handleCancel () { + this.close() + } + } + } +</script> + +<style scoped> + +.placeholder-text { + color: #999; + font-style: italic; +} + +.error-button { + background-color: #ff4d4f !important; + border-color: #ff4d4f !important; + color: #fff !important; +} + +</style> \ No newline at end of file -- Gitblit v1.9.3