From efaf016bd38b2e30d3942890beacc2b50bae70d9 Mon Sep 17 00:00:00 2001
From: zhangherong <571457620@qq.com>
Date: 星期一, 25 八月 2025 16:01:15 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/mes/MesProductionWorkOrderListView.vue            |  480 +++++++++++++++--------------
 src/views/cms/CuttingInventoryList.vue                      |  210 ++++++++++++
 src/views/cms/CuttingInboundList.vue                        |  246 +++++++++++++--
 src/views/mes/modules/MesProductionWorkOrderReportModal.vue |    6 
 4 files changed, 663 insertions(+), 279 deletions(-)

diff --git a/src/views/cms/CuttingInboundList.vue b/src/views/cms/CuttingInboundList.vue
index 972c824..6f4ce01 100644
--- a/src/views/cms/CuttingInboundList.vue
+++ b/src/views/cms/CuttingInboundList.vue
@@ -117,8 +117,7 @@
         </template>
 
         <span slot="action" slot-scope="text, record">
-          <a @click="handleEdit(record)">缂栬緫</a>
-
+          <a @click="handleEdit(record)" :disabled="record.orderStatus == '2'">缂栬緫</a>
           <a-divider type="vertical" />
           <a-dropdown>
             <a class="ant-dropdown-link">鏇村 <a-icon type="down" /></a>
@@ -126,14 +125,17 @@
               <a-menu-item>
                 <a @click="handleDetail(record)">璇︽儏</a>
               </a-menu-item>
-              <a-menu-item>
+<!--              <a-menu-item v-if="record.orderStatus != '2'">-->
+<!--                <a-popconfirm title="纭畾鍒犻櫎鍚�?" @confirm="() => handleDelete(record.id)">-->
+<!--                  <a>鍒犻櫎</a>-->
+<!--                </a-popconfirm>-->
+<!--              </a-menu-item>-->
+              <a-menu-item v-if="record.orderStatus != '2'">
+                  <a @click="handleSubmit(record.id)" :disabled="record.orderStatus == '3'">鎻愪氦</a>
+              </a-menu-item>
+              <a-menu-item v-if="record.orderStatus != '2'">
                 <a-popconfirm title="纭畾鍒犻櫎鍚�?" @confirm="() => handleDelete(record.id)">
                   <a>鍒犻櫎</a>
-                </a-popconfirm>
-              </a-menu-item>
-              <a-menu-item>
-                <a-popconfirm title="纭畾鎻愪氦鍚�?" @confirm="() => handleSubmit(record.id)">
-                  <a>鎻愪氦</a>
                 </a-popconfirm>
               </a-menu-item>
             </a-menu>
@@ -165,7 +167,7 @@
   import Vue from 'vue'
   import { ACCESS_TOKEN } from '@/store/mutation-types'
   import store from '@/store'
-
+  import { Modal } from 'ant-design-vue';
 
   export default {
     name: 'CuttingInboundList',
@@ -245,6 +247,7 @@
           deleteBatch: "/cms/cuttingInbound/deleteBatch",
           exportXlsUrl: "/cms/cuttingInbound/exportXls",
           importExcelUrl: "cms/cuttingInbound/importExcel",
+          submit: "/cms/cuttingInbound/submit",
         },
         dictOptions:{},
         superFieldList:[],
@@ -284,6 +287,7 @@
         this.$refs.modalForm.title="璇︽儏";
         this.$refs.modalForm.disableSubmit = true;
       },
+
       // 鑷畾涔夎鐐瑰嚮浜嬩欢
       customRow(record) {
         return {
@@ -409,42 +413,208 @@
       /**
        *  鍗曟嵁鎻愪氦
        */
-      // handleSubmit: function() {
+      handleSubmit: function(id) {
+        if (!this.url.submit) {
+          this.$message.error('璇疯缃畊rl.submit灞炴��!')
+          return
+        }
+
+        let targetId = id; // 浠庡弬鏁拌幏鍙朓D
+        // 濡傛灉娌℃湁閫氳繃鍙傛暟浼犻�扞D锛屽垯妫�鏌ラ�変腑鐨勮褰�
+        if (!targetId) {
+          if (this.selectedRowKeys.length != 1) {
+            this.$message.warning('璇烽�夋嫨涓�鏉¤褰曪紒')
+            return
+          } else {
+            targetId = this.selectedRowKeys[0]
+          }
+        }
+
+        // 灏嗗弬鏁颁綔涓烘煡璇㈠弬鏁伴檮鍔犲埌URL涓�
+        let httpurl = this.url.submit + '?orderId=' + encodeURIComponent(targetId)
+        let method = 'get'
+        var params = {}  // 娓呯┖params锛屽洜涓哄弬鏁板凡缁忓湪URL涓紶閫�
+
+        const that = this
+
+        this.$confirm({
+          title: '纭鎻愪氦锛�',
+          // content: '姝e湪鎻愪氦鏁版嵁锛岃鑰愬績绛夊緟...',
+          okText: '纭',
+          cancelText: '鍙栨秷',
+          onOk() {
+            // 鏄剧ず鍔犺浇鎻愮ず
+            const hide = that.$message.loading('姝e湪鎻愪氦鏁版嵁锛岃鑰愬績绛夊緟...', 0);
+
+            // 鍙戦�佽姹�
+            return httpAction(httpurl, params, method).then((res) => {
+              hide(); // 闅愯棌鍔犺浇鎻愮ず
+              if (res.success) {
+                that.$message.success(res.message)
+                that.loadData()
+              } else {
+                that.$message.warning(res.message)
+              }
+            }).catch(error => {
+              hide(); // 闅愯棌鍔犺浇鎻愮ず
+              that.$message.error('鎻愪氦澶辫触: ' + error.message)
+            }).finally(() => {
+              that.loading = false
+            })
+          }
+        })
+      },
+
+      // /**
+      //  *  鍗曟嵁鎻愪氦锛堟敮鎸佸疄鏃惰繘搴︽洿鏂帮級
+      //  */
+      // handleSubmit: function(id) {
       //   if (!this.url.submit) {
       //     this.$message.error('璇疯缃畊rl.submit灞炴��!')
       //     return
       //   }
-      //   if (this.selectedRowKeys.length != 1) {
-      //     this.$message.warning('璇烽�夋嫨涓�鏉¤褰曪紒')
-      //     return
-      //   } else {
-      //     var id = this.selectedRowKeys[0]
-      //     let httpurl = this.url.submit
-      //     let method = 'post'
-      //     var params = { id: id }
       //
-      //     const that = this
-      //
-      //     this.$confirm({
-      //       title: '纭鎻愪氦锛�',
-      //       okText: '纭',
-      //       cancelText: '鍙栨秷',
-      //       onOk() {
-      //         httpAction(httpurl, params, method).then((res) => {
-      //           if (res.success) {
-      //             that.$message.success(res.message)
-      //             that.loadData()
-      //           } else {
-      //             that.$message.warning(res.message)
-      //           }
-      //         }).finally(() => {
-      //           that.loading = false
-      //
-      //         })
-      //       }
-      //     })
+      //   let targetId = id; // 浠庡弬鏁拌幏鍙朓D
+      //   // 濡傛灉娌℃湁閫氳繃鍙傛暟浼犻�扞D锛屽垯妫�鏌ラ�変腑鐨勮褰�
+      //   if (!targetId) {
+      //     if (this.selectedRowKeys.length != 1) {
+      //       this.$message.warning('璇烽�夋嫨涓�鏉¤褰曪紒')
+      //       return
+      //     } else {
+      //       targetId = this.selectedRowKeys[0]
+      //     }
       //   }
+      //
+      //   const that = this
+      //
+      //   this.$confirm({
+      //     title: '纭鎻愪氦锛�',
+      //     content: '鎻愪氦杩囩▼涓彲鑳介渶瑕佽緝闀挎椂闂达紝璇疯�愬績绛夊緟...',
+      //     okText: '纭',
+      //     cancelText: '鍙栨秷',
+      //
+      //     onOk() {
+      //       // 鍒涘缓杩涘害鏉℃ā鎬佹
+      //       let percent = 0;
+      //       let totalTools = 0; // 鍒�鍏锋�绘暟
+      //       let processedTools = 0; // 宸插鐞嗗垁鍏锋暟
+      //
+      //       // 浣跨敤 this.$info 鍒涘缓妯℃�佹
+      //       const modal = that.$info({
+      //         title: '姝e湪鎻愪氦鏁版嵁',
+      //         content: that.$createElement('div', [
+      //           that.$createElement('p', '姝e湪澶勭悊鍒�鍏峰叆搴擄紝璇风◢鍊�...'),
+      //           that.$createElement('a-progress', {
+      //             props: {
+      //               percent: percent,
+      //               status: 'active'
+      //             }
+      //           }),
+      //           // that.$createElement('p', {
+      //           //   style: {
+      //           //     marginTop: '10px'
+      //           //   }
+      //           // }, `杩涘害: ${processedTools}/${totalTools} 鎶婂垁鍏穈)
+      //         ]),
+      //         okButtonProps: { style: { display: 'none' } }, // 闅愯棌纭鎸夐挳
+      //         cancelText: '鍙栨秷',
+      //         closable: false, // 绂佹鍏抽棴妯℃�佹
+      //       });
+      //
+      //       // 鏇存柊杩涘害鏄剧ず鍑芥暟
+      //       const updateProgress = () => {
+      //         if (totalTools > 0) {
+      //           percent = Math.round((processedTools / totalTools) * 100);
+      //           // 纭繚杩涘害涓嶈秴杩�90%锛屼繚鐣欐渶鍚�10%缁欐渶缁堝畬鎴�
+      //           percent = percent > 90 ? 90 : percent;
+      //         }
+      //
+      //         modal.update({
+      //           content: that.$createElement('div', [
+      //             that.$createElement('p', '姝e湪澶勭悊鍒�鍏峰叆搴擄紝璇风◢鍊�...'),
+      //             that.$createElement('a-progress', {
+      //               props: {
+      //                 percent: percent,
+      //                 status: 'active'
+      //               }
+      //             }),
+      //             // that.$createElement('p', {
+      //             //   style: {
+      //             //     marginTop: '10px'
+      //             //   }
+      //             // }, `杩涘害: ${processedTools}/${totalTools} 鎶婂垁鍏穈)
+      //           ])
+      //         });
+      //       };
+      //
+      //       // 鍙戦�佽姹�
+      //       let httpurl = that.url.submit + '?orderId=' + encodeURIComponent(targetId)
+      //
+      //       return httpAction(httpurl, {}, 'get').then((res) => {
+      //         // 鏍规嵁鍚庣杩斿洖鐨勬�诲垁鍏锋暟璁剧疆杩涘害
+      //         if (res.success) {
+      //           // 濡傛灉鍚庣杩斿洖浜嗘�诲垁鍏锋暟
+      //           if (res.result && res.result.quantity !== undefined) {
+      //             totalTools = res.result.quantity;
+      //             processedTools = res.result.totalSubmitted || 0; //宸插鐞嗗垁鍏锋暟
+      //           }
+      //           // 濡傛灉鍚庣杩斿洖浜嗘槑缁嗗垪琛紝鏍规嵁receive_number璁$畻鎬绘暟閲�
+      //           else if (res.result && res.result.detailList) {
+      //             // 鏍规嵁姣忎釜鏄庣粏鐨剅eceive_number绱姞璁$畻鎬诲垁鍏锋暟
+      //             totalTools = res.result.detailList.reduce((total, detail) => {
+      //               return total + (detail.receiveNumber || 0);
+      //             }, 0);
+      //             processedTools = totalTools; // 宸插鐞嗘暟閲�
+      //           }
+      //
+      //           // 鏇存柊杩涘害鏄剧ず
+      //           percent = 100; // 鐩存帴鏄剧ず100%瀹屾垚
+      //           updateProgress();
+      //
+      //           // 鏄剧ず瀹屾垚鐘舵��
+      //           setTimeout(() => {
+      //             modal.update({
+      //               content: that.$createElement('div', [
+      //                 that.$createElement('p', '姝e湪澶勭悊鍒�鍏峰叆搴擄紝璇风◢鍊�...'),
+      //                 that.$createElement('a-progress', {
+      //                   props: {
+      //                     percent: percent,
+      //                     status: 'success'
+      //                   }
+      //                 }),
+      //                 that.$createElement('p', {
+      //                   style: {
+      //                     marginTop: '10px'
+      //                   }
+      //                 }, totalTools > 0 ?
+      //                   `杩涘害: ${processedTools}/${totalTools} 鎶婂垁鍏穈 :
+      //                   '澶勭悊瀹屾垚')
+      //               ])
+      //             });
+      //
+      //             // 寤惰繜鍏抽棴妯℃�佹
+      //             setTimeout(() => {
+      //               modal.destroy();
+      //               that.$message.success(res.message || '鎻愪氦鎴愬姛');
+      //               that.loadData();
+      //             }, 500);
+      //           }, 300);
+      //         } else {
+      //           // 澶勭悊閿欒鎯呭喌
+      //           modal.destroy();
+      //           that.$message.warning(res.message || '鎻愪氦澶辫触');
+      //         }
+      //       }).catch(error => {
+      //         modal.destroy();
+      //         that.$message.error('鎻愪氦澶辫触: ' + error.message)
+      //       }).finally(() => {
+      //         that.loading = false
+      //       })
+      //     }
+      //   })
       // },
+
+
     }
   }
 </script>
diff --git a/src/views/cms/CuttingInventoryList.vue b/src/views/cms/CuttingInventoryList.vue
index 65b96c9..b1a972f 100644
--- a/src/views/cms/CuttingInventoryList.vue
+++ b/src/views/cms/CuttingInventoryList.vue
@@ -108,8 +108,23 @@
             </a-menu>
           </a-dropdown>
         </span>
-
       </a-table>
+    </div>
+    <!-- 搴撳瓨缁熻琛ㄦ牸 -->
+    <div style="margin-top: 20px;">
+      <a-card title="搴撳瓨缁熻">
+        <a-table
+          :pagination="statisticsPagination"
+          :columns="statisticsColumns"/>in
+          :dataSource="statisticsData"
+          :loading="statisticsLoading"
+          bordered
+          size="middle">
+          <span slot="inventoryStatus" slot-scope="text">
+            <a-tag :color="getTagColor(text)">{{ text }}</a-tag>
+          </span>
+        />
+      </a-card>
     </div>
 
     <cutting-inventory-modal ref="modalForm" @ok="modalFormOk"></cutting-inventory-modal>
@@ -147,7 +162,7 @@
           {
             title:'鍒�鍏风紪鐮�',
             align:"center",
-            dataIndex: 'cuttingId'
+            dataIndex: 'cuttingId_dictText'
           },
           {
             title:'鍒�鍏锋潯鐮�',
@@ -173,20 +188,80 @@
           //   scopedSlots: { customRender: 'action' }
           // }
         ],
+        // 缁熻琛ㄦ牸鍒楀畾涔�
+        statisticsColumns: [
+          {
+            title:'鍒�鍏风紪鐮�',
+            align:"center",
+            dataIndex: 'cuttingCode',
+            customRender: (text, record, index) => {
+              const obj = {
+                children: text,
+                attrs: {}
+              };
+              // 璁剧疆鍚堝苟閫昏緫
+              if (record.rowSpan !== undefined) {
+                obj.attrs.rowSpan = record.rowSpan;
+              } else {
+                obj.attrs.rowSpan = 1;
+              }
+              return obj;
+            }
+          },
+          {
+            title: '搴撳瓨鐘舵��',
+            dataIndex: 'inventoryStatus',
+            align: "center",
+          },
+          {
+            title: '鏁伴噺',
+            dataIndex: 'cuttingIdNumber',
+            align: "center"
+          }
+        ],
         url: {
           list: "/cms/cuttingInventory/list",
           delete: "/cms/cuttingInventory/delete",
           deleteBatch: "/cms/cuttingInventory/deleteBatch",
           exportXlsUrl: "/cms/cuttingInventory/exportXls",
           importExcelUrl: "cms/cuttingInventory/importExcel",
-          
+          statistics: "/cms/cuttingInventory/statistics" // 娣诲姞缁熻鎺ュ彛鍦板潃
         },
         dictOptions:{},
         superFieldList:[],
+        // 缁熻鏁版嵁
+        statisticsData: [],
+        statisticsLoading: false,
+
+        // 涓轰富琛ㄦ牸淇濈暀鍘熸湁鐨勫垎椤甸厤缃�
+        ipagination: {
+          current: 1,
+          pageSize: 10,
+          pageSizeOptions: ['10', '20', '30'],
+          showTotal: (total, range) => {
+            return range[0] + '-' + range[1] + ' 鍏�' + total + '鏉�'
+          },
+          showQuickJumper: true,
+          showSizeChanger: true,
+          total: 0
+        },
+        // 涓虹粺璁¤〃鏍兼坊鍔犲崟鐙殑鍒嗛〉閰嶇疆
+        statisticsPagination: {
+          current: 1,
+          pageSize: 10,
+          pageSizeOptions: ['10', '20', '30'],
+          showTotal: (total, range) => {
+            return range[0] + '-' + range[1] + ' 鍏�' + total + '鏉�'
+          },
+          showQuickJumper: true,
+          showSizeChanger: true,
+          total: 0
+        }
       }
     },
     created() {
-    this.getSuperFieldList();
+      this.getSuperFieldList();
+      this.loadStatisticsData();
     },
     computed: {
       importExcelUrl: function(){
@@ -203,8 +278,133 @@
         fieldList.push({type:'string',value:'inventoryStatus',text:'搴撳瓨鐘舵��'})
         fieldList.push({type:'number',value:'currentLife',text:'褰撳墠瀵垮懡(鐧惧垎姣�)'})
         this.superFieldList = fieldList
+      },
+      // 鍔犺浇缁熻淇℃伅
+      loadStatisticsData() {
+        this.statisticsLoading = true;
+        // 璋冪敤鍚庣鎺ュ彛鑾峰彇缁熻鏁版嵁
+        this.$http({
+          url: this.url.statistics,
+          method: "get",
+          params: {
+            ...this.getQueryParams(),
+            pageNo: this.statisticsPagination.current,
+            pageSize: this.statisticsPagination.pageSize
+          }
+        }).then((res) => {
+          if (res.success) {
+            // 鏇存柊缁熻琛ㄦ牸鐨勫垎椤垫�绘暟
+            this.statisticsPagination.total = res.result.total;
+            // 瀵规暟鎹繘琛屽悎骞跺鐞嗭紝浣跨敤 res.result.records 鑰屼笉鏄� res.result
+            this.statisticsData = this.mergeStatisticsData(res.result.records);
+          }
+          this.statisticsLoading = false;
+        }).catch(() => {
+          this.statisticsLoading = false;
+        });
+      },
+
+      // 鏍规嵁鐘舵�佽繑鍥炴爣绛鹃鑹�
+      getTagColor(status) {
+        const colorMap = {
+          '姝e父': 'green',
+          '宸插嚭搴�': 'orange',
+        };
+        return colorMap[status];
+      },
+
+      // 閲嶅啓鎼滅储鏂规硶锛屽湪鎼滅储瀹屾垚鍚庡姞杞界粺璁′俊鎭�
+      searchQuery() {
+        this.loadData(1);
+        // 鎼滅储瀹屾垚鍚庡姞杞界粺璁′俊鎭�
+        this.$nextTick(() => {
+          this.loadStatisticsData();
+        });
+      },
+
+      // 閲嶅啓閲嶇疆鏂规硶
+      searchReset() {
+        this.queryParam = {};
+        this.loadData(1);
+        this.$nextTick(() => {
+          this.loadStatisticsData();
+        });
+      },
+
+      // 閲嶅啓鍔犺浇鏁版嵁鏂规硶
+      loadData(arg) {
+        if (arg === 1) {
+          this.ipagination.current = 1;
+        }
+        var params = this.getQueryParams();//鏌ヨ鏉′欢
+        this.loading = true;
+        this.$http({
+          url: this.url.list,
+          method: "get",
+          params: params
+        }).then((res) => {
+          if (res.success) {
+            this.dataSource = res.result.records;
+            this.ipagination.total = res.result.total;
+
+            // 鍔犺浇缁熻淇℃伅
+            this.loadStatisticsData();
+          }
+          this.loading = false;
+        })
+      },
+      // 鍚堝苟缁熻鏁版嵁鏂规硶
+      mergeStatisticsData(data) {
+        if (!data || data.length === 0) return [];
+
+        const grouped = {};
+
+        // 鎸夊垁鍏风紪鐮佸垎缁�
+        data.forEach(item => {
+          const key = item.cuttingCode;
+          if (!grouped[key]) {
+            grouped[key] = {
+              cuttingCode: item.cuttingCode,
+              cuttingId: item.cuttingId,
+              statuses: []
+            };
+          }
+          // 浣跨敤 item.inventoryStatus 鍜� item.cuttingIdNumber
+          grouped[key].statuses.push({
+            status: item.inventoryStatus,
+            count: item.cuttingIdNumber
+          });
+        });
+
+        // 杞崲涓鸿〃鏍奸渶瑕佺殑鏍煎紡锛屽苟娣诲姞琛屽悎骞朵俊鎭�
+        const result = [];
+        Object.values(grouped).forEach(group => {
+          const statuses = group.statuses;
+          const totalCount = statuses.reduce((sum, s) => sum + s.count, 0);
+
+          // 绗竴琛屾樉绀哄垁鍏风紪鐮侊紝璁剧疆rowSpan
+          result.push({
+            cuttingCode: group.cuttingCode,
+            cuttingId: group.cuttingId,
+            inventoryStatus: `${statuses[0].status}:${statuses[0].count}`,
+            cuttingIdNumber: totalCount,
+            rowSpan: statuses.length  // 鍚堝苟鐨勮鏁�
+          });
+
+          // 鍓╀綑琛屽彧鏄剧ず鐘舵�佷俊鎭紝鍒�鍏风紪鐮佸垪rowSpan涓�0
+          for (let i = 1; i < statuses.length; i++) {
+            result.push({
+              cuttingCode: group.cuttingCode,
+              cuttingId: group.cuttingId,
+              inventoryStatus: `${statuses[i].status}:${statuses[i].count}`,
+              cuttingIdNumber: totalCount,
+              rowSpan: 0  // 琛ㄧず琚悎骞�
+            });
+          }
+        });
+        return result;
       }
-    }
+    },
   }
 </script>
 <style scoped>
diff --git a/src/views/mes/MesProductionWorkOrderListView.vue b/src/views/mes/MesProductionWorkOrderListView.vue
index ef4e254..0f244cd 100644
--- a/src/views/mes/MesProductionWorkOrderListView.vue
+++ b/src/views/mes/MesProductionWorkOrderListView.vue
@@ -5,26 +5,40 @@
       <a-form layout="inline" @keyup.enter.native="searchQuery">
         <a-row :gutter="24">
           <a-col :xl="6" :lg="7" :md="8" :sm="24">
-            <a-form-item label="宸ュ崟鍙�(浠诲姟鍙�)">
-              <j-input placeholder="璇疯緭鍏ュ伐鍗曞彿(浠诲姟鍙�)" v-model="queryParam.workOrderCode"></j-input>
+            <a-form-item label="浜х嚎">
+              <j-tree-select dict="base_factory,factory_name,id" pid-field="parent_id"
+                             v-model="queryParam.factoryId" style="width: 100%"></j-tree-select>
             </a-form-item>
           </a-col>
           <a-col :xl="6" :lg="7" :md="8" :sm="24">
-            <a-form-item label="鐗╂枡缂栧彿">
-              <j-input placeholder="璇疯緭鍏ョ墿鏂欑紪鍙�" v-model="queryParam.materialNumber"></j-input>
+            <a-form-item label="鐗╂枡缂栫爜">
+              <a-input placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�" v-model="queryParam.materialNumber"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鐗╂枡鍚嶇О">
+              <a-input placeholder="璇疯緭鍏ョ墿鏂欏悕绉�" v-model="queryParam.materialName"></a-input>
             </a-form-item>
           </a-col>
           <template v-if="toggleSearchStatus">
             <a-col :xl="6" :lg="7" :md="8" :sm="24">
               <a-form-item label="宸ュ崟鐘舵��">
-                <j-dict-select-tag dictCode="work_order_status" placeholder="璇疯緭鍏ュ伐鍗曠姸鎬�"
+                <j-dict-select-tag dictCode="work_order_status" placeholder="璇烽�夋嫨宸ュ崟鐘舵��"
                                    v-model="queryParam.workOrderStatus"></j-dict-select-tag>
               </a-form-item>
             </a-col>
             <a-col :xl="6" :lg="7" :md="8" :sm="24">
-              <a-form-item label="閲嶅彂甯冧汉">
-                <j-select-user-by-dep placeholder="璇疯緭鍏ラ噸鍙戝竷浜�"
-                                      v-model="queryParam.republisher"></j-select-user-by-dep>
+              <a-form-item label="宸ュ崟鍙�(浠诲姟鍙�)">
+                <a-input placeholder="璇疯緭鍏ュ伐鍗曞彿(浠诲姟鍙�)" v-model="queryParam.workOrderCode"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="鎺掍骇鏃ユ湡">
+                <a-range-picker
+                  style="width: 100%"
+                  @change="dateRangeChange"
+                  :value="dateRange">
+                </a-range-picker>
               </a-form-item>
             </a-col>
           </template>
@@ -41,8 +55,24 @@
         </a-row>
         <a-row>
           <a-button type="primary" @click="productionSchedule" icon="retweet" style="margin-bottom: 8px">鎺掍骇</a-button>
+          <a-dropdown v-if="selectedRowKeys.length > 1">
+            <a-menu slot="overlay">
+              <a-menu-item key="1" @click="batchPublish">
+                <a-icon type="check"/>
+                鍙戝竷
+              </a-menu-item>
+            </a-menu>
+            <a-button style="margin-left: 8px">
+              鎵归噺鎿嶄綔
+              <a-icon type="down"/>
+            </a-button>
+          </a-dropdown>
         </a-row>
       </a-form>
+    </div>
+    <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+      <i class="anticon anticon-info-circle ant-alert-icon"></i>宸查�夋嫨&nbsp;<a style="font-weight: 600">{{ selectedRowKeys.length }}</a>椤�&nbsp;&nbsp;
+      <a style="margin-left: 24px" @click="onClearSelected">娓呯┖</a>
     </div>
     <a-spin :spinning="confirmLoading">
       <div>
@@ -56,30 +86,11 @@
           :dataSource="dataSource"
           :pagination="ipagination"
           :loading="loading"
-          :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange,type: 'radio'}"
+          :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange,type: 'checkbox'}"
           class="j-table-force-nowrap"
-          @change="handleTableChange">
-
-          <template slot="htmlSlot" slot-scope="text">
-            <div v-html="text"></div>
-          </template>
-          <template slot="imgSlot" slot-scope="text,record">
-            <span v-if="!text" style="font-size: 12px;font-style: italic;">鏃犲浘鐗�</span>
-            <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt=""
-                 style="max-width:80px;font-size: 12px;font-style: italic;" />
-          </template>
-          <template slot="fileSlot" slot-scope="text">
-            <span v-if="!text" style="font-size: 12px;font-style: italic;">鏃犳枃浠�</span>
-            <a-button
-              v-else
-              :ghost="true"
-              type="primary"
-              icon="download"
-              size="small"
-              @click="downloadFile(text)">
-              涓嬭浇
-            </a-button>
-          </template>
+          @change="handleTableChange"
+          :customRow="clickSelect"
+        >
 
           <span slot="action" slot-scope="text, record">
             <span v-if="record.workOrderStatus === 'NEW'">
@@ -95,11 +106,11 @@
               <a-divider type="vertical" />
               <a @click="handleCompletenessCheck(record)">榻愬鎬ф鏌�</a>
             </span>
-            <span v-if="record.workOrderStatus === 'PUBLISHED' && record.equipmentInspectionFlag === '0'">
+            <span v-if="record.workOrderStatus === 'PUBLISHED' && record.completenessCheckFlag === '1' && record.equipmentInspectionFlag === '0'">
               <a-divider type="vertical" />
               <a @click="handleCompletenessCheck(record)">璁惧鐐规</a>
             </span>
-            <span v-if="record.workOrderStatus === 'PUBLISHED' && record.processInspectionFlag === '0'">
+            <span v-if="record.workOrderStatus === 'PUBLISHED' && record.completenessCheckFlag === '1' && record.equipmentInspectionFlag === '1' && record.processInspectionFlag === '0'">
               <a-divider type="vertical" />
               <a @click="handleCompletenessCheck(record)">宸ヨ壓鐐规</a>
             </span>
@@ -130,65 +141,45 @@
               </a-menu-item>
             </a-menu>
           </a-dropdown>
-
         </span>
         </a-table>
       </div>
       <a-tabs v-model="activeKey" @change="handleChangeTabs">
-        <a-tab-pane tab="宸ュ崟鎶ュ伐" :key="refKeys1[0]" :forceRender="true">
-          <div style="display: flex; align-items: center; margin-bottom: 10px;">
-          </div>
-          <j-vxe-table
-            keep-source
-            :ref="refKeys1[0]"
+        <a-tab-pane tab="宸ュ崟鎶ュ伐" :key="tabsRefKeys[0]" :forceRender="true">
+          <a-table
+            :ref="tabsRefKeys[0]"
             :loading="mesWorkReporting.loading"
             :columns="mesWorkReporting.columns"
             :dataSource="mesWorkReporting.dataSource"
-            :maxHeight="300"
-            :rowNumber="true"
-            :rowSelection="true"
-            :toolbar="false">
-            <template slot="showDetail" slot-scope="{row}">
-              <a-button type="primary" @click="handleOrderDetail(row)" size="small">
-                <a-icon type="eye" />璁㈠崟璇︽儏
-              </a-button>
-            </template>
-          </j-vxe-table>
+            :pagination="false"
+            :scroll="{ y: 300 }"
+            size="middle"
+            bordered>
+          </a-table>
         </a-tab-pane>
-        <a-tab-pane tab="涓婁笅鏂欐煡璇�" :key="refKeys3[0]" :forceRender="true">
-          <div style="display: flex; align-items: center; margin-bottom: 10px;">
-          </div>
-          <j-vxe-table
-            keep-source
-            :ref="refKeys3[0]"
+        <a-tab-pane tab="涓婁笅鏂欐煡璇�" :key="tabsRefKeys[1]" :forceRender="true">
+          <a-table
+            :ref="tabsRefKeys[1]"
             :loading="mesMaterialLoading.loading"
             :columns="mesMaterialLoading.columns"
             :dataSource="mesMaterialLoading.dataSource"
-            :maxHeight="300"
-            :rowNumber="true"
-            :rowSelection="true"
-            :toolbar="false">
-            <template slot="showUnloadingDetail" slot-scope="{row}">
-              <a-button type="primary" @click="handleUnLoadingDetail(row)" size="small">
-                <a-icon type="eye" />涓嬫枡璇︽儏
-              </a-button>
-            </template>
-          </j-vxe-table>
+            :pagination="false"
+            :scroll="{ y: 300 }"
+            size="middle"
+            bordered>
+          </a-table>
         </a-tab-pane>
-        <a-tab-pane tab="榻愬鎬ф鏌ヨ褰�" :key="refKeys4[0]" :forceRender="true">
-          <div style="display: flex; align-items: center; margin-bottom: 10px;">
-          </div>
-          <j-vxe-table
-            keep-source
-            :ref="refKeys4[0]"
+        <a-tab-pane tab="榻愬鎬ф鏌ヨ褰�" :key="tabsRefKeys[2]" :forceRender="true">
+          <a-table
+            :ref="tabsRefKeys[2]"
             :loading="mesKittingCompletenessCheck.loading"
             :columns="mesKittingCompletenessCheck.columns"
             :dataSource="mesKittingCompletenessCheck.dataSource"
-            :maxHeight="300"
-            :rowNumber="true"
-            :rowSelection="true"
-            :toolbar="false"
-          />
+            :pagination="false"
+            :scroll="{ y: 300 }"
+            size="middle"
+            bordered>
+          </a-table>
         </a-tab-pane>
       </a-tabs>
     </a-spin>
@@ -208,8 +199,6 @@
 import { mixinDevice } from '@/utils/mixin'
 import { JeecgListMixin } from '@/mixins/JeecgListMixin'
 import MesProductionWorkOrderModal from './modules/MesProductionWorkOrderModal'
-import { JVxeTableModelMixin } from '@/mixins/JVxeTableModelMixin.js'
-import { JVXETypes } from '@/components/jeecg/JVxeTable'
 import { filterMultiDictText } from '@/components/dict/JDictSelectUtil'
 import { getAction, requestPut } from '@api/manage'
 import MesProductionOrderModal from '@views/mes/modules/MesProductionOrderModal.vue'
@@ -218,11 +207,14 @@
 import MesProductionWorkOrderRepublishModal from '@views/mes/modules/MesProductionWorkOrderRepublishModal.vue'
 import MesProductionWorkOrderReportModal from '@views/mes/modules/MesProductionWorkOrderReportModal.vue'
 import MesProductionWorkOrderCompletenessCheckModal from '@views/mes/modules/MesProductionWorkOrderCompletenessCheckModal.vue'
+import JSelectFactory from '@comp/jeecgbiz/JSelectFactory.vue'
+import moment from 'moment/moment'
 
 export default {
   name: 'MesProductionWorkOrderList',
-  mixins: [JeecgListMixin, mixinDevice, JVxeTableModelMixin, JVXETypes],
+  mixins: [JeecgListMixin, mixinDevice],
   components: {
+    JSelectFactory,
     MesProductionWorkOrderModal,
     MesProductionOrderModal,
     MesMaterialUnloadingList,
@@ -235,15 +227,20 @@
     return {
       description: '鎺掍骇宸ュ崟绠$悊椤甸潰',
       activeKey : 'mesWorkReporting',
-      // 宸ュ崟鎶ュ伐
-      refKeys1: ['mesWorkReporting'],
-      tableKeys1: ['mesWorkReporting'],
-      //涓婃枡
-      refKeys3: ['mesMaterialLoading'],
-      tableKeys3: ['mesMaterialLoading'],
-      //榻愬鎬ф鏌ヨ褰�
-      refKeys4: ['mesKittingCompletenessCheck'],
-      tableKeys4: ['mesKittingCompletenessCheck'],
+      confirmLoading: false,
+      tabsRefKeys: ['mesWorkReporting', 'mesMaterialLoading', 'mesKittingCompletenessCheck'],
+      /* 鍒嗛〉鍙傛暟 */
+      ipagination:{
+        current: 1,
+        pageSize: 5,
+        pageSizeOptions: ['5', '10', '20'],
+        showTotal: (total, range) => {
+          return range[0] + "-" + range[1] + " 鍏�" + total + "鏉�"
+        },
+        showQuickJumper: true,
+        showSizeChanger: true,
+        total: 0
+      },
       // 琛ㄥご
       columns: [
         {
@@ -340,93 +337,65 @@
         dataSource: [],
         columns: [
           {
-            title: '鎿嶄綔',
-            key: 'action',
-            type: JVXETypes.slot,
-            slotName: 'showDetail',
-            width: '120px',
-            align: 'center'
+            title: '#',
+            dataIndex: '',
+            key: 'rowIndex',
+            width: 60,
+            align: 'center',
+            customRender: function(t, r, index) {
+              return parseInt(index) + 1
+            }
           },
           {
             title: '璁㈠崟鍙�',
-            key: 'orderCode',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'orderCode'
           },
           {
             title: '宸ュ崟鍙�',
-            key: 'workOrderCode',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'workOrderCode'
           },
           {
             title: '浜х嚎鍚嶇О',
-            key: 'factoryName',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'factoryName'
           },
           {
             title: '鎵规鍙�',
-            key: 'batchNumber',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'batchNumber'
           },
           {
             title: '鎵樺彿',
-            key: 'palletNumber',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'palletNumber'
           },
           {
             title: '鏁伴噺',
-            key: 'quantity',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'quantity'
           },
           {
             title: '鎶ュ伐浜�',
-            key: 'reporter',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'reporter'
           },
           {
             title: '鎶ュ伐鏃堕棿',
-            key: 'reportTime',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'reportTime'
           },
           {
             title: '绾胯竟浠撳悕绉�',
-            key: 'warehouseName',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'warehouseName'
           },
-          {
-            title: '鎴愬搧涓嬬嚎鎵撳嵃鐘舵��',
-            key: 'printStatus',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
-          },
+          // {
+          //   title: '鎴愬搧涓嬬嚎鎵撳嵃鐘舵��',
+          //   align: 'center',
+          //   dataIndex: 'printStatus'
+          // }
         ]
       },
       mesMaterialLoading: {
@@ -434,85 +403,60 @@
         dataSource: [],
         columns: [
           {
-            title: '鎿嶄綔',
-            key: 'action',
-            type: JVXETypes.slot,
-            slotName: 'showUnloadingDetail',
-            width: '120px',
-            align: 'center'
+            title: '#',
+            dataIndex: '',
+            key: 'rowIndex',
+            width: 60,
+            align: 'center',
+            customRender: function(t, r, index) {
+              return parseInt(index) + 1
+            }
           },
           {
             title: '宸ュ崟鍙�',
-            key: 'workOrderCode',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'workOrderCode'
           },
           {
-            title: '璁惧ID',
-            key: 'equipmentId',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            title: '璁惧',
+            align: 'center',
+            dataIndex: 'equipmentId'
           },
           {
             title: '宸ュ簭缂栫爜',
-            key: 'processCode',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'processCode'
           },
           {
             title: '宸ュ簭鍚嶇О',
-            key: 'processName',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'processName'
           },
           {
             title: '鐗╂枡缂栫爜',
-            key: 'materialNumber',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'materialNumber'
           },
           {
             title: '鐗╂枡鍚嶇О',
-            key: 'materialName',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'materialName'
           },
           {
             title: '鎵规鍙�',
-            key: 'batchNumber',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'batchNumber'
           },
           {
             title: '鏁伴噺',
-            key: 'quantity',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'quantity'
           },
           {
             title: '鍓╀綑鏁伴噺',
-            key: 'remainingQuantity',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
-          },
+            align: 'center',
+            dataIndex: 'remainingQuantity'
+          }
         ]
       },
       mesKittingCompletenessCheck: {
@@ -520,53 +464,48 @@
         dataSource: [],
         columns: [
           {
+            title: '#',
+            dataIndex: '',
+            key: 'rowIndex',
+            width: 60,
+            align: 'center',
+            customRender: function(t, r, index) {
+              return parseInt(index) + 1
+            }
+          },
+          {
             title: '宸ュ崟鍙�',
-            key: 'workOrderCode',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'workOrderCode'
           },
           {
             title: '鐗╂枡缂栧彿',
-            key: 'materialNumber',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'materialNumber'
           },
           {
             title: '鐗╂枡鍚嶇О',
-            key: 'materialName',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'materialName'
           },
           {
             title: '闇�姹傛暟閲�',
-            key: 'requiredQuantity',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'requiredQuantity'
           },
           {
             title: '瀹為檯鏁伴噺',
-            key: 'actualQuantity',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
+            align: 'center',
+            dataIndex: 'actualQuantity'
           },
           {
             title: '鏄惁榻愬',
-            key: 'checkFlag',
-            type: JVXETypes.input,
-            width: '200px',
-            placeholder: '璇疯緭鍏�${title}',
-            defaultValue: ''
-          },
+            align: 'center',
+            dataIndex: 'checkFlag',
+            customRender: function(text) {
+              return text === '0' ? '鍚�' : text === '1' ? '鏄�' : ''
+            }
+          }
         ]
       },
       url: {
@@ -584,21 +523,96 @@
         execute: '/mes/mesProductionWorkOrder/execute',
       },
       dictOptions: {},
-      superFieldList: []
+      superFieldList: [],
+      dateRange: []
     }
   },
   created() {
     this.getSuperFieldList()
   },
   computed: {
+    tabsKeyMap() {
+      return {
+        mesWorkReporting: {
+          url: this.url.queryWorkReportingByWorkOrderId,
+          loading: this.mesWorkReporting.loading,
+          data: this.mesWorkReporting.dataSource,
+          setLoading: (loading) => { this.mesWorkReporting.loading = loading },
+          setData: (data) => { this.mesWorkReporting.dataSource = data }
+        },
+        mesMaterialLoading: {
+          url: this.url.queryLoadingByWorkOrderId,
+          loading: this.mesMaterialLoading.loading,
+          data: this.mesMaterialLoading.dataSource,
+          setLoading: (loading) => { this.mesMaterialLoading.loading = loading },
+          setData: (data) => { this.mesMaterialLoading.dataSource = data }
+        },
+        mesKittingCompletenessCheck: {
+          url: this.url.queryCompletenessCheckByWorkOrderId,
+          loading: this.mesKittingCompletenessCheck.loading,
+          data: this.mesKittingCompletenessCheck.dataSource,
+          setLoading: (loading) => { this.mesKittingCompletenessCheck.loading = loading },
+          setData: (data) => { this.mesKittingCompletenessCheck.dataSource = data }
+        }
+      }
+    },
     importExcelUrl: function() {
       return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
     }
   },
   methods: {
+    handleChangeTabs(key) {
+      this.activeKey = key
+      this.selectTabData(key, this.selectedRowKeys[0])
+    },
+    clickSelect(record) {
+      return {
+        on: {
+          click: () => {
+            this.selectedRowKeys = [record.id]
+            this.selectTabData(this.activeKey, record.id)
+          }
+        }
+      }
+    },
+    selectTabData(tabKey, workOrderId) {
+      const tab = this.tabsKeyMap[tabKey]
+      if (tab) {
+        tab.setLoading(true)
+        getAction(tab.url, { workOrderId: workOrderId }).then(res => {
+          if (res.success) {
+            tab.setData(res.result || [])
+          }
+        }).catch(error => {
+          console.error('Error loading tab data:', error)
+          tab.setData([])
+        }).finally(() => {
+          tab.setLoading(false)
+        })
+      }
+    },
+    searchReset() {
+      this.queryParam = {}
+      this.dateRange = []
+      this.loadData(1);
+    },
+    dateRangeChange(dates, dateStrings) {
+      this.dateRange = dates
+      this.queryParam.startDate = dateStrings[0]
+      this.queryParam.endDate = dateStrings[1]
+    },
     productionSchedule() {
       this.$refs.MesProductionWorkOrderScheduleModal.scheduleOpen()
     },
+    batchPublish() {
+      if (this.selectedRowKeys.length < 1) {
+        this.$message.warning('璇烽�夋嫨澶氭潯璁板綍锛�')
+        return
+      }
+      const ids = this.selectedRowKeys.join(',')
+      this.handlePublish(ids)
+      this.selectedRowKeys = []
+    },
     handlePublish(id) {
       requestPut(this.url.publish, null, { ids: id }).then((res) => {
         if (res.success) {
diff --git a/src/views/mes/modules/MesProductionWorkOrderReportModal.vue b/src/views/mes/modules/MesProductionWorkOrderReportModal.vue
index 2aa862a..5d45778 100644
--- a/src/views/mes/modules/MesProductionWorkOrderReportModal.vue
+++ b/src/views/mes/modules/MesProductionWorkOrderReportModal.vue
@@ -171,8 +171,8 @@
       });
     },
     // 鎵撳嵃鏍囩
-    printLabel() {
-      this.generateQRCode('鎴愬搧鎵樻爣绛�'); // 鍏堢敓鎴愪簩缁寸爜
+    printLabel(palletNumber) {
+      this.generateQRCode(palletNumber); // 鍏堢敓鎴愪簩缁寸爜
       setTimeout(() => {
         printJS({
           printable: 'printLabel',
@@ -279,7 +279,7 @@
                 }
                 //鎴愬搧鎵樻爣绛炬墦鍗�
                 this.$nextTick(() => {
-                  this.printLabel()
+                  this.printLabel(data.palletNumber)
                 })
               }
               this.submitCallback()

--
Gitblit v1.9.3