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