From e9f8d23f55f64903d834308f9f167aaf3195c20d Mon Sep 17 00:00:00 2001
From: chenlu <1320612696@qq.com>
Date: 星期三, 30 七月 2025 09:10:26 +0800
Subject: [PATCH] Merge branch 'master' of http://10.153.19.25:10105/r/ERP_override

---
 north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue                                 |    5 
 north-glass-erp/src/main/resources/mapper/sd/ProductMapper.xml                                    |   10 
 north-glass-erp/northglass-erp/src/views/pp/report/ProcessToBeCompleted.vue                       |    9 
 north-glass-erp/northglass-erp/src/utils/decimal.js                                               |    8 
 north-glass-erp/src/main/resources/mapper/sd/OrderGlassDetailMapper.xml                           |   30 
 north-glass-erp/src/main/resources/mapper/sd/OrderMapper.xml                                      |   23 
 north-glass-erp/northglass-erp/src/lang/zh.js                                                     |   27 
 north-glass-erp/northglass-erp/src/views/mm/ingredientStock/CreateOutBound.vue                    |  121 
 north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportMapper.java                         |   38 
 north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderProcessDetailMapper.java             |    6 
 north-glass-erp/northglass-erp/src/views/sd/order/UpdateOrderCraft.vue                            |  865 +++
 north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue                          |    3 
 north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml                                         |  542 ++
 north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet1.vue                         |    6 
 north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyang.vue                   |  405 +
 north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintFlowCard.vue                   |   11 
 north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelDetails.vue                      |    9 
 north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderDetail.java                          |    3 
 north-glass-erp/northglass-erp/src/views/mm/productStock/CreateProductStock.vue                   |    4 
 north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialOutbound.java                     |    2 
 north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderMapper.java                          |    8 
 north-glass-erp/northglass-erp/src/views/pp/report/DamageReport.vue                               |  144 
 north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedOperateLog.java                   |    3 
 north-glass-erp/northglass-erp/src/components/sd/order/UploadPicture.vue                          |    2 
 north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue                        |  259 
 north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml                                    |   42 
 north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintProject.vue                    |   37 
 north-glass-erp/northglass-erp/src/views/pp/report/Report.vue                                     |    1 
 north-glass-erp/northglass-erp/src/views/pp/replenish/PrintReplenishFlowCard.vue                  |    1 
 north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedGoodsInventoryMapper.java         |    7 
 north-glass-erp/src/main/java/com/example/erp/mapper/sd/BasicDataMapper.java                      |    6 
 north-glass-erp/northglass-erp/src/views/mm/productStock/FinishedProductOut.vue                   |    2 
 north-glass-erp/northglass-erp/src/views/mm/productStock/ProductStockList.vue                     |   53 
 north-glass-erp/package-lock.json                                                                 |    6 
 north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCardDetails.vue                  |   43 
 north-glass-erp/northglass-erp/src/views/sd/order/CreateOrder.vue                                 |   72 
 north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductMapper.java                        |    2 
 north-glass-erp/src/main/java/com/example/erp/service/mm/FinishedGoodsInventoryService.java       |  109 
 north-glass-erp/src/main/java/com/example/erp/service/pp/ProductionSchedulingService.java         |    2 
 north-glass-erp/src/main/java/com/example/erp/mapper/mm/BasicWarehouseTypeMapper.java             |    2 
 north-glass-erp/src/main/resources/mapper/mm/MaterialInventory.xml                                |   96 
 north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportingWorkMapper.java                  |    2 
 north-glass-erp/northglass-erp/src/views/pp/processCard/SelectProcessCard.vue                     |   46 
 north-glass-erp/src/main/resources/mapper/pp/ReportingWork.xml                                    |   53 
 north-glass-erp/northglass-erp/src/views/mm/stockReport/MaterialOutboundReport.vue                |    4 
 north-glass-erp/src/main/resources/mapper/sd/BasicDataMapper.xml                                  |    2 
 north-glass-erp/src/main/java/com/example/erp/controller/mm/MaterialInventoryController.java      |   15 
 north-glass-erp/northglass-erp/src/views/sd/delivery/CreateDelivery.vue                           |    1 
 north-glass-erp/src/main/java/com/example/erp/controller/mm/BasicWarehouseTypeController.java     |    8 
 north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductDetailMapper.java                  |    2 
 north-glass-erp/src/main/java/com/example/erp/mapper/pp/FlowCardMapper.java                       |   26 
 north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java                  |    1 
 north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderGlassDetailMapper.java               |    5 
 north-glass-erp/northglass-erp/src/utils/requestTemp.js                                           |   59 
 north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet2.vue                            |    4 
 north-glass-erp/src/main/java/com/example/erp/dto/pp/TeamOutputDTO.java                           |    4 
 north-glass-erp/northglass-erp/src/views/mm/basicData/WarehouseBasicData.vue                      |    1 
 north-glass-erp/northglass-erp/package-lock.json                                                  | 1512 +++++++
 north-glass-erp/northglass-erp/src/stores/sd/companySet/常州吉利.js                                   |   20 
 north-glass-erp/src/main/java/com/example/erp/entity/sd/DeliveryDetail.java                       |    1 
 north-glass-erp/src/main/resources/mapper/sd/OrderProcessDetailMapper.xml                         |   10 
 north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportingWorkController.java          |   12 
 north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressDTO.java                       |    2 
 north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedOperateLogMapper.java             |   10 
 north-glass-erp/northglass-erp/src/stores/sd/companySet/金华天成.js                                   |   22 
 north-glass-erp/northglass-erp/src/views/sd/delivery/SelectDelivery.vue                           |  157 
 north-glass-erp/src/main/java/com/example/erp/controller/mm/FinishedGoodsInventoryController.java |    8 
 north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecordPint.vue                    |   51 
 north-glass-erp/src/main/java/com/example/erp/controller/pp/ProcessCardController.java            |   41 
 north-glass-erp/northglass-erp/src/views/pp/report/TaskCompletionStatus.vue                       |   24 
 north-glass-erp/src/main/java/com/example/erp/service/mm/MaterialInventoryService.java            |  176 
 north-glass-erp/src/main/resources/mapper/mm/FinishedOperateLog.xml                               |  138 
 north-glass-erp/src/main/resources/mapper/sd/OrderDetailMapper.xml                                |   10 
 north-glass-erp/northglass-erp/src/components/sd/order/UpdateAlienEditor.vue                      |  577 ++
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCardDetail.vue              |   13 
 north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressCombinationDTO.java            |   19 
 north-glass-erp/northglass-erp/src/utils/request.js                                               |    2 
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/Compute.vue                        |    7 
 north-glass-erp/src/main/java/com/example/erp/dto/pp/DamageReportDTO.java                         |    2 
 north-glass-erp/src/main/resources/mapper/sd/DeliveryMapper.xml                                   |    4 
 north-glass-erp/northglass-erp/src/components/mm/PrintPackingListLuoyang.vue                      |  373 +
 north-glass-erp/northglass-erp/src/lang/ar.js                                                     |   13 
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue                    |   14 
 north-glass-erp/northglass-erp/src/stores/sd/companySet/新疆恒鑫.js                                   |   21 
 north-glass-erp/northglass-erp/src/views/mm/ingredientStock/MaterialOutbound.vue                  |    2 
 north-glass-erp/src/main/java/com/example/erp/mapper/sd/DeliveryDetailMapper.java                 |   10 
 north-glass-erp/src/main/resources/mapper/pp/Report.xml                                           |  972 ++++
 north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgress.vue                             |  126 
 north-glass-erp/src/main/java/com/example/erp/controller/sd/OrderController.java                  |   15 
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue                  |   10 
 north-glass-erp/src/main/java/com/example/erp/mapper/mm/MaterialInventoryMapper.java              |    2 
 north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java                |    8 
 north-glass-erp/src/main/java/com/example/erp/dto/pp/FlowCardDTO.java                             |   51 
 north-glass-erp/northglass-erp/src/views/pp/processCard/PrintLabel.vue                            |  202 
 north-glass-erp/northglass-erp/src/views/mm/ingredientStock/SelectIngredientsStock.vue            |   90 
 north-glass-erp/northglass-erp/src/views/pp/report/SplittingDetailsOutside.vue                    |   26 
 north-glass-erp/northglass-erp/src/components/sd/order/OrderProcess.vue                           |   63 
 north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderGlassDetail.java                     |    2 
 north-glass-erp/src/main/java/com/example/erp/service/pp/ReportService.java                       |  396 +
 north-glass-erp/northglass-erp/src/components/mm/PrintPackingList.vue                             |    8 
 north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet2.vue                         |    5 
 north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet3.vue                            |    3 
 north-glass-erp/src/test/java/com/example/erp/service/sd/BasicDataServiceTest.java                |    7 
 north-glass-erp/src/main/java/com/example/erp/controller/sd/BasicDataController.java              |   24 
 north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java                |   36 
 north-glass-erp/src/main/resources/mapper/pp/ReworkMapper.xml                                     |    1 
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/GlassComputed.vue                       |  250 
 north-glass-erp/src/main/resources/application.yml                                                |    4 
 north-glass-erp/northglass-erp/src/components/pp/TagStyleDesigner.vue                             |   69 
 north-glass-erp/src/main/java/com/example/erp/controller/pp/GlassOptimizeController.java          |   10 
 north-glass-erp/src/main/java/com/example/erp/service/pp/ReworkService.java                       |    2 
 north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderDetailMapper.java                    |    2 
 north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedGoodsInventory.java               |    3 
 north-glass-erp/src/main/java/com/example/erp/service/sd/DeliveryService.java                     |   26 
 north-glass-erp/northglass-erp/src/stores/sd/companySet/天津北玻.js                                   |   24 
 north-glass-erp/northglass-erp/src/views/pp/report/TeamOutput.vue                                 |  135 
 north-glass-erp/src/main/java/com/example/erp/service/pp/FlowCardService.java                     |  175 
 north-glass-erp/northglass-erp/src/router/index.js                                                |   21 
 north-glass-erp/northglass-erp/src/components/pp/PrintProcess.vue                                 |   88 
 north-glass-erp/northglass-erp/src/lang/en.js                                                     |   13 
 north-glass-erp/src/main/resources/mapper/sd/DeliveryDetailMapper.xml                             |  200 
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ComputeCard.vue                    |    2 
 north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecord.vue                        |   10 
 north-glass-erp/northglass-erp/src/views/pp/report/OrderReportingWorks.vue                        |    7 
 north-glass-erp/src/main/resources/mapper/sd/ProductDetailMapper.xml                              |    8 
 north-glass-erp/northglass-erp/src/components/mm/materialOutbound/PrintSheet1.vue                 |    2 
 north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgressCombination.vue                  |  467 ++
 north-glass-erp/src/main/java/com/example/erp/service/sd/BasicDataService.java                    |   29 
 north-glass-erp/northglass-erp/config.js                                                          |   17 
 north-glass-erp/northglass-erp/src/views/sd/product/CreateProduct.vue                             |   15 
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue                       |   17 
 north-glass-erp/northglass-erp/src/components/pp/PrintProcessReplenish.vue                        |   50 
 north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyangDetails.vue            |  486 ++
 north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue                   |  242 +
 north-glass-erp/src/main/java/com/example/erp/service/sd/OrderService.java                        |  117 
 north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportController.java                 |   63 
 north-glass-erp/src/main/java/com/example/erp/service/mm/BasicWarehouseTypeService.java           |   11 
 north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReworkMapper.java                         |    5 
 north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCard.vue                         |  152 
 north-glass-erp/src/main/resources/mapper/mm/BasicWarehouseType.xml                               |    4 
 north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialLog.java                          |    2 
 north-glass-erp/northglass-erp/src/views/mm/basicData/canvas.vue                                  |  696 +++
 north-glass-erp/northglass-erp/src/stores/sd/companySet/洛阳北玻.js                                   |  138 
 north-glass-erp/northglass-erp/package.json                                                       |    4 
 north-glass-erp/northglass-erp/src/lang/ru.js                                                     |   14 
 north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue                         |    4 
 north-glass-erp/northglass-erp/src/lang/kr.js                                                     |   11 
 north-glass-erp/src/main/resources/application-prod.yml                                           |   49 
 north-glass-erp/src/main/resources/mapper/mm/FinishedGoodsInventory.xml                           |  110 
 149 files changed, 11,221 insertions(+), 1,088 deletions(-)

diff --git a/north-glass-erp/northglass-erp/config.js b/north-glass-erp/northglass-erp/config.js
index b5ebb12..6c6405a 100644
--- a/north-glass-erp/northglass-erp/config.js
+++ b/north-glass-erp/northglass-erp/config.js
@@ -1,18 +1,5 @@
 export default {
-  //serverUrl:"localhost:8086"
-  //鏂扮枂鏈嶅姟鍣�
-  //serverUrl:"192.168.2.144:8086"
-  //甯稿窞鏈嶅姟鍣�
+  serverUrl:"localhost:8086",
+  serverUrlTemp:"10.153.19.150:8079",
   //serverUrl:"192.168.1.199:8086"
-  //涓婃捣鏈嶅姟鍣�
-  //serverUrl:"10.153.19.150:8086"
-  //澶╂触鐢熶骇閮�
-  //serverUrl:"192.168.150.41:8086"
-  //澶╂触鏈嶅姟鍣�
-  //serverUrl:"192.168.150.39:8086"
-  //澶╂触娴嬭瘯绔�
-  //serverUrl:"192.168.150.39:8087"
-  //涔変箤鏈嶅姟鍣�
-  serverUrl:"192.168.0.39:8086"
-
 }
diff --git a/north-glass-erp/northglass-erp/package-lock.json b/north-glass-erp/northglass-erp/package-lock.json
index 8f8069c..903df15 100644
--- a/north-glass-erp/northglass-erp/package-lock.json
+++ b/north-glass-erp/northglass-erp/package-lock.json
@@ -12,8 +12,12 @@
         "@vue-macros/reactivity-transform": "^0.3.23",
         "axios": "^1.5.1",
         "decimal.js": "^10.4.3",
+        "dxf-parser": "^1.1.2",
+        "dxf-writer": "^1.18.4",
         "element-plus": "^2.9.3",
         "file-saver": "^2.0.5",
+        "leafer-ui": "^1.8.0",
+        "leaflet": "^1.9.4",
         "moment": "^2.30.1",
         "northglass-erp": "file:",
         "pinia": "^2.1.6",
@@ -759,6 +763,461 @@
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
     },
+    "node_modules/@leafer-in/interface": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-in/interface/-/interface-1.8.0.tgz",
+      "integrity": "sha512-j4ucPjPX8/TBIID1RPHv6CA1KtiIh56igvrHBYHd44NS1tzKWhsswKUVRrzK0nqeSh1VL4SzGZgiQNwZq56R4A==",
+      "peerDependencies": {
+        "@leafer-ui/interface": "^1.8.0",
+        "@leafer/interface": "^1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/app": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/app/-/app-1.8.0.tgz",
+      "integrity": "sha512-IapfZlekYrm32h2KfILlbdzcD7n4ncrzXLeM0h0XBK+4rRCqLrPNScPbzKtNhaMhFvq2NjLdfWVqmy63jXfj2g==",
+      "dependencies": {
+        "@leafer-ui/data": "1.8.0",
+        "@leafer-ui/display": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/bounds": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/bounds/-/bounds-1.8.0.tgz",
+      "integrity": "sha512-k72/biSCoUKNM7Gtk25R1AuBwdebT9b2XVveAqbaAq0CV6Wk0tUbjAnzyarSyzYn4BgrjPCTGl/lYtiPuIAiRQ==",
+      "dependencies": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/color": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/color/-/color-1.8.0.tgz",
+      "integrity": "sha512-WLw7rgA7zgVp8dp1hahWM8v8lo6HClUmpbWrsPTTlA7QXAiNpayfh8bV8NOhhwhQhCtxOEtC6UGKsBcTorwqMQ==",
+      "dependencies": {
+        "@leafer-ui/draw": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/core": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/core/-/core-1.8.0.tgz",
+      "integrity": "sha512-GkFRaNoArkFEEctzP5rKxOzFOnNzTLa9hLbvPQM/CFCBSSDdkx+BsnKBPkwHqvcRvGQLPZ3fhpoatxMoQncPug==",
+      "dependencies": {
+        "@leafer-ui/app": "1.8.0",
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer-ui/event": "1.8.0",
+        "@leafer-ui/hit": "1.8.0",
+        "@leafer-ui/interaction": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/data": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/data/-/data-1.8.0.tgz",
+      "integrity": "sha512-J386mOuGuVbpCU9fYdNg2IAluufYhjP4latizX8YdPEAnS2qGgbz5OahLwyCtBLYH50mT6gMyL/HSFXY4Idj5g==",
+      "dependencies": {
+        "@leafer-ui/external": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/decorator": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/decorator/-/decorator-1.8.0.tgz",
+      "integrity": "sha512-LGY8yqk+7TFhC0VgSV0jz1mHEY/6pLSmX5BNxuyomOBLzKbmW+EaWKl1JtuIBjg5ENXL5ZhVWfDZIs38fxM5Zw==",
+      "dependencies": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/display": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/display/-/display-1.8.0.tgz",
+      "integrity": "sha512-VrDOH5UTrYqAjLb2GIrVpTO33lHznxLDzP0IBqPduTGSe43BPMz7iNqUHwzgZDsV/qBKasLUtbrWcuk7SAp1fA==",
+      "dependencies": {
+        "@leafer-ui/data": "1.8.0",
+        "@leafer-ui/decorator": "1.8.0",
+        "@leafer-ui/display-module": "1.8.0",
+        "@leafer-ui/external": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/display-module": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/display-module/-/display-module-1.8.0.tgz",
+      "integrity": "sha512-69ZsFg+pUGskFa8kfO1OnmAz6q4q0/RNlmqbPE8B2D35J6JVJeITK1PBxGOGB/hKhDdoGUDpkb/MuKeIiIhNoA==",
+      "dependencies": {
+        "@leafer-ui/bounds": "1.8.0",
+        "@leafer-ui/data": "1.8.0",
+        "@leafer-ui/render": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/draw": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/draw/-/draw-1.8.0.tgz",
+      "integrity": "sha512-utYzJ4IIP2GaKWTVaO19gnlrz0HMXmzgvkcsovW5JoOQIi7XpB3yFXf7tUTUb9HdcVMAK7jssz4T0E4EiMaWvQ==",
+      "dependencies": {
+        "@leafer-ui/decorator": "1.8.0",
+        "@leafer-ui/display": "1.8.0",
+        "@leafer-ui/display-module": "1.8.0",
+        "@leafer-ui/external": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/effect": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/effect/-/effect-1.8.0.tgz",
+      "integrity": "sha512-on6jWBrGizw4pV1ZAtauwkA2e/jzf/aULfDrjVwwD5IrzLepcNoCJjE+ZQyabLU2KnRKKmjsvaGfMyYbpnjHfA==",
+      "dependencies": {
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/event": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/event/-/event-1.8.0.tgz",
+      "integrity": "sha512-jwaUKogwmq5wjhjiV01DCGxRcEY1MgszrQ5KokpLPnHCVPnxjBzrnJ808OAkXxwtrsNeFSpBDNOCbRvY4A0+qQ==",
+      "dependencies": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/external": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/external/-/external-1.8.0.tgz",
+      "integrity": "sha512-nyyVTkM8X3KPJou7cX3+npc4C9a5YSAUviu95auSEFWlF/OBzdUQ2wwG6JKvN+BZzNOTgWgqByyRNbChI90xXw==",
+      "dependencies": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/hit": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/hit/-/hit-1.8.0.tgz",
+      "integrity": "sha512-LpCoPlELmUOcERtibj0IZpSokhWOJksWJrxxdHWLgS0nDqfuu1OYkLNl3OWsYiejSPyDdODD6R7bLfWSOSjz8Q==",
+      "dependencies": {
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/interaction": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/interaction/-/interaction-1.8.0.tgz",
+      "integrity": "sha512-SCIP5nvGNb5z9i1HcCFXiHNk1gNvmIdoH+PcZFwoN35bYAlkIeRx9pDTSxrLBoVpJq4FXxt2qQrR9+IwZuJ3/A==",
+      "dependencies": {
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer-ui/event": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/interaction-web": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/interaction-web/-/interaction-web-1.8.0.tgz",
+      "integrity": "sha512-HhySVSnjHm4BGEyw8mqoNyyzf2fmzV1V/yHw5i5UOrbJol58f12xGY8J6zoMLKrcXh4VfZQ+uaqjOWiYjOiLGw==",
+      "dependencies": {
+        "@leafer-ui/core": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/interface": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/interface/-/interface-1.8.0.tgz",
+      "integrity": "sha512-cwZutgshMWVg22xzJ9+34Ye/HX0W6LxMyQwoPtDlMUMQKvBW5EHRfQ5dv4d16X9PFxA0N7Djm0u7/TIpjrCh0g==",
+      "dependencies": {
+        "@leafer/interface": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/paint": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/paint/-/paint-1.8.0.tgz",
+      "integrity": "sha512-8F5XgJS0lflpA2W6GxJVQw8bjv9H5dCc0JdjHbQEcaKMFk0vQzjm6d61HbjWXEW61jHXZC+rXtDOi3T1MrQVVg==",
+      "dependencies": {
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/partner": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/partner/-/partner-1.8.0.tgz",
+      "integrity": "sha512-3VBx61FoR8/zSXslmWstg/u7qulzBvi3e+iMl+fW0ruWeNx95VdM4W3LG3am9RQ92fqnKdF1ebgpoKZcIm5ajQ==",
+      "dependencies": {
+        "@leafer-ui/color": "1.8.0",
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer-ui/effect": "1.8.0",
+        "@leafer-ui/paint": "1.8.0",
+        "@leafer-ui/text": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/render": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/render/-/render-1.8.0.tgz",
+      "integrity": "sha512-1gEx9FmlvyhYMqGrh4ogTv3MuJnti4pIBqPtrI+8grPQ1cpjwS36ghV+7LNhb6y+oPOwqw/22+KIG35ObxVLEA==",
+      "dependencies": {
+        "@leafer-ui/external": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/text": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/text/-/text-1.8.0.tgz",
+      "integrity": "sha512-7IXXDjP8DkzIniOI1ow/6rMlYknBCRltGo7lyFy2besI32mS1yIobXlO60/uTCtfAJVPL5Wtr8ZACm0sf5UrUA==",
+      "dependencies": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer-ui/web": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/web/-/web-1.8.0.tgz",
+      "integrity": "sha512-tG0OQl+U2+6dNXmWzQzczReAH63H7eJPNkCwRxSMopipvVLR0ix3YgpHFrCBzd05yH2x1S5xJ9aUJin+bgAUfA==",
+      "dependencies": {
+        "@leafer-in/interface": "1.8.0",
+        "@leafer-ui/core": "1.8.0",
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer-ui/interaction-web": "1.8.0",
+        "@leafer-ui/interface": "1.8.0",
+        "@leafer-ui/partner": "1.8.0",
+        "@leafer/canvas-web": "1.8.0",
+        "@leafer/core": "1.8.0",
+        "@leafer/image-web": "1.8.0",
+        "@leafer/interface": "1.8.0",
+        "@leafer/partner": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/canvas": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/canvas/-/canvas-1.8.0.tgz",
+      "integrity": "sha512-8s02D1lR4cFbNZV63WbjONgr54FuffQS9YRGml2FuRhGwgTHF6UGMQ5u7CWx9YLGgCcW4DdBqS8v1KX1MVJzOA==",
+      "dependencies": {
+        "@leafer/data": "1.8.0",
+        "@leafer/debug": "1.8.0",
+        "@leafer/file": "1.8.0",
+        "@leafer/list": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/path": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/canvas-web": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/canvas-web/-/canvas-web-1.8.0.tgz",
+      "integrity": "sha512-gYRmiK0WATOY1caiUTnHB0xfqvuI2oi9SW1fykIdLI/cVQfANtaOaL8mOajiwQIZv64yK630UEQIFobHkUEA5A==",
+      "dependencies": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/core": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/core/-/core-1.8.0.tgz",
+      "integrity": "sha512-BOvWte6IEv5Tyrf0rx6lplwtfd7It4DtGU9js//rCZwfaocRlJCLTgcGEXk97DkdUiDeJ8gxaJiMp9CTq4CjAA==",
+      "dependencies": {
+        "@leafer/canvas": "1.8.0",
+        "@leafer/data": "1.8.0",
+        "@leafer/debug": "1.8.0",
+        "@leafer/decorator": "1.8.0",
+        "@leafer/display": "1.8.0",
+        "@leafer/display-module": "1.8.0",
+        "@leafer/event": "1.8.0",
+        "@leafer/file": "1.8.0",
+        "@leafer/helper": "1.8.0",
+        "@leafer/image": "1.8.0",
+        "@leafer/layout": "1.8.0",
+        "@leafer/list": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/path": "1.8.0",
+        "@leafer/platform": "1.8.0",
+        "@leafer/task": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/data": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/data/-/data-1.8.0.tgz",
+      "integrity": "sha512-qzVFYNlHBJzhF23duqIxWrKwJ+kfidU0h1QiH+zbVwEdIaDGT7obiXZEzwR+kjLPftVb8gyZrZoyHgvWu43ErA=="
+    },
+    "node_modules/@leafer/debug": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/debug/-/debug-1.8.0.tgz",
+      "integrity": "sha512-zqM7091uVP1OCiumJle6/t9Imc7GiM6AlX2FkvMi65YO9Ob9wmzE8X2lzA2/yggiCtbGdLRbC53Ghm1x3PrI3A==",
+      "dependencies": {
+        "@leafer/math": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/decorator": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/decorator/-/decorator-1.8.0.tgz",
+      "integrity": "sha512-kdnN3JydJmBvyGK9dBZRA7mv3bawU3l3mNOclR/OWzH2uESo7tbOsDqqRdKjcKG85reMlsdKPt06Nd3FhrlmTQ==",
+      "dependencies": {
+        "@leafer/data": "1.8.0",
+        "@leafer/debug": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/display": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/display/-/display-1.8.0.tgz",
+      "integrity": "sha512-rIUOrG8nJhFmK61ulo846zpvgH6ogI9ojZ9RMMBfvVL2N81CYF7/u+7QcgCKJB0GdLlCaDgmyXuCAozuAik7Gg==",
+      "dependencies": {
+        "@leafer/data": "1.8.0",
+        "@leafer/debug": "1.8.0",
+        "@leafer/decorator": "1.8.0",
+        "@leafer/display-module": "1.8.0",
+        "@leafer/event": "1.8.0",
+        "@leafer/helper": "1.8.0",
+        "@leafer/image": "1.8.0",
+        "@leafer/layout": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/display-module": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/display-module/-/display-module-1.8.0.tgz",
+      "integrity": "sha512-ZdXKjfcYCDHzUSx6GsGJh3SQLyQZFZ3TcRpseF/IAmQpmLwujKvAdltLlN30eNEsil6qqEOORuNqQHGyd6YFQA==",
+      "dependencies": {
+        "@leafer/debug": "1.8.0",
+        "@leafer/event": "1.8.0",
+        "@leafer/helper": "1.8.0",
+        "@leafer/math": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/event": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/event/-/event-1.8.0.tgz",
+      "integrity": "sha512-PHBvoZ2LLnI5HY3L5SyKHvIUoyMFitNj7Nn2fqF6yUHp9BQzhKV2gLuyn7RjhpnPta4Xo88ruLADFO0yWlG5gA==",
+      "dependencies": {
+        "@leafer/decorator": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/file": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/file/-/file-1.8.0.tgz",
+      "integrity": "sha512-JwYTv1p/cIhAQv5iXT86gRInwHQz/kLKaQAREi7oA9bacyBQ+2cE4r695I7Nok7JyqTFEe5DtK3g2sm3Ueqfgg==",
+      "dependencies": {
+        "@leafer/debug": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/helper": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/helper/-/helper-1.8.0.tgz",
+      "integrity": "sha512-cTai2P/Fy0Rxr+Lno111pseNJF5xU0ctowTV4lFW+6cOnaGpqeJoTGFkO9MeSOFeSRBjxe7ecfsNoGGzm3THoA==",
+      "dependencies": {
+        "@leafer/math": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/image": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/image/-/image-1.8.0.tgz",
+      "integrity": "sha512-XElWxR5RZeiTKF+ntdTf5d3wxt2xj7BLh3N3q1Z5Y9ymf73P+efcWV/CaNPRpP8M6uXomQLwYE8KbRa79y5ZVw==",
+      "dependencies": {
+        "@leafer/data": "1.8.0",
+        "@leafer/file": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/platform": "1.8.0",
+        "@leafer/task": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/image-web": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/image-web/-/image-web-1.8.0.tgz",
+      "integrity": "sha512-OGcBG1ALIeF2pjMoSwJlrfEL1KQbu1TfJDYMqLGydM1Ygt5w/FHJrsqtd/zBJlmjxZSVCmA5C8DDlbFkKpqJOw==",
+      "dependencies": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/interface": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/interface/-/interface-1.8.0.tgz",
+      "integrity": "sha512-76jOG0AabfIw8WMI8nulb1FKylBcVnpucuiTjml5df6P991wcH8xsDSQtRCaOKrsl0C2DbW62BVwst1NHHHalQ=="
+    },
+    "node_modules/@leafer/layout": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/layout/-/layout-1.8.0.tgz",
+      "integrity": "sha512-t6tisD+dcKSwyAaKV/EIPRrrx/HCQn9vGrZxTVSs/sXGdM7Sfhv2Kp9/QJm7lEceVbVmAWWQX/3QMWs1bj8xKA==",
+      "dependencies": {
+        "@leafer/helper": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/layouter": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/layouter/-/layouter-1.8.0.tgz",
+      "integrity": "sha512-prrsYdlHsUjYSLBuotmmbWYNhML5EkLqD6NPPbl43eBd0nGVZJZMTmgVZNcjn/Ms2MGf15IeVIg1VhAuFlp2fg==",
+      "dependencies": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/list": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/list/-/list-1.8.0.tgz",
+      "integrity": "sha512-eySBH8eRcoW4P9N5Doj6xgFwQ5AqgzG+jR9jhd1VDaV4mVjK+PnBxLWLkg/ZNZgYX38HEtQZ02qMiDFOHmBA6g=="
+    },
+    "node_modules/@leafer/math": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/math/-/math-1.8.0.tgz",
+      "integrity": "sha512-X0VaEqgCOAHZUsiiYWqoENvE5lHrglfuKaX3fkers31UgjPN0wmTSbk+N4kXR9ssq6wq3KzJIRdPyPLVTMoo5A=="
+    },
+    "node_modules/@leafer/partner": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/partner/-/partner-1.8.0.tgz",
+      "integrity": "sha512-qILWj6XIj3wpCgZPs/hh/Z7BgI6/fYcjC/aJRETz87X9anL5GtlrVP7FDvb2O5uD8fiSRkqoeMWhUmVCnIclZg==",
+      "dependencies": {
+        "@leafer/core": "1.8.0",
+        "@leafer/layouter": "1.8.0",
+        "@leafer/renderer": "1.8.0",
+        "@leafer/selector": "1.8.0",
+        "@leafer/watcher": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/path": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/path/-/path-1.8.0.tgz",
+      "integrity": "sha512-FXxkxc4Yckr+zBO+Ejz4aKtIC0mV3Jmx/0Vl8uOVT5GOzpbJvGdZYM4a5jRMddUJn5I/C0F1QWjXTGqHX/6fSA==",
+      "dependencies": {
+        "@leafer/debug": "1.8.0",
+        "@leafer/math": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/platform": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/platform/-/platform-1.8.0.tgz",
+      "integrity": "sha512-EuwwMKowbQ3tcPffa3hFDkAm+odvJmH0f+b8QzSBlS9SXO2H6FMcizxMqrnSt7CmBEQY7PZEazXGxYMaptUflA==",
+      "dependencies": {
+        "@leafer/debug": "1.8.0",
+        "@leafer/layouter": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/renderer": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/renderer/-/renderer-1.8.0.tgz",
+      "integrity": "sha512-rXmSRJW2lDlDJFeJwJEwd7gxU8IPtW7ysJ9xHoj+vqeeIFn8xxBZiYjE4/Y+CNCR4eebOC2qseLYzTV99+QIhA==",
+      "dependencies": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/selector": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/selector/-/selector-1.8.0.tgz",
+      "integrity": "sha512-uljegY6ia0UodTnd8G0wYXo1KbT31+PXgNvnSdrV5Jd+n8snjUoAKA6wkfbTIAZoLFbIEoge5alJ2WMvyF+4QQ==",
+      "dependencies": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/task": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/task/-/task-1.8.0.tgz",
+      "integrity": "sha512-i+oFTC9jX0k4MKek4zhuezkNwH5n1m/TZ2eCy+uw6Hwt8i4LCX2tY/mNcFJGtNztBBHxbT3pe/oCM8Pi2nuYag==",
+      "dependencies": {
+        "@leafer/debug": "1.8.0",
+        "@leafer/math": "1.8.0"
+      }
+    },
+    "node_modules/@leafer/watcher": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/watcher/-/watcher-1.8.0.tgz",
+      "integrity": "sha512-Co37fD2k6sr7ZrKpM1NghpX0iVMvA51NKSPk3MxDbLUyzBRCmbhyLlvT68CW09L1Vb+9WOvuQA3kdQ4QUrOTew==",
+      "dependencies": {
+        "@leafer/data": "1.8.0",
+        "@leafer/event": "1.8.0",
+        "@leafer/list": "1.8.0"
+      }
+    },
     "node_modules/@popperjs/core": {
       "name": "@sxzz/popperjs-es",
       "version": "2.11.7",
@@ -1097,9 +1556,9 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.10.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
-      "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz",
+      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -1441,6 +1900,19 @@
       "integrity": "sha512-FKWIhiU96bi3xpP9ewRMgANsoVmMUBnMnmpCT6dPMZOunVYJQmJhSRruoI0XSPoHeIif3kyEuiHbFrOJwEJaEA==",
       "license": "MIT"
     },
+    "node_modules/dxf-parser": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/dxf-parser/-/dxf-parser-1.1.2.tgz",
+      "integrity": "sha512-GPTumUvRkounlIazLIyJMmTWt+nlg+ksS0Hdm8jWvejmZKBTz6gvHTam76wRm4PQMma5sgKLThblQyeIJcH79Q==",
+      "dependencies": {
+        "loglevel": "^1.7.1"
+      }
+    },
+    "node_modules/dxf-writer": {
+      "version": "1.18.4",
+      "resolved": "https://registry.npmmirror.com/dxf-writer/-/dxf-writer-1.18.4.tgz",
+      "integrity": "sha512-JdLOyP+1UyeB30yPowJLJKK0bPROq/dX+QTWcLSplQoepcyo/YMlU0Z27T7mIPxgwiPb+CQWwUIlbcRRfns+ng=="
+    },
     "node_modules/element-plus": {
       "version": "2.9.3",
       "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.3.tgz",
@@ -1725,6 +2197,28 @@
       "resolved": "https://registry.npmmirror.com/jsbarcode/-/jsbarcode-3.11.6.tgz",
       "integrity": "sha512-G5TKGyKY1zJo0ZQKFM1IIMfy0nF2rs92BLlCz+cU4/TazIc4ZH+X1GYeDRt7TKjrYqmPfTjwTBkU/QnQlsYiuA=="
     },
+    "node_modules/leafer-ui": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/leafer-ui/-/leafer-ui-1.8.0.tgz",
+      "integrity": "sha512-Y/jXyC3ZJ8DCkifUfIgSqt38fwdf1UJ8//IKWntvCXVlEx9R50vx33rxf1VVHQq0NWcfH6U64k+VzDLSXq/rFA==",
+      "dependencies": {
+        "@leafer-in/interface": "1.8.0",
+        "@leafer-ui/core": "1.8.0",
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer-ui/interaction-web": "1.8.0",
+        "@leafer-ui/interface": "1.8.0",
+        "@leafer-ui/partner": "1.8.0",
+        "@leafer-ui/web": "1.8.0",
+        "@leafer/core": "1.8.0",
+        "@leafer/interface": "1.8.0",
+        "@leafer/partner": "1.8.0"
+      }
+    },
+    "node_modules/leaflet": {
+      "version": "1.9.4",
+      "resolved": "https://registry.npmmirror.com/leaflet/-/leaflet-1.9.4.tgz",
+      "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="
+    },
     "node_modules/local-pkg": {
       "version": "0.4.3",
       "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
@@ -1765,6 +2259,18 @@
         "@types/lodash-es": "*",
         "lodash": "*",
         "lodash-es": "*"
+      }
+    },
+    "node_modules/loglevel": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmmirror.com/loglevel/-/loglevel-1.9.2.tgz",
+      "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==",
+      "engines": {
+        "node": ">= 0.6.0"
+      },
+      "funding": {
+        "type": "tidelift",
+        "url": "https://tidelift.com/funding/github/npm/loglevel"
       }
     },
     "node_modules/magic-string": {
@@ -8012,6 +8518,458 @@
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
     },
+    "@leafer-in/interface": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-in/interface/-/interface-1.8.0.tgz",
+      "integrity": "sha512-j4ucPjPX8/TBIID1RPHv6CA1KtiIh56igvrHBYHd44NS1tzKWhsswKUVRrzK0nqeSh1VL4SzGZgiQNwZq56R4A==",
+      "requires": {}
+    },
+    "@leafer-ui/app": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/app/-/app-1.8.0.tgz",
+      "integrity": "sha512-IapfZlekYrm32h2KfILlbdzcD7n4ncrzXLeM0h0XBK+4rRCqLrPNScPbzKtNhaMhFvq2NjLdfWVqmy63jXfj2g==",
+      "requires": {
+        "@leafer-ui/data": "1.8.0",
+        "@leafer-ui/display": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/bounds": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/bounds/-/bounds-1.8.0.tgz",
+      "integrity": "sha512-k72/biSCoUKNM7Gtk25R1AuBwdebT9b2XVveAqbaAq0CV6Wk0tUbjAnzyarSyzYn4BgrjPCTGl/lYtiPuIAiRQ==",
+      "requires": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/color": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/color/-/color-1.8.0.tgz",
+      "integrity": "sha512-WLw7rgA7zgVp8dp1hahWM8v8lo6HClUmpbWrsPTTlA7QXAiNpayfh8bV8NOhhwhQhCtxOEtC6UGKsBcTorwqMQ==",
+      "requires": {
+        "@leafer-ui/draw": "1.8.0"
+      }
+    },
+    "@leafer-ui/core": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/core/-/core-1.8.0.tgz",
+      "integrity": "sha512-GkFRaNoArkFEEctzP5rKxOzFOnNzTLa9hLbvPQM/CFCBSSDdkx+BsnKBPkwHqvcRvGQLPZ3fhpoatxMoQncPug==",
+      "requires": {
+        "@leafer-ui/app": "1.8.0",
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer-ui/event": "1.8.0",
+        "@leafer-ui/hit": "1.8.0",
+        "@leafer-ui/interaction": "1.8.0"
+      }
+    },
+    "@leafer-ui/data": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/data/-/data-1.8.0.tgz",
+      "integrity": "sha512-J386mOuGuVbpCU9fYdNg2IAluufYhjP4latizX8YdPEAnS2qGgbz5OahLwyCtBLYH50mT6gMyL/HSFXY4Idj5g==",
+      "requires": {
+        "@leafer-ui/external": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/decorator": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/decorator/-/decorator-1.8.0.tgz",
+      "integrity": "sha512-LGY8yqk+7TFhC0VgSV0jz1mHEY/6pLSmX5BNxuyomOBLzKbmW+EaWKl1JtuIBjg5ENXL5ZhVWfDZIs38fxM5Zw==",
+      "requires": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/display": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/display/-/display-1.8.0.tgz",
+      "integrity": "sha512-VrDOH5UTrYqAjLb2GIrVpTO33lHznxLDzP0IBqPduTGSe43BPMz7iNqUHwzgZDsV/qBKasLUtbrWcuk7SAp1fA==",
+      "requires": {
+        "@leafer-ui/data": "1.8.0",
+        "@leafer-ui/decorator": "1.8.0",
+        "@leafer-ui/display-module": "1.8.0",
+        "@leafer-ui/external": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/display-module": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/display-module/-/display-module-1.8.0.tgz",
+      "integrity": "sha512-69ZsFg+pUGskFa8kfO1OnmAz6q4q0/RNlmqbPE8B2D35J6JVJeITK1PBxGOGB/hKhDdoGUDpkb/MuKeIiIhNoA==",
+      "requires": {
+        "@leafer-ui/bounds": "1.8.0",
+        "@leafer-ui/data": "1.8.0",
+        "@leafer-ui/render": "1.8.0"
+      }
+    },
+    "@leafer-ui/draw": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/draw/-/draw-1.8.0.tgz",
+      "integrity": "sha512-utYzJ4IIP2GaKWTVaO19gnlrz0HMXmzgvkcsovW5JoOQIi7XpB3yFXf7tUTUb9HdcVMAK7jssz4T0E4EiMaWvQ==",
+      "requires": {
+        "@leafer-ui/decorator": "1.8.0",
+        "@leafer-ui/display": "1.8.0",
+        "@leafer-ui/display-module": "1.8.0",
+        "@leafer-ui/external": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/effect": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/effect/-/effect-1.8.0.tgz",
+      "integrity": "sha512-on6jWBrGizw4pV1ZAtauwkA2e/jzf/aULfDrjVwwD5IrzLepcNoCJjE+ZQyabLU2KnRKKmjsvaGfMyYbpnjHfA==",
+      "requires": {
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/event": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/event/-/event-1.8.0.tgz",
+      "integrity": "sha512-jwaUKogwmq5wjhjiV01DCGxRcEY1MgszrQ5KokpLPnHCVPnxjBzrnJ808OAkXxwtrsNeFSpBDNOCbRvY4A0+qQ==",
+      "requires": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/external": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/external/-/external-1.8.0.tgz",
+      "integrity": "sha512-nyyVTkM8X3KPJou7cX3+npc4C9a5YSAUviu95auSEFWlF/OBzdUQ2wwG6JKvN+BZzNOTgWgqByyRNbChI90xXw==",
+      "requires": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/hit": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/hit/-/hit-1.8.0.tgz",
+      "integrity": "sha512-LpCoPlELmUOcERtibj0IZpSokhWOJksWJrxxdHWLgS0nDqfuu1OYkLNl3OWsYiejSPyDdODD6R7bLfWSOSjz8Q==",
+      "requires": {
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/interaction": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/interaction/-/interaction-1.8.0.tgz",
+      "integrity": "sha512-SCIP5nvGNb5z9i1HcCFXiHNk1gNvmIdoH+PcZFwoN35bYAlkIeRx9pDTSxrLBoVpJq4FXxt2qQrR9+IwZuJ3/A==",
+      "requires": {
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer-ui/event": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/interaction-web": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/interaction-web/-/interaction-web-1.8.0.tgz",
+      "integrity": "sha512-HhySVSnjHm4BGEyw8mqoNyyzf2fmzV1V/yHw5i5UOrbJol58f12xGY8J6zoMLKrcXh4VfZQ+uaqjOWiYjOiLGw==",
+      "requires": {
+        "@leafer-ui/core": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/interface": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/interface/-/interface-1.8.0.tgz",
+      "integrity": "sha512-cwZutgshMWVg22xzJ9+34Ye/HX0W6LxMyQwoPtDlMUMQKvBW5EHRfQ5dv4d16X9PFxA0N7Djm0u7/TIpjrCh0g==",
+      "requires": {
+        "@leafer/interface": "1.8.0"
+      }
+    },
+    "@leafer-ui/paint": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/paint/-/paint-1.8.0.tgz",
+      "integrity": "sha512-8F5XgJS0lflpA2W6GxJVQw8bjv9H5dCc0JdjHbQEcaKMFk0vQzjm6d61HbjWXEW61jHXZC+rXtDOi3T1MrQVVg==",
+      "requires": {
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/partner": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/partner/-/partner-1.8.0.tgz",
+      "integrity": "sha512-3VBx61FoR8/zSXslmWstg/u7qulzBvi3e+iMl+fW0ruWeNx95VdM4W3LG3am9RQ92fqnKdF1ebgpoKZcIm5ajQ==",
+      "requires": {
+        "@leafer-ui/color": "1.8.0",
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer-ui/effect": "1.8.0",
+        "@leafer-ui/paint": "1.8.0",
+        "@leafer-ui/text": "1.8.0"
+      }
+    },
+    "@leafer-ui/render": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/render/-/render-1.8.0.tgz",
+      "integrity": "sha512-1gEx9FmlvyhYMqGrh4ogTv3MuJnti4pIBqPtrI+8grPQ1cpjwS36ghV+7LNhb6y+oPOwqw/22+KIG35ObxVLEA==",
+      "requires": {
+        "@leafer-ui/external": "1.8.0"
+      }
+    },
+    "@leafer-ui/text": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/text/-/text-1.8.0.tgz",
+      "integrity": "sha512-7IXXDjP8DkzIniOI1ow/6rMlYknBCRltGo7lyFy2besI32mS1yIobXlO60/uTCtfAJVPL5Wtr8ZACm0sf5UrUA==",
+      "requires": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer-ui/web": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer-ui/web/-/web-1.8.0.tgz",
+      "integrity": "sha512-tG0OQl+U2+6dNXmWzQzczReAH63H7eJPNkCwRxSMopipvVLR0ix3YgpHFrCBzd05yH2x1S5xJ9aUJin+bgAUfA==",
+      "requires": {
+        "@leafer-in/interface": "1.8.0",
+        "@leafer-ui/core": "1.8.0",
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer-ui/interaction-web": "1.8.0",
+        "@leafer-ui/interface": "1.8.0",
+        "@leafer-ui/partner": "1.8.0",
+        "@leafer/canvas-web": "1.8.0",
+        "@leafer/core": "1.8.0",
+        "@leafer/image-web": "1.8.0",
+        "@leafer/interface": "1.8.0",
+        "@leafer/partner": "1.8.0"
+      }
+    },
+    "@leafer/canvas": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/canvas/-/canvas-1.8.0.tgz",
+      "integrity": "sha512-8s02D1lR4cFbNZV63WbjONgr54FuffQS9YRGml2FuRhGwgTHF6UGMQ5u7CWx9YLGgCcW4DdBqS8v1KX1MVJzOA==",
+      "requires": {
+        "@leafer/data": "1.8.0",
+        "@leafer/debug": "1.8.0",
+        "@leafer/file": "1.8.0",
+        "@leafer/list": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/path": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "@leafer/canvas-web": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/canvas-web/-/canvas-web-1.8.0.tgz",
+      "integrity": "sha512-gYRmiK0WATOY1caiUTnHB0xfqvuI2oi9SW1fykIdLI/cVQfANtaOaL8mOajiwQIZv64yK630UEQIFobHkUEA5A==",
+      "requires": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer/core": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/core/-/core-1.8.0.tgz",
+      "integrity": "sha512-BOvWte6IEv5Tyrf0rx6lplwtfd7It4DtGU9js//rCZwfaocRlJCLTgcGEXk97DkdUiDeJ8gxaJiMp9CTq4CjAA==",
+      "requires": {
+        "@leafer/canvas": "1.8.0",
+        "@leafer/data": "1.8.0",
+        "@leafer/debug": "1.8.0",
+        "@leafer/decorator": "1.8.0",
+        "@leafer/display": "1.8.0",
+        "@leafer/display-module": "1.8.0",
+        "@leafer/event": "1.8.0",
+        "@leafer/file": "1.8.0",
+        "@leafer/helper": "1.8.0",
+        "@leafer/image": "1.8.0",
+        "@leafer/layout": "1.8.0",
+        "@leafer/list": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/path": "1.8.0",
+        "@leafer/platform": "1.8.0",
+        "@leafer/task": "1.8.0"
+      }
+    },
+    "@leafer/data": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/data/-/data-1.8.0.tgz",
+      "integrity": "sha512-qzVFYNlHBJzhF23duqIxWrKwJ+kfidU0h1QiH+zbVwEdIaDGT7obiXZEzwR+kjLPftVb8gyZrZoyHgvWu43ErA=="
+    },
+    "@leafer/debug": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/debug/-/debug-1.8.0.tgz",
+      "integrity": "sha512-zqM7091uVP1OCiumJle6/t9Imc7GiM6AlX2FkvMi65YO9Ob9wmzE8X2lzA2/yggiCtbGdLRbC53Ghm1x3PrI3A==",
+      "requires": {
+        "@leafer/math": "1.8.0"
+      }
+    },
+    "@leafer/decorator": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/decorator/-/decorator-1.8.0.tgz",
+      "integrity": "sha512-kdnN3JydJmBvyGK9dBZRA7mv3bawU3l3mNOclR/OWzH2uESo7tbOsDqqRdKjcKG85reMlsdKPt06Nd3FhrlmTQ==",
+      "requires": {
+        "@leafer/data": "1.8.0",
+        "@leafer/debug": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "@leafer/display": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/display/-/display-1.8.0.tgz",
+      "integrity": "sha512-rIUOrG8nJhFmK61ulo846zpvgH6ogI9ojZ9RMMBfvVL2N81CYF7/u+7QcgCKJB0GdLlCaDgmyXuCAozuAik7Gg==",
+      "requires": {
+        "@leafer/data": "1.8.0",
+        "@leafer/debug": "1.8.0",
+        "@leafer/decorator": "1.8.0",
+        "@leafer/display-module": "1.8.0",
+        "@leafer/event": "1.8.0",
+        "@leafer/helper": "1.8.0",
+        "@leafer/image": "1.8.0",
+        "@leafer/layout": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "@leafer/display-module": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/display-module/-/display-module-1.8.0.tgz",
+      "integrity": "sha512-ZdXKjfcYCDHzUSx6GsGJh3SQLyQZFZ3TcRpseF/IAmQpmLwujKvAdltLlN30eNEsil6qqEOORuNqQHGyd6YFQA==",
+      "requires": {
+        "@leafer/debug": "1.8.0",
+        "@leafer/event": "1.8.0",
+        "@leafer/helper": "1.8.0",
+        "@leafer/math": "1.8.0"
+      }
+    },
+    "@leafer/event": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/event/-/event-1.8.0.tgz",
+      "integrity": "sha512-PHBvoZ2LLnI5HY3L5SyKHvIUoyMFitNj7Nn2fqF6yUHp9BQzhKV2gLuyn7RjhpnPta4Xo88ruLADFO0yWlG5gA==",
+      "requires": {
+        "@leafer/decorator": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "@leafer/file": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/file/-/file-1.8.0.tgz",
+      "integrity": "sha512-JwYTv1p/cIhAQv5iXT86gRInwHQz/kLKaQAREi7oA9bacyBQ+2cE4r695I7Nok7JyqTFEe5DtK3g2sm3Ueqfgg==",
+      "requires": {
+        "@leafer/debug": "1.8.0"
+      }
+    },
+    "@leafer/helper": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/helper/-/helper-1.8.0.tgz",
+      "integrity": "sha512-cTai2P/Fy0Rxr+Lno111pseNJF5xU0ctowTV4lFW+6cOnaGpqeJoTGFkO9MeSOFeSRBjxe7ecfsNoGGzm3THoA==",
+      "requires": {
+        "@leafer/math": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "@leafer/image": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/image/-/image-1.8.0.tgz",
+      "integrity": "sha512-XElWxR5RZeiTKF+ntdTf5d3wxt2xj7BLh3N3q1Z5Y9ymf73P+efcWV/CaNPRpP8M6uXomQLwYE8KbRa79y5ZVw==",
+      "requires": {
+        "@leafer/data": "1.8.0",
+        "@leafer/file": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/platform": "1.8.0",
+        "@leafer/task": "1.8.0"
+      }
+    },
+    "@leafer/image-web": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/image-web/-/image-web-1.8.0.tgz",
+      "integrity": "sha512-OGcBG1ALIeF2pjMoSwJlrfEL1KQbu1TfJDYMqLGydM1Ygt5w/FHJrsqtd/zBJlmjxZSVCmA5C8DDlbFkKpqJOw==",
+      "requires": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer/interface": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/interface/-/interface-1.8.0.tgz",
+      "integrity": "sha512-76jOG0AabfIw8WMI8nulb1FKylBcVnpucuiTjml5df6P991wcH8xsDSQtRCaOKrsl0C2DbW62BVwst1NHHHalQ=="
+    },
+    "@leafer/layout": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/layout/-/layout-1.8.0.tgz",
+      "integrity": "sha512-t6tisD+dcKSwyAaKV/EIPRrrx/HCQn9vGrZxTVSs/sXGdM7Sfhv2Kp9/QJm7lEceVbVmAWWQX/3QMWs1bj8xKA==",
+      "requires": {
+        "@leafer/helper": "1.8.0",
+        "@leafer/math": "1.8.0",
+        "@leafer/platform": "1.8.0"
+      }
+    },
+    "@leafer/layouter": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/layouter/-/layouter-1.8.0.tgz",
+      "integrity": "sha512-prrsYdlHsUjYSLBuotmmbWYNhML5EkLqD6NPPbl43eBd0nGVZJZMTmgVZNcjn/Ms2MGf15IeVIg1VhAuFlp2fg==",
+      "requires": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer/list": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/list/-/list-1.8.0.tgz",
+      "integrity": "sha512-eySBH8eRcoW4P9N5Doj6xgFwQ5AqgzG+jR9jhd1VDaV4mVjK+PnBxLWLkg/ZNZgYX38HEtQZ02qMiDFOHmBA6g=="
+    },
+    "@leafer/math": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/math/-/math-1.8.0.tgz",
+      "integrity": "sha512-X0VaEqgCOAHZUsiiYWqoENvE5lHrglfuKaX3fkers31UgjPN0wmTSbk+N4kXR9ssq6wq3KzJIRdPyPLVTMoo5A=="
+    },
+    "@leafer/partner": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/partner/-/partner-1.8.0.tgz",
+      "integrity": "sha512-qILWj6XIj3wpCgZPs/hh/Z7BgI6/fYcjC/aJRETz87X9anL5GtlrVP7FDvb2O5uD8fiSRkqoeMWhUmVCnIclZg==",
+      "requires": {
+        "@leafer/core": "1.8.0",
+        "@leafer/layouter": "1.8.0",
+        "@leafer/renderer": "1.8.0",
+        "@leafer/selector": "1.8.0",
+        "@leafer/watcher": "1.8.0"
+      }
+    },
+    "@leafer/path": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/path/-/path-1.8.0.tgz",
+      "integrity": "sha512-FXxkxc4Yckr+zBO+Ejz4aKtIC0mV3Jmx/0Vl8uOVT5GOzpbJvGdZYM4a5jRMddUJn5I/C0F1QWjXTGqHX/6fSA==",
+      "requires": {
+        "@leafer/debug": "1.8.0",
+        "@leafer/math": "1.8.0"
+      }
+    },
+    "@leafer/platform": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/platform/-/platform-1.8.0.tgz",
+      "integrity": "sha512-EuwwMKowbQ3tcPffa3hFDkAm+odvJmH0f+b8QzSBlS9SXO2H6FMcizxMqrnSt7CmBEQY7PZEazXGxYMaptUflA==",
+      "requires": {
+        "@leafer/debug": "1.8.0",
+        "@leafer/layouter": "1.8.0"
+      }
+    },
+    "@leafer/renderer": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/renderer/-/renderer-1.8.0.tgz",
+      "integrity": "sha512-rXmSRJW2lDlDJFeJwJEwd7gxU8IPtW7ysJ9xHoj+vqeeIFn8xxBZiYjE4/Y+CNCR4eebOC2qseLYzTV99+QIhA==",
+      "requires": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer/selector": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/selector/-/selector-1.8.0.tgz",
+      "integrity": "sha512-uljegY6ia0UodTnd8G0wYXo1KbT31+PXgNvnSdrV5Jd+n8snjUoAKA6wkfbTIAZoLFbIEoge5alJ2WMvyF+4QQ==",
+      "requires": {
+        "@leafer/core": "1.8.0"
+      }
+    },
+    "@leafer/task": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/task/-/task-1.8.0.tgz",
+      "integrity": "sha512-i+oFTC9jX0k4MKek4zhuezkNwH5n1m/TZ2eCy+uw6Hwt8i4LCX2tY/mNcFJGtNztBBHxbT3pe/oCM8Pi2nuYag==",
+      "requires": {
+        "@leafer/debug": "1.8.0",
+        "@leafer/math": "1.8.0"
+      }
+    },
+    "@leafer/watcher": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/@leafer/watcher/-/watcher-1.8.0.tgz",
+      "integrity": "sha512-Co37fD2k6sr7ZrKpM1NghpX0iVMvA51NKSPk3MxDbLUyzBRCmbhyLlvT68CW09L1Vb+9WOvuQA3kdQ4QUrOTew==",
+      "requires": {
+        "@leafer/data": "1.8.0",
+        "@leafer/event": "1.8.0",
+        "@leafer/list": "1.8.0"
+      }
+    },
     "@popperjs/core": {
       "version": "npm:@sxzz/popperjs-es@2.11.7",
       "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
@@ -8261,9 +9219,9 @@
       }
     },
     "acorn": {
-      "version": "8.10.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
-      "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw=="
+      "version": "8.15.0",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz",
+      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="
     },
     "adler-32": {
       "version": "1.3.1",
@@ -8501,6 +9459,19 @@
       "resolved": "https://registry.npmmirror.com/dom-zindex/-/dom-zindex-1.0.6.tgz",
       "integrity": "sha512-FKWIhiU96bi3xpP9ewRMgANsoVmMUBnMnmpCT6dPMZOunVYJQmJhSRruoI0XSPoHeIif3kyEuiHbFrOJwEJaEA=="
     },
+    "dxf-parser": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/dxf-parser/-/dxf-parser-1.1.2.tgz",
+      "integrity": "sha512-GPTumUvRkounlIazLIyJMmTWt+nlg+ksS0Hdm8jWvejmZKBTz6gvHTam76wRm4PQMma5sgKLThblQyeIJcH79Q==",
+      "requires": {
+        "loglevel": "^1.7.1"
+      }
+    },
+    "dxf-writer": {
+      "version": "1.18.4",
+      "resolved": "https://registry.npmmirror.com/dxf-writer/-/dxf-writer-1.18.4.tgz",
+      "integrity": "sha512-JdLOyP+1UyeB30yPowJLJKK0bPROq/dX+QTWcLSplQoepcyo/YMlU0Z27T7mIPxgwiPb+CQWwUIlbcRRfns+ng=="
+    },
     "element-plus": {
       "version": "2.9.3",
       "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.3.tgz",
@@ -8714,6 +9685,28 @@
       "resolved": "https://registry.npmmirror.com/jsbarcode/-/jsbarcode-3.11.6.tgz",
       "integrity": "sha512-G5TKGyKY1zJo0ZQKFM1IIMfy0nF2rs92BLlCz+cU4/TazIc4ZH+X1GYeDRt7TKjrYqmPfTjwTBkU/QnQlsYiuA=="
     },
+    "leafer-ui": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/leafer-ui/-/leafer-ui-1.8.0.tgz",
+      "integrity": "sha512-Y/jXyC3ZJ8DCkifUfIgSqt38fwdf1UJ8//IKWntvCXVlEx9R50vx33rxf1VVHQq0NWcfH6U64k+VzDLSXq/rFA==",
+      "requires": {
+        "@leafer-in/interface": "1.8.0",
+        "@leafer-ui/core": "1.8.0",
+        "@leafer-ui/draw": "1.8.0",
+        "@leafer-ui/interaction-web": "1.8.0",
+        "@leafer-ui/interface": "1.8.0",
+        "@leafer-ui/partner": "1.8.0",
+        "@leafer-ui/web": "1.8.0",
+        "@leafer/core": "1.8.0",
+        "@leafer/interface": "1.8.0",
+        "@leafer/partner": "1.8.0"
+      }
+    },
+    "leaflet": {
+      "version": "1.9.4",
+      "resolved": "https://registry.npmmirror.com/leaflet/-/leaflet-1.9.4.tgz",
+      "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="
+    },
     "local-pkg": {
       "version": "0.4.3",
       "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
@@ -8742,6 +9735,11 @@
       "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
       "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
       "requires": {}
+    },
+    "loglevel": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmmirror.com/loglevel/-/loglevel-1.9.2.tgz",
+      "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg=="
     },
     "magic-string": {
       "version": "0.30.5",
@@ -8818,8 +9816,12 @@
         "axios": "^1.5.1",
         "decimal.js": "^10.4.3",
         "dom-zindex": "^1.0.4",
+        "dxf-parser": "^1.1.2",
+        "dxf-writer": "^1.18.4",
         "element-plus": "^2.9.3",
         "file-saver": "^2.0.5",
+        "leafer-ui": "^1.8.0",
+        "leaflet": "^1.9.4",
         "moment": "^2.30.1",
         "northglass-erp": "file:",
         "pinia": "^2.1.6",
@@ -9266,6 +10268,458 @@
           "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
           "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
         },
+        "@leafer-in/interface": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-in/interface/-/interface-1.8.0.tgz",
+          "integrity": "sha512-j4ucPjPX8/TBIID1RPHv6CA1KtiIh56igvrHBYHd44NS1tzKWhsswKUVRrzK0nqeSh1VL4SzGZgiQNwZq56R4A==",
+          "requires": {}
+        },
+        "@leafer-ui/app": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/app/-/app-1.8.0.tgz",
+          "integrity": "sha512-IapfZlekYrm32h2KfILlbdzcD7n4ncrzXLeM0h0XBK+4rRCqLrPNScPbzKtNhaMhFvq2NjLdfWVqmy63jXfj2g==",
+          "requires": {
+            "@leafer-ui/data": "1.8.0",
+            "@leafer-ui/display": "1.8.0",
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/bounds": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/bounds/-/bounds-1.8.0.tgz",
+          "integrity": "sha512-k72/biSCoUKNM7Gtk25R1AuBwdebT9b2XVveAqbaAq0CV6Wk0tUbjAnzyarSyzYn4BgrjPCTGl/lYtiPuIAiRQ==",
+          "requires": {
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/color": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/color/-/color-1.8.0.tgz",
+          "integrity": "sha512-WLw7rgA7zgVp8dp1hahWM8v8lo6HClUmpbWrsPTTlA7QXAiNpayfh8bV8NOhhwhQhCtxOEtC6UGKsBcTorwqMQ==",
+          "requires": {
+            "@leafer-ui/draw": "1.8.0"
+          }
+        },
+        "@leafer-ui/core": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/core/-/core-1.8.0.tgz",
+          "integrity": "sha512-GkFRaNoArkFEEctzP5rKxOzFOnNzTLa9hLbvPQM/CFCBSSDdkx+BsnKBPkwHqvcRvGQLPZ3fhpoatxMoQncPug==",
+          "requires": {
+            "@leafer-ui/app": "1.8.0",
+            "@leafer-ui/draw": "1.8.0",
+            "@leafer-ui/event": "1.8.0",
+            "@leafer-ui/hit": "1.8.0",
+            "@leafer-ui/interaction": "1.8.0"
+          }
+        },
+        "@leafer-ui/data": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/data/-/data-1.8.0.tgz",
+          "integrity": "sha512-J386mOuGuVbpCU9fYdNg2IAluufYhjP4latizX8YdPEAnS2qGgbz5OahLwyCtBLYH50mT6gMyL/HSFXY4Idj5g==",
+          "requires": {
+            "@leafer-ui/external": "1.8.0",
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/decorator": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/decorator/-/decorator-1.8.0.tgz",
+          "integrity": "sha512-LGY8yqk+7TFhC0VgSV0jz1mHEY/6pLSmX5BNxuyomOBLzKbmW+EaWKl1JtuIBjg5ENXL5ZhVWfDZIs38fxM5Zw==",
+          "requires": {
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/display": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/display/-/display-1.8.0.tgz",
+          "integrity": "sha512-VrDOH5UTrYqAjLb2GIrVpTO33lHznxLDzP0IBqPduTGSe43BPMz7iNqUHwzgZDsV/qBKasLUtbrWcuk7SAp1fA==",
+          "requires": {
+            "@leafer-ui/data": "1.8.0",
+            "@leafer-ui/decorator": "1.8.0",
+            "@leafer-ui/display-module": "1.8.0",
+            "@leafer-ui/external": "1.8.0",
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/display-module": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/display-module/-/display-module-1.8.0.tgz",
+          "integrity": "sha512-69ZsFg+pUGskFa8kfO1OnmAz6q4q0/RNlmqbPE8B2D35J6JVJeITK1PBxGOGB/hKhDdoGUDpkb/MuKeIiIhNoA==",
+          "requires": {
+            "@leafer-ui/bounds": "1.8.0",
+            "@leafer-ui/data": "1.8.0",
+            "@leafer-ui/render": "1.8.0"
+          }
+        },
+        "@leafer-ui/draw": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/draw/-/draw-1.8.0.tgz",
+          "integrity": "sha512-utYzJ4IIP2GaKWTVaO19gnlrz0HMXmzgvkcsovW5JoOQIi7XpB3yFXf7tUTUb9HdcVMAK7jssz4T0E4EiMaWvQ==",
+          "requires": {
+            "@leafer-ui/decorator": "1.8.0",
+            "@leafer-ui/display": "1.8.0",
+            "@leafer-ui/display-module": "1.8.0",
+            "@leafer-ui/external": "1.8.0",
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/effect": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/effect/-/effect-1.8.0.tgz",
+          "integrity": "sha512-on6jWBrGizw4pV1ZAtauwkA2e/jzf/aULfDrjVwwD5IrzLepcNoCJjE+ZQyabLU2KnRKKmjsvaGfMyYbpnjHfA==",
+          "requires": {
+            "@leafer-ui/draw": "1.8.0",
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/event": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/event/-/event-1.8.0.tgz",
+          "integrity": "sha512-jwaUKogwmq5wjhjiV01DCGxRcEY1MgszrQ5KokpLPnHCVPnxjBzrnJ808OAkXxwtrsNeFSpBDNOCbRvY4A0+qQ==",
+          "requires": {
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/external": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/external/-/external-1.8.0.tgz",
+          "integrity": "sha512-nyyVTkM8X3KPJou7cX3+npc4C9a5YSAUviu95auSEFWlF/OBzdUQ2wwG6JKvN+BZzNOTgWgqByyRNbChI90xXw==",
+          "requires": {
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/hit": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/hit/-/hit-1.8.0.tgz",
+          "integrity": "sha512-LpCoPlELmUOcERtibj0IZpSokhWOJksWJrxxdHWLgS0nDqfuu1OYkLNl3OWsYiejSPyDdODD6R7bLfWSOSjz8Q==",
+          "requires": {
+            "@leafer-ui/draw": "1.8.0",
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/interaction": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/interaction/-/interaction-1.8.0.tgz",
+          "integrity": "sha512-SCIP5nvGNb5z9i1HcCFXiHNk1gNvmIdoH+PcZFwoN35bYAlkIeRx9pDTSxrLBoVpJq4FXxt2qQrR9+IwZuJ3/A==",
+          "requires": {
+            "@leafer-ui/draw": "1.8.0",
+            "@leafer-ui/event": "1.8.0",
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/interaction-web": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/interaction-web/-/interaction-web-1.8.0.tgz",
+          "integrity": "sha512-HhySVSnjHm4BGEyw8mqoNyyzf2fmzV1V/yHw5i5UOrbJol58f12xGY8J6zoMLKrcXh4VfZQ+uaqjOWiYjOiLGw==",
+          "requires": {
+            "@leafer-ui/core": "1.8.0",
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/interface": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/interface/-/interface-1.8.0.tgz",
+          "integrity": "sha512-cwZutgshMWVg22xzJ9+34Ye/HX0W6LxMyQwoPtDlMUMQKvBW5EHRfQ5dv4d16X9PFxA0N7Djm0u7/TIpjrCh0g==",
+          "requires": {
+            "@leafer/interface": "1.8.0"
+          }
+        },
+        "@leafer-ui/paint": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/paint/-/paint-1.8.0.tgz",
+          "integrity": "sha512-8F5XgJS0lflpA2W6GxJVQw8bjv9H5dCc0JdjHbQEcaKMFk0vQzjm6d61HbjWXEW61jHXZC+rXtDOi3T1MrQVVg==",
+          "requires": {
+            "@leafer-ui/draw": "1.8.0",
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/partner": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/partner/-/partner-1.8.0.tgz",
+          "integrity": "sha512-3VBx61FoR8/zSXslmWstg/u7qulzBvi3e+iMl+fW0ruWeNx95VdM4W3LG3am9RQ92fqnKdF1ebgpoKZcIm5ajQ==",
+          "requires": {
+            "@leafer-ui/color": "1.8.0",
+            "@leafer-ui/draw": "1.8.0",
+            "@leafer-ui/effect": "1.8.0",
+            "@leafer-ui/paint": "1.8.0",
+            "@leafer-ui/text": "1.8.0"
+          }
+        },
+        "@leafer-ui/render": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/render/-/render-1.8.0.tgz",
+          "integrity": "sha512-1gEx9FmlvyhYMqGrh4ogTv3MuJnti4pIBqPtrI+8grPQ1cpjwS36ghV+7LNhb6y+oPOwqw/22+KIG35ObxVLEA==",
+          "requires": {
+            "@leafer-ui/external": "1.8.0"
+          }
+        },
+        "@leafer-ui/text": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/text/-/text-1.8.0.tgz",
+          "integrity": "sha512-7IXXDjP8DkzIniOI1ow/6rMlYknBCRltGo7lyFy2besI32mS1yIobXlO60/uTCtfAJVPL5Wtr8ZACm0sf5UrUA==",
+          "requires": {
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer-ui/web": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer-ui/web/-/web-1.8.0.tgz",
+          "integrity": "sha512-tG0OQl+U2+6dNXmWzQzczReAH63H7eJPNkCwRxSMopipvVLR0ix3YgpHFrCBzd05yH2x1S5xJ9aUJin+bgAUfA==",
+          "requires": {
+            "@leafer-in/interface": "1.8.0",
+            "@leafer-ui/core": "1.8.0",
+            "@leafer-ui/draw": "1.8.0",
+            "@leafer-ui/interaction-web": "1.8.0",
+            "@leafer-ui/interface": "1.8.0",
+            "@leafer-ui/partner": "1.8.0",
+            "@leafer/canvas-web": "1.8.0",
+            "@leafer/core": "1.8.0",
+            "@leafer/image-web": "1.8.0",
+            "@leafer/interface": "1.8.0",
+            "@leafer/partner": "1.8.0"
+          }
+        },
+        "@leafer/canvas": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/canvas/-/canvas-1.8.0.tgz",
+          "integrity": "sha512-8s02D1lR4cFbNZV63WbjONgr54FuffQS9YRGml2FuRhGwgTHF6UGMQ5u7CWx9YLGgCcW4DdBqS8v1KX1MVJzOA==",
+          "requires": {
+            "@leafer/data": "1.8.0",
+            "@leafer/debug": "1.8.0",
+            "@leafer/file": "1.8.0",
+            "@leafer/list": "1.8.0",
+            "@leafer/math": "1.8.0",
+            "@leafer/path": "1.8.0",
+            "@leafer/platform": "1.8.0"
+          }
+        },
+        "@leafer/canvas-web": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/canvas-web/-/canvas-web-1.8.0.tgz",
+          "integrity": "sha512-gYRmiK0WATOY1caiUTnHB0xfqvuI2oi9SW1fykIdLI/cVQfANtaOaL8mOajiwQIZv64yK630UEQIFobHkUEA5A==",
+          "requires": {
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer/core": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/core/-/core-1.8.0.tgz",
+          "integrity": "sha512-BOvWte6IEv5Tyrf0rx6lplwtfd7It4DtGU9js//rCZwfaocRlJCLTgcGEXk97DkdUiDeJ8gxaJiMp9CTq4CjAA==",
+          "requires": {
+            "@leafer/canvas": "1.8.0",
+            "@leafer/data": "1.8.0",
+            "@leafer/debug": "1.8.0",
+            "@leafer/decorator": "1.8.0",
+            "@leafer/display": "1.8.0",
+            "@leafer/display-module": "1.8.0",
+            "@leafer/event": "1.8.0",
+            "@leafer/file": "1.8.0",
+            "@leafer/helper": "1.8.0",
+            "@leafer/image": "1.8.0",
+            "@leafer/layout": "1.8.0",
+            "@leafer/list": "1.8.0",
+            "@leafer/math": "1.8.0",
+            "@leafer/path": "1.8.0",
+            "@leafer/platform": "1.8.0",
+            "@leafer/task": "1.8.0"
+          }
+        },
+        "@leafer/data": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/data/-/data-1.8.0.tgz",
+          "integrity": "sha512-qzVFYNlHBJzhF23duqIxWrKwJ+kfidU0h1QiH+zbVwEdIaDGT7obiXZEzwR+kjLPftVb8gyZrZoyHgvWu43ErA=="
+        },
+        "@leafer/debug": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/debug/-/debug-1.8.0.tgz",
+          "integrity": "sha512-zqM7091uVP1OCiumJle6/t9Imc7GiM6AlX2FkvMi65YO9Ob9wmzE8X2lzA2/yggiCtbGdLRbC53Ghm1x3PrI3A==",
+          "requires": {
+            "@leafer/math": "1.8.0"
+          }
+        },
+        "@leafer/decorator": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/decorator/-/decorator-1.8.0.tgz",
+          "integrity": "sha512-kdnN3JydJmBvyGK9dBZRA7mv3bawU3l3mNOclR/OWzH2uESo7tbOsDqqRdKjcKG85reMlsdKPt06Nd3FhrlmTQ==",
+          "requires": {
+            "@leafer/data": "1.8.0",
+            "@leafer/debug": "1.8.0",
+            "@leafer/platform": "1.8.0"
+          }
+        },
+        "@leafer/display": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/display/-/display-1.8.0.tgz",
+          "integrity": "sha512-rIUOrG8nJhFmK61ulo846zpvgH6ogI9ojZ9RMMBfvVL2N81CYF7/u+7QcgCKJB0GdLlCaDgmyXuCAozuAik7Gg==",
+          "requires": {
+            "@leafer/data": "1.8.0",
+            "@leafer/debug": "1.8.0",
+            "@leafer/decorator": "1.8.0",
+            "@leafer/display-module": "1.8.0",
+            "@leafer/event": "1.8.0",
+            "@leafer/helper": "1.8.0",
+            "@leafer/image": "1.8.0",
+            "@leafer/layout": "1.8.0",
+            "@leafer/math": "1.8.0",
+            "@leafer/platform": "1.8.0"
+          }
+        },
+        "@leafer/display-module": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/display-module/-/display-module-1.8.0.tgz",
+          "integrity": "sha512-ZdXKjfcYCDHzUSx6GsGJh3SQLyQZFZ3TcRpseF/IAmQpmLwujKvAdltLlN30eNEsil6qqEOORuNqQHGyd6YFQA==",
+          "requires": {
+            "@leafer/debug": "1.8.0",
+            "@leafer/event": "1.8.0",
+            "@leafer/helper": "1.8.0",
+            "@leafer/math": "1.8.0"
+          }
+        },
+        "@leafer/event": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/event/-/event-1.8.0.tgz",
+          "integrity": "sha512-PHBvoZ2LLnI5HY3L5SyKHvIUoyMFitNj7Nn2fqF6yUHp9BQzhKV2gLuyn7RjhpnPta4Xo88ruLADFO0yWlG5gA==",
+          "requires": {
+            "@leafer/decorator": "1.8.0",
+            "@leafer/math": "1.8.0",
+            "@leafer/platform": "1.8.0"
+          }
+        },
+        "@leafer/file": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/file/-/file-1.8.0.tgz",
+          "integrity": "sha512-JwYTv1p/cIhAQv5iXT86gRInwHQz/kLKaQAREi7oA9bacyBQ+2cE4r695I7Nok7JyqTFEe5DtK3g2sm3Ueqfgg==",
+          "requires": {
+            "@leafer/debug": "1.8.0"
+          }
+        },
+        "@leafer/helper": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/helper/-/helper-1.8.0.tgz",
+          "integrity": "sha512-cTai2P/Fy0Rxr+Lno111pseNJF5xU0ctowTV4lFW+6cOnaGpqeJoTGFkO9MeSOFeSRBjxe7ecfsNoGGzm3THoA==",
+          "requires": {
+            "@leafer/math": "1.8.0",
+            "@leafer/platform": "1.8.0"
+          }
+        },
+        "@leafer/image": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/image/-/image-1.8.0.tgz",
+          "integrity": "sha512-XElWxR5RZeiTKF+ntdTf5d3wxt2xj7BLh3N3q1Z5Y9ymf73P+efcWV/CaNPRpP8M6uXomQLwYE8KbRa79y5ZVw==",
+          "requires": {
+            "@leafer/data": "1.8.0",
+            "@leafer/file": "1.8.0",
+            "@leafer/math": "1.8.0",
+            "@leafer/platform": "1.8.0",
+            "@leafer/task": "1.8.0"
+          }
+        },
+        "@leafer/image-web": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/image-web/-/image-web-1.8.0.tgz",
+          "integrity": "sha512-OGcBG1ALIeF2pjMoSwJlrfEL1KQbu1TfJDYMqLGydM1Ygt5w/FHJrsqtd/zBJlmjxZSVCmA5C8DDlbFkKpqJOw==",
+          "requires": {
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer/interface": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/interface/-/interface-1.8.0.tgz",
+          "integrity": "sha512-76jOG0AabfIw8WMI8nulb1FKylBcVnpucuiTjml5df6P991wcH8xsDSQtRCaOKrsl0C2DbW62BVwst1NHHHalQ=="
+        },
+        "@leafer/layout": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/layout/-/layout-1.8.0.tgz",
+          "integrity": "sha512-t6tisD+dcKSwyAaKV/EIPRrrx/HCQn9vGrZxTVSs/sXGdM7Sfhv2Kp9/QJm7lEceVbVmAWWQX/3QMWs1bj8xKA==",
+          "requires": {
+            "@leafer/helper": "1.8.0",
+            "@leafer/math": "1.8.0",
+            "@leafer/platform": "1.8.0"
+          }
+        },
+        "@leafer/layouter": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/layouter/-/layouter-1.8.0.tgz",
+          "integrity": "sha512-prrsYdlHsUjYSLBuotmmbWYNhML5EkLqD6NPPbl43eBd0nGVZJZMTmgVZNcjn/Ms2MGf15IeVIg1VhAuFlp2fg==",
+          "requires": {
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer/list": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/list/-/list-1.8.0.tgz",
+          "integrity": "sha512-eySBH8eRcoW4P9N5Doj6xgFwQ5AqgzG+jR9jhd1VDaV4mVjK+PnBxLWLkg/ZNZgYX38HEtQZ02qMiDFOHmBA6g=="
+        },
+        "@leafer/math": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/math/-/math-1.8.0.tgz",
+          "integrity": "sha512-X0VaEqgCOAHZUsiiYWqoENvE5lHrglfuKaX3fkers31UgjPN0wmTSbk+N4kXR9ssq6wq3KzJIRdPyPLVTMoo5A=="
+        },
+        "@leafer/partner": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/partner/-/partner-1.8.0.tgz",
+          "integrity": "sha512-qILWj6XIj3wpCgZPs/hh/Z7BgI6/fYcjC/aJRETz87X9anL5GtlrVP7FDvb2O5uD8fiSRkqoeMWhUmVCnIclZg==",
+          "requires": {
+            "@leafer/core": "1.8.0",
+            "@leafer/layouter": "1.8.0",
+            "@leafer/renderer": "1.8.0",
+            "@leafer/selector": "1.8.0",
+            "@leafer/watcher": "1.8.0"
+          }
+        },
+        "@leafer/path": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/path/-/path-1.8.0.tgz",
+          "integrity": "sha512-FXxkxc4Yckr+zBO+Ejz4aKtIC0mV3Jmx/0Vl8uOVT5GOzpbJvGdZYM4a5jRMddUJn5I/C0F1QWjXTGqHX/6fSA==",
+          "requires": {
+            "@leafer/debug": "1.8.0",
+            "@leafer/math": "1.8.0"
+          }
+        },
+        "@leafer/platform": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/platform/-/platform-1.8.0.tgz",
+          "integrity": "sha512-EuwwMKowbQ3tcPffa3hFDkAm+odvJmH0f+b8QzSBlS9SXO2H6FMcizxMqrnSt7CmBEQY7PZEazXGxYMaptUflA==",
+          "requires": {
+            "@leafer/debug": "1.8.0",
+            "@leafer/layouter": "1.8.0"
+          }
+        },
+        "@leafer/renderer": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/renderer/-/renderer-1.8.0.tgz",
+          "integrity": "sha512-rXmSRJW2lDlDJFeJwJEwd7gxU8IPtW7ysJ9xHoj+vqeeIFn8xxBZiYjE4/Y+CNCR4eebOC2qseLYzTV99+QIhA==",
+          "requires": {
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer/selector": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/selector/-/selector-1.8.0.tgz",
+          "integrity": "sha512-uljegY6ia0UodTnd8G0wYXo1KbT31+PXgNvnSdrV5Jd+n8snjUoAKA6wkfbTIAZoLFbIEoge5alJ2WMvyF+4QQ==",
+          "requires": {
+            "@leafer/core": "1.8.0"
+          }
+        },
+        "@leafer/task": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/task/-/task-1.8.0.tgz",
+          "integrity": "sha512-i+oFTC9jX0k4MKek4zhuezkNwH5n1m/TZ2eCy+uw6Hwt8i4LCX2tY/mNcFJGtNztBBHxbT3pe/oCM8Pi2nuYag==",
+          "requires": {
+            "@leafer/debug": "1.8.0",
+            "@leafer/math": "1.8.0"
+          }
+        },
+        "@leafer/watcher": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/@leafer/watcher/-/watcher-1.8.0.tgz",
+          "integrity": "sha512-Co37fD2k6sr7ZrKpM1NghpX0iVMvA51NKSPk3MxDbLUyzBRCmbhyLlvT68CW09L1Vb+9WOvuQA3kdQ4QUrOTew==",
+          "requires": {
+            "@leafer/data": "1.8.0",
+            "@leafer/event": "1.8.0",
+            "@leafer/list": "1.8.0"
+          }
+        },
         "@popperjs/core": {
           "version": "npm:@sxzz/popperjs-es@2.11.7",
           "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
@@ -9515,9 +10969,9 @@
           }
         },
         "acorn": {
-          "version": "8.10.0",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
-          "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw=="
+          "version": "8.15.0",
+          "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz",
+          "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="
         },
         "adler-32": {
           "version": "1.3.1",
@@ -9755,6 +11209,19 @@
           "resolved": "https://registry.npmmirror.com/dom-zindex/-/dom-zindex-1.0.6.tgz",
           "integrity": "sha512-FKWIhiU96bi3xpP9ewRMgANsoVmMUBnMnmpCT6dPMZOunVYJQmJhSRruoI0XSPoHeIif3kyEuiHbFrOJwEJaEA=="
         },
+        "dxf-parser": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmmirror.com/dxf-parser/-/dxf-parser-1.1.2.tgz",
+          "integrity": "sha512-GPTumUvRkounlIazLIyJMmTWt+nlg+ksS0Hdm8jWvejmZKBTz6gvHTam76wRm4PQMma5sgKLThblQyeIJcH79Q==",
+          "requires": {
+            "loglevel": "^1.7.1"
+          }
+        },
+        "dxf-writer": {
+          "version": "1.18.4",
+          "resolved": "https://registry.npmmirror.com/dxf-writer/-/dxf-writer-1.18.4.tgz",
+          "integrity": "sha512-JdLOyP+1UyeB30yPowJLJKK0bPROq/dX+QTWcLSplQoepcyo/YMlU0Z27T7mIPxgwiPb+CQWwUIlbcRRfns+ng=="
+        },
         "element-plus": {
           "version": "2.9.3",
           "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.3.tgz",
@@ -9968,6 +11435,28 @@
           "resolved": "https://registry.npmmirror.com/jsbarcode/-/jsbarcode-3.11.6.tgz",
           "integrity": "sha512-G5TKGyKY1zJo0ZQKFM1IIMfy0nF2rs92BLlCz+cU4/TazIc4ZH+X1GYeDRt7TKjrYqmPfTjwTBkU/QnQlsYiuA=="
         },
+        "leafer-ui": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmmirror.com/leafer-ui/-/leafer-ui-1.8.0.tgz",
+          "integrity": "sha512-Y/jXyC3ZJ8DCkifUfIgSqt38fwdf1UJ8//IKWntvCXVlEx9R50vx33rxf1VVHQq0NWcfH6U64k+VzDLSXq/rFA==",
+          "requires": {
+            "@leafer-in/interface": "1.8.0",
+            "@leafer-ui/core": "1.8.0",
+            "@leafer-ui/draw": "1.8.0",
+            "@leafer-ui/interaction-web": "1.8.0",
+            "@leafer-ui/interface": "1.8.0",
+            "@leafer-ui/partner": "1.8.0",
+            "@leafer-ui/web": "1.8.0",
+            "@leafer/core": "1.8.0",
+            "@leafer/interface": "1.8.0",
+            "@leafer/partner": "1.8.0"
+          }
+        },
+        "leaflet": {
+          "version": "1.9.4",
+          "resolved": "https://registry.npmmirror.com/leaflet/-/leaflet-1.9.4.tgz",
+          "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="
+        },
         "local-pkg": {
           "version": "0.4.3",
           "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
@@ -9997,6 +11486,11 @@
           "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
           "requires": {}
         },
+        "loglevel": {
+          "version": "1.9.2",
+          "resolved": "https://registry.npmmirror.com/loglevel/-/loglevel-1.9.2.tgz",
+          "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg=="
+        },
         "magic-string": {
           "version": "0.30.5",
           "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
diff --git a/north-glass-erp/northglass-erp/package.json b/north-glass-erp/northglass-erp/package.json
index ee50f21..e547e83 100644
--- a/north-glass-erp/northglass-erp/package.json
+++ b/north-glass-erp/northglass-erp/package.json
@@ -12,8 +12,12 @@
     "@vue-macros/reactivity-transform": "^0.3.23",
     "axios": "^1.5.1",
     "decimal.js": "^10.4.3",
+    "dxf-parser": "^1.1.2",
+    "dxf-writer": "^1.18.4",
     "element-plus": "^2.9.3",
     "file-saver": "^2.0.5",
+    "leafer-ui": "^1.8.0",
+    "leaflet": "^1.9.4",
     "moment": "^2.30.1",
     "northglass-erp": "file:",
     "pinia": "^2.1.6",
diff --git a/north-glass-erp/northglass-erp/src/components/mm/PrintPackingList.vue b/north-glass-erp/northglass-erp/src/components/mm/PrintPackingList.vue
index 2499e91..d9890cb 100644
--- a/north-glass-erp/northglass-erp/src/components/mm/PrintPackingList.vue
+++ b/north-glass-erp/northglass-erp/src/components/mm/PrintPackingList.vue
@@ -119,8 +119,16 @@
 }
 
 table{
+  border-collapse: collapse;
   width: 100%;
 }
+tr,td,th{
+  border: 1px solid black;
+}
+
+th,.no-change-row {
+  white-space: nowrap;
+}
 
 @media print {
   @page {
diff --git a/north-glass-erp/northglass-erp/src/components/mm/PrintPackingListLuoyang.vue b/north-glass-erp/northglass-erp/src/components/mm/PrintPackingListLuoyang.vue
new file mode 100644
index 0000000..2ad6652
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/components/mm/PrintPackingListLuoyang.vue
@@ -0,0 +1,373 @@
+<script setup>
+import request from "@/utils/request"
+import {ElDatePicker, ElMessage} from "element-plus"
+import {nextTick, onMounted, onUnmounted, onUpdated, reactive, ref, watch} from "vue"
+import {Search} from "@element-plus/icons-vue"
+import {useRouter} from 'vue-router'
+import {changeFilterEvent, filterChanged} from "@/hook"
+import {useI18n} from 'vue-i18n'
+import deepClone from "@/utils/deepClone";
+import QRCode from "qrcode";
+import companyInfo from "@/stores/sd/companyInfo";
+import userInfo from "@/stores/userInfo"
+import {add,addAuto} from '@/utils/decimal';
+//璇█鑾峰彇
+const company = companyInfo()
+const {t} = useI18n()
+let router = useRouter()
+let produceList = ref([])
+let count = ref([{id:1},{id:2}])
+let list = ref()
+const details = ref([])
+const user=userInfo()
+const name1=ref("admin")
+const name2=ref("admin")
+
+
+
+const data = ref({
+  printList: []
+})
+
+let props = defineProps({
+  printList: null,
+  companyVal: null
+})
+
+const {currentRoute} = useRouter()
+const route = currentRoute.value
+
+
+data.value.printList = JSON.parse(props.printList)
+
+onMounted(() => {
+  selectPrint()
+})
+
+const companyList = ref([{
+  company:'娲涢槼鍖楁柟鐜荤拑鎶�鏈偂浠芥湁闄愬叕鍙�',
+  companyInfo:"LUOYANGNORTHGLASSTECHNOLOGYCO.,LTD.",
+  address:'娲涢槼鍥藉楂樻柊鎶�鏈紑鍙戝尯寮犲簞',
+  phone:'0379-64312861.64331830',
+  url:'http://www.northglass.com',
+  fax:'0379-64332066',
+  email:"luoyang@northglass.com",
+  postcode:'471003'
+
+},
+  {
+    company:'涓婃捣鍖楃幓鐜荤拑鎶�鏈伐涓氭湁闄愬叕鍙�',
+    companyInfo:"SHANGHAI NORTH GLASS TECHNOLOGY&INDUSTRY CO.,LTD.",
+    address:'涓婃捣甯傛澗姹熷尯灏忔槅灞遍晣鍏夊崕璺�328鍙�',
+    phone:'(021)57858640',
+    url:'http://www.northglass.com',
+    fax:'(021)57858600',
+    email:"sngpzb@163.com",
+    postcode:'201614'
+
+  }
+])
+let companyAddress = ref(companyList.value[0])
+watch(props, (newVal, oldVal) => {
+  companyAddress.value = companyList.value[props.companyVal-1]
+})
+
+
+onUpdated(() => {
+  const element = document.getElementById('my-paragraph');
+  if (element) {
+    //console.log(element.style.height)
+  }
+});
+const orderDetailList = ref([])
+const customer = ref({})
+const selectPrint =async () => {
+  request.post(`/finishedGoodsInventory/getSelectPrints`, data.value).then((res) => {
+    if (res.code == 200) {
+      produceList.value = deepClone(res.data.data)
+      customer.value = produceList.value[0].detail[0]
+      let height = 0
+      let index = 0
+      for(let i=0;i<produceList.value.length;i++){
+        //鎹骇鍝佸氨鎹㈤〉
+        if(i>0){
+          index+=1
+        }
+        orderDetailList.value[index]=[]
+        orderDetailList.value[index].push({
+          type:'customer',
+          customer:produceList.value[i].detail[0]
+        })
+        produceList.value[i].detailList.forEach(order => {
+          height+=50
+          //鍒ゆ柇楂樺害鏄惁瓒呰繃350锛屽垯鎹㈤〉
+          if(height>=500){
+            height=0
+            index+=1
+            orderDetailList.value[index]=[]
+
+            orderDetailList.value[index].push({
+              type:'customer',
+              customer:produceList.value[i].detail[0]
+            })
+          }
+          orderDetailList.value[index].push({
+            type:'product',
+            productName:order.product_name
+          })
+
+
+          order.detailList.forEach(item => {
+            height+=30
+            if(height>=500){
+              height=0
+              index+=1
+              orderDetailList.value[index]=[]
+              orderDetailList.value[index].push({
+                type:'customer',
+                customer:produceList.value[i].detail[0]
+              })
+            }
+            orderDetailList.value[index].push({
+              type:'size',
+              size:item
+            })
+          })
+        })
+      }
+      orderDetailList.value.forEach((page,index)=>{
+        let sum = {
+          quantity:0,
+          area:0,
+          weight:0
+        }
+        page.forEach((row)=>{
+          if(row.type==='size'){
+            sum.quantity +=row.size.quantity
+            sum.area =addAuto(row.size.area,sum.area,2)
+            sum.weight =addAuto(row.size.weight,sum.weight,2)
+          }
+        })
+        page.push({
+          type:'sum',
+          sum:sum
+        })
+      })
+
+    } else {
+      ElMessage.warning(res.msg)
+      router.push("/login")
+    }
+  })
+}
+
+</script>
+
+<template>
+  <div >
+    <div :class="'div_'+n " style="width: 46%;position: relative;margin-top: 20px" v-for="n in 2" >
+        <table v-for="page in orderDetailList" :key="page" style="width: 100%">
+          <thead>
+          <tr>
+            <td colspan="1" style="text-align: center;font-weight: bolder;">
+              <div style="width: 35px;height: 35px">
+                <img id="img-pic" style="width:100%;height: 100%" src="@/assets/northGlass.ico" alt="">
+              </div>
+            </td>
+            <td colspan="4" style="font-weight: bolder">
+              <div style="font-size: 15px;font-weight: bold;line-height: 15px;">
+                <p
+                    style="font-size: 15px;
+                             font-weight: bold;
+                             line-height: 15px;"
+                >{{companyAddress.company}}</p>
+                <span style="font-size: 8px;">&nbsp;&nbsp;&nbsp;&nbsp;{{companyAddress.companyInfo}}</span>
+              </div>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="5" style="text-align: center;font-size: 12px">
+              <div>(瑁呯鍗�)</div>
+            </td>
+          </tr>
+          <tr style="width: 100%;font-size: 9px"  >
+            <td colspan="5">
+              <div style="display:flex;">
+                <div style="width: 100%"><span style="font-weight: bold;">瀹㈡埛鍚嶇О</span>锛�
+                  <input class="contactNumber" style="width: 80%;font-size: 9px" type="text"
+                         v-model="page[0].customer.customer_name" />
+                </div>
+              </div>
+              <div style="display:flex;">
+                <div style="width: 100%"><span style="font-weight: bold">宸ョ▼鍚嶇О</span>锛歿{page[0].customer.project}}</div>
+              </div>
+              <div style="display:flex;">
+                <div style="width: 50%"><span style="font-weight: bold">璁㈠崟鍙�</span>锛歿{page[0].customer.order_id}}</div>
+                <div style="width: 50%"><span style="font-weight: bold">瑁呯鍗曞彿</span>锛歿{page[0].customer.remarks}}</div>
+              </div>
+              <div style="display:flex;">
+                <div style="width: 50%"><span style="font-weight: bold">鍖呰鏃ユ湡</span>锛歿{page[0].customer.reporting_work_time}}</div>
+                <div style="width: 50%"><span style="font-weight: bold">鏈灦鏁伴噺</span>锛歿{page[0].customer.quantity}}</div>
+              </div>
+              <div style="display:flex;">
+                <div style="width: 50%;font-size: 9px"><span style="font-weight: bold">鍔犲伐鐝粍</span>锛歿{page[0].customer.teams_groups_name2}}</div>
+                <div style="width: 50%;font-size: 9px"><span style="font-weight: bold">鍖呰鐝粍</span>锛歿{page[0].customer.teams_groups_name}}</div>
+              </div>
+              <div style="display:flex;">
+                <div style="width: 50%"><span style="font-weight: bold">璐ㄩ噺妫�楠�</span>锛氬垬鍖栬強</div>
+                <div style="width: 50%"><span style="font-weight: bold">鎴愬搧鍙戣揣</span>锛氶儜鐝婄強</div>
+              </div>
+
+
+            </td>
+          </tr>
+          <tr style="width: 100%;font-size: 12px">
+            <td style="width: 20%;">缂栧彿</td>
+            <td style="width: 20%;">瀹藉害</td>
+            <td style="width: 20%;">楂樺害</td>
+            <td style="width: 20%;">鐗囨暟</td>
+            <td style="width: 20%;">闈㈢Н(m虏)</td>
+          </tr>
+          <tr style="width: 100%;">
+            <td colspan="5" ><hr></td>
+          </tr>
+          </thead>
+          <tbody>
+          <template v-for="(row,index) in page" :key="row">
+            <tr v-if="row.type==='product'" style="width: 100%;height: 100px" >
+              <td colspan="1" style="font-weight: bold;font-size: 11px">鍔犲伐鍝佺:</td>
+              <td colspan="4">
+                <textarea style="resize: none;width: 100%;height: 100px;border: 0" class="textarea" type="textarea" v-model="row.productName" /></td>
+            </tr>
+            <tr v-else-if="row.type==='size'" style="width: 100%;height: 30px">
+              <td style="font-size: 10px">{{ row.size.building_number }}</td>
+              <td style="font-weight: bold">{{ row.size.width }}</td>
+              <td style="font-weight: bold">{{ row.size.height }}</td>
+              <td style="font-weight: bold">{{ row.size.quantity }}</td>
+              <td>{{ row.size.area }}</td>
+            </tr>
+
+            <tr id="footsum" v-else-if="row.type==='sum'" style="border: 0;font-size: 10px">
+              <td colspan="5" style="border: 0;">
+                <div style="display:flex;">
+                  <div>鏈〉鏁伴噺</div>&nbsp;&nbsp;&nbsp;&nbsp;
+                  <div>{{row.sum.quantity}}</div>&nbsp;&nbsp;&nbsp;
+                  <div>闈㈢Н</div>&nbsp;&nbsp;&nbsp;&nbsp;
+                  <div>{{row.sum.area}}(m虏)</div>&nbsp;&nbsp;&nbsp;
+                  <div>閲嶉噺</div>&nbsp;&nbsp;&nbsp;&nbsp;
+                  <div>{{row.sum.weight}}(kg)</div>
+                </div>
+              </td>
+            </tr>
+
+          </template>
+          </tbody>
+          <tfoot id="sticky-footer">
+            <tr style="border: 0;font-size: 8px">
+              <td colspan="5" style="border: 0;">
+                <div style="display:flex;">
+                  <div>鍦板潃:{{companyAddress.address}}</div>&nbsp;&nbsp;&nbsp;&nbsp;
+                  <div>鐢佃瘽:{{companyAddress.phone}}</div>
+                </div>
+                <div style="display:flex;">
+                  <div>{{companyAddress.url}}</div>&nbsp;&nbsp;&nbsp;&nbsp;
+                  <div>浼犵湡:{{companyAddress.fax}}</div>
+                </div>
+                <div style="display:flex;">
+                  <div>E-mail:{{companyAddress.email}}</div>&nbsp;&nbsp;&nbsp;&nbsp;
+                  <div>閭紪锛歿{companyAddress.postcode}}</div>
+                </div>
+
+              </td>
+            </tr>
+          </tfoot>
+        </table>
+      </div>
+  </div>
+
+</template>
+
+<style scoped>
+* {
+  margin: 0;
+  padding: 0;
+}
+.contactNumber{
+  width: 40%;
+  height:20px;
+  border: none;
+  box-shadow: none;
+  font-size: 15px;
+}
+.div_2{
+  margin-left: 6%;
+}
+.element-to-break-after {
+  width: 8%;
+}
+.element-to-breakr{
+  page-break-after: always;
+}
+#contentTable{
+  width: 100%;
+  height: 100%;
+}
+
+#record{
+  font-size: 15px;
+  text-align: left;
+  display: flex;
+  flex-wrap: wrap
+}
+
+table{
+  width: 100%;
+  page-break-after: always;
+}
+
+@media print {
+  @page {
+    size: auto;  /* auto is the initial value */
+    margin: 4mm 5mm 0mm 5mm  /* this affects the margin in the printer settings */
+
+  }
+  #footsum{
+    position: fixed;
+    bottom: 1.5cm;
+    width: 100%; /* 鎴栬�呰缃垚鍏蜂綋鐨勫搴� */
+  }
+  #sticky-footer {
+    position: fixed;
+    bottom: 0.5cm;
+    width: 100%; /* 鎴栬�呰缃垚鍏蜂綋鐨勫搴� */
+  }
+/*    thead{
+    display: table-header-group;
+    page-break-inside: avoid;
+  }
+  table {
+    page-break-inside: auto;
+  }
+  tr {
+    page-break-inside: avoid;
+  }
+
+
+  tfoot {
+    display: table-footer-group;
+    page-break-inside: avoid;
+  }*/
+
+}
+
+
+
+.textarea{
+  --el-border-color: rgba(255,255,255,0.0);
+  --el-input-focus-border-color: rgba(255,255,255,0.0);
+  --el-input-focus-border-width: 0px;
+  --el-input-hover-border-color: rgba(255,255,255,0.0);
+  --el-input-hover-border-width: 0px;
+}
+
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/components/mm/materialOutbound/PrintSheet1.vue b/north-glass-erp/northglass-erp/src/components/mm/materialOutbound/PrintSheet1.vue
index cf0213b..cfd500d 100644
--- a/north-glass-erp/northglass-erp/src/components/mm/materialOutbound/PrintSheet1.vue
+++ b/north-glass-erp/northglass-erp/src/components/mm/materialOutbound/PrintSheet1.vue
@@ -24,7 +24,7 @@
 let materialStore= ref([])
 const getData = () => {
   console.log(props.materialOutboundId)
-  request.get(`/MaterialInventory/printCreateOutbound/${props.materialOutboundId}`).then(res => {
+  request.get(`/materialInventory/printCreateOutbound/${props.materialOutboundId}`).then(res => {
     createOutbound.value=res.data.createOutbound
     createOutboundDetail.value=res.data.createOutboundDetail
     console.log(createOutbound.value)
diff --git a/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelDetails.vue b/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelDetails.vue
index fc39f8b..accd9ae 100644
--- a/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelDetails.vue
+++ b/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelDetails.vue
@@ -22,7 +22,8 @@
 let filterData = ref({})
 
 const data = ref({
-  printList: []
+  printList: [],
+  landingSequence:null
 })
 
 let props = defineProps({
@@ -32,7 +33,8 @@
   lableType:null,//鏍囩绫诲瀷
   titleList:null,//鏍囬
   switch:null,//鍒ゆ柇鏄惁涓烘柊鎵撳嵃,
-  lastList:[]
+  lastList:[],
+  landingSequence:null
 })
 
 const {currentRoute} = useRouter()
@@ -47,7 +49,9 @@
 }
 let lableType = props.lableType
 let switchType = props.switch
+let landingSequence = props.landingSequence
 data.value.printList = JSON.parse(props.list)
+data.value.landingSequence = props.landingSequence
 onMounted(() => {
     request.post(`/processCard/getSelectPrintCustomLabelDetails/${type}/${lableType}`, data.value).then((res) => {
       if (res.code == 200) {
@@ -93,6 +97,7 @@
   // 鑾峰彇鏄犲皠涓墍鏈夌殑閿�
   const keys = Object.keys(propertyMapping);
   // 鏍规嵁 index 鑾峰彇瀵瑰簲鐨勫睘鎬у悕
+   
   const propertyName = keys[index];
   // 濡傛灉鏄犲皠涓病鏈夎 index锛岀洿鎺ヨ繑鍥�
   if (!propertyName) {
diff --git a/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue b/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue
index dcea140..b2aa75a 100644
--- a/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue
+++ b/north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue
@@ -23,7 +23,8 @@
 let filterData = ref({})
 
 const data = ref({
-  printList: []
+  printList: [],
+  isRepeat:false
 })
 
 let props = defineProps({
diff --git a/north-glass-erp/northglass-erp/src/components/pp/PrintProcess.vue b/north-glass-erp/northglass-erp/src/components/pp/PrintProcess.vue
index 356a2b3..e2165b5 100644
--- a/north-glass-erp/northglass-erp/src/components/pp/PrintProcess.vue
+++ b/north-glass-erp/northglass-erp/src/components/pp/PrintProcess.vue
@@ -32,7 +32,11 @@
   printMerge: null,
   printLike: null,
   printProject:null,
-  merges:null
+  merges:null,
+  printFc:null,
+  flashback:null,
+  landingSequence:null,
+  compound:null
 })
 
 const {currentRoute} = useRouter()
@@ -60,12 +64,20 @@
 if (merges == '') {
   merges = null
 }
+
+//鎸囧畾灞傚悓鏋�
+let compound = props.compound
+if (compound == '') {
+  compound = null
+}
 let name=company.companyName
+
+let printNumberFc = props.printFc
 data.value.printList = JSON.parse(props.printList)
 let flowCardCount = ''
 onMounted(() => {
       if(props.printProject!=null){
-        request.post(`/processCard/getSelectPrintProject/${printProject}/${merges}`).then((res) => {
+        request.post(`/processCard/getSelectPrintProject/${printProject}/${merges}/${props.flashback}/${props.landingSequence}`).then((res) => {
           if (res.code == 200) {
             load(res.data.data)
           } else {
@@ -74,7 +86,7 @@
           }
         })
       }else{
-        request.post(`/processCard/getSelectPrinting/${merge}/${like}/${merges}`, data.value).then((res) => {
+        request.post(`/processCard/getSelectPrinting/${merge}/${like}/${merges}/${props.flashback}/${compound}/${props.landingSequence}`, data.value).then((res) => {
           if (res.code == 200) {
             load(res.data.data)
           } else {
@@ -92,33 +104,40 @@
 const handleGetQRCode = async () => {
   let technologyNumber=''
   for (let i = 0; i < produceList.value.length; i++) {
-    if (produceList.value[i].detail[0].qrcode!="" && produceList.value[i].detail[0].qrcode!=null){
-       technologyNumber = produceList.value[i].detail[0].qrcode.toString(); // 杞崲涓哄瓧绗︿覆浠ヤ究澶勭悊姣忎釜瀛楃,鍚堝苟鏍囩
-    }else {
+    console.log(produceList.value[i].detail[0])
+    // if (produceList.value[i].detail[0].qrcode!="" && produceList.value[i].detail[0].qrcode!=null){
+    //    technologyNumber = produceList.value[i].detail[0].qrcode.toString(); // 杞崲涓哄瓧绗︿覆浠ヤ究澶勭悊姣忎釜瀛楃,鍚堝苟鏍囩
+    // }else {
        technologyNumber = produceList.value[i].detail[0].technologyNumber.toString(); // 杞崲涓哄瓧绗︿覆浠ヤ究澶勭悊姣忎釜瀛楃
-    }
-    produceList.value[i].detail[0]["qrcodeList"] = []; // 鍒濆鍖栦竴涓┖鏁扮粍鐢ㄦ潵瀛樺偍 QR Code
-
-    const processId = produceList.value[i].detail[0].process_id;
-    const url = `${processId}/${technologyNumber}`
-    // 鐢熸垚 QR Code 骞跺瓨鍌ㄥ埌鏁扮粍涓�
-    const qrcodeData = await QRCode.toDataURL(url);
-    produceList.value[i].detail[0]["qrcodeList"].push({
-      qrcode: qrcodeData,
-      technologyNumber: technologyNumber
-    });
-
-    // for (let j = 0; j < technologyNumber.length; j++) {
-    //   const processId = produceList.value[i].detail[0].process_id;
-    //   const url = `${processId}/${technologyNumber[j]}`;
-    //   // 鐢熸垚 QR Code 骞跺瓨鍌ㄥ埌鏁扮粍涓�
-    //   const qrcodeData = await QRCode.toDataURL(url);
-    //   produceList.value[i].detail[0]["qrcodeList"].push({
-    //     qrcode: qrcodeData,
-    //     technologyNumber: technologyNumber[j]
-    //   });
-    //
     // }
+    produceList.value[i].detail[0]["qrcodeList"] = []; // 鍒濆鍖栦竴涓┖鏁扮粍鐢ㄦ潵瀛樺偍 QR Code
+    if (compound == null  ){
+      const processId = produceList.value[i].detail[0].process_id;
+      const url = `${processId}/${technologyNumber}`
+      // 鐢熸垚 QR Code 骞跺瓨鍌ㄥ埌鏁扮粍涓�
+      const qrcodeData = await QRCode.toDataURL(url);
+      produceList.value[i].detail[0]["qrcodeList"].push({
+        qrcode: qrcodeData,
+        technologyNumber: technologyNumber
+      });
+    }
+    else {
+    technologyNumber = compound
+     for (let j = 0; j < technologyNumber.length; j++) {
+        const processId = produceList.value[i].detail[0].process_id;
+        const url = `${processId}/${technologyNumber[j]}`;
+        // 鐢熸垚 QR Code 骞跺瓨鍌ㄥ埌鏁扮粍涓�
+        const qrcodeData = await QRCode.toDataURL(url);
+        produceList.value[i].detail[0]["qrcodeList"].push({
+          qrcode: qrcodeData,
+          technologyNumber: technologyNumber[j]
+        });
+     }
+    }
+
+
+
+
   }
 };
 
@@ -257,9 +276,13 @@
       <tr v-for="(itemFlow,index) in item.detail" :key="index">
         <td  colspan="31">
           <div style="float: left;"><input style="border: none;font-size: 28px;width: 70px;margin: 5px  "/></div>
-          <div id="bj" style="float: right;font-size: 28px">{{ id + 1 }}</div>
+          <div id="bj" v-if="printFc=='true'" style="float: right;font-size: 28px">{{ id + 1 }}</div>
+          <div id="bj" v-else style="float: right;font-size: 28px"></div>
           <div>{{ company.companyName }}</div>
-          <div>鐢熶骇娴佺▼鍗�<span style="font-weight: bold" v-if="printProject!=null">({{ printProject }})</span></div>
+          <div>
+            鐢熶骇娴佺▼鍗�<span style="font-weight: bold" v-if="printProject!=null">({{ printProject }})</span>
+            <span style="font-weight: bold" v-if="props.compound!=null">({{ props.compound }}灞傚悓鏋�)</span>
+          </div>
           <div  style="font-weight: bolder;display: flex;justify-content:space-between">
             <div>
               鎵撳嵃浜猴細{{user.user.userName}} &nbsp;&nbsp;
@@ -284,7 +307,8 @@
         <td class="tdNowrap">瀹㈡埛鍚嶇О锛�</td>
         <td colspan="2">{{ items.customer_name }}</td>
         <td class="tdNowrap">椤圭洰鍚嶇О锛�</td>
-        <td colspan="4" style="min-width: 250px;">{{ items.project }}</td>
+        <td v-if="name=='娲涢槼鍖楁柟鐜荤拑鎶�鏈偂浠芥湁闄愬叕鍙�'" colspan="4" style="min-width: 250px;">{{ items.projectBatch }}</td>
+        <td v-else colspan="4" style="min-width: 250px;">{{ items.project }}</td>
         <td class="tdNowrap">宸ヨ壓娴佺▼锛�</td>
         <td :colspan="2+item.processList.length*2"  style="width: 500px">{{ items.process }}</td>
       </tr>
@@ -378,7 +402,7 @@
       <tr v-for="(qrCodeItem,index) in item.detail" :key="index">
         <td colspan="31">
           <span style="display: flex;">
-            <span v-for="(qrCodeItems,index) in qrCodeItem.qrcodeList" :key="index" style="display: flex;width: 35%">
+            <span v-for="(qrCodeItems,index) in qrCodeItem.qrcodeList" :key="index" style="display: flex;width: 250px">
             <div class='qrCode' style="width: 80px;height: 80px;">
             <img :src=qrCodeItems.qrcode>
           </div>
diff --git a/north-glass-erp/northglass-erp/src/components/pp/PrintProcessReplenish.vue b/north-glass-erp/northglass-erp/src/components/pp/PrintProcessReplenish.vue
index 6a34a28..fc8c7e7 100644
--- a/north-glass-erp/northglass-erp/src/components/pp/PrintProcessReplenish.vue
+++ b/north-glass-erp/northglass-erp/src/components/pp/PrintProcessReplenish.vue
@@ -175,7 +175,6 @@
 
            flowCardCount=produceList.value.length
 
-
           handleSummary()
           handleGetQRCode()
         } else {
@@ -186,24 +185,44 @@
 
     }
 )
-
-
 const handleGetQRCode = async () => {
-  let technologyNumber=''
   for (let i = 0; i < produceList.value.length; i++) {
-    const technologyNumber = produceList.value[i].detail[0].mergeTechnologyNumber.toString(); // 杞崲涓哄瓧绗︿覆浠ヤ究澶勭悊姣忎釜瀛楃
-    produceList.value[i].detail[0]["qrcodeList"] = []; // 鍒濆鍖栦竴涓┖鏁扮粍鐢ㄦ潵瀛樺偍 QR Code
+    const detail = produceList.value[i].detail[0];
+    const processId = detail.process_id;
+    const mergeStr = detail.mergeTechnologyNumber?.toString() || '';
 
-    const processId = produceList.value[i].detail[0].process_id;
-    const url = `${processId}/${technologyNumber}`;
-    // 鐢熸垚 QR Code 骞跺瓨鍌ㄥ埌鏁扮粍涓�
-    const qrcodeData = await QRCode.toDataURL(url);
-    produceList.value[i].detail[0]["qrcodeList"].push({
-      qrcode: qrcodeData,
-      technologyNumber: technologyNumber
-    });
+    detail.qrcodeList = []; // 鍒濆鍖�
+
+    for (let j = 0; j < mergeStr.length; j++) {
+      const singleTech = mergeStr[j]; // 鍙栧嚭姣忎竴浣嶅瓧绗�
+      const url = `${processId}/${singleTech}`;
+      const qrcodeData = await QRCode.toDataURL(url);
+      detail.qrcodeList.push({
+        qrcode: qrcodeData,
+        technologyNumber: singleTech
+      });
+    }
   }
 };
+
+
+// const handleGetQRCode = async () => {
+//   let technologyNumber=''
+//   for (let i = 0; i < produceList.value.length; i++) {
+//
+//     const technologyNumber = produceList.value[i].detail[0].technologyNumber.toString(); // 杞崲涓哄瓧绗︿覆浠ヤ究澶勭悊姣忎釜瀛楃
+//     produceList.value[i].detail[0]["qrcodeList"] = []; // 鍒濆鍖栦竴涓┖鏁扮粍鐢ㄦ潵瀛樺偍 QR Code
+//     const merge = produceList.value[i].detail[0].mergeTechnologyNumber.toString();
+//     const processId = produceList.value[i].detail[0].process_id;
+//     const url = `${processId}/${technologyNumber}`;
+//     // 鐢熸垚 QR Code 骞跺瓨鍌ㄥ埌鏁扮粍涓�
+//     const qrcodeData = await QRCode.toDataURL(url);
+//     produceList.value[i].detail[0]["qrcodeList"].push({
+//       qrcode: qrcodeData,
+//       technologyNumber: technologyNumber
+//     });
+//   }
+// };
 
 
 //鏍规嵁杈撳叆鐨勬暟閲忛噸鏂版眹鎬�
@@ -265,7 +284,8 @@
         <td class="tdNowrap">瀹㈡埛鍚嶇О锛�</td>
         <td colspan="2">{{ items.customer_name }}</td>
         <td class="tdNowrap">椤圭洰鍚嶇О锛�</td>
-        <td colspan="8" style="min-width: 300px;">{{ items.project }}</td>
+        <td v-if="name=='娲涢槼鍖楁柟鐜荤拑鎶�鏈偂浠芥湁闄愬叕鍙�'" colspan="4" style="min-width: 250px;">{{ items.projectBatch }}</td>
+        <td v-else colspan="4" style="min-width: 250px;">{{ items.project }}</td>
         <td class="tdNowrap">宸ヨ壓娴佺▼锛�</td>
         <td :colspan="2+item.processList.length*2"  style="width: 500px">{{ items.process }}</td>
       </tr>
diff --git a/north-glass-erp/northglass-erp/src/components/pp/TagStyleDesigner.vue b/north-glass-erp/northglass-erp/src/components/pp/TagStyleDesigner.vue
index c9fa6c6..d13ccc9 100644
--- a/north-glass-erp/northglass-erp/src/components/pp/TagStyleDesigner.vue
+++ b/north-glass-erp/northglass-erp/src/components/pp/TagStyleDesigner.vue
@@ -45,7 +45,8 @@
   type: null,//鏍囩妯℃澘
   lableType: null,//鏍囩绫诲瀷
   titleList:null,//鏍囬鍒楄〃
-  switch:null//鍒ゆ柇鏄惁涓烘柊鎵撳嵃
+  switch:null,//鍒ゆ柇鏄惁涓烘柊鎵撳嵃
+  landingSequence:null//鏍囩钀芥灦椤哄簭鎵撳嵃
 })
 
 //瀹ゅ唴瀹ゅ闈�
@@ -114,7 +115,8 @@
   list:null,//鍕鹃�夌殑鏁版嵁
   faceOrientation:null,//鍐呭闈�
   type:null,//鏍囩妯℃澘
-  lableType:null//鏍囩绫诲瀷
+  lableType:null,//鏍囩绫诲瀷
+  landingSequence:null
 })
 
 const printContentLabel = ref({
@@ -130,7 +132,7 @@
 let type = props.type
 let lableTypes = props.lableType
 data.value.printList = JSON.parse(props.list)
-
+let landingSequence = props.landingSequence
 
 const TgaStyleSet = ref([
   {
@@ -188,6 +190,18 @@
     tid: 'project', title: '椤圭洰鍚嶇О', data: '', type: 'text',
     options: {
       field: 'project',
+      testData: '',
+      width:270,
+      height: 16,
+      fontSize: 11.25,
+      textAlign: "left",
+      textContentVerticalAlign: "middle"
+    }
+  },
+  {
+    tid: 'batch', title: '鎵规', data: '', type: 'text',
+    options: {
+      field: 'batch',
       testData: '',
       width:270,
       height: 16,
@@ -317,6 +331,18 @@
     }
   },
   {
+    tid: 'processIdAD', title: '绠�鏄撴祦绋嬪崱', data: '', type: 'text',
+    options: {
+      field: 'processIdAD',
+      testData: '',
+      width:270,
+      height: 16,
+      fontSize: 11.25,
+      textAlign: "left",
+      textContentVerticalAlign: "middle"
+    }
+  },
+  {
     tid: 'quantity', title: '璁㈠崟鏁伴噺', data: '', type: 'text',
     options: {
       field: 'quantity',
@@ -341,9 +367,21 @@
     }
   },
   {
-    tid: 'numberSize', title: '搴忓彿灏哄', data: '', type: 'text',
+    tid: 'numberSize', title: '搴忓昂鏁�', data: '', type: 'text',
     options: {
       field: 'numberSize',
+      testData: '',
+      width:270,
+      height: 16,
+      fontSize: 11.25,
+      textAlign: "left",
+      textContentVerticalAlign: "middle"
+    }
+  },
+  {
+    tid: 'numberSizeQuantity', title: '搴忓彿灏哄', data: '', type: 'text',
+    options: {
+      field: 'numberSizeQuantity',
       testData: '',
       width:270,
       height: 16,
@@ -598,9 +636,22 @@
     }
   },
   {
+    tid: 'sumQuantity', title: '璁㈠崟鎬绘暟', data: '', type: 'text',
+    options: {
+      field: 'sumQuantity',
+      testData: '',
+      width:100,
+      height: 16,
+      fontSize: 11.25,
+      textAlign: "left",
+      textContentVerticalAlign: "middle"
+    }
+  },
+  {
     tid: 'custom1', title: '鑷畾涔�1', data: '', type: 'text',
     options: {
       title: '鑷畾涔�1',
+      field: 'custom1',
       testData: '',
       width:270,
       height: 16,
@@ -614,6 +665,7 @@
     tid: 'custom2', title: '鑷畾涔�2', data: '', type: 'text',
     options: {
       title: '鑷畾涔�2',
+      field: 'custom2',
       testData: '',
       width:270,
       height: 16,
@@ -832,7 +884,8 @@
         const result = Object.fromEntries(
             fields.map(item => [item.field, true]) // 杞崲鎴� [key, value] 鏁扮粍
         )
-        let funct = "function(value,row,index,options){return `"
+        //<div style='width: 6.5cm;height:4.95cm;background-color: #5cadfe'>
+        let funct = "function(value,row,index,options){return ` <br>"
         json.panels[0].printElements[index].options.columns[0].forEach(item => {
           if(item.field && !result[item.field ]){
             if (company.printShowTitle){
@@ -844,7 +897,8 @@
             funct += item.title+'<br>'
           }
         })
-        funct+='`}'
+        funct+='<br>`}'
+        //</div>
         json.panels[0].printElements[index].options.columns[0][0].renderFormatter = funct
       }
     })
@@ -938,6 +992,8 @@
   labelRow.value.type = type
   labelRow.value.lableType = lableType.value
   labelRow.value.switch=true
+  labelRow.value.landingSequence = landingSequence
+
   lastList.value = []
   if (lableTypes == 1) {
 
@@ -1126,6 +1182,7 @@
                         :type="labelRow.type"
                         :titleList="labelRow.titleList"
                         :switch="labelRow.switch"
+                        :landingSequence = "labelRow.landingSequence"
                         style="width: 100%;height: 100%"/>
   </el-dialog>
 
diff --git a/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet1.vue b/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet1.vue
index 899d1e5..b847d4c 100644
--- a/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet1.vue
+++ b/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet1.vue
@@ -39,6 +39,7 @@
 
   request.post(`/delivery/getSelectDeliveryPrinting`,form.value).then((res) => {
     if(res.code==200){
+      console.log(res.data)
       produceList.value = deepClone(res.data)
       for(let i=0;i<produceList.value.length;i++){
         let produceList1= ({
@@ -192,7 +193,7 @@
               <thead>
               <tr v-if="index===0">
                 <th style="width: 6%;">搴忓彿</th>
-                <th style="width: 15%;">妤煎眰缂栧彿</th>
+                <th style="width: 15%;">妤煎眰缂栧彿(绠卞彿)</th>
                 <th style="width: 17%;" colspan="1">瀹絏楂�</th>
                 <th style="width: 10%;">鏁伴噺</th>
                 <th style="width: 10%;">闈㈢Н</th>
@@ -211,7 +212,8 @@
 
               <tr class="day-in" v-for="(items, index1) in item.DeliveryDetailList" :key="index1">
                 <td>{{items.order_number}}</td>
-                <td>{{items.buildingNumber}}</td>
+                <td v-if="items.box_no!=null&&items.box_no!=''">{{items.buildingNumber}}({{items.box_no}})</td>
+                <td v-else>{{items.buildingNumber}}</td>
                 <td colspan="1" style="font-size: 15px;font-weight: bold;" v-if="items.other_columns!=null&&(JSON.parse(items.other_columns).S02!=null)">{{JSON.parse(items.other_columns).S02}}</td>
                 <td colspan="1" style="font-size: 15px;font-weight: bold;" v-else>{{items.width}}x{{items.height}}</td>
                 <td>{{items.quantity}}</td>
diff --git a/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet2.vue b/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet2.vue
index da77f56..062b834 100644
--- a/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet2.vue
+++ b/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet2.vue
@@ -138,7 +138,7 @@
               <thead>
               <tr v-if="index===0">
                 <th style="width: 6%;">搴忓彿</th>
-                <th style="width: 20%;">妤煎眰缂栧彿</th>
+                <th style="width: 20%;">妤煎眰缂栧彿(绠卞彿)</th>
                 <th style="width: 20%;" colspan="2">瀹絏楂�</th>
                 <th style="width: 10%;">鏁伴噺</th>
                 <th style="width: 10%;">闈㈢Н</th>
@@ -155,7 +155,8 @@
 
               <tr class="day-in" v-for="(items, index1) in item.DeliveryDetailList" :key="index1">
                 <td>{{items.order_number}}</td>
-                <td>{{items.buildingNumber}}</td>
+                <td v-if="items.box_no!=null&&items.box_no!=''">{{items.buildingNumber}}({{items.box_no}})</td>
+                <td v-else>{{items.buildingNumber}}</td>
                 <td colspan="2" style="font-size: 15px;font-weight: bold;" v-if="items.other_columns!=null&&(JSON.parse(items.other_columns).S02!=null)">{{JSON.parse(items.other_columns).S02}}</td>
                 <td colspan="2" style="font-size: 15px;font-weight: bold;" v-else>{{items.width}}x{{items.height}}</td>
                 <td>{{items.quantity}}</td>
diff --git a/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyang.vue b/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyang.vue
new file mode 100644
index 0000000..f2ab561
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyang.vue
@@ -0,0 +1,405 @@
+<script setup>
+import request from "@/utils/request"
+import {computed, onMounted, ref} from "vue"
+import PrintFoot from "@/components/sd/order/PrintFoot.vue"
+import companyInfo from "@/stores/sd/companyInfo"
+import deepClone from "@/utils/deepClone";
+import {ElMessage} from "element-plus";
+import {add,addAuto} from '@/utils/decimal';
+
+const company = companyInfo()
+let produceList = ref([])
+let otherMoney = []
+let otherMoney1 = []
+let delivery = ref([])
+let money = ref("")
+let otherMoneys = 0
+let sumMoney = 0
+let takeCare =ref("鍏蜂綋瑙勬牸璇﹁娓呭崟")
+let remark =ref(company.deliveryRemark)
+
+
+
+let props = defineProps({
+  deliveryId:null,
+  type:null
+})
+const form = ref({
+})
+let produceList2 = ref([])
+
+
+const deliveryId = ref()
+
+const pageData = ref()
+const getData = () => {
+  if(props.deliveryId===null  || props.deliveryId===undefined || props.deliveryId===''){
+    return
+  }
+  deliveryId.value = props.deliveryId[0].deliveryId
+  form.value.deliveryId=props.deliveryId
+  form.value.type=company.productName
+  form.value.state=props.type
+
+
+  request.post(`/delivery/getSelectDeliveryPrinting`,form.value).then((res) => {
+    if(res.code==200){
+      produceList.value = deepClone(res.data)
+      for(let i=0;i<produceList.value.length;i++){
+        produceList.value[i].data.forEach(item =>{
+          let para =
+          item.DeliveryDetail.orderId=
+              `${takeCare.value}\n${item.DeliveryDetail.orderDetail.edgingType || item.DeliveryDetail.orderDetail.shape}`
+
+        })
+        let produceList1= ({
+          data:null,
+          otherMoney:null,
+          otherMoney1:null,
+          delivery:null,
+          money:null,
+          otherMoneys:0,
+          sumMoney:0
+        })
+        produceList1.data=produceList.value[i].data
+        produceList1.delivery=produceList.value[i].delivery
+        produceList1.money=produceList.value[i].money
+        produceList1.otherMoney=produceList.value[i].otherMoney
+        for(let j=0;j<produceList1.data.length;j++){
+          produceList1.sumMoney+=produceList1.data[j].DeliveryDetail.money
+        }
+        otherMoney1=[]
+        for(let i=0;i<produceList1.otherMoney.length;i++){
+          if(produceList1.otherMoney[i].DeliveryDetailOtherMoney.monery!=null){
+            produceList1.otherMoneys+=produceList1.otherMoney[i].DeliveryDetailOtherMoney.monery
+            if(otherMoney1.length===0){
+              otherMoney1.push(produceList1.otherMoney[i])
+            }
+            else{
+              for(let s=0;s<otherMoney1.length;s++){
+                if(produceList1.otherMoney[i].DeliveryDetailOtherMoney.alias===otherMoney1[s].DeliveryDetailOtherMoney.alias){
+
+                  otherMoney1[s].DeliveryDetailOtherMoney.count=add(produceList1.otherMoney[i].DeliveryDetailOtherMoney.count,otherMoney1[s].DeliveryDetailOtherMoney.count)
+                  otherMoney1[s].DeliveryDetailOtherMoney.monery =add(produceList1.otherMoney[i].DeliveryDetailOtherMoney.monery,otherMoney1[s].DeliveryDetailOtherMoney.monery)
+                  break
+                }
+                if(s+1===otherMoney1.length){
+                  otherMoney1.push(produceList1.otherMoney[i])
+                  break
+                }
+              }
+
+            }
+
+          }
+
+        }
+        produceList1.otherMoney1=otherMoney1
+        produceList2.value.push(produceList1)
+      }
+      for(let j=0;j<produceList2.value.length;j++){
+
+        if(produceList2.value[j].delivery.money.toFixed(0)!==(produceList2.value[j].otherMoneys
+            +produceList2.value[j].sumMoney+produceList2.value[j].delivery.freight).toFixed(0)){
+          console.log(produceList2.value[j])
+          console.log(produceList2.value[j].delivery.money)
+          console.log((produceList2.value[j].otherMoneys
+              +produceList2.value[j].sumMoney).toFixed(0))
+          console.log(produceList2.value[j].delivery.deliveryId)
+        }
+
+      }
+      //缁欐暟鎹繘琛屽垎椤�
+      pageData.value = groupArrayByFive(produceList2.value[0].data)
+      console.log(pageData.value)
+      delivery.value = produceList2.value[0].delivery
+      console.log(delivery.value)
+
+
+
+    }else{
+      ElMessage.warning(res.msg)
+      router.push("/login")
+    }
+  })
+}
+
+function groupArrayByFive(arr) {
+  let result = [];
+  for (let i = 0; i < arr.length; i += 4) {
+    result.push(arr.slice(i, i + 4));
+  }
+  return result;
+}
+let deliveryDate = ref()
+onMounted(() => {
+  const today = new Date
+  today.setTime(today.getTime())
+  deliveryDate.value = today.getFullYear() +
+      '-' + ("0" + (today.getMonth() + 1)).slice(-2)
+      + '-' + ("0" + today.getDate()).slice(-2)
+  getData()
+})
+
+const  stringToJson = (productList) => {
+  productList.forEach(item => {
+    item.otherColumns = JSON.parse(item.otherColumns)
+  })
+}
+
+const getQuantity = (productList) => {
+  let quantity = 0
+  productList.forEach(item => {
+    quantity += item.quantity
+  })
+  return parseFloat(quantity.toFixed(3))
+
+}
+
+const getArea = (productList) => {
+  let area = 0
+  productList.forEach(item => {
+    area += item.grossArea
+  })
+  return parseFloat(area.toFixed(3))
+
+}
+
+const getPerimeter = (productList) => {
+  let perimeter = 0
+  productList.forEach(item => {
+    perimeter += item.perimeter
+  })
+  return parseFloat(perimeter.toFixed(3))
+}
+
+const printSheet = () => {
+}
+let companyName = ref('娲涢槼鐜荤拑鍏徃')
+
+const getQuantitySum = (page)=>{
+  console.log(page)
+  if(pageData.value[page] === undefined){
+    return  0
+  }
+  return pageData.value[page].reduce((accumulator, currentValue) => {
+    return add(accumulator,currentValue.DeliveryDetail.quantity)
+  }, 0)
+}
+const getAreaSum = (page)=>{
+  if(pageData.value[page] === undefined){
+    return  0
+  }
+  return pageData.value[page].reduce((accumulator, currentValue) => {
+    return addAuto(accumulator,currentValue.DeliveryDetail.area,2)
+  }, 0)
+}
+const getMoneySum = (page)=>{
+  if(pageData.value[page] === undefined){
+    return  0
+  }
+  const val = pageData.value[page].reduce((accumulator, currentValue) => {
+    return addAuto(accumulator,currentValue.DeliveryDetail.money,2)
+  }, 0)
+
+  return val===0?'':val
+}
+
+
+defineExpose({
+  printSheet
+});
+</script>
+
+<template>
+  <div >
+    <el-row id="footsum" :gutter="20" >
+      <el-col :span="19"></el-col>
+      <el-col :span="5" style="font-size: 17px" >{{delivery.creator}}</el-col>
+    </el-row>
+    <el-row id="footsum1" :gutter="20" >
+      <el-col :span="2" ></el-col>
+      <el-col :span="3" style="font-size: 17px">{{ delivery.contacts }}</el-col>
+      <el-col :span="7" style="font-size: 17px">{{ delivery.contactNumber }}</el-col>
+      <el-col :span="1" ></el-col>
+      <el-col :span="11" style="font-size: 17px">{{ delivery.deliveryAddress }}</el-col>
+    </el-row>
+
+    <table  class="content1" v-for="(page,pageIndex) in pageData"  >
+      <thead>
+        <tr style="height: 3.6cm"><td></td></tr>
+
+        <tr>
+          <td colspan="6" >
+            <el-row :gutter="20">
+              <el-col :span="2"></el-col>
+              <el-col :span="8">
+                <input v-model="companyName"
+                       style="border: 0;width: 100%;
+                       height: 100%;font-size:19px;font-weight: bold "/>
+              </el-col>
+              <el-col :span="6" style="font-size:19px;font-weight: bold"> {{deliveryId}} </el-col>
+              <el-col :span="3"></el-col>
+              <el-col :span="5" style="white-space: nowrap;font-size:19px;font-weight: bold">{{deliveryDate}}</el-col>
+            </el-row>
+          </td>
+        </tr>
+        <tr style="height: 0.1cm"><td></td></tr>
+
+        <tr style="margin-top: 20px">
+          <td colspan="6">
+            <el-row :gutter="20">
+              <el-col :span="2"></el-col>
+              <el-col :span="12" style="font-size: 16px;">{{delivery.customerName }}</el-col>
+
+              <el-col :span="10" style="font-size: 16px;white-space: nowrap;"> {{delivery.project }}</el-col>
+            </el-row>
+          </td>
+        </tr>
+        <tr>
+          <td colspan="6">
+            <el-row :gutter="20">
+              <el-col :span="2"></el-col>
+              <el-col :span="12" style="font-size: 16px"> {{delivery.orderId }}</el-col>
+            </el-row>
+          </td>
+        </tr>
+
+        <tr style="height: 1cm"><td></td></tr>
+
+
+
+      </thead>
+      <tbody  >
+        <tr v-for="(item,index) in page">
+          <td style="width: 5cm">
+            <el-input  class="textarea bbb" type="textarea"
+                       :autosize="{ minRows: 1, maxRows: 20 }"
+                       v-model="item.DeliveryDetail.orderDetail.productName" />
+          </td>
+
+          <td style="width: 150px" >
+            <el-input  class="textarea aaa" type="textarea"
+                       :autosize="{ minRows: 1, maxRows: 20 }"
+                       v-model="item.DeliveryDetail.orderId" />
+
+          </td>
+          <td style="width: 65px">
+            {{item.DeliveryDetail.quantity}}
+          </td>
+          <td style="width: 100px" >
+            <input  style="border: 0;width: 100px" v-model="item.DeliveryDetail.area">
+          </td>
+
+          <td
+              style="width: 80px"
+              v-if="props.type===1"
+          >
+            {{item.DeliveryDetail.price == '0' ? '' : item.DeliveryDetail.price}}
+          </td>
+          <td
+              v-if="props.type===1"
+          >
+            {{item.DeliveryDetail.money == '0' ? '' : item.DeliveryDetail.money}}
+          </td>
+        </tr>
+
+        <tr id="table-sum">
+          <td id="sum_td"></td>
+          <td  ></td>
+          <td style="width: 65px" >
+            {{getQuantitySum(pageIndex)}}
+          </td>
+          <td style="width: 100px">
+            <input  style="border: 0;width: 100px;font-size: 17px" :value="getAreaSum(pageIndex)">
+          </td>
+         <td style="width: 80px"></td>
+          <td v-if="props.type===1">
+            {{getMoneySum(pageIndex)}}
+          </td>
+        </tr>
+      </tbody>
+    </table>
+
+
+  </div>
+
+
+</template>
+
+
+
+
+<style scoped>
+*{
+  color: rgba(0, 0, 0, 0.8); /* 鏇存繁鐨勯粦鑹� */
+  font-family: 'Microsoft YaHei', '寰蒋闆呴粦', sans-serif;
+  outline: none;
+}
+#sheet{
+  width: 21cm;
+}
+table{
+  width: 18.3cm
+
+}
+.content1{
+  page-break-after: always;
+
+}
+span{
+  width: 7cm;
+  text-align: center;
+}
+tbody *{
+  font-size: 14px;
+}
+#footsum1,#footsum{
+  font-weight: bold;font-size: 17px;
+}
+
+@media print {
+  #footsum{
+    position: fixed;
+    bottom: 3.4cm;
+    width: 100%; /* 鎴栬�呰缃垚鍏蜂綋鐨勫搴� */
+    font-size: 17px;
+  }
+  #footsum1{
+    position: fixed;
+    bottom: 1cm;
+    width: 100%; /* 鎴栬�呰缃垚鍏蜂綋鐨勫搴� */
+  }
+  #table-sum {
+    position: absolute; /* 鎴栬�呬娇鐢� relative锛屾牴鎹叿浣撻渶姹� */
+    bottom: 5cm;
+  }
+  #sum_td{
+    width: 9cm;
+  }
+
+}
+
+.textarea{
+--el-border-color: rgba(255,255,255,0.0);
+--el-input-focus-border-color: rgba(255,255,255,0.0);
+--el-input-focus-border-width: 0px;
+--el-input-hover-border-color: rgba(255,255,255,0.0);
+--el-input-hover-border-width: 0px;
+  width: 100%;
+}
+:deep(.el-textarea__inner){
+  color: #333333;
+  font-family: 'Microsoft YaHei', '寰蒋闆呴粦', sans-serif;
+  font-size: 14px;
+}
+:deep(.aaa){
+  width: 150px;
+}
+:deep(.bbb){
+  width: 5cm;
+}
+:deep(#table-sum td){
+  font-size: 17px;
+}
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyangDetails.vue b/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyangDetails.vue
new file mode 100644
index 0000000..c01c449
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyangDetails.vue
@@ -0,0 +1,486 @@
+<script setup>
+import request from "@/utils/request"
+import {computed, onMounted, ref} from "vue"
+import PrintFoot from "@/components/sd/order/PrintFoot.vue"
+import companyInfo from "@/stores/sd/companyInfo"
+import deepClone from "@/utils/deepClone";
+import {ElMessage} from "element-plus";
+import {add, addAuto} from '@/utils/decimal';
+
+const company = companyInfo()
+let produceList = ref([])
+let otherMoney = []
+let otherMoney1 = []
+let delivery = ref([])
+let money = ref("")
+let otherMoneys = 0
+let sumMoney = 0
+let takeCare = ref("鍏蜂綋瑙勬牸璇﹁娓呭崟")
+let remark = ref(company.deliveryRemark)
+
+
+let props = defineProps({
+  deliveryId: null,
+  type: null
+})
+const form = ref({})
+let produceList2 = ref([])
+
+
+const deliveryId = ref()
+
+const pageData = ref()
+const getData = () => {
+  if (props.deliveryId === null || props.deliveryId === undefined || props.deliveryId === '') {
+    return
+  }
+  deliveryId.value = props.deliveryId[0].deliveryId
+  form.value.deliveryId = props.deliveryId
+  form.value.type = company.productName
+  form.value.state = props.type
+
+
+  request.post(`/delivery/getSelectDeliveryPrinting`, form.value).then((res) => {
+    if (res.code == 200) {
+      //console.log(res.data)
+      produceList.value = deepClone(res.data)
+      for (let i = 0; i < produceList.value.length; i++) {
+        produceList.value[i].data.forEach(item => {
+
+
+        })
+        let produceList1 = ({
+          data: null,
+          otherMoney: null,
+          otherMoney1: null,
+          delivery: null,
+          money: null,
+          otherMoneys: 0,
+          sumMoney: 0
+        })
+        produceList1.data = produceList.value[i].data
+        produceList1.delivery = produceList.value[i].delivery
+        produceList1.money = produceList.value[i].money
+        produceList1.otherMoney = produceList.value[i].otherMoney
+        for (let j = 0; j < produceList1.data.length; j++) {
+          produceList1.sumMoney += produceList1.data[j].DeliveryDetail.money
+        }
+        otherMoney1 = []
+        for (let i = 0; i < produceList1.otherMoney.length; i++) {
+          if (produceList1.otherMoney[i].DeliveryDetailOtherMoney.monery != null) {
+            produceList1.otherMoneys += produceList1.otherMoney[i].DeliveryDetailOtherMoney.monery
+            if (otherMoney1.length === 0) {
+              otherMoney1.push(produceList1.otherMoney[i])
+            } else {
+              for (let s = 0; s < otherMoney1.length; s++) {
+                if (produceList1.otherMoney[i].DeliveryDetailOtherMoney.alias === otherMoney1[s].DeliveryDetailOtherMoney.alias) {
+
+                  otherMoney1[s].DeliveryDetailOtherMoney.count = add(produceList1.otherMoney[i].DeliveryDetailOtherMoney.count, otherMoney1[s].DeliveryDetailOtherMoney.count)
+                  otherMoney1[s].DeliveryDetailOtherMoney.monery = add(produceList1.otherMoney[i].DeliveryDetailOtherMoney.monery, otherMoney1[s].DeliveryDetailOtherMoney.monery)
+                  break
+                }
+                if (s + 1 === otherMoney1.length) {
+                  otherMoney1.push(produceList1.otherMoney[i])
+                  break
+                }
+              }
+
+            }
+
+          }
+
+        }
+        produceList1.otherMoney1 = otherMoney1
+        produceList2.value.push(produceList1)
+      }
+      for (let j = 0; j < produceList2.value.length; j++) {
+
+        if (produceList2.value[j].delivery.money.toFixed(0) !== (produceList2.value[j].otherMoneys
+            + produceList2.value[j].sumMoney + produceList2.value[j].delivery.freight).toFixed(0)) {
+          console.log(produceList2.value[j])
+          console.log(produceList2.value[j].delivery.money)
+          console.log((produceList2.value[j].otherMoneys
+              + produceList2.value[j].sumMoney).toFixed(0))
+          console.log(produceList2.value[j].delivery.deliveryId)
+        }
+
+      }
+      //缁欐暟鎹繘琛屽垎椤�
+      pageData.value = groupArrayByFive(produceList2.value[0].data)
+      //console.log(pageData.value)
+      delivery.value = produceList2.value[0].delivery
+      //console.log(delivery.value)
+
+
+    } else {
+      ElMessage.warning(res.msg)
+      router.push("/login")
+    }
+  })
+}
+
+function groupArrayByFive(arr) {
+
+  /*let result = [];
+  let productName=ref()
+  arr.forEach(item=>{
+    for (let i = 0; i < item.DeliveryDetailList.length; i += 8) {
+      let resultMap = {
+        id:null,
+        DeliveryDetail:null,
+        DeliveryDetailList:[]
+      };
+      resultMap.DeliveryDetail=item.DeliveryDetail
+      resultMap.id=item.DeliveryDetailList.slice(i, i + 8).length
+      resultMap.DeliveryDetailList.push(item.DeliveryDetailList.slice(i, i + 8))
+      result.push(resultMap)
+    }
+
+  })*/
+  let result = [];
+  arr.forEach(item => {
+    item.DeliveryDetailList.forEach(items => {
+      result.push(items)
+    })
+  })
+  console.log(result)
+  let index=0
+  let number=0
+  let numberResult = [];
+  let results = [];
+  let productName=result[0]['product_name']
+  for (let i = 0; i < result.length; i ++) {
+    if(productName!=result[i]['product_name']){
+      productName=result[i]['product_name']
+      index++
+    }
+    number++
+    numberResult.push(result[i])
+
+
+    let next=false
+    if (i + 1 != result.length) {
+      if(result[i+1]['product_name']!=productName){
+        next=true
+      }
+    }else{
+      next=true
+    }
+
+    if((index==3 && next) ||number==8){
+      results.push(numberResult);
+      index=0
+      number=0
+      numberResult=[]
+    }else{
+      if (i + 1 == result.length) {
+        results.push(numberResult);
+        index=0
+        number=0
+        numberResult=[]
+      }
+    }
+
+
+
+
+
+  }
+  console.log(results)
+
+  /*for (let i = 0; i < result.length; i += 8) {
+    results.push(result.slice(i, i + 8));
+  }*/
+
+  for (let i = 0; i < results.length; i++) {
+    let name = results[i][0]['product_name'] //涓婁竴娆″悕绉�
+    let key = 0;   //鐩稿悓鏁�
+    for (let j = 0; j < results[i].length; j++) {
+      let thisName = results[i][j]['product_name'];
+      if (thisName != name) {
+        results[i][key].rowspan = j - key;
+        name=results[i][j]['product_name']
+        key = j;
+      }
+      if (j + 1 == results[i].length) {
+        results[i][key].rowspan = j - key+1;
+        name=results[i][j]['product_name']
+      }
+
+    }
+  }
+
+
+  return results;
+}
+
+let deliveryDate = ref()
+onMounted(() => {
+  const today = new Date
+  today.setTime(today.getTime())
+  deliveryDate.value = today.getFullYear() +
+      '-' + ("0" + (today.getMonth() + 1)).slice(-2)
+      + '-' + ("0" + today.getDate()).slice(-2)
+  getData()
+})
+
+
+const printSheet = () => {
+}
+let companyName = ref('娲涢槼鐜荤拑鍏徃')
+
+const getQuantitySum = (page) => {
+  if (pageData.value[page] === undefined) {
+    return 0
+  }
+  return pageData.value[page].reduce((accumulator, currentValue) => {
+    return add(accumulator, currentValue.quantity)
+  }, 0)
+
+
+}
+const getAreaSum = (page) => {
+  if (pageData.value[page] === undefined) {
+    return 0
+  }
+  return pageData.value[page].reduce((accumulator, currentValue) => {
+    return addAuto(accumulator, currentValue.area, 2)
+  }, 0)
+}
+const getMoneySum = (page) => {
+  if (pageData.value[page] === undefined) {
+    return 0
+  }
+  return pageData.value[page].reduce((accumulator, currentValue) => {
+    return addAuto(accumulator, currentValue.money, 2)
+  }, 0)
+}
+
+
+defineExpose({
+  printSheet
+});
+</script>
+
+<template>
+  <div>
+    <el-row id="footsum" :gutter="20">
+      <el-col :span="20"></el-col>
+      <el-col :span="4" style="font-size: 17px">{{ delivery.creator }}</el-col>
+    </el-row>
+    <el-row id="footsum1" :gutter="20">
+      <el-col :span="2"></el-col>
+      <el-col :span="3" style="font-size: 17px">{{ delivery.contacts }}</el-col>
+      <el-col :span="7" style="font-size: 17px">{{ delivery.contactNumber }}</el-col>
+      <el-col :span="1"></el-col>
+      <el-col :span="11" style="font-size: 17px">{{ delivery.deliveryAddress }}</el-col>
+    </el-row>
+
+    <table class="content1" v-for="(page,pageIndex) in pageData">
+      <thead>
+      <tr style="height: 3.6cm">
+        <td></td>
+      </tr>
+
+      <tr>
+        <td colspan="6">
+          <el-row :gutter="20">
+            <el-col :span="2"></el-col>
+            <el-col :span="9">
+              <input v-model="companyName"
+                     style="border: 0;width: 100%;
+                       height: 100%;font-size:19px;font-weight: bold "/>
+            </el-col>
+            <el-col :span="5" style="font-size:19px;font-weight: bold"> {{ deliveryId }}</el-col>
+            <el-col :span="6"></el-col>
+            <el-col :span="2" style="white-space: nowrap;font-size:19px;font-weight: bold">{{ deliveryDate }}</el-col>
+          </el-row>
+        </td>
+      </tr>
+      <tr style="height: 0.1cm">
+        <td></td>
+      </tr>
+
+      <tr style="margin-top: 20px">
+        <td colspan="6">
+          <el-row :gutter="20">
+            <el-col :span="2"></el-col>
+            <el-col :span="17" style="font-size: 16px;">{{ delivery.customerName }}</el-col>
+
+            <el-col :span="5" style="font-size: 16px;white-space: nowrap;"> {{ delivery.project }}</el-col>
+          </el-row>
+        </td>
+      </tr>
+      <tr style="height: 0.1cm">
+        <td></td>
+      </tr>
+      <tr>
+        <td colspan="6">
+          <el-row :gutter="20">
+            <el-col :span="2"></el-col>
+            <el-col :span="12" style="font-size: 16px;"> {{ delivery.orderId }}</el-col>
+          </el-row>
+        </td>
+      </tr>
+
+      <tr style="height: 1cm">
+        <td></td>
+      </tr>
+
+
+      </thead>
+      <tbody>
+      <template v-for="(items,index1) in page">
+        <tr>
+
+          <td style="width: 4cm" :rowspan="items.rowspan" v-if="items.rowspan!==undefined">
+            <el-input class="textarea" type="textarea"
+                      :autosize="{ minRows: 1, maxRows: 20 }"
+                      v-model="items.product_name"/>
+          </td>
+          <td style="width: 0.8cm"></td>
+
+          <td style="width: 2cm">
+            <el-input class="textarea" type="textarea"
+                      :autosize="{ minRows: 1, maxRows: 20 }"
+                      v-model="items.width"/>
+
+          </td>
+          <td style="width: 2cm">
+            <el-input class="textarea" type="textarea"
+                      :autosize="{ minRows: 1, maxRows: 20 }"
+                      v-model="items.height"/>
+
+          </td>
+          <td style="width: 60px">
+            {{ items.quantity }}
+          </td>
+          <td style="width: 100px">
+            <input style="border: 0;width: 100px" v-model="items.area">
+          </td>
+
+          <td
+              v-if="props.type===1||props.type===3"
+              style="width: 80px"
+          >
+            {{ items.price == '0' ? '' : items.price }}
+          </td>
+          <td
+              v-if="props.type===1||props.type===3"
+          >
+            {{ items.money == '0' ? '' : items.money }}
+          </td>
+
+        </tr>
+      </template>
+      <tr id="table-sum">
+        <td id="sum_td"></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td style="width: 60px">
+          {{ getQuantitySum(pageIndex) }}
+        </td>
+        <td style="width: 100px">
+          <input style="border: 0;width: 100px" :value="getAreaSum(pageIndex)">
+        </td>
+        <td style="width: 80px"></td>
+        <td v-if="props.type===1||props.type===3">
+          {{ getMoneySum(pageIndex) == '0.00' ? '' : getMoneySum(pageIndex) }}
+        </td>
+
+      </tr>
+
+      </tbody>
+    </table>
+
+
+  </div>
+
+
+</template>
+
+
+<style scoped>
+* {
+  color: rgba(0, 0, 0, 0.8); /* 鏇存繁鐨勯粦鑹� */
+  font-family: 'Microsoft YaHei', '寰蒋闆呴粦', sans-serif;
+  outline: none;
+}
+
+#sheet {
+  width: 21cm;
+}
+
+table {
+  width: 18.3cm
+
+}
+
+.content1 {
+  page-break-after: always;
+
+}
+
+span {
+  width: 7cm;
+  text-align: center;
+}
+
+tbody * {
+  font-size: 14px;
+}
+
+#footsum1, #footsum {
+  font-size: 17px;
+}
+
+@media print {
+  #footsum {
+    position: fixed;
+    bottom: 3.5cm;
+    width: 100%; /* 鎴栬�呰缃垚鍏蜂綋鐨勫搴� */
+    font-size: 17px;
+  }
+
+  #footsum1 {
+    position: fixed;
+    bottom: 1cm;
+    width: 100%; /* 鎴栬�呰缃垚鍏蜂綋鐨勫搴� */
+  }
+  #table-sum {
+    position: absolute; /* 鎴栬�呬娇鐢� relative锛屾牴鎹叿浣撻渶姹� */
+    bottom: 5cm;
+  }
+  #sum_td{
+    width: 9cm;
+  }
+}
+
+.textarea {
+  --el-border-color: rgba(255, 255, 255, 0.0);
+  --el-input-focus-border-color: rgba(255, 255, 255, 0.0);
+  --el-input-focus-border-width: 0px;
+  --el-input-hover-border-color: rgba(255, 255, 255, 0.0);
+  --el-input-hover-border-width: 0px;
+}
+
+/*textarea {
+
+  font-size: 16px;
+  border:none;
+  text-align: right;
+  font-weight: bold;
+  width: 100%;
+  height: 100%;
+}*/
+:deep(.el-textarea__inner) {
+  color: #333333;
+  font-family: 'Microsoft YaHei', '寰蒋闆呴粦', sans-serif;
+  font-size: 14px;
+}
+:deep(#table-sum td){
+  font-size: 17px;
+}
+
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/components/sd/order/OrderProcess.vue b/north-glass-erp/northglass-erp/src/components/sd/order/OrderProcess.vue
index 6483eab..cc69b2c 100644
--- a/north-glass-erp/northglass-erp/src/components/sd/order/OrderProcess.vue
+++ b/north-glass-erp/northglass-erp/src/components/sd/order/OrderProcess.vue
@@ -1,7 +1,6 @@
 <script setup>
 import {computed, onMounted, reactive, ref, watch} from "vue";
 import {changeFilterEvent, filterChanged} from "@/hook"
-import footSum from "@/hook/footSum"
 import {useI18n} from "vue-i18n"
 import request from "@/utils/request"
 import {ElMessage} from "element-plus"
@@ -42,10 +41,10 @@
   mergeCells:[],
   toolbarConfig: {
     zoom: true,
-    custom: true
+    /*custom: true*/
   },
   cellClassName ({ row, column,columnIndex})  {
-    if (columnIndex>10 && row.quantity*1 === row.reportWorkQuantity[column.title]*1){
+    if (columnIndex>10 && row.thisQuantity*1 === row.reportWorkQuantity[column.title]*1){
         return 'row-green'
     }
     return null
@@ -77,14 +76,17 @@
   {field: 'order_type', width: 120,title: t('order.orderType'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
   {field: 'process_id',width: 110, title: t('processCard.processId'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
   {field: 'technology_number', width: 90,title:  t('processCard.technologyNumber'),showOverflow:"ellipsis"},
+  {field: 'child_width', width: 90,title:  t('order.width'),showOverflow:"ellipsis"},
+  {field: 'child_height', width: 90,title:  t('order.height'),showOverflow:"ellipsis"},
   {field: 'quantity', width: 90,title: t('order.quantity')},
+  {field: 'glassQuantity', width: 90,title: t('order.glassQuantity')},
   {field: 'gross_area', width: 90,title: t('order.area')},
   {field: 'shippedQuantity',width: 120, title: t('delivery.deliveryQuantity')},
   {field: 'inventory',width: 120, title: t('productStock.inventoryQuantity')},
   {field: 'inventoryArea',width: 120, title: t('report.inventoryArea')},
   {field: 'broken_num',width: 90, title: t('reportingWorks.quantityBroken')},
 ]
-let column = [0,1,3,6,7,8,9]
+let column = [0,1,3,6,7,8,10,11,12,13]
 
 
 onMounted(()=>{
@@ -96,16 +98,16 @@
 })
 
 
-
+let mergeCells = ref()
 const getWorkOrder = () => {
+  gridOptions.loading = true
   request.post(`/report/processCardProgress/${props.orderId}`,column).then(async (res) => {
     if (res.code == 200) {
-
       gridOptions.columns = JSON.parse(JSON.stringify(columns))
       gridOptions.columns.forEach(item =>{
         item.filterMethod = filterChanged
       })
-      list.value = ['quantity']
+      list.value = ['quantity','inventory','inventoryArea','gross_area','shippedQuantity','glassQuantity']
       res.data.title.forEach((item,index) =>{
         list.value.push('reportWorkQuantity.'+item.process)
         let column = {slots: { default: 'quantitySum'},
@@ -117,23 +119,55 @@
       res.data.data.forEach(item => {
         item.reportWorkQuantity=JSON.parse(item.reportWorkQuantity)
         item.reportWorkQuantityCount=JSON.parse(item.reportWorkQuantityCount)
+        item.reportWorkQuantityShow=JSON.parse(item.reportWorkQuantityShow)
       })
-      //gridOptions.mergeCells= res.data.mergeCells
+
       await xGrid.value.loadData(res.data.data)
+      await xGrid.value.setMergeCells(res.data.mergeCells)
+      mergeCells.value = res.data.mergeCells
+      gridOptions.loading = false
+
     } else {
       ElMessage.warning(res.msg)
     }
   })
 }
 
-const quantitySum = ( row,column )=>{
-  const reportWorkQuantity = row.reportWorkQuantity[column.title] || 0
-  const reportWorkQuantityCount = row.reportWorkQuantityCount[column.title] || 0
-  if(reportWorkQuantity===reportWorkQuantityCount){
-    return reportWorkQuantity
+const filterChange = () =>{
+  if(xGrid.value.isFilter()){
+    xGrid.value.clearMergeCells()
+    xGrid.value.clearMergeFooterItems()
+  }else{
+    xGrid.value.setMergeCells(mergeCells.value)
+    xGrid.value.updateFooter()
   }
 
-  return (reportWorkQuantity
+
+}
+const footSum =(list, field) => {
+  if(xGrid.value.isFilter()){
+    return
+  }
+  let count = 0
+  list.forEach(item => {
+    if(field.indexOf('.')>-1){
+      let  array = field.split('.')
+      count += Number(item[array[0]][array[1]]) || 0
+    }else {
+      count += Number(item[field])  || 0
+    }
+  })
+  return count.toFixed(2)
+}
+
+const quantitySum = ( row,column )=>{
+  const reportWorkQuantityCount = row.reportWorkQuantityCount[column.title] || ''
+  const reportWorkQuantityShow = row.reportWorkQuantityShow[column.title] || ''
+  if(reportWorkQuantityShow===reportWorkQuantityCount){
+    return reportWorkQuantityShow
+  }
+
+  return (reportWorkQuantityShow
       +'('
       +reportWorkQuantityCount
       +')' )
@@ -144,6 +178,7 @@
 <template>
   <div style="width: 100%;height: 100%">
     <vxe-grid
+        @filter-change ='filterChange'
         height="100%"
         size="mini"
         class="mytable-scrollbar"
diff --git a/north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet2.vue b/north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet2.vue
index 157e86b..50b92ce 100644
--- a/north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet2.vue
+++ b/north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet2.vue
@@ -197,12 +197,12 @@
         <tr v-if="item1.differentSize || item1.bendRadius" v-for="(item2,index2) in item1.orderGlassDetails" :key="index2" >
 
             <td style="border: 0"></td>
-            <td>{{ item2.technologyNumber }}</td>
+            <td>#{{ item2.technologyNumber }}</td>
             <td colspan="4"> {{item2.glassChild}}</td>
             <td>{{item2.childWidth}}</td>
             <td>{{item2.arc}}</td>
             <td>{{item2.childHeight}}</td>
-            <td>{{item1.archRise}}</td>
+            <td>{{item2.archRise?item2.archRise:item1.archRise}}</td>
             <td colspan="7"></td>
 
           </tr>
diff --git a/north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet3.vue b/north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet3.vue
index 321cce2..56907e1 100644
--- a/north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet3.vue
+++ b/north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet3.vue
@@ -201,7 +201,8 @@
         <th style="text-align: left;border:none;font-weight: bold;" colspan="2">鑱旂郴浜猴細<span>{{delivery.contacts}}</span></th>
       </tr>
       <tr>
-        <th style="text-align: left;border:none;font-weight: bold;" colspan="7">閫佽揣鍦板潃锛�<span>{{delivery.deliveryAddress}}</span></th>
+        <th style="text-align: left;border:none;font-weight: bold;" colspan="4">閫佽揣鍦板潃锛�<span>{{delivery.deliveryAddress}}</span></th>
+        <th style="text-align: left;border:none;font-weight: bold;" colspan="3">閫佽揣鏃堕棿锛�<span>{{delivery.deliveryDate}}</span></th>
         <th style="text-align: left;border:none;font-weight: bold;" colspan="2">鑱旂郴鐢佃瘽锛�<span>{{delivery.contactNumber}}</span></th>
       </tr>
       <tr>
diff --git a/north-glass-erp/northglass-erp/src/components/sd/order/UpdateAlienEditor.vue b/north-glass-erp/northglass-erp/src/components/sd/order/UpdateAlienEditor.vue
new file mode 100644
index 0000000..a47e693
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/components/sd/order/UpdateAlienEditor.vue
@@ -0,0 +1,577 @@
+<script setup>
+import {computed, onMounted, onUpdated, reactive, ref, watch} from "vue"
+import {filterChanged} from "@/hook"
+import {useI18n} from "vue-i18n"
+import {ElMessage, ElMessageBox,} from "element-plus"
+import request from "@/utils/request"
+import {useRouter,useRoute} from "vue-router"
+import {Ellipse, Leafer, Line, Path, Polygon} from "leafer-ui";
+import {round} from "xe-utils";
+import DxfParser from "dxf-parser";
+import { saveAs } from 'file-saver';
+import DXFWriter from 'dxf-writer';
+
+
+const { t } = useI18n()
+const router = useRouter()
+const route = useRoute()
+let width = ref("")
+let height = ref("null")
+let rowIndex = ref(null)
+const xGrid = ref()
+
+//鐢ㄤ簬鎺ユ敹鐖剁粍浠跺弬鏁�
+let prop = defineProps({
+  rowIndex:{}
+})
+onMounted(()=>{
+  if(Object.keys(prop.rowIndex).length === 0){
+    return
+  }
+  rowIndex.value=prop.rowIndex
+  width.value=prop.rowIndex.width
+  height.value=prop.rowIndex.height
+  ongetproject(rowIndex.value)
+})
+
+const emits = defineEmits(['getUploadPicture'])
+
+let fileName=ref(null)
+let fileDate=ref(null)
+let dxfData=ref(null)
+let state=ref(false)
+let points=ref([])
+let data1=ref(0);let data2=ref(0);let data3=ref(0);let data4=ref(0)
+let data5=ref(0);let data6=ref(0);let data7=ref(0);let data8=ref(0)
+
+let datas1=ref(0);let datas2=ref(0);let datas3=ref(0);let datas4=ref(0)
+let datas5=ref(0);let datas6=ref(0);let datas7=ref(0);let datas8=ref(0)
+let big=0
+let leafer;
+let parsedDXFData = ref([]);
+let orderDetailWidth=ref(0)
+let orderDetailHeight=ref(0)
+let widthAgv=ref(0)
+let heightAgv=ref(0)
+
+const ongetproject = (row) =>  {
+
+  if(row.fileName==null||row.fileName==""){
+    orderDetailWidth.value=row.width
+    orderDetailHeight.value=row.height
+    const main =document.getElementById('mains')
+    const width =document.getElementById('width')
+    const height =document.getElementById('height')
+    if(orderDetailWidth.value/400>orderDetailHeight.value/250){
+      big=orderDetailWidth.value/400
+    }else{
+      big=orderDetailHeight.value/250
+    }
+    let widthAgv=orderDetailWidth.value/big
+    let heightAgv=orderDetailHeight.value/big
+    main.style.width=widthAgv+"px"
+    main.style.height=heightAgv+"px"
+    main.style.backgroundColor = "#8d9095"
+    datas2.value=heightAgv
+    datas8.value=heightAgv
+    datas5.value=widthAgv
+    datas7.value=widthAgv
+    if(leafer!==undefined){
+      leafer.clear()
+    }
+    leafer=new Leafer({ view: 'canvas' })
+    points.value=[0, heightAgv, 0, 0, widthAgv, 0, widthAgv,heightAgv]
+    const polygon = new Polygon({
+      points: points.value,
+      fill: '#32cd79',
+      origin: [0, 0]
+    })
+    setTimeout(() => {
+      leafer.add(polygon);
+    }, 30)
+    state.value=true
+  }else{
+    const b64Data = row.fileData;
+    const byteCharacters = atob(b64Data);
+    const parser = new DxfParser();
+    dxfData.value = parser.parseSync(byteCharacters)
+    state.value=false
+    handleFileUpload()
+  }
+
+
+}
+
+const getproject = () => {
+  if (state.value){
+    leafer = new Leafer({view: 'canvas'})
+    points.value = [datas1.value + (parseInt(data5.value) / big), datas2.value - (parseInt(data6.value) / big), datas3.value + (parseInt(data1.value) / big), datas4.value + (parseInt(data2.value) / big),
+      datas5.value - (parseInt(data3.value) / big), datas6.value + (parseInt(data4.value) / big), datas7.value - (parseInt(data7.value) / big), datas8.value - (parseInt(data8.value) / big)]
+    const polygon = new Polygon({
+      points: points.value,
+      fill: '#32cd79',
+      origin: [0, 0]
+    })
+    leafer.add(polygon)
+    exportToDXF(1)
+  }
+}
+
+const exportToDXF = async (value) => {
+  const dxf = new DXFWriter();
+  const polygonPoints = points.value.map((coord, index) => ({
+    x: index % 2 === 0 ? coord : undefined,
+    y: index % 2 !== 0 ? -coord : undefined
+  })).filter(point => point.x !== undefined && point.y !== undefined);
+
+  let arr=[]
+  for (let i=0;i<points.value.length;i++){
+    let a=[]
+    if(i % 2 === 0){
+      a.push(points.value[i]*big)
+      a.push((points.value[i+1]*big))
+      a.push(0)
+      arr.push(a)
+    }
+
+  }
+  let minX = Infinity, minY = Infinity;
+  let maxX = -Infinity, maxY = -Infinity;
+  arr.forEach(p => {
+    minX = Math.min(Math.abs(p[0]),minX );
+    minY = Math.min(Math.abs(p[1]),minY);
+    maxX = Math.max(Math.abs(p[0]),maxX );
+    maxY = Math.max(Math.abs(p[1]),maxY);
+  });
+
+  arr.forEach(p => {
+    p[1]=maxY-minY-p[1]
+  });
+
+
+  dxf.drawPolyline(arr,{ closed: true, layer: '0' })
+
+  const blob = new Blob([dxf.toDxfString()], {type: 'text/plain;charset=utf-8'});
+  const base64 = await fileToBase64(blob);
+  if(value===1){
+    fileName.value="map.dxf"
+    fileDate.value=base64.replace(/^data:.+;base64,/, "")
+  }
+  else if(value===2&&state.value){
+    saveAs(blob, 'map.dxf');
+  }else{
+    ElMessage.warning("璇ユ牸寮忎笉鏀寔瀵煎嚭")
+  }
+}
+
+
+
+const fileToBase64 = (file) => {
+  return new Promise((resolve, reject) => {
+    const reader = new FileReader();
+    reader.onload = () => resolve(reader.result);
+    reader.onerror = reject;
+    reader.readAsDataURL(file);
+  });
+};
+
+function toBottomOrigin(y, canvasHeight) {
+  return canvasHeight - y; // 灏嗗乏涓婅Y鍧愭爣杞崲涓哄乏涓嬭鍧愭爣绯�
+}
+
+const handleFile =  async (event) => {
+  state.value=false
+  const main = document.getElementById('mains')
+  const width = document.getElementById('width')
+  const height = document.getElementById('height')
+  validate()
+  if(leafer!==undefined){
+    leafer.clear()
+  }
+  leafer = new Leafer({view: 'canvas'});
+  const file = event.target.files[0];
+  if (file) {
+    const reader = new FileReader();
+    reader.onload = async (e) => {
+      const text = e.target.result;
+      try {
+        const base64 = await fileToBase64(file);
+        const parser = new DxfParser();
+        dxfData.value = parser.parseSync(text);
+        handleFileUpload()
+
+        fileName.value=file.name
+        fileDate.value=base64.replace(/^data:.+;base64,/, "")
+      } catch (error) {
+        console.error('瑙f瀽DXF鏂囦欢鏃跺嚭閿�:', error);
+      }
+    };
+    reader.readAsText(file);
+  }
+}
+
+const handleFileUpload =  () => {
+  const main =document.getElementById('mains')
+  const width =document.getElementById('width')
+  const height =document.getElementById('height')
+  if(leafer!==undefined){
+    leafer.clear()
+  }
+  leafer = new Leafer({ view: 'canvas' });
+  try {
+    let minX = Infinity, minY = Infinity;
+    let maxX = -Infinity, maxY = -Infinity;
+    dxfData.value.entities.forEach(entity => {
+      if (entity.type === 'LINE' || entity.type === 'LWPOLYLINE') {
+        entity.vertices.forEach(vertices => {
+          minX = Math.min(vertices.x, minX);
+          minY = Math.min(vertices.y, minY);
+          maxX = Math.max(vertices.x, maxX);
+          maxY = Math.max(vertices.y, maxY);
+        })
+      }
+      if (entity.type === 'ARC') {
+        const center = {x: entity.center.x, y: entity.center.y};
+        const radius = entity.radius;
+        const startAngle = entity.startAngle * (180 / Math.PI);
+        const endAngle = entity.endAngle * (180 / Math.PI);
+
+        const points = [];
+        const steps = 32;
+        for (let i = 0; i <= steps; i++) {
+          const angle = startAngle + (endAngle - startAngle) * (i / steps);
+          const x = center.x + radius * Math.cos(angle * Math.PI / 180);
+          const y = center.y + radius * Math.sin(angle * Math.PI / 180);
+          points.push({x, y});
+        }
+
+
+        points.forEach(p => {
+          minX = Math.min(minX, p.x);
+          minY = Math.min(minY, p.y);
+          maxX = Math.max(maxX, p.x);
+          maxY = Math.max(maxY, p.y);
+        });
+      }
+    });
+    if ((maxX - minX) / 400 > (maxY - minY) / 250) {
+      big = (maxX - minX) / 400
+    } else {
+      big = (maxY - minY) / 250
+    }
+
+    Object.values(dxfData.value.entities).forEach(entity => {
+      switch (entity.type) {
+        case 'LINE':
+          main.style.width = (maxX - minX) / big + "px"
+          main.style.height = (maxY - minY) / big + "px"
+          main.style.backgroundColor = "#8d9095"
+          width.innerHTML = round(maxX - minX, 2)
+          height.innerHTML = round(maxY - minY, 2)
+          const line = new Line({
+            points: [(entity.vertices[0].x - minX) / big, ((maxY - minY) - (entity.vertices[0].y- minY)) / big,
+              (entity.vertices[1].x - minX) / big, ((maxY - minY) - (entity.vertices[1].y - minY)) / big],
+            stroke: '#f00',
+            strokeWidth: 1
+          })
+          setTimeout(() => {
+            leafer.add(line);
+          }, 30);
+          break;
+        case 'LWPOLYLINE':
+
+          main.style.width = (maxX - minX) / big + "px"
+          main.style.height = (maxY - minY) / big + "px"
+          main.style.backgroundColor = "#8d9095"
+          width.innerHTML = round(maxX - minX, 2)
+          height.innerHTML = round(maxY - minY, 2)
+
+          let point = entity.vertices.map(v => [
+            (v.x - minX) / big,
+            toBottomOrigin((v.y - minY) / big, (maxY - minY) / big),
+          ]).flat()
+
+
+          if(entity.vertices.length==4){
+            isQuadrilateral(maxY,minY,maxX,minX,point)
+          }
+
+          const polygon = new Polygon({
+            points: point,
+            fill: '#32cd79',
+          })
+          setTimeout(() => {
+            leafer.add(polygon);
+          }, 30);
+
+          break;
+        case 'CIRCLE':
+          big = (entity.radius * 2) / 400
+          main.style.width = entity.radius * 2 / big + "px"
+          main.style.height = entity.radius * 2 / big + "px"
+          width.innerHTML = round(entity.radius * 2, 2)
+          height.innerHTML = round(entity.radius * 2, 2)
+          const ellipse = new Ellipse({
+            width: entity.radius * 2 / big,
+            height: entity.radius * 2 / big,
+            fill: "#32cd79"
+          })
+          setTimeout(() => {
+            leafer.add(ellipse);
+          }, 30);
+
+          break;
+        case 'ELLIPSE':
+          console.log(entity)
+
+          const {majorAxisEndPoint, axisRatio} = entity;
+
+          const dx = majorAxisEndPoint.x;
+          const dy = majorAxisEndPoint.y;
+          const a = Math.sqrt(dx ** 2 + dy ** 2);
+          const c = a * axisRatio;
+          const 胃 = Math.atan2(dy, dx);
+          const l = axisRatio * (180 / Math.PI);
+
+          if ((a * 2) / 400 > (c * 2) / 250) {
+            big = (a * 2) / 400
+          } else {
+            big = (c * 2) / 250
+          }
+
+          main.style.width = a * 2 / big + "px"
+          main.style.height = c * 2 / big + "px"
+          width.innerHTML = round(a * 2, 2)
+          height.innerHTML = round(c * 2, 2)
+          const ellipse2 = new Ellipse({
+            width: a * 2 / big,
+            height: c * 2 / big,
+            fill: "#32cd79",
+          })
+
+          setTimeout(() => {
+            leafer.add(ellipse2);
+          }, 30);
+
+          break;
+        case 'ARC':
+          const center = {x: entity.center.x, y: entity.center.y};
+          const radius = entity.radius;
+          const startAngle = entity.startAngle * (180 / Math.PI);
+          const endAngle = entity.endAngle * (180 / Math.PI);
+
+          if ((maxX - minX) / 400 > (maxY - minY) / 250) {
+            big = (maxX - minX) / 400
+          } else {
+            big = (maxY - minY) / 250
+          }
+
+
+          // 璁$畻鍦嗗姬鐨勮捣鐐瑰拰缁堢偣
+          const startX = (center.x + radius * Math.cos(entity.startAngle) - minX);
+          const startY = (maxY - minY) - ((center.y + radius * Math.sin(entity.startAngle)) - minY);
+          const endX = (center.x + radius * Math.cos(entity.endAngle) - minX);
+          const endY = (maxY - minY) - ((center.y + radius * Math.sin(entity.endAngle)) - minY);
+
+          // 鍒涘缓鍦嗗姬璺緞
+          const path = new Path({
+            path: `M ${startX / big} ${startY / big} A ${radius / big} ${radius / big} 0 ${endAngle - startAngle > 180 ? 1 : 0} 0 ${endX / big} ${endY / big}`,
+            stroke: '#f00',
+            strokeWidth: 1,
+          });
+
+
+          setTimeout(() => {
+            leafer.add(path);
+          }, 30);
+
+
+          break;
+
+      }
+    })
+  } catch (error) {
+    console.error('瑙f瀽DXF鏂囦欢鏃跺嚭閿�:', error);
+  }
+
+};
+
+const validate = async () => {
+  data1.value=0
+  data2.value=0
+  data3.value=0
+  data4.value=0
+  data5.value=0
+  data6.value=0
+  data7.value=0
+  data8.value=0
+  big=0
+  return true
+}
+defineExpose({
+  validate
+})
+
+const save =  () => {
+  emits('getUploadPicture', fileName.value,fileDate.value)
+}
+
+
+const isQuadrilateral =  (maxY,minY,maxX,minX,point) => {
+  state.value=true
+  datas1.value=0
+  datas2.value=(maxY - minY) / big
+  datas3.value=0
+  datas4.value=0
+  datas5.value=(maxX - minX) / big
+  datas6.value=0
+  datas7.value=(maxX - minX) / big
+  datas8.value=(maxY - minY) / big
+  //points.value=[0, heightAgv, 0, 0, widthAgv, 0, widthAgv,heightAgv]
+
+  let numbers = [point[0], point[2], point[4], point[6]]; // 绀轰緥鏁扮粍
+  let maxX1 = Math.max(...numbers); // 鎵惧埌鏈�澶у��
+  let maxIndex = numbers.findIndex(num => num === maxX1); // 瀹氫綅绗竴涓尮閰嶇储寮�
+  let remaining = [...numbers]; // 澶嶅埗鍘熸暟缁勯伩鍏嶇獊鍙�
+  remaining.splice(maxIndex, 1); // 浠呯Щ闄ょ涓�涓渶澶у�煎疄渚�
+  let maxX2 = Math.max(...remaining); // 鍦ㄥ墿浣欐暟缁勪腑鎵剧浜屽ぇ鍊�
+
+  let arr=[]
+  for (let i=0;i<point.length;i++){
+    let a=[]
+    if(i % 2 === 0){
+      a.push(point[i])
+      a.push((point[i+1]))
+      arr.push(a)
+    }
+
+  }
+  let x=[]
+  let y=[]
+
+  let upperRight=null //鍙充笂
+  let lowerRight=null //鍙充笅
+  let topLeft=null //宸︿笂
+  let lowerLeft=null //宸︿笅
+
+  arr.forEach(item=>{
+    if(item[0]==maxX1||item[0]==maxX2){
+      x.push(item)
+    }else{
+      y.push(item)
+    }
+  })
+
+  if(x[0][1]>x[1][1]){
+    lowerRight=x[0]
+    upperRight=x[1]
+  }else{
+    upperRight=x[0]
+    lowerRight=x[1]
+  }
+
+  if(y[0][1]>y[1][1]){
+    lowerLeft=y[0]
+    topLeft=y[1]
+  }else {
+    topLeft=y[0]
+    lowerLeft=y[1]
+  }
+
+
+  if(lowerLeft[0]*big===0){
+    data5.value=0
+  }else{
+    data5.value=round(lowerLeft[0]*big,0)
+  }
+  if(lowerLeft[1]*big===0){
+    data6.value=0
+  }else{
+    data6.value=round(maxY-minY-lowerLeft[1]*big,0)
+  }
+  if(topLeft[0]*big===0){
+    data1.value=0
+  }else{
+    data1.value=round(topLeft[0]*big,0)
+  }
+  if(topLeft[1]*big===0){
+    data2.value=0
+  }else{
+    data2.value=round(topLeft[1]*big,0)
+  }
+  if(upperRight[0]*big===0){
+    data3.value=0
+  }else{
+    data3.value=round(maxX-minX-upperRight[0]*big,0)
+  }
+  if(upperRight[1]*big===0){
+    data4.value=0
+  }else{
+    data4.value=round(upperRight[1]*big,0)
+  }
+  if(lowerRight[0]*big===0){
+    data7.value=0
+  }else{
+    data7.value=round(maxX-minX-lowerRight[0]*big,0)
+  }
+  if(lowerRight[1]*big===0){
+    data8.value=0
+  }else{
+    data8.value=round(maxY-minY-lowerRight[1]*big,0)
+  }
+}
+
+
+
+</script>
+
+<template>
+  <div style="width: 404px;height: 254px;border: 2px solid #000;float: left;
+      position: relative;display: flex;justify-content: center;align-content: center;margin-left: 100px;margin-top: 25px;">
+    <div id="mains" ref="parent"  >
+      <canvas  id="canvas" ></canvas>
+    </div>
+  </div>
+  <div id="width" style="height: 20px;position: absolute;top: 37px;left: 300px;">{{orderDetailWidth}}</div>
+  <div id="height" style="width: 60px;position: absolute;top: 178px;left: 60px;">{{orderDetailHeight}}</div>
+  <div style="float: left;margin-top: 30px;margin-left: 150px">
+    <el-input class="contactNumber" @blur="getproject" type="text" v-model="data1" />
+    <el-input class="contactNumber" @blur="getproject" type="text" v-model="data2"  />&nbsp;&nbsp;&nbsp;
+    <el-input class="contactNumber" @blur="getproject" type="text" v-model="data3"  />
+    <el-input class="contactNumber" @blur="getproject" type="text" v-model="data4"  /><br>
+    <el-input class="contactNumber" @blur="getproject" type="text" v-model="data5"  />
+    <el-input class="contactNumber" @blur="getproject" type="text" v-model="data6"  />&nbsp;&nbsp;&nbsp;
+    <el-input class="contactNumber" @blur="getproject" type="text" v-model="data7"  />
+    <el-input class="contactNumber" @blur="getproject" type="text" v-model="data8"  /><br>
+  </div>
+  <div id="width" style="height: 20px;position: absolute;top: 342px;left: 145px;">涓�</div>
+  <div id="width" style="height: 20px;position: absolute;top: 364px;left: 145px;">涓�</div>
+  <div id="width" style="height: 20px;position: absolute;top: 322px;left: 185px;">妯�</div>
+  <div id="width" style="height: 20px;position: absolute;top: 322px;left: 255px;">绔�</div>
+  <div id="width" style="height: 20px;position: absolute;top: 322px;left: 320px;">妯�</div>
+  <div id="width" style="height: 20px;position: absolute;top: 322px;left: 385px;">绔�</div>
+  <div style="float: left;margin-top: 20px;margin-left: 80px;">
+    <input style="width: 180px;"  type="file" @change="handleFile" accept=".dxf" />
+    <el-button type="primary" @click="exportToDXF(2)">瀵煎嚭DXF</el-button>
+  </div>
+  <div style="float: left;margin-top: 20px;margin-left: 80px;">
+    <el-button type="primary" @click="save()">淇濆瓨</el-button>
+  </div>
+
+
+
+</template>
+
+<style scoped>
+.contactNumber{
+  width: 60px;
+  height:20px;
+  border: none;
+  box-shadow: none;
+  font-size: 15px;
+}
+
+#mains {
+  position: relative;
+}
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/components/sd/order/UploadPicture.vue b/north-glass-erp/northglass-erp/src/components/sd/order/UploadPicture.vue
index c77013f..dac7efb 100644
--- a/north-glass-erp/northglass-erp/src/components/sd/order/UploadPicture.vue
+++ b/north-glass-erp/northglass-erp/src/components/sd/order/UploadPicture.vue
@@ -14,7 +14,7 @@
   console.log(file)
 }
 const handleChange = (uploadFile, uploadFiles) => {
-  emits('getUploadPicture', uploadFile.name)
+  emits('getUploadPicture', uploadFile.name,uploadFile)
   upload.value.clearFiles()
 }
 
diff --git a/north-glass-erp/northglass-erp/src/lang/ar.js b/north-glass-erp/northglass-erp/src/lang/ar.js
index 7eac612..ea253d3 100644
--- a/north-glass-erp/northglass-erp/src/lang/ar.js
+++ b/north-glass-erp/northglass-erp/src/lang/ar.js
@@ -141,7 +141,7 @@
            hollowUpdate:'鬲毓丿賷賱 賮丕氐賱 賲鬲賵爻胤',
            interlayerThickness:'*爻購賲賰 丕賱鬲氐賮賷丨',
            interlayerType:'* 丕賱賳賵毓',
-           interlayerColor:'* 丕賱賱賵賳',
+           interlayerColor:' 丕賱賱賵賳',
            interlayer:'賮丕氐賱 丕賱鬲氐賮賷丨',
            interlayerUpdate:'鬲毓丿賷賱 賮丕氐賱 丕賱鬲氐賮賷丨 ',
            glassAttribute:'禺氐丕卅氐 丕賱夭噩丕噩 賲鬲噩丕賳爻丞',
@@ -252,6 +252,8 @@
         allAmount:'闈㈢Н閲戦锛堟�婚噾棰濓級',
         orderTransfer:'璁㈠崟鎶ュ伐杞Щ',
 
+        graphic:'鍥惧舰',
+        drawingNo:'鍥惧彿',
         msg:{
             productCheck:'丕賱乇噩丕亍 丕禺鬲賷丕乇 賲賳鬲噩',
             tableLengthNot:'賱丕 鬲賵噩丿 亘賷丕賳丕鬲 賱賱噩丿賵賱',
@@ -288,7 +290,8 @@
         },
         preciseMode:'绮剧‘妯″紡',
         ambiguityModels:'妯$硦妯″紡',
-        glassSizeRange:'鐜荤拑灏哄鑼冨洿'
+        glassSizeRange:'鐜荤拑灏哄鑼冨洿',
+        glassQuantity:'灏忕墖鏁伴噺'
 
     },
     searchOrder:{
@@ -355,7 +358,8 @@
         xMargin:'賴丕賲卮 丕賱賲丨賵乇 X',
         yMargin:'賴丕賲卮 丕賱賲丨賵乇 Y',
         location:'賲賵賯毓 丕賱毓賱丕賲丞 丕賱鬲噩丕乇賷丞',
-        sort:'鐜荤拑鍙嶅集'
+        sort:'鐜荤拑鍙嶅集',
+        archRise:'鎷遍珮'
 
     },
 
@@ -388,6 +392,8 @@
             selectDetailProcessCard:"娴佺▼鍗℃槑缁嗘煡璇�"
 
         },
+        printCompound:'闇�瑕佸悓鏋剁殑灞�',
+        flashback:'鍊掑簭',
         processId:'乇賯賲 亘胤丕賯丞 丕賱毓賲賱賷丞',
         founder:'賲賵夭毓 丕賱乇賮賵賮',
         layoutStatus:'丕賱丨丕賱丞',
@@ -995,6 +1001,7 @@
             finishedProductReport :'鬲賯乇賷乇 丕賱賲賳鬲噩丕鬲 丕賱賳賴丕卅賷丞',
             orderWorkReportForm :'璁㈠崟鎶ュ伐鎶ヨ〃',
         },
+        teamsGroupsName:'涓婂伐搴忔姤宸�',
         productionReport:'鬲賯乇賷乇 丕賱廿賳鬲丕噩',
         workInProgressReport:'鬲賯乇賷乇 爻賷乇 丕賱毓賲賱',
         processToBeCompleted:'鬲賯乇賷乇 丕賱毓賲賱賷丞 丕賱賲毓賱賯丞',
diff --git a/north-glass-erp/northglass-erp/src/lang/en.js b/north-glass-erp/northglass-erp/src/lang/en.js
index 5dbcacb..95e45f7 100644
--- a/north-glass-erp/northglass-erp/src/lang/en.js
+++ b/north-glass-erp/northglass-erp/src/lang/en.js
@@ -141,7 +141,7 @@
             hollowUpdate:'Hollow spacers modified',
             interlayerThickness:'*Lamination thickness',
             interlayerType:'* Type',
-            interlayerColor:'* Color',
+            interlayerColor:'Color',
             interlayer:'Lamination  spacer',
             interlayerUpdate:'Lamination  spacer modified',
             glassAttribute:'Monolithic glass properties',
@@ -252,6 +252,8 @@
         allAmount:'闈㈢Н閲戦锛堟�婚噾棰濓級',
         orderTransfer:'璁㈠崟鎶ュ伐杞Щ',
 
+        graphic:'graphic',
+        drawingNo:'drawingNo',
         msg:{
             productCheck:'Please select a product',
             tableLengthNot:'No table data',
@@ -289,7 +291,8 @@
         },
         preciseMode:'绮剧‘妯″紡',
         ambiguityModels:'妯$硦妯″紡',
-        glassSizeRange:'鐜荤拑灏哄鑼冨洿'
+        glassSizeRange:'鐜荤拑灏哄鑼冨洿',
+        glassQuantity:'灏忕墖鏁伴噺'
 
     },
     searchOrder:{
@@ -356,7 +359,8 @@
         xMargin:'X axis margin',
         yMargin:'Y-axis margin',
         location:'Trademark position',
-        sort:'鐜荤拑鍙嶅集'
+        sort:'鐜荤拑鍙嶅集',
+        archRise:'鎷遍珮'
 
     },
 
@@ -388,6 +392,8 @@
             printFlowCard:"Process card printing",
             selectDetailProcessCard:"Process card details query"
         },
+        printCompound:'闇�瑕佸悓鏋剁殑灞�',
+        flashback:'鍊掑簭',
         processId:'Process Card Number',
         founder:'Divider',
         layoutStatus:'Type Setting',
@@ -997,6 +1003,7 @@
             finishedProductReport :'Finished product report',
             orderWorkReportForm :'璁㈠崟鎶ュ伐鎶ヨ〃',
         },
+        teamsGroupsName:'涓婂伐搴忔姤宸�',
         productionReport:'Production report',
         workInProgressReport:'Product in process report',
         processToBeCompleted:'Process to be completed report',
diff --git a/north-glass-erp/northglass-erp/src/lang/kr.js b/north-glass-erp/northglass-erp/src/lang/kr.js
index 3af0051..4780383 100644
--- a/north-glass-erp/northglass-erp/src/lang/kr.js
+++ b/north-glass-erp/northglass-erp/src/lang/kr.js
@@ -141,7 +141,7 @@
             hollowUpdate:'欷戧车 臧勱博鞛� 靾橃爼',
             interlayerThickness:'鞝侅傅 霊愱粯',
             interlayerType:'*鞙犿槙',
-            interlayerColor:'*靸夓儊',
+            interlayerColor:'靸夓儊',
             interlayer:'鞝侅傅 臧勱博鞛�',
             interlayerUpdate:'鞝侅傅 臧勱博鞛� 靾橃爼',
             glassAttribute:'雼澕 鞙犽Μ 韸轨劚',
@@ -251,6 +251,9 @@
         quantityMount:'靾橂焿 旮办 旮堨暋',
         allAmount:'齑� 氅挫爜 旮堨暋',
         orderTransfer:'欤茧 鞚搓磤',
+
+        graphic:'graphic',
+        drawingNo:'drawingNo',
         transferPage:{
             oldOrderId:'旮办〈 欤茧 氩堩樃',
             newOrderId:'鞁犼窚 欤茧 氩堩樃',
@@ -297,7 +300,8 @@
         },
         preciseMode:'绮剧‘妯″紡',
         ambiguityModels:'妯$硦妯″紡',
-        glassSizeRange:'鐜荤拑灏哄鑼冨洿'
+        glassSizeRange:'鐜荤拑灏哄鑼冨洿',
+        glassQuantity:'灏忕墖鏁伴噺'
 
     },
     searchOrder:{
@@ -397,6 +401,8 @@
             selectDetailProcessCard:'頂勲靹胳姢 旃措摐 靸侅劯 臁绊殞'
 
         },
+        printCompound:'闇�瑕佸悓鏋剁殑灞�',
+        flashback:'鍊掑簭',
         processId:'頂勲靹胳姢 旃措摐 氩堩樃',
         founder:'攵勲鞍 鞛戩梾鞛�',
         layoutStatus:'臧�瓿� 氚办箻 靸來儨',
@@ -1006,6 +1012,7 @@
             finishedProductReport :'鞕勳牅頀� 氤搓碃靹�',
             orderWorkReportForm :'璁㈠崟鎶ュ伐鎶ヨ〃',
         },
+        teamsGroupsName:'涓婂伐搴忔姤宸�',
         productionReport:'靸濎偘 氤搓碃靹�',
         workInProgressReport:'歆勴枆 欷戩澑 鞝滍拡 氤搓碃靹�',
         processToBeCompleted:'鞕勲頃挫暭 頃� 頂勲靹胳姢 氤搓碃靹�',
diff --git a/north-glass-erp/northglass-erp/src/lang/ru.js b/north-glass-erp/northglass-erp/src/lang/ru.js
index 060e35f..45a3aed 100644
--- a/north-glass-erp/northglass-erp/src/lang/ru.js
+++ b/north-glass-erp/northglass-erp/src/lang/ru.js
@@ -141,7 +141,7 @@
             hollowUpdate:'袩褍褋褌芯械 芯斜薪芯胁谢械薪懈械',
             interlayerThickness:'* 孝芯谢褖懈薪邪 褋谢芯褟',
             interlayerType:'* 孝懈锌',
-            interlayerColor:'* 笑胁械褌',
+            interlayerColor:' 笑胁械褌',
             interlayer:'孝褉懈锌谢械泻褋',
             interlayerUpdate:'孝褉懈锌谢械泻褋 芯斜薪芯胁谢械薪懈械',
             glassAttribute:'小胁芯泄褋褌胁邪 屑芯薪芯谢懈褌薪芯谐芯 褋褌械泻谢邪',
@@ -252,6 +252,8 @@
         allAmount:'闈㈢Н閲戦锛堟�婚噾棰濓級',
         orderTransfer:'璁㈠崟鎶ュ伐杞Щ',
 
+        graphic:'鍥惧舰',
+        drawingNo:'鍥惧彿',
         msg:{
             productCheck:'袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 锌褉芯写褍泻褌',
             tableLengthNot:'袧械褌 写邪薪薪褘褏 褌邪斜谢懈褑褘',
@@ -288,7 +290,8 @@
         },
         preciseMode:'绮剧‘妯″紡',
         ambiguityModels:'妯$硦妯″紡',
-        glassSizeRange:'鐜荤拑灏哄鑼冨洿'
+        glassSizeRange:'鐜荤拑灏哄鑼冨洿',
+        glassQuantity:'灏忕墖鏁伴噺'
 
     },
     searchOrder:{
@@ -355,7 +358,8 @@
         xMargin:'袚褉邪薪懈褑褘 芯褋懈 X',
         yMargin:'袠薪褌械褉胁邪谢 芯褋懈 Y',
         location:'袪邪褋锌芯谢芯卸械薪懈械 褌芯胁邪褉薪芯谐芯 蟹薪邪泻邪',
-        sort:'鐜荤拑鍙嶅集'
+        sort:'鐜荤拑鍙嶅集',
+        archRise:'鎷遍珮'
     },
 
     workOrder:{
@@ -386,7 +390,8 @@
             printFlowCard:"娴佺▼鍗℃墦鍗�",
             selectDetailProcessCard:"娴佺▼鍗℃槑缁嗘煡璇�"
         },
-
+        printCompound:'闇�瑕佸悓鏋剁殑灞�',
+        flashback:'鍊掑簭',
         processId:'袧芯屑械褉 锌褉芯褑械褋褋邪',
         founder:'袛懈褋锌械褌褔械褉',
         layoutStatus:'肖芯褉屑邪褌',
@@ -995,6 +1000,7 @@
             finishedProductReport :'袨褌褔械褌 芯 谐芯褌芯胁芯泄 锌褉芯写褍泻褑懈懈',
             orderWorkReportForm :'璁㈠崟鎶ュ伐鎶ヨ〃',
         },
+        teamsGroupsName:'涓婂伐搴忔姤宸�',
         productionReport:'袨褌褔械褌 芯 锌褉芯懈蟹胁芯写褋褌胁械',
         workInProgressReport:'袨褌褔械褌 芯 薪械蟹邪胁械褉褕械薪薪芯泄 锌褉芯写褍泻褑懈懈',
         processToBeCompleted:'袨褌褔械褌 芯 薪械蟹邪胁械褉褕械薪薪芯泄 芯锌械褉邪褑懈懈',
diff --git a/north-glass-erp/northglass-erp/src/lang/zh.js b/north-glass-erp/northglass-erp/src/lang/zh.js
index 8a53693..0fa114e 100644
--- a/north-glass-erp/northglass-erp/src/lang/zh.js
+++ b/north-glass-erp/northglass-erp/src/lang/zh.js
@@ -125,7 +125,7 @@
            glassRepeat:'璇峰厛閫夋嫨闂撮殧鐗�',
            HollowReview:'璇烽�夋嫨鍏ㄩ儴涓┖闂撮殧鐗╀笅鎷夋',
            firstGlass:"璇峰厛閫夋嫨浜у搧",
-           InterlayerReview:'璇烽�夋嫨鍏ㄩ儴涓┖闂撮殧鐗╀笅鎷夋',
+           InterlayerReview:'璇烽�夋嫨鍏ㄩ儴闂撮殧鐗╁甫鏄熷彿涓嬫媺妗�',
            glassTypeTitle:'鏉愭枡灞炴��',
            thickness:'*鍘氬害',
            color:'*棰滆壊',
@@ -141,7 +141,7 @@
            hollowUpdate:'涓┖闂撮殧鐗╀慨鏀�',
            interlayerThickness:'*澶瑰眰鍘氬害',
            interlayerType:'*绫诲瀷',
-           interlayerColor:'*棰滆壊',
+           interlayerColor:'棰滆壊',
            interlayer:'澶瑰眰闂撮殧鐗�',
            interlayerUpdate:'澶瑰眰闂撮殧鐗╀慨鏀�',
            glassAttribute:'鍗曠墖鐜荤拑灞炴��:',
@@ -251,6 +251,9 @@
         quantityMount:'鏁伴噺閲戦',
         allAmount:'闈㈢Н閲戦锛堟�婚噾棰濓級',
         orderTransfer:'璁㈠崟鎶ュ伐杞Щ',
+
+        graphic:'鍥惧舰',
+        drawingNo:'鍥惧彿',
         transferPage:{
             oldOrderId:'鍘熻鍗曞彿',
             newOrderId:'鏂拌鍗曞彿',
@@ -297,7 +300,8 @@
         },
         preciseMode:'绮剧‘妯″紡',
         ambiguityModels:'妯$硦妯″紡',
-        glassSizeRange:'鐜荤拑灏哄鑼冨洿'
+        glassSizeRange:'鐜荤拑灏哄鑼冨洿',
+        glassQuantity:'灏忕墖鏁伴噺'
 
     },
     searchOrder:{
@@ -364,7 +368,8 @@
         xMargin:'瀹芥柟鍚戝潗鏍�',
         yMargin:'楂樻柟鍚戝潗鏍�',
         location:'鍟嗘爣浣嶇疆',
-        sort:'鐜荤拑鍙嶅集'
+        sort:'鐜荤拑鍙嶅集',
+        archRise:'鎷遍珮'
 
     },
 
@@ -397,6 +402,8 @@
             selectDetailProcessCard:"娴佺▼鍗℃槑缁嗘煡璇�"
 
         },
+        printCompound:'闇�瑕佸悓鏋剁殑灞�',
+        flashback:'鍊掑簭',
         processId:'娴佺▼鍗″彿',
         founder:'鍒嗘灦鍛�',
         layoutStatus:'鎺掔増鐘舵��',
@@ -487,7 +494,7 @@
         printStatus:'鎵撳嵃娆℃暟',
         labelPrinting2:'鏍囩鎵撳嵃2',
         finishedProductPrinting2:'鎴愬搧鎵撳嵃2',
-        editablePrinting:'鍙紪杈戞墦鍗�',
+        editablePrinting:'鏍囩鑷畾涔夋墦鍗�',
         invertSelection:'鍙嶉��',
         sortSummary:'鎺掑簭姹囨��',
         addAutomatically:'鑷姩濉厖',
@@ -522,7 +529,8 @@
         addFlowCardMsg2:'璇烽�夋嫨鏈垎鏋惰鍗曟墦鍗�',
         okFlowCard:'宸插垎鏋�',
         noFlowCard:'鏈垎鏋�',
-
+        mainWidth:'瀹介珮',
+        mainHeight:'楂樺',
 
     },
     reportingWorks:{
@@ -531,6 +539,9 @@
             addReportingWork:"鎶ュ伐鏂板",
             qualityInspectionReview:"璐ㄦ瀹℃牳",
         },
+        msgMannerPacking:'璇烽�夋嫨鍖呰鏂瑰紡',
+        saveWorkStorage:'鎶ュ伐鍏ュ簱',
+        mannerPacking:'鍖呰鏂瑰紡',
         glassNumber:'缂栧彿',
         glassAddress:'鐗囨爣璁�',
         WorkReportingManagement:'鎶ュ伐绠$悊',
@@ -1007,8 +1018,10 @@
             finishedProductReport :'鎴愬搧鎶ヨ〃',
             orderWorkReportForm :'璁㈠崟鎶ュ伐鎶ヨ〃',
         },
+        teamsGroupsName:'涓婂伐搴忔姤宸�',
         productionReport:'鐢熶骇鎶ヨ〃',
-        workInProgressReport:'鍦ㄥ埗鍝佹姤琛�',
+        workInProgressReport:'鍦ㄥ埗鍝佹槑缁嗘姤琛�',
+        WorkInProgressCombination:'鍦ㄥ埗鍝佹眹鎬绘姤琛�',
         processToBeCompleted:'宸ュ簭寰呭畬鎴愭姤琛�',
         productionAndShippingProgress:'鐢熶骇鍙戣揣杩涘害鎶ヨ〃',
         processCardProgress:'娴佺▼鍗¤繘搴︽姤琛�',
diff --git a/north-glass-erp/northglass-erp/src/router/index.js b/north-glass-erp/northglass-erp/src/router/index.js
index b39a685..9334961 100644
--- a/north-glass-erp/northglass-erp/src/router/index.js
+++ b/north-glass-erp/northglass-erp/src/router/index.js
@@ -551,6 +551,11 @@
               component: () => import('../views/pp/processCard/PrintProjectDetails.vue'),
             },
             {
+              path: 'TagStyleDesigner',
+              name: 'TagStyleDesigner',
+              component: () => import('../components/pp/TagStyleDesigner.vue'),
+            },
+            {
               path: '',
               redirect:'/main/processCard/selectProcessCard'
             }
@@ -839,6 +844,12 @@
               path: 'workInProgress',
               name: 'workInProgress',
               component: () => import('../views/pp/report/WorkInProgress.vue'),
+            },
+            {
+              //鍦ㄥ埗鍝佹眹鎬绘姤琛�
+              path: 'workInProgressCombination',
+              name: 'workInProgressCombination',
+              component: () => import('../views/pp/report/WorkInProgressCombination.vue'),
             },
             {
               //鎴愬搧鐜囨姤琛�
@@ -1253,6 +1264,11 @@
               component: () => import('../views/mm/basicData/WarehouseCreateBasicData.vue'),
             },
             {
+              path: 'canvas',
+              name: 'canvas',
+              component: () => import('../views/mm/basicData/canvas.vue'),
+            },
+            {
               path: '',
               redirect: '/main/warehouseBasicData/warehouseSearchBasicData'
             }
@@ -1320,6 +1336,11 @@
       path: '/app',
       name: 'app',
       component: () => import('../views/system/app/appDownload.vue')
+    },
+    {
+      path: '/productionScheduleCollect',
+      name: 'productionScheduleCollect',
+      component: () => import('../views/pp/report/WorkInProgressCombination.vue'),
     }
     
   ]
diff --git "a/north-glass-erp/northglass-erp/src/stores/sd/companySet/\345\244\251\346\264\245\345\214\227\347\216\273.js" "b/north-glass-erp/northglass-erp/src/stores/sd/companySet/\345\244\251\346\264\245\345\214\227\347\216\273.js"
index e5ddb79..c091097 100644
--- "a/north-glass-erp/northglass-erp/src/stores/sd/companySet/\345\244\251\346\264\245\345\214\227\347\216\273.js"
+++ "b/north-glass-erp/northglass-erp/src/stores/sd/companySet/\345\244\251\346\264\245\345\214\227\347\216\273.js"
@@ -3,6 +3,7 @@
 export default defineStore('companyInfo', {
 
     state: () => ({
+        hollow:'*',
         notChangeProduct:true,//澶╂触true锛屽叾浠杅alse锛屾槸鍚﹀紑鍚潪鏈汉鍒涘缓鐨勪骇鍝佷笉鑳戒慨鏀�
         timeOut:false,//閲戝崕true锛屽叾浠杅alse锛屾槸鍚﹀紑鍚秴鏃舵敼鍙樺閫夋鐘舵��
         connectMes:false,//甯稿窞,涔変箤true锛屽叾浠杅alse锛屾樉绀鸿鍗曟姤宸ヨ浆绉绘槸鍚﹀惎鐢�
@@ -10,32 +11,37 @@
         address:'澶╂触瀹濆澔鍖鸿妭鑳界幆淇濆伐涓氬尯澶╁叴璺タ渚у疂涓亾鍗椾晶',
         telephone:'022-59280088',
         fax:'022-59280066',
-        errorArea:0.4,
+        errorArea:0.4,//缁撶畻闈㈢Н璇樊
         widHeiLength:{//璁㈠崟瀹介珮闀垮害
             regexp:/^(0|[1-9][0-9]{0,4}([.][0-9]{1,2})?)$/,//姝e垯0.00-99999.99
             //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//姝e垯0.00-9999.99
             msg:'basicData.msg.range99999Dec2'
         },
         orderIdType:'year',//鍚庣鐢熸垚璁㈠崟鍙风被鍨嬶紝day:姣忓ぉ鐢熸垚锛宮onth:姣忔湀鐢熸垚,year:姣忓勾鐢熸垚
-        deliveryIdType:'day',
+        deliveryIdType:'day',//鍚庣鐢熸垚鍙戣揣鍗曞彿绫诲瀷锛宒ay:姣忓ぉ鐢熸垚锛宮onth:姣忔湀鐢熸垚
         deliveryDate:7,//璁㈠崟鍒涘缓閫佽揣鏃ユ湡 澶╂触7澶╋紝甯稿窞7澶╋紝涔変箤15澶╋紝鏂扮枂15澶�
-        columnName:'鍥惧彿',
+        columnName:'鍥惧彿',//鎵撳嵃鐢熶骇鍗曟椂闇�瑕佹樉绀虹殑鍒楀悕锛屾病鏈変负绌�
         selectOrderReviewShow:true, //璁㈠崟棣栭〉鍔犲伐鍗曞鏍告寜閽槸鍚︽樉绀�
         productName:"product_name",//浜у搧鍒涘缓鏌ラ噸瀛楁
         decValue:3,//璁㈠崟淇濈暀浣嶆暟锛屽ぉ娲�3浣�,甯稿窞2浣�
-        label:1,//鏍囩绫诲瀷
+        label:1,//鏍囩绫诲瀷,甯稿窞涓�2锛屽叾浠栦负1
         calculateType:1,//璁㈠崟璁$畻鏂瑰紡
         reportType:1,//鎶ュ伐鏄惁鏌ヨ鏍峰搧璁㈠崟2鏌ヨ锛�1涓嶆煡璇�
         qualityInsStatus:1,//璺ㄥ伐搴忚川妫�瀹℃牳锛�1涓嶉渶瑕侊紝2闇�瑕�
         remarkSwitch:1,//娴佺▼鍗′笂鏄惁鏄剧ず鍏跺畠澶囨敞锛�1鏄剧ず锛�2涓嶆樉绀�
-        icon:"",//鍟嗘爣鍙傛暟
+        icon:"",//鍟嗘爣鍙傛暟锛屾病鏈変负绌�
         printShowTitle:true,//娴佺▼鍗¤嚜瀹氫箟鎵撳嵃鏄惁鏄剧ず鏍囩
         longSide:null,//璁㈠崟鍒涘缓鏈�闀胯竟鎻愮ず棰滆壊 null涓嶆彁绀洪鑹�
         showDeliveryCreator:true,//鍙戣揣鍗曞垱寤轰汉鍏堟樉绀烘垨鑰呭悗鏄剧ず false鍚庢樉绀�
-        deliveryRemark: ['澶囨敞:鏈壒鐜荤拑涓轰紭绛夊悎鏍煎搧锛岃鍦ㄥ嵏璐ф椂,褰撻潰娑堢偣楠屾敹銆佸鏈夎川閲忛棶棰樺湪涓�鍛ㄥ唴涓庢湰鍏徃鑱旂郴,鍚﹀垯姒備笉璐熻矗锛�'],
-        deliveryOutbound: false,//鍙戣揣榛樿鍑哄簱
-        flowCardMerge: 0,//娴佺▼鍗″悎鐗囨墦鍗�
-        printBtn:1,//鎵撳嵃鐣岄潰涓変釜鎸夐挳涓槸鍚︽樉绀烘爣绛炬墦鍗扮浉鍏虫寜閽紝0鏄剧ず甯稿窞锛�1鍏跺畠涓嶆樉绀�
+        deliveryRemark: ['澶囨敞:鏈壒鐜荤拑涓轰紭绛夊悎鏍煎搧锛岃鍦ㄥ嵏璐ф椂,褰撻潰娑堢偣楠屾敹銆佸鏈夎川閲忛棶棰樺湪涓�鍛ㄥ唴涓庢湰鍏徃鑱旂郴,鍚﹀垯姒備笉璐熻矗锛�'],//鎵撳嵃鍙戣揣鍗曠殑澶囨敞
+        deliveryOutbound: false,//鍙戣揣榛樿鍑哄簱,榛樿鍑哄簱涓簍rue
+        flowCardMerge: 0,//娴佺▼鍗″悎鐗囨墦鍗帮紝1鍚堝苟锛屽叾浠栦笉鍚堝苟
+        printBtn:0,//鎵撳嵃鐣岄潰涓変釜鎸夐挳涓槸鍚︽樉绀烘爣绛炬墦鍗扮浉鍏虫寜閽紝0鏄剧ず锛�1鍏跺畠涓嶆樉绀�
+        printNumber:true,//澶氶�夎鍗曟墦鍗版祦绋嬪崱鏄惁鏄剧ず鍙充笂瑙掑簭鍙蜂箟涔宖alse,鍏跺畠true
+        materialOutboundColor:false,//搴撳瓨鏌ヨ鍏ュ簱瓒呰繃涓�瀹氭椂闂存敼鍙橀鑹诧紝娲涢槼true锛屽叾浠杅alse
+        storageBtn:false,//鏄惁鏄剧ず鎶ュ伐鍏ュ簱鐩稿叧鍐呭锛屾礇闃硉rue锛屽叾浠杅alse
+        teamsType:false,//鏄惁寮�鍚彮缁勪笅鎷夋锛屾礇闃硉rue锛屽叾浠杅alse
+        alienFunction:false,//鏄惁寮�鍚紓褰㈠姛鑳斤紝鏆傛椂閮芥槸false
         //澶╂触
         printLabel: {
             custom: (item1) => {
diff --git "a/north-glass-erp/northglass-erp/src/stores/sd/companySet/\345\270\270\345\267\236\345\220\211\345\210\251.js" "b/north-glass-erp/northglass-erp/src/stores/sd/companySet/\345\270\270\345\267\236\345\220\211\345\210\251.js"
index d7c7c02..0a0e30e 100644
--- "a/north-glass-erp/northglass-erp/src/stores/sd/companySet/\345\270\270\345\267\236\345\220\211\345\210\251.js"
+++ "b/north-glass-erp/northglass-erp/src/stores/sd/companySet/\345\270\270\345\267\236\345\220\211\345\210\251.js"
@@ -3,6 +3,7 @@
 export default defineStore('companyInfo', {
 
     state: () => ({
+        hollow:'*',
         notChangeProduct:false,//澶╂触true锛屽叾浠杅alse锛屾槸鍚﹀紑鍚潪鏈汉鍒涘缓鐨勪骇鍝佷笉鑳戒慨鏀�
         timeOut:false,//閲戝崕true锛屽叾浠杅alse锛屾槸鍚﹀紑鍚秴鏃舵敼鍙樺閫夋鐘舵��
         connectMes:true,//甯稿窞,涔変箤true锛屽叾浠杅alse锛屾樉绀鸿鍗曟姤宸ヨ浆绉绘槸鍚﹀惎鐢�
@@ -10,7 +11,7 @@
         address:'甯稿窞甯傚ぉ瀹佸尯閮戦檰闀囧ぇ鏄庡崡璺�8鍙�',
         telephone:'022-59280088',
         fax:'022-59280066',
-        errorArea:0.4,
+        errorArea:0.4,//缁撶畻闈㈢Н璇樊
         widHeiLength:{//璁㈠崟瀹介珮闀垮害
             regexp:/^(\d{1,4})$/,//姝e垯鍥涗綅鏁存暟
             //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//姝e垯0.00-9999.99
@@ -19,23 +20,28 @@
         orderIdType:'month',//鍚庣鐢熸垚璁㈠崟鍙风被鍨嬶紝day:姣忓ぉ鐢熸垚锛宮onth:姣忔湀鐢熸垚
         deliveryIdType:'month',//鍚庣鐢熸垚鍙戣揣鍗曞彿绫诲瀷锛宒ay:姣忓ぉ鐢熸垚锛宮onth:姣忔湀鐢熸垚
         deliveryDate:7,//璁㈠崟鍒涘缓閫佽揣鏃ユ湡 澶╂触7澶╋紝甯稿窞7澶╋紝涔変箤15澶╋紝鏂扮枂15澶�
-        columnName:'寮傚舰鍙傛暟',
+        columnName:'寮傚舰鍙傛暟',//鎵撳嵃鐢熶骇鍗曟椂闇�瑕佹樉绀虹殑鍒楀悕锛屾病鏈変负绌�
         selectOrderReviewShow:false, //璁㈠崟棣栭〉鍔犲伐鍗曞鏍告寜閽槸鍚︽樉绀�
         productName:"product_abbreviation", //浜у搧鍒涘缓鏌ラ噸瀛楁
         decValue:2,//璁㈠崟淇濆瓨闈㈢Н浣嶆暟
-        label:2,//鏍囩绫诲瀷
+        label:2,//鏍囩绫诲瀷,甯稿窞涓�2锛屽叾浠栦负1
         calculateType:2,//璁㈠崟璁$畻鏂瑰紡
         reportType:2,//鎶ュ伐鏄惁鏌ヨ鏍峰搧璁㈠崟2鏌ヨ锛�1涓嶆煡璇�
         qualityInsStatus:2,//璺ㄥ伐搴忚川妫�瀹℃牳锛�1涓嶉渶瑕侊紝2闇�瑕�
         remarkSwitch:2,//娴佺▼鍗′笂鏄惁鏄剧ず鍏跺畠澶囨敞锛�1鏄剧ず锛�2涓嶆樉绀�
-        icon:"濂ラ涔呴��",//鍟嗘爣鍙傛暟
+        icon:"濂ラ涔呴��",//鍟嗘爣鍙傛暟锛屾病鏈変负绌�
         printShowTitle:true,//娴佺▼鍗¤嚜瀹氫箟鎵撳嵃鏄惁鏄剧ず鏍囩
         longSide:6500,//璁㈠崟鍒涘缓鏈�闀胯竟鎻愮ず棰滆壊
         showDeliveryCreator:true,//鍙戣揣鍗曞垱寤轰汉鍏堟樉绀烘垨鑰呭悗鏄剧ず false鍚庢樉绀�
-        deliveryRemark: ['澶囨敞:鏈壒鐜荤拑涓轰紭绛夊悎鏍煎搧锛岃鍦ㄥ嵏璐ф椂,褰撻潰娑堢偣楠屾敹銆佸鏈夎川閲忛棶棰樺湪涓�鍛ㄥ唴涓庢湰鍏徃鑱旂郴,鍚﹀垯姒備笉璐熻矗锛�'],
-        deliveryOutbound: true,//鍙戣揣榛樿鍑哄簱
-        flowCardMerge: 1,//娴佺▼鍗″悎鐗囨墦鍗�
+        deliveryRemark: ['澶囨敞:鏈壒鐜荤拑涓轰紭绛夊悎鏍煎搧锛岃鍦ㄥ嵏璐ф椂,褰撻潰娑堢偣楠屾敹銆佸鏈夎川閲忛棶棰樺湪涓�鍛ㄥ唴涓庢湰鍏徃鑱旂郴,鍚﹀垯姒備笉璐熻矗锛�'],//鎵撳嵃鍙戣揣鍗曠殑澶囨敞
+        deliveryOutbound: true,//鍙戣揣榛樿鍑哄簱,榛樿鍑哄簱涓簍rue
+        flowCardMerge: 1,//娴佺▼鍗″悎鐗囨墦鍗帮紝1鍚堝苟锛屽叾浠栦笉鍚堝苟
         printBtn:0,//鎵撳嵃鐣岄潰涓変釜鎸夐挳涓槸鍚︽樉绀烘爣绛炬墦鍗扮浉鍏虫寜閽紝0鏄剧ず甯稿窞锛�1澶╂触鍏跺畠涓嶆樉绀�
+        printNumber:true,//澶氶�夎鍗曟墦鍗版祦绋嬪崱鏄惁鏄剧ず鍙充笂瑙掑簭鍙蜂箟涔宖alse,鍏跺畠true
+        materialOutboundColor:false,//搴撳瓨鏌ヨ鍏ュ簱瓒呰繃涓�瀹氭椂闂存敼鍙橀鑹诧紝娲涢槼true锛屽叾浠杅alse
+        storageBtn:false,//鏄惁鏄剧ず鎶ュ伐鍏ュ簱鐩稿叧鍐呭锛屾礇闃硉rue锛屽叾浠杅alse
+        teamsType:false,//鏄惁寮�鍚彮缁勪笅鎷夋锛屾礇闃硉rue锛屽叾浠杅alse
+        alienFunction:false,//鏄惁寮�鍚紓褰㈠姛鑳斤紝鏆傛椂閮芥槸false
         //澶╂触
         printLabel: {
             custom: (item1) => {
diff --git "a/north-glass-erp/northglass-erp/src/stores/sd/companySet/\346\226\260\347\226\206\346\201\222\351\221\253.js" "b/north-glass-erp/northglass-erp/src/stores/sd/companySet/\346\226\260\347\226\206\346\201\222\351\221\253.js"
index 4e8d0a6..489ca73 100644
--- "a/north-glass-erp/northglass-erp/src/stores/sd/companySet/\346\226\260\347\226\206\346\201\222\351\221\253.js"
+++ "b/north-glass-erp/northglass-erp/src/stores/sd/companySet/\346\226\260\347\226\206\346\201\222\351\221\253.js"
@@ -3,6 +3,7 @@
 export default defineStore('companyInfo', {
 
     state: () => ({
+        hollow:'*',
         notChangeProduct:false,//澶╂触true锛屽叾浠杅alse锛屾槸鍚﹀紑鍚潪鏈汉鍒涘缓鐨勪骇鍝佷笉鑳戒慨鏀�
         timeOut:false,//閲戝崕true锛屽叾浠杅alse锛屾槸鍚﹀紑鍚秴鏃舵敼鍙樺閫夋鐘舵��
         connectMes:false,//甯稿窞,涔変箤true锛屽叾浠杅alse锛屾樉绀鸿鍗曟姤宸ヨ浆绉绘槸鍚﹀惎鐢�
@@ -10,7 +11,7 @@
         address:'鏂扮枂浜斿娓犲伐涓氬洯鍏靛洟鏂板瀷寤烘潗宸ヤ笟鍥尯宸ヤ竴璺�11鍙烽檮1鍙�',
         telephone:'13419168999',
         fax:'',
-        errorArea:0.4,
+        errorArea:0.4,//缁撶畻闈㈢Н璇樊
         widHeiLength:{//璁㈠崟瀹介珮闀垮害
             regexp:/^(0|[1-9][0-9]{0,4}([.][0-9]{1,2})?)$/,//姝e垯0.00-99999.99
             //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//姝e垯0.00-9999.99
@@ -19,24 +20,28 @@
         orderIdType:'year',//鍚庣鐢熸垚璁㈠崟鍙风被鍨嬶紝day:姣忓ぉ鐢熸垚锛宮onth:姣忔湀鐢熸垚,year:鎸夊勾鐢熸垚
         deliveryIdType:'day',//鍚庣鐢熸垚鍙戣揣鍗曞彿绫诲瀷锛宒ay:姣忓ぉ鐢熸垚锛宮onth:姣忔湀鐢熸垚
         deliveryDate:15,//璁㈠崟鍒涘缓閫佽揣鏃ユ湡 澶╂触7澶╋紝甯稿窞7澶╋紝涔変箤15澶╋紝鏂扮枂15澶�
-        columnName:'鍥惧彿',
+        columnName:'鍥惧彿',//鎵撳嵃鐢熶骇鍗曟椂闇�瑕佹樉绀虹殑鍒楀悕锛屾病鏈変负绌�
         selectOrderReviewShow:true, //璁㈠崟棣栭〉鍔犲伐鍗曞鏍告寜閽槸鍚︽樉绀�
         productName:"product_name",//浜у搧鍒涘缓鏃堕噸澶嶉獙璇侊紝鈥榩roduct_abbreviation鈥�
         decValue:2,//璁㈠崟淇濈暀浣嶆暟锛屽ぉ娲�3浣�,甯稿窞2浣�
-        label:1,//鏍囩绫诲瀷 1鏄ぉ娲� 2鏄父宸�
+        label:1,//鏍囩绫诲瀷,甯稿窞涓�2锛屽叾浠栦负1
         calculateType:2,//璁㈠崟璁$畻鏂瑰紡
         reportType:1,//鎶ュ伐鏄惁鏌ヨ鏍峰搧璁㈠崟2鏌ヨ锛�1涓嶆煡璇�
         qualityInsStatus:1,//璺ㄥ伐搴忚川妫�瀹℃牳锛�1.涓嶉渶瑕侊紝2.闇�瑕�
         remarkSwitch:2,//娴佺▼鍗′笂鏄惁鏄剧ず鍏跺畠澶囨敞锛�1鏄剧ず锛�2涓嶆樉绀�
-        icon:"濂ラ涔呴��",//鍟嗘爣鍙傛暟
+        icon:"濂ラ涔呴��",//鍟嗘爣鍙傛暟锛屾病鏈変负绌�
         printShowTitle:true,//娴佺▼鍗¤嚜瀹氫箟鎵撳嵃鏄惁鏄剧ず鏍囩
         longSide:null,//璁㈠崟鍒涘缓鏈�闀胯竟鎻愮ず棰滆壊
         showDeliveryCreator:true,//鍙戣揣鍗曞垱寤轰汉鍏堟樉绀烘垨鑰呭悗鏄剧ず false鍚庢樉绀�
-        deliveryRemark: ['澶囨敞:鏈壒鐜荤拑涓轰紭绛夊悎鏍煎搧锛岃鍦ㄥ嵏璐ф椂,褰撻潰娑堢偣楠屾敹銆佸鏈夎川閲忛棶棰樺湪涓�鍛ㄥ唴涓庢湰鍏徃鑱旂郴,鍚﹀垯姒備笉璐熻矗锛�'],
-        deliveryOutbound: false,//鍙戣揣榛樿鍑哄簱
-        flowCardMerge: 0,//娴佺▼鍗″悎鐗囨墦鍗�
+        deliveryRemark: ['澶囨敞:鏈壒鐜荤拑涓轰紭绛夊悎鏍煎搧锛岃鍦ㄥ嵏璐ф椂,褰撻潰娑堢偣楠屾敹銆佸鏈夎川閲忛棶棰樺湪涓�鍛ㄥ唴涓庢湰鍏徃鑱旂郴,鍚﹀垯姒備笉璐熻矗锛�'],//鎵撳嵃鍙戣揣鍗曠殑澶囨敞
+        deliveryOutbound: false,//鍙戣揣榛樿鍑哄簱,榛樿鍑哄簱涓簍rue
+        flowCardMerge: 0,//娴佺▼鍗″悎鐗囨墦鍗帮紝1鍚堝苟锛屽叾浠栦笉鍚堝苟
         printBtn:1,//鎵撳嵃鐣岄潰涓変釜鎸夐挳涓槸鍚︽樉绀烘爣绛炬墦鍗扮浉鍏虫寜閽紝0鏄剧ず甯稿窞锛�1澶╂触鍏跺畠涓嶆樉绀�
-
+        printNumber:true,//澶氶�夎鍗曟墦鍗版祦绋嬪崱鏄惁鏄剧ず鍙充笂瑙掑簭鍙蜂箟涔宖alse,鍏跺畠true
+        materialOutboundColor:false,//搴撳瓨鏌ヨ鍏ュ簱瓒呰繃涓�瀹氭椂闂存敼鍙橀鑹诧紝娲涢槼true锛屽叾浠杅alse
+        storageBtn:false,//鏄惁鏄剧ず鎶ュ伐鍏ュ簱鐩稿叧鍐呭锛屾礇闃硉rue锛屽叾浠杅alse
+        teamsType:false,//鏄惁寮�鍚彮缁勪笅鎷夋锛屾礇闃硉rue锛屽叾浠杅alse
+        alienFunction:false,//鏄惁寮�鍚紓褰㈠姛鑳斤紝鏆傛椂閮芥槸false
         //澶╂触
         printLabel: {
             custom: (item1) => {
diff --git "a/north-glass-erp/northglass-erp/src/stores/sd/companySet/\346\264\233\351\230\263\345\214\227\347\216\273.js" "b/north-glass-erp/northglass-erp/src/stores/sd/companySet/\346\264\233\351\230\263\345\214\227\347\216\273.js"
new file mode 100644
index 0000000..b15f6db
--- /dev/null
+++ "b/north-glass-erp/northglass-erp/src/stores/sd/companySet/\346\264\233\351\230\263\345\214\227\347\216\273.js"
@@ -0,0 +1,138 @@
+import {defineStore} from "pinia";
+
+export default defineStore('companyInfo', {
+
+    state: () => ({
+        hollow:'+',
+        notChangeProduct:false,//澶╂触true锛屽叾浠杅alse锛屾槸鍚﹀紑鍚潪鏈汉鍒涘缓鐨勪骇鍝佷笉鑳戒慨鏀�
+        timeOut:false,//閲戝崕true锛屽叾浠杅alse锛屾槸鍚﹀紑鍚彂璐ц秴鏃舵敼鍙樺閫夋鐘舵�侀鑹�
+        connectMes:false,//甯稿窞,涔変箤true锛屽叾浠杅alse锛屾樉绀鸿鍗曟姤宸ヨ浆绉绘槸鍚﹀惎鐢�
+        companyName: '娲涢槼鍖楁柟鐜荤拑鎶�鏈偂浠芥湁闄愬叕鍙�',
+        address:'娲涢槼鍥藉楂樻柊鎶�鏈紑鍙戝尯',
+        telephone:'0379-64312861',
+        fax:'0379-64332066',
+        errorArea:0.5,
+        widHeiLength:{//璁㈠崟瀹介珮闀垮害
+            regexp:/^(0|[1-9][0-9]{0,4}([.][0-9]{1,2})?)$/,//姝e垯0.00-99999.99
+            //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//姝e垯0.00-9999.99
+            msg:'basicData.msg.range99999Dec2'
+        },
+        orderIdType:'day',//鍚庣鐢熸垚璁㈠崟鍙风被鍨嬶紝day:姣忓ぉ鐢熸垚锛宮onth:姣忔湀鐢熸垚,year:姣忓勾鐢熸垚
+        deliveryIdType:'day',
+        deliveryDate:15,//璁㈠崟鍒涘缓閫佽揣鏃ユ湡 澶╂触7澶╋紝甯稿窞7澶╋紝涔変箤15澶╋紝鏂扮枂15澶�
+        columnName:'鍥惧彿',
+        selectOrderReviewShow:true, //璁㈠崟棣栭〉鍔犲伐鍗曞鏍告寜閽槸鍚︽樉绀�
+        productName:"product_name",
+        decValue:3,//璁㈠崟淇濈暀浣嶆暟锛屽ぉ娲�3浣�,甯稿窞2浣�
+        label:1,//鏍囩绫诲瀷锛堣嚜瀹氫箟鎵撳嵃鏍囩甯稿窞2锛屽叾浠�1锛�
+        calculateType:1,//璁㈠崟璁$畻鏂瑰紡
+        reportType:2,//鎶ュ伐鏄惁鏌ヨ鏍峰搧璁㈠崟2鏌ヨ锛�1涓嶆煡璇�
+        qualityInsStatus:2,//璺ㄥ伐搴忚川妫�瀹℃牳锛�1涓嶉渶瑕侊紝2闇�瑕�
+        remarkSwitch:2,//娴佺▼鍗′笂鏄惁鏄剧ず鍏跺畠澶囨敞锛�1鏄剧ず锛�2涓嶆樉绀�
+        icon:"",//鍟嗘爣鍙傛暟
+        printShowTitle:false,//娴佺▼鍗¤嚜瀹氫箟鎵撳嵃鏄惁鏄剧ず鏍囩
+        longSide:null,//璁㈠崟鍒涘缓鏈�闀胯竟鎻愮ず棰滆壊 null涓嶆彁绀洪鑹�
+        showDeliveryCreator:true,//鍙戣揣鍗曞垱寤轰汉鍏堟樉绀烘垨鑰呭悗鏄剧ず false鍚庢樉绀�
+        deliveryRemark: ['娓╅Θ鎻愮ず锛氭垜鍙歌礋璐e彧閫佷笉鍗搞�傝揣鍒板伐鍦版垨宸ュ巶鍚庯紝璇蜂簬浜斿ぉ鍐呭畨瑁呭畬姣曪紝濡傛湭鑳藉強鏃跺畨瑁呭畬姣曪紝璇锋斁缃簬闃村噳骞茬嚗澶勶紝骞跺仛濂介槻鏅掗槻娣嬬殑鎺柦锛岄槻姝㈢幓鐠冨彂闇夛紱鎵�鏈夊崟鐗囬晙鑶滅幓鐠冭鍕跨敤甯﹂吀鎬ф垨纰辨�х殑娑蹭綋娓呮礂鑶滈潰銆�',
+            '澹版槑锛氳揣鍒板伐鍦版垨宸ュ巶鍚庯紝濡傝嫢璐靛徃涓嶅強鏃剁殑瀹夎鎴栨湭鍋氶槻鏅掗槻娣嬫帾鏂藉鑷寸殑鐜荤拑鍙戦湁锛屾垜鍙告涓嶈礋璐c��',
+            '鏀惰揣鏃堕渶楠屾敹浜у搧鏁伴噺銆佽鏍煎強鏈夋棤鐮存崯锛屽鍙戠幇闂闇�浜庢敹璐т笁鏃ュ唴锛屼互涔﹂潰閫氱煡骞堕檮涓婄幇鍦鸿瘉鏄庢潗鏂欙紙濡傜牬鎹熺収鐗囩瓑锛夛紝鐩稿叧璇佹槑璧勬枡涓嶈冻锛屾垨鍦ㄤ笂杩版棩鏈熷唴鏈彁鍑鸿川閲忓紓璁殑锛岄�炬湡瑙嗕负浜у搧鍚堟牸锛屾垜鍙稿皢涓嶄簣鎵挎媴浠讳綍璐d换銆傛暚璇风暀鎰忥紒'],
+        deliveryOutbound: false,//鍙戣揣榛樿鍑哄簱
+        flowCardMerge: 0,//娴佺▼鍗″悎鐗囨墦鍗�
+        printBtn:1,//鎵撳嵃鐣岄潰涓変釜鎸夐挳涓槸鍚︽樉绀烘爣绛炬墦鍗扮浉鍏虫寜閽紝0鏄剧ず甯稿窞锛�1澶╂触鍏跺畠涓嶆樉绀�
+        materialOutboundColor:true,//搴撳瓨鏌ヨ鍏ュ簱瓒呰繃涓�瀹氭椂闂存敼鍙橀鑹诧紝娲涢槼true锛屽叾浠杅alse
+        storageBtn:true,//鏄惁鏄剧ず鎶ュ伐鍏ュ簱鐩稿叧鍐呭锛屾礇闃硉rue锛屽叾浠杅alse
+        teamsType:true,//鏄惁寮�鍚彮缁勪笅鎷夋锛屾礇闃硉rue锛屽叾浠杅alse
+        alienFunction:false,//鏄惁寮�鍚紓褰㈠姛鑳斤紝鏆傛椂閮芥槸false
+        //澶╂触
+        printLabel: {
+            custom: (item1) => {
+                return `<div class="row3" style="text-align: center;font-weight: bolder;">
+                  <label style="font-size: 22px;margin-top: 28px;">W:${item1.width}</label>
+                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                  <label style="font-size: 22px;margin-top: 28px;">H:${item1.height}</label>
+                </div>`
+            },
+            customSemi: (item1) => {
+                return `<div class="row3" style="text-align: center;font-weight: bolder;">
+                  <label style="font-weight: bolder;font-size: 10px;margin-top: 8px;">W:${item1.width}</label>
+                  &nbsp;&nbsp;&nbsp;
+                  <label style="font-weight: bolder;font-size: 10px;margin-top: 8px;">H:${item1.height}</label>
+                </div>`
+            },
+            labelType: '鍗婂搧鏍囩',
+            labelValue:2,
+            labelType3: '鎴愬搧鏍囩3',
+            labelValue3:3,
+            className:{
+                custom:{
+                    printFlowCardName: () => {
+                        return `printFlowCard_finished`
+                    },
+                    entiretyName: () => {
+                        return `entirety_finished`
+                    },
+                    contentRowName: () => {
+                        return `contentRow`
+                    }
+                },
+                semi:{
+                    printFlowCardName: () => {
+                        return `printFlowCard_semi`
+                    },
+                    entiretyName: () => {
+                        return `entirety_semi`
+                    },
+                    contentRowName: () => {
+                        return `contentRow`
+                    }
+                },
+
+
+            },
+            printFlowCard: {//娴佺▼鍗℃墦鍗版牱寮�
+                patch:'姝e搧',
+                lackOf:'娆″搧',
+                processingNote: (itemtextarea) => {
+                    return  ``
+                },
+            },
+            hideButton:'true',//娴佺▼鍗℃墦鍗扮晫闈㈡寜閽槸鍚︽樉绀�
+            getSelectFlowCard:2,//娴佺▼鍗℃墦鍗版煡璇㈡槸鍚﹀悎骞�  1鍚堝苟2涓嶅悎骞�
+            columnsLabel:2,//涓�琛屼袱鍒楁垚鍝佹爣绛� 1鏂扮枂涓�琛屼袱鍒楁垚鍝佹爣绛撅紝2鍏跺畠
+        },
+
+        //甯稿窞
+        printLabel1: {
+            custom: (item1) => {
+                return `<div class="row3" style="text-align: center;font-weight: bolder;">
+                      <label style="font-weight: bolder;font-size:12px;">${item1.width}*${item1.height}=${item1.quantity}</label>
+                </div>`
+
+            },
+            customSemi: (item1) => {
+                return `<div class="row3" style="text-align: center;font-weight: bolder;">
+                      <label style="font-weight: bolder;font-size:10px;">${item1.width}*${item1.height}=${item1.quantity}</label>
+                </div>`
+            },
+            labelType: '鎴愬搧鏍囩2',
+            labelValue:3,
+
+            printFlowCard: {
+                patch:'姝e搧',
+                lackOf:'娆″搧',
+                processingNote: (itemtextarea) => {
+                    return  `${itemtextarea.processing_note}`
+                },
+            },
+            hideButton:'false',
+        },
+
+
+    }),
+    actions: {
+        //
+    }
+})
\ No newline at end of file
diff --git "a/north-glass-erp/northglass-erp/src/stores/sd/companySet/\351\207\221\345\215\216\345\244\251\346\210\220.js" "b/north-glass-erp/northglass-erp/src/stores/sd/companySet/\351\207\221\345\215\216\345\244\251\346\210\220.js"
index 753c5d9..a499ba6 100644
--- "a/north-glass-erp/northglass-erp/src/stores/sd/companySet/\351\207\221\345\215\216\345\244\251\346\210\220.js"
+++ "b/north-glass-erp/northglass-erp/src/stores/sd/companySet/\351\207\221\345\215\216\345\244\251\346\210\220.js"
@@ -3,6 +3,7 @@
 export default defineStore('companyInfo', {
 
     state: () => ({
+        hollow:'*',
         notChangeProduct:false,//澶╂触true锛屽叾浠杅alse锛屾槸鍚﹀紑鍚潪鏈汉鍒涘缓鐨勪骇鍝佷笉鑳戒慨鏀�
         timeOut:true,//閲戝崕true锛屽叾浠杅alse锛屾槸鍚﹀紑鍚彂璐ц秴鏃舵敼鍙樺閫夋鐘舵�侀鑹�
         connectMes:true,//甯稿窞,涔変箤true锛屽叾浠杅alse锛屾樉绀鸿鍗曟姤宸ヨ浆绉绘槸鍚﹀惎鐢�
@@ -10,34 +11,39 @@
         address:'娴欐睙鐪侀噾鍗庡競閲戜笢鍖烘浌瀹呴晣宸ヤ笟鍔熻兘鍖洪工宀╄28鍙�2鍙�',
         telephone:'153 8178 1915 绂忓枩澶╂垚',
         fax:'',
-        errorArea:0.3,
+        errorArea:0.3,//缁撶畻闈㈢Н璇樊
         widHeiLength:{//璁㈠崟瀹介珮闀垮害
             regexp:/^(0|[1-9][0-9]{0,4}([.][0-9]{1,2})?)$/,//姝e垯0.00-99999.99
             //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//姝e垯0.00-9999.99
             msg:'basicData.msg.range99999Dec2'
         },
         orderIdType:'year',//鍚庣鐢熸垚璁㈠崟鍙风被鍨嬶紝day:姣忓ぉ鐢熸垚锛宮onth:姣忔湀鐢熸垚,year:姣忓勾鐢熸垚
-        deliveryIdType:'day',
+        deliveryIdType:'day',//鍚庣鐢熸垚鍙戣揣鍗曞彿绫诲瀷锛宒ay:姣忓ぉ鐢熸垚锛宮onth:姣忔湀鐢熸垚
         deliveryDate:15,//璁㈠崟鍒涘缓閫佽揣鏃ユ湡 澶╂触7澶╋紝甯稿窞7澶╋紝涔変箤15澶╋紝鏂扮枂15澶�
-        columnName:'鍥惧彿',
+        columnName:'鍥惧彿',//鎵撳嵃鐢熶骇鍗曟椂闇�瑕佹樉绀虹殑鍒楀悕锛屾病鏈変负绌�
         selectOrderReviewShow:true, //璁㈠崟棣栭〉鍔犲伐鍗曞鏍告寜閽槸鍚︽樉绀�
         productName:"product_name",
         decValue:2,//璁㈠崟淇濈暀浣嶆暟锛屽ぉ娲�3浣�,甯稿窞2浣�
-        label:1,//鏍囩绫诲瀷锛堣嚜瀹氫箟鎵撳嵃鏍囩甯稿窞2锛屽叾浠�1锛�
+        label:1,//鏍囩绫诲瀷,甯稿窞涓�2锛屽叾浠栦负1
         calculateType:1,//璁㈠崟璁$畻鏂瑰紡
         reportType:2,//鎶ュ伐鏄惁鏌ヨ鏍峰搧璁㈠崟2鏌ヨ锛�1涓嶆煡璇�
         qualityInsStatus:2,//璺ㄥ伐搴忚川妫�瀹℃牳锛�1涓嶉渶瑕侊紝2闇�瑕�
         remarkSwitch:2,//娴佺▼鍗′笂鏄惁鏄剧ず鍏跺畠澶囨敞锛�1鏄剧ず锛�2涓嶆樉绀�
-        icon:"",//鍟嗘爣鍙傛暟
+        icon:"",//鍟嗘爣鍙傛暟锛屾病鏈変负绌�
         printShowTitle:false,//娴佺▼鍗¤嚜瀹氫箟鎵撳嵃鏄惁鏄剧ず鏍囩
         longSide:null,//璁㈠崟鍒涘缓鏈�闀胯竟鎻愮ず棰滆壊 null涓嶆彁绀洪鑹�
         showDeliveryCreator:false,//鍙戣揣鍗曞垱寤轰汉鍏堟樉绀烘垨鑰呭悗鏄剧ず false鍚庢樉绀�
         deliveryRemark: ['娓╅Θ鎻愮ず锛氭垜鍙歌礋璐e彧閫佷笉鍗搞�傝揣鍒板伐鍦版垨宸ュ巶鍚庯紝璇蜂簬浜斿ぉ鍐呭畨瑁呭畬姣曪紝濡傛湭鑳藉強鏃跺畨瑁呭畬姣曪紝璇锋斁缃簬闃村噳骞茬嚗澶勶紝骞跺仛濂介槻鏅掗槻娣嬬殑鎺柦锛岄槻姝㈢幓鐠冨彂闇夛紱鎵�鏈夊崟鐗囬晙鑶滅幓鐠冭鍕跨敤甯﹂吀鎬ф垨纰辨�х殑娑蹭綋娓呮礂鑶滈潰銆�',
             '澹版槑锛氳揣鍒板伐鍦版垨宸ュ巶鍚庯紝濡傝嫢璐靛徃涓嶅強鏃剁殑瀹夎鎴栨湭鍋氶槻鏅掗槻娣嬫帾鏂藉鑷寸殑鐜荤拑鍙戦湁锛屾垜鍙告涓嶈礋璐c��',
-            '鏀惰揣鏃堕渶楠屾敹浜у搧鏁伴噺銆佽鏍煎強鏈夋棤鐮存崯锛屽鍙戠幇闂闇�浜庢敹璐т笁鏃ュ唴锛屼互涔﹂潰閫氱煡骞堕檮涓婄幇鍦鸿瘉鏄庢潗鏂欙紙濡傜牬鎹熺収鐗囩瓑锛夛紝鐩稿叧璇佹槑璧勬枡涓嶈冻锛屾垨鍦ㄤ笂杩版棩鏈熷唴鏈彁鍑鸿川閲忓紓璁殑锛岄�炬湡瑙嗕负浜у搧鍚堟牸锛屾垜鍙稿皢涓嶄簣鎵挎媴浠讳綍璐d换銆傛暚璇风暀鎰忥紒'],
-        deliveryOutbound: false,//鍙戣揣榛樿鍑哄簱
-        flowCardMerge: 0,//娴佺▼鍗″悎鐗囨墦鍗�
+            '鏀惰揣鏃堕渶楠屾敹浜у搧鏁伴噺銆佽鏍煎強鏈夋棤鐮存崯锛屽鍙戠幇闂闇�浜庢敹璐т笁鏃ュ唴锛屼互涔﹂潰閫氱煡骞堕檮涓婄幇鍦鸿瘉鏄庢潗鏂欙紙濡傜牬鎹熺収鐗囩瓑锛夛紝鐩稿叧璇佹槑璧勬枡涓嶈冻锛屾垨鍦ㄤ笂杩版棩鏈熷唴鏈彁鍑鸿川閲忓紓璁殑锛岄�炬湡瑙嗕负浜у搧鍚堟牸锛屾垜鍙稿皢涓嶄簣鎵挎媴浠讳綍璐d换銆傛暚璇风暀鎰忥紒'],//鎵撳嵃鍙戣揣鍗曠殑澶囨敞
+        deliveryOutbound: false,//鍙戣揣榛樿鍑哄簱,榛樿鍑哄簱涓簍rue
+        flowCardMerge: 0,//娴佺▼鍗″悎鐗囨墦鍗帮紝1鍚堝苟锛屽叾浠栦笉鍚堝苟
         printBtn:1,//鎵撳嵃鐣岄潰涓変釜鎸夐挳涓槸鍚︽樉绀烘爣绛炬墦鍗扮浉鍏虫寜閽紝0鏄剧ず甯稿窞锛�1澶╂触鍏跺畠涓嶆樉绀�
+        printNumber:true,//澶氶�夎鍗曟墦鍗版祦绋嬪崱鏄惁鏄剧ず鍙充笂瑙掑簭鍙蜂箟涔宖alse,鍏跺畠true
+        materialOutboundColor:false,//搴撳瓨鏌ヨ鍏ュ簱瓒呰繃涓�瀹氭椂闂存敼鍙橀鑹诧紝娲涢槼true锛屽叾浠杅alse
+        storageBtn:false,//鏄惁鏄剧ず鎶ュ伐鍏ュ簱鐩稿叧鍐呭锛屾礇闃硉rue锛屽叾浠杅alse
+        teamsType:false,//鏄惁寮�鍚彮缁勪笅鎷夋锛屾礇闃硉rue锛屽叾浠杅alse
+        alienFunction:false,//鏄惁寮�鍚紓褰㈠姛鑳斤紝鏆傛椂閮芥槸false
         //澶╂触
         printLabel: {
             custom: (item1) => {
diff --git a/north-glass-erp/northglass-erp/src/utils/decimal.js b/north-glass-erp/northglass-erp/src/utils/decimal.js
index f340131..cbc7dce 100644
--- a/north-glass-erp/northglass-erp/src/utils/decimal.js
+++ b/north-glass-erp/northglass-erp/src/utils/decimal.js
@@ -7,6 +7,11 @@
     const decimal2 = new Decimal(num2===null?0:num2);
     return decimal1.plus(decimal2).toString();
 }
+function addAuto(num1, num2,scale) {
+    const decimal1 = new Decimal(num1===null?0:num1);
+    const decimal2 = new Decimal(num2===null?0:num2);
+    return decimal1.plus(decimal2).toFixed(2)
+}
 
 // 灏佽鍑忔硶鍑芥暟
 function subtract(num1, num2) {
@@ -44,6 +49,7 @@
     multiply,
     divide,
     multiplyAuto,
-    divideAuto
+    divideAuto,
+    addAuto
 
 }
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/utils/request.js b/north-glass-erp/northglass-erp/src/utils/request.js
index bde0ca0..67052be 100644
--- a/north-glass-erp/northglass-erp/src/utils/request.js
+++ b/north-glass-erp/northglass-erp/src/utils/request.js
@@ -4,7 +4,7 @@
 const userStore=useUserInfoStore()
 const request = axios.create({
     baseURL: `http://${config.serverUrl}`,  // 娉ㄦ剰锛侊紒 杩欓噷鏄叏灞�缁熶竴鍔犱笂浜� 鍚庣鎺ュ彛鍓嶇紑 鍓嶇紑锛屽悗绔繀椤昏繘琛岃法鍩熼厤缃紒
-    timeout: 30000
+    timeout: 60000
 })
 
 //
diff --git a/north-glass-erp/northglass-erp/src/utils/requestTemp.js b/north-glass-erp/northglass-erp/src/utils/requestTemp.js
new file mode 100644
index 0000000..9bd1e6a
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/utils/requestTemp.js
@@ -0,0 +1,59 @@
+import axios from 'axios'
+import config from '../../config'
+import useUserInfoStore from '@/stores/userInfo'
+const userStore=useUserInfoStore()
+const request = axios.create({
+    baseURL: `http://${config.serverUrlTemp}`,  // 娉ㄦ剰锛侊紒 杩欓噷鏄叏灞�缁熶竴鍔犱笂浜� 鍚庣鎺ュ彛鍓嶇紑 鍓嶇紑锛屽悗绔繀椤昏繘琛岃法鍩熼厤缃紒
+    timeout: 60000
+})
+
+
+
+//
+
+// request 鎷︽埅鍣�
+// 鍙互鑷姹傚彂閫佸墠瀵硅姹傚仛涓�浜涘鐞�
+// 姣斿缁熶竴鍔爐oken锛屽璇锋眰鍙傛暟缁熶竴鍔犲瘑
+request.interceptors.request.use(config => {
+    config.headers['Content-Type'] = 'application/json;charset=utf-8';
+    if(userStore.user){
+        config.headers['satoken'] = userStore.user.token;
+    }
+      // 璁剧疆璇锋眰澶�
+    return config
+}, error => {
+    return Promise.reject(error)
+});
+
+// response 鎷︽埅鍣�
+// 鍙互鍦ㄦ帴鍙e搷搴斿悗缁熶竴澶勭悊缁撴灉
+request.interceptors.response.use(
+    response => {
+        let res = response.data
+        //浼犻�掓姤閿欎俊鎭紝鎶婃姤閿欎俊鎭紶閫掑埌pinia涓�
+        userStore.setResponseCode(parseInt(res.code),res.msg)
+        if((res.code != 200 && res.code != '200')){
+            if(response.config.responseType !== 'blob'){
+                return Promise.reject(res.code)
+            }
+        }
+
+        // 濡傛灉鏄繑鍥炵殑鏂囦欢
+        if (response.config.responseType === 'blob') {
+            return res
+        }
+        // 鍏煎鏈嶅姟绔繑鍥炵殑瀛楃涓叉暟鎹�
+        if (typeof res === 'string') {
+            res = res ? JSON.parse(res) : res
+        }
+        return res;
+    },
+    error => {
+        console.log('err' + error) // for debug
+        return Promise.reject(error)
+    }
+)
+
+
+export default request
+
diff --git a/north-glass-erp/northglass-erp/src/views/mm/basicData/WarehouseBasicData.vue b/north-glass-erp/northglass-erp/src/views/mm/basicData/WarehouseBasicData.vue
index a5fa441..6e7d5a0 100644
--- a/north-glass-erp/northglass-erp/src/views/mm/basicData/WarehouseBasicData.vue
+++ b/north-glass-erp/northglass-erp/src/views/mm/basicData/WarehouseBasicData.vue
@@ -21,6 +21,7 @@
     <div id="div-title">
       <el-breadcrumb :separator-icon="ArrowRight">
         <el-breadcrumb-item @click="changeRouter(1)" :class="indexFlag===1?'indexTag':''" :to="{ path: '/main/warehouseBasicData/warehouseSearchBasicData' }">{{$t('warehouseBasicData.BasicData')}}</el-breadcrumb-item>
+<!--        <el-breadcrumb-item @click="changeRouter(2)" :class="indexFlag===2?'indexTag':''" :to="{ path: '/main/warehouseBasicData/canvas' }">canvas</el-breadcrumb-item>-->
         <el-breadcrumb-item v-show="false" />
       </el-breadcrumb>
     </div>
diff --git a/north-glass-erp/northglass-erp/src/views/mm/basicData/canvas.vue b/north-glass-erp/northglass-erp/src/views/mm/basicData/canvas.vue
new file mode 100644
index 0000000..9e895e8
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/mm/basicData/canvas.vue
@@ -0,0 +1,696 @@
+
+
+
+
+<script setup>
+import { Leafer, Polygon,Ellipse,Line,Path } from 'leafer-ui'
+import {nextTick, onMounted, onUnmounted, onUpdated, reactive, ref, watch} from "vue"
+import { saveAs } from 'file-saver';
+import DXFWriter from 'dxf-writer';
+import DxfParser from 'dxf-parser';
+import {round} from "xe-utils";
+import request from "@/utils/request";
+import {ElMessage} from "element-plus";
+
+let XMargin=ref(30)
+let YMargin=ref(30)
+let points=ref([])
+let data1=ref(0)
+let data2=ref(0)
+let data3=ref(0)
+let data4=ref(0)
+let data5=ref(0)
+let data6=ref(0)
+let data7=ref(0)
+let data8=ref(0)
+
+let datas1=ref(0)
+let datas2=ref(0)
+let datas3=ref(0)
+let datas4=ref(0)
+let datas5=ref(0)
+let datas6=ref(0)
+let datas7=ref(0)
+let datas8=ref(0)
+let big=0
+let leafer;
+
+onMounted(() => {
+  const main =document.getElementById('mains')
+  const width =document.getElementById('width')
+  const height =document.getElementById('height')
+  const iocn =document.getElementById('iocn')
+  width.innerHTML=1500
+  height.innerHTML=600
+  if(1500/400>600/300){
+    big=1500/400
+  }else{
+    big=600/300
+  }
+  let widthAgv=1500/big
+  let heightAgv=600/big
+  main.style.width=widthAgv+"px"
+  main.style.height=heightAgv+"px"
+  main.style.backgroundColor="white"
+  iocn.style.marginLeft=XMargin.value/big+"px"
+  iocn.style.marginTop=YMargin.value/big+"px"
+  datas2.value=heightAgv
+  datas8.value=heightAgv
+  datas5.value=widthAgv
+  datas7.value=widthAgv
+  leafer=new Leafer({ view: 'canvas' })
+
+  points.value=[0, heightAgv, 0, 0, widthAgv, 0, widthAgv,heightAgv]
+  const polygon = new Polygon({
+    points: points.value,
+    fill: '#32cd79',
+    origin: [0, 0],
+    scale:0.5
+  })
+  leafer.add(polygon)
+
+})
+const getproject = () =>  {
+  leafer=new Leafer({ view: 'canvas' })
+  points.value=[datas1.value+(parseInt(data1.value)/big), datas2.value-(parseInt(data2.value)/big), datas3.value+(parseInt(data3.value)/big), datas4.value+(parseInt(data4.value)/big),
+    datas5.value-(parseInt(data5.value)/big), datas6.value+(parseInt(data6.value)/big), datas7.value-(parseInt(data7.value)/big), datas8.value-(parseInt(data8.value)/big)]
+  const polygon = new Polygon({
+    points: points.value,
+    fill: '#32cd79',
+    origin: [0, 0]
+  })
+  leafer.add(polygon)
+
+}
+
+const exportToDXF = () => {
+  const dxf = new DXFWriter();
+  const polygonPoints = points.value.map((coord, index) => ({
+    x: index % 2 === 0 ? coord : undefined,
+    y: index % 2 !== 0 ? -coord : undefined
+  })).filter(point => point.x !== undefined && point.y !== undefined);
+
+  let arr=[]
+  for (let i=0;i<points.value.length;i++){
+    let a=[]
+    if(i % 2 === 0){
+      a.push(points.value[i]*big)
+      a.push((points.value[i+1]*big))
+      a.push(0)
+      arr.push(a)
+    }
+
+  }
+  let minX = Infinity, minY = Infinity;
+  let maxX = -Infinity, maxY = -Infinity;
+  arr.forEach(p => {
+    minX = Math.min(Math.abs(p[0]),minX );
+    minY = Math.min(Math.abs(p[1]),minY);
+    maxX = Math.max(Math.abs(p[0]),maxX );
+    maxY = Math.max(Math.abs(p[1]),maxY);
+  });
+
+  arr.forEach(p => {
+    p[1]=maxY-minY-p[1]
+  });
+
+
+  dxf.drawPolyline(arr,{ closed: true, layer: '0' })
+
+  const blob = new Blob([dxf.toDxfString()], { type: 'text/plain;charset=utf-8' });
+  saveAs(blob, 'map.dxf');
+}
+
+
+function toBottomOrigin(y, canvasHeight) {
+  return canvasHeight - y; // 灏嗗乏涓婅Y鍧愭爣杞崲涓哄乏涓嬭鍧愭爣绯�
+}
+
+function addPolygonAsLines(dxf, points, layer = '0') {
+  for (let i = 0; i < points.length; i++) {
+    const nextIdx = (i + 1) % points.length;
+    dxf.drawPolygon(
+        points[i].x, points[i].y,
+        points[nextIdx].x, points[nextIdx].y
+    );
+  }
+}
+
+const uploadToServer = (data, fileName) => {
+  request.post('/order/upload-dxf', {
+    fileName: fileName,
+    fileData: data
+  }, {
+    headers: {'Content-Type': 'application/json'}
+  });
+};
+
+const file = ref(null);
+const triggerFileSelect = () => {
+  request.post("/order/selectUploadDxf").then((res) => {
+    if (res.code === "200" ) {
+      console.log(res.data)
+      const b64Data = res.data.data.file_data;
+      const byteCharacters = atob(b64Data);
+      const parser = new DxfParser();
+      const dxfData = parser.parseSync(byteCharacters)
+      console.log(dxfData)
+    }
+  })
+};
+
+
+
+const fileToBase64 = (file) => {
+  return new Promise((resolve, reject) => {
+    const reader = new FileReader();
+    reader.onload = () => resolve(reader.result);
+    reader.onerror = reject;
+    reader.readAsDataURL(file);
+  });
+};
+
+const handleFileUpload =  async (event) => {
+  const main = document.getElementById('mains')
+  const width = document.getElementById('width')
+  const height = document.getElementById('height')
+  leafer.removeAll()
+  leafer = new Leafer({view: 'canvas'});
+  const file = event.target.files[0];
+  try {
+    const base64 = await fileToBase64(file);
+    const pureBase64 = base64.replace(/^data:.+;base64,/, "");
+    uploadToServer(pureBase64, file.name)
+  } catch (error) {
+    console.error('杞崲澶辫触:', error);
+  }
+  if (file) {
+    const reader = new FileReader();
+    reader.onload = async (e) => {
+      const text = e.target.result;
+      try {
+        const parser = new DxfParser();
+        const dxfData = parser.parseSync(text);
+
+        let minX = Infinity, minY = Infinity;
+        let maxX = -Infinity, maxY = -Infinity;
+        dxfData.entities.forEach(entity => {
+          if (entity.type === 'LINE' || entity.type === 'LWPOLYLINE') {
+            entity.vertices.forEach(vertices => {
+              minX = Math.min(Math.abs(vertices.x), minX);
+              minY = Math.min(Math.abs(vertices.y), minY);
+              maxX = Math.max(Math.abs(vertices.x), maxX);
+              maxY = Math.max(Math.abs(vertices.y), maxY);
+            })
+          }
+          if (entity.type === 'ARC') {
+            const center = {x: entity.center.x, y: entity.center.y};
+            const radius = entity.radius;
+            const startAngle = entity.startAngle * (180 / Math.PI);
+            const endAngle = entity.endAngle * (180 / Math.PI);
+
+            const points = [];
+            const steps = 32;
+            for (let i = 0; i <= steps; i++) {
+              const angle = startAngle + (endAngle - startAngle) * (i / steps);
+              const x = center.x + radius * Math.cos(angle * Math.PI / 180);
+              const y = center.y + radius * Math.sin(angle * Math.PI / 180);
+              points.push({x, y});
+            }
+
+
+            points.forEach(p => {
+              minX = Math.min(minX, p.x);
+              minY = Math.min(minY, p.y);
+              maxX = Math.max(maxX, p.x);
+              maxY = Math.max(maxY, p.y);
+            });
+          }
+        });
+        if ((maxX - minX) / 400 > (maxY - minY) / 300) {
+          big = (maxX - minX) / 400
+        } else {
+          big = (maxY - minY) / 300
+        }
+
+        Object.values(dxfData.entities).forEach(entity => {
+          /*const bounds = drawEntity(entity);
+
+          if (bounds) {
+            minX = Math.min(minX, bounds.minX);
+            minY = Math.min(minY, bounds.minY);
+            maxX = Math.max(maxX, bounds.maxX);
+            maxY = Math.max(maxY, bounds.maxY);
+          }*/
+          switch (entity.type) {
+
+            case 'LINE':
+              /*main.style.width=(maxX-minX)+"px"
+              main.style.height=(maxY-minY)+"px"
+              width.innerHTML=round(maxX-minX,2)
+              height.innerHTML=round(maxY-minY,2)
+              const line = new Line({
+                points: [(Math.abs(entity.vertices[0].x)-minX)/big, toBottomOrigin((Math.abs(entity.vertices[0].y)-minY)/big,(maxY-minY)/big),
+                  (Math.abs(entity.vertices[1].x)-minX)/big, toBottomOrigin((Math.abs(entity.vertices[1].y)-minY)/big,(maxY-minY)/big)],
+                stroke: '#f00',
+                strokeWidth: 2
+              })*/
+              main.style.width = (maxX - minX) / big + "px"
+              main.style.height = (maxY - minY) / big + "px"
+              width.innerHTML = round(maxX - minX, 2)
+              height.innerHTML = round(maxY - minY, 2)
+              const line = new Line({
+                points: [(Math.abs(entity.vertices[0].x) - minX) / big, ((maxY - minY) - (Math.abs(entity.vertices[0].y) - minY)) / big,
+                  (Math.abs(entity.vertices[1].x) - minX) / big, ((maxY - minY) - (Math.abs(entity.vertices[1].y) - minY)) / big],
+                stroke: '#f00',
+                strokeWidth: 1
+              })
+              setTimeout(() => {
+                leafer.add(line);
+              }, 30);
+              break;
+            case 'LWPOLYLINE':
+
+              main.style.width = (maxX - minX) / big + "px"
+              main.style.height = (maxY - minY) / big + "px"
+              main.style.backgroundColor = "white"
+              width.innerHTML = round(maxX - minX, 2)
+              height.innerHTML = round(maxY - minY, 2)
+              let point = entity.vertices.map(v => [
+                (Math.abs(v.x) - minX) / big,
+                toBottomOrigin((Math.abs(v.y) - minY) / big, (maxY - minY) / big),
+              ]).flat()
+              const polygon = new Polygon({
+                points: point,
+                fill: '#32cd79',
+              })
+              setTimeout(() => {
+                leafer.add(polygon);
+              }, 30);
+
+              break;
+            case 'CIRCLE':
+              big = (entity.radius * 2) / 400
+              main.style.width = entity.radius * 2 / big + "px"
+              main.style.height = entity.radius * 2 / big + "px"
+              width.innerHTML = round(entity.radius * 2, 2)
+              height.innerHTML = round(entity.radius * 2, 2)
+              const ellipse = new Ellipse({
+                width: entity.radius * 2 / big,
+                height: entity.radius * 2 / big,
+                fill: "#32cd79"
+              })
+              setTimeout(() => {
+                leafer.add(ellipse);
+              }, 30);
+
+              break;
+            case 'ELLIPSE':
+              console.log(entity)
+
+              const {majorAxisEndPoint, axisRatio} = entity;
+
+              const dx = majorAxisEndPoint.x;
+              const dy = majorAxisEndPoint.y;
+              const a = Math.sqrt(dx ** 2 + dy ** 2);
+              const c = a * axisRatio;
+              const 胃 = Math.atan2(dy, dx);
+              const l = axisRatio * (180 / Math.PI);
+
+              if ((a * 2) / 400 > (c * 2) / 300) {
+                big = (a * 2) / 400
+              } else {
+                big = (c * 2) / 300
+              }
+
+              main.style.width = a * 2 / big + "px"
+              main.style.height = c * 2 / big + "px"
+              width.innerHTML = round(a * 2, 2)
+              height.innerHTML = round(c * 2, 2)
+              const ellipse2 = new Ellipse({
+                width: a * 2 / big,
+                height: c * 2 / big,
+                fill: "#32cd79",
+              })
+
+              setTimeout(() => {
+                leafer.add(ellipse2);
+              }, 30);
+
+              break;
+            case 'ARC':
+              const center = {x: entity.center.x, y: entity.center.y};
+              const radius = entity.radius;
+              const startAngle = entity.startAngle * (180 / Math.PI);
+              const endAngle = entity.endAngle * (180 / Math.PI);
+
+              if ((maxX - minX) / 400 > (maxY - minY) / 300) {
+                big = (maxX - minX) / 400
+              } else {
+                big = (maxY - minY) / 300
+              }
+
+
+              // 璁$畻鍦嗗姬鐨勮捣鐐瑰拰缁堢偣
+              const startX = (center.x + radius * Math.cos(entity.startAngle) - minX);
+              const startY = (maxY - minY) - ((center.y + radius * Math.sin(entity.startAngle)) - minY);
+              const endX = (center.x + radius * Math.cos(entity.endAngle) - minX);
+              const endY = (maxY - minY) - ((center.y + radius * Math.sin(entity.endAngle)) - minY);
+
+              // 鍒涘缓鍦嗗姬璺緞
+              const path = new Path({
+                path: `M ${startX / big} ${startY / big} A ${radius / big} ${radius / big} 0 ${endAngle - startAngle > 180 ? 1 : 0} 0 ${endX / big} ${endY / big}`,
+                stroke: '#f00',
+                strokeWidth: 1,
+              });
+
+
+              setTimeout(() => {
+                leafer.add(path);
+              }, 30);
+
+
+              break;
+
+          }
+        })
+        // 鑷姩缂╂斁瑙嗗浘
+        /*if (minX !== Infinity) {
+          const width = maxX - minX;
+          const height = maxY - minY;
+          const centerX = (minX + maxX) / 2;
+          const centerY = (minY + maxY) / 2;
+
+          main.style.width=width/big+"px"
+          main.style.height=height/big+"px"
+
+        }*/
+
+      } catch (error) {
+        console.error('瑙f瀽DXF鏂囦欢鏃跺嚭閿�:', error);
+      }
+    };
+    reader.readAsText(file);
+  }
+};
+
+function drawEntity(entity) {
+  switch (entity.type) {
+    case 'LWPOLYLINE':
+      return drawPolyline(entity);
+    case 'POLYLINE':
+      return drawPolyline(entity);
+    case 'LINE':
+      return drawLine(entity);
+    case 'CIRCLE':
+      return drawCircle(entity);
+    case 'ARC':
+      return drawArc(entity);
+    case 'SPLINE':
+      return drawSpline(entity);
+    default:
+      console.warn('Unsupported entity type:', entity.type);
+      return null;
+  }
+}
+
+let minX = Infinity, minY = Infinity;
+let maxX = -Infinity, maxY = -Infinity;
+// 缁樺埗澶氭绾�
+function drawPolyline(polyline) {
+  const points = polyline.vertices.map(v => {
+    return { x: Math.abs(v.x), y: Math.abs(v.y) }; // 缈昏浆Y鍧愭爣
+  });
+
+  // 澶勭悊闂悎澶氳竟褰�
+  if (polyline.flags && polyline.flags.includes('closed') && points.length > 0) {
+    points.push({...points[0]});
+  }
+
+  // 璁$畻杈圭晫
+
+  points.forEach(p => {
+    minX = Math.min(p.x,minX);
+    minY = Math.min(p.y,minY);
+    maxX = Math.max(p.x,maxX);
+    maxY = Math.max(p.y,maxY);
+  });
+
+  let agvX=maxX-minX
+  let agvY=maxY-minY
+
+
+  // 鍒涘缓Leafer澶氳竟褰�
+  const polygon = new Polygon({
+    points: points.flatMap(p => [(p.x-minX)/big,(agvY-(p.y-minY))/big]),
+    fill: 'rgba(100, 150, 255, 0.3)',
+    stroke: '#32cd79',
+    strokeWidth: 2,
+    cornerRadius: 0,
+    draggable: true
+  });
+
+  // 淇濆瓨鍘熷DXF鏁版嵁
+  polygon.dxfData = {
+    type: polyline.type,
+    layer: polyline.layer || '0',
+    color: polyline.color || 7
+  };
+  setTimeout(() => {
+    leafer.add(polygon);
+  }, 30);
+
+
+  return { minX, minY, maxX, maxY };
+}
+
+// 缁樺埗鐩寸嚎
+function drawLine(line) {
+  const points = line.vertices.map(v => {
+    return { x: Math.abs(v.x), y: Math.abs(v.y) };
+  });
+
+  points.forEach(p => {
+    minX = Math.min(p.x,minX);
+    minY = Math.min(p.y,minY);
+    maxX = Math.max(p.x,maxX);
+    maxY = Math.max(p.y,maxY);
+  });
+
+  let agvX=maxX-minX
+  let agvY=maxY-minY
+
+  const lineObj = new Line({
+    points:[
+      (points[0].x-minX)/big,(agvY-(points[0].y-minY))/big,
+      (points[1].x-minX)/big,(agvY-(points[1].y-minY))/big
+    ],
+    stroke: '#32cd79',
+    strokeWidth: 2
+  });
+
+  setTimeout(() => {
+    leafer.add(lineObj);
+  }, 30);
+
+  return { minX, minY, maxX, maxY };
+}
+
+// 缁樺埗鍦�
+function drawCircle(circle) {
+  const center = { x: circle.center.x, y: circle.center.y };
+  const radius = circle.radius;
+
+   minX = center.x - radius;
+   minY = center.y - radius;
+   maxX = center.x + radius;
+   maxY = center.y + radius;
+
+  const circleObj = new Leafer.Ellipse({
+    x: center.x,
+    y: center.y,
+    radiusX: radius,
+    radiusY: radius,
+    fill: 'rgba(100, 150, 255, 0.3)',
+    stroke: '#32cd79',
+    strokeWidth: 2
+  });
+
+  circleObj.dxfData = {
+    type: 'CIRCLE',
+    layer: circle.layer || '0',
+    color: circle.color || 7
+  };
+
+  leafer.add(circleObj);
+
+  return { minX, minY, maxX, maxY };
+}
+
+// 缁樺埗鍦嗗姬
+function drawArc(arc) {
+  const center = { x: arc.center.x, y: arc.center.y };
+  const radius = arc.radius;
+  const startAngle = arc.startAngle*(180/Math.PI);
+  const endAngle = arc.endAngle*(180/Math.PI);
+
+  const points = [];
+  const steps = 32;
+  for (let i = 0; i <= steps; i++) {
+    const angle = startAngle + (endAngle - startAngle) * (i / steps);
+    const x = center.x + radius * Math.cos(angle * Math.PI / 180);
+    const y = center.y + radius * Math.sin(angle * Math.PI / 180);
+    points.push({ x, y });
+  }
+
+
+  points.forEach(p => {
+    minX = Math.min(minX, p.x);
+    minY = Math.min(minY, p.y);
+    maxX = Math.max(maxX, p.x);
+    maxY = Math.max(maxY, p.y);
+  });
+  let agvX=maxX-minX
+  let agvY=maxY-minY
+
+  // 璁$畻鍦嗗姬鐨勮捣鐐瑰拰缁堢偣
+  const startX = (center.x-minX)/big + radius/big * Math.cos(arc.startAngle);
+  const startY = (agvY-(center.y-minY))/big + radius/big * Math.sin(arc.startAngle);
+  const endX = (center.x-minX)/big + radius/big * Math.cos(arc.endAngle);
+  const endY = (agvY-(center.y-minY))/big + radius/big * Math.sin(arc.endAngle);
+
+  // 鍒涘缓鍦嗗姬璺緞
+  const path = new Path({
+    path: `M ${endX} ${endY} A ${radius/big} ${radius/big} 0 ${endAngle - startAngle > 180 ? 1 : 0} 0 ${startX} ${startY}`,
+    stroke: '#32cd79',
+    strokeWidth: 2,
+  });
+
+
+  setTimeout(() => {
+    leafer.add(path);
+  }, 30);
+
+
+  return { minX, minY, maxX, maxY };
+}
+
+// 缁樺埗鏍锋潯鏇茬嚎锛堢畝鍖栧疄鐜帮級
+function drawSpline(spline) {
+  if (!spline.controlPoints || spline.controlPoints.length < 2) {
+    console.warn('Invalid SPLINE entity');
+    return null;
+  }
+
+  const points = spline.controlPoints.map(p => {
+    return { x: p.x, y: -p.y };
+  });
+
+  // 鍒涘缓鏍锋潯鏇茬嚎璺緞锛堜娇鐢ㄤ笁娆¤礉濉炲皵鏇茬嚎杩戜技锛�
+  let pathData = `M ${points[0].x} ${points[0].y}`;
+
+  if (points.length === 2) {
+    pathData += ` L ${points[1].x} ${points[1].y}`;
+  } else {
+    for (let i = 1; i < points.length; i++) {
+      const p0 = points[i-1];
+      const p1 = points[i];
+      const cp1x = p0.x + (p1.x - p0.x) / 3;
+      const cp1y = p0.y + (p1.y - p0.y) / 3;
+      const cp2x = p1.x - (p1.x - p0.x) / 3;
+      const cp2y = p1.y - (p1.y - p0.y) / 3;
+
+      pathData += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p1.x} ${p1.y}`;
+    }
+  }
+
+  const path = new Leafer.Path({
+    path: pathData,
+    stroke: '#32cd79',
+    strokeWidth: 2,
+    fill: 'none'
+  });
+
+  path.dxfData = {
+    type: 'SPLINE',
+    layer: spline.layer || '0',
+    color: spline.color || 7
+  };
+
+  leafer.add(path);
+
+  // 璁$畻杈圭晫
+  points.forEach(p => {
+    minX = Math.min(minX, p.x);
+    minY = Math.min(minY, p.y);
+    maxX = Math.max(maxX, p.x);
+    maxY = Math.max(maxY, p.y);
+  });
+
+  return { minX, minY, maxX, maxY };
+}
+
+const handleInputX = (newValue) => {
+  const iocn =document.getElementById('iocn')
+  if(newValue+20*big<=1500){
+    iocn.style.marginLeft=newValue/big+"px"
+  }
+
+};
+const handleInputY = (newValue) => {
+  const iocn =document.getElementById('iocn')
+  iocn.style.marginTop=newValue/big+"px"
+};
+
+
+
+</script>
+
+<template>
+  <div style="width: 460px;height: 320px;justify-content: center;display: flex;">
+    <div>
+      <div id="width" style="height: 20px;"></div>
+      <div id="height" style="width: 60px;margin-left: -40px;"></div>
+      <div id="mains" style="margin-top: -20px" >
+        <div id="iocn" style="width: 20px;height: 20px;position: absolute;"></div>
+        <canvas  id="canvas" ></canvas>
+      </div>
+    </div>
+
+
+  </div>
+
+  <el-input class="contactNumber" @blur="getproject" type="text" v-model="data1" />
+  <el-input class="contactNumber" @blur="getproject" type="text" v-model="data2"  />
+  <el-input class="contactNumber" @blur="getproject" type="text" v-model="data3"  />
+  <el-input class="contactNumber" @blur="getproject" type="text" v-model="data4"  /><br>
+  <el-input class="contactNumber" @blur="getproject" type="text" v-model="data5"  />
+  <el-input class="contactNumber" @blur="getproject" type="text" v-model="data6"  />
+  <el-input class="contactNumber" @blur="getproject" type="text" v-model="data7"  />
+  <el-input class="contactNumber" @blur="getproject" type="text" v-model="data8"  /><br>
+  <el-button type="primary" @click="exportToDXF">瀵煎嚭DXF</el-button>
+  <div>
+    <input type="file" @change="handleFileUpload" accept=".dxf" />
+  </div>
+  <el-input-number @input="handleInputX"   v-model="XMargin"/>
+  <el-input-number @input="handleInputY"   v-model="YMargin"/>
+
+  <button @click="triggerFileSelect">閫夋嫨鏂囦欢</button>
+</template>
+
+<style>
+.contactNumber{
+  width: 60px;
+  height:20px;
+  border: none;
+  box-shadow: none;
+  font-size: 15px;
+}
+
+#mains {
+  position: relative;
+}
+input[type="file"] {
+  margin-top: 10px;
+}
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/CreateOutBound.vue b/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/CreateOutBound.vue
index 3f5eae8..c721dfa 100644
--- a/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/CreateOutBound.vue
+++ b/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/CreateOutBound.vue
@@ -66,11 +66,15 @@
   materialRequisitionPersonnel:'',
   materialRequisitionTeam:'',
   orderId:'',
+  project:'',
+  batch:'',
   materialRequisitionDate:'',
   reviewedState:'',
   reviewed:'',
   warehouseManager:userStore.user.userName
 })
+
+let userNameCutting = ref([])
 
 let filterData = ref({
 
@@ -109,9 +113,8 @@
     if (res.code == 200) {
 
       titleSelectJson.value = deepClone(res.data)
-      console.log("a"+titleSelectJson.value)
       const today = new Date
-      today.setTime(today.getTime() + (15 * 24 * 60 * 60 * 1000))
+      today.setTime(today.getTime())
       titleUploadData.value.materialRequisitionDate = today.getFullYear() +
           '-' + ("0" + (today.getMonth() + 1)).slice(-2)
           + '-' + ("0" + today.getDate()).slice(-2)
@@ -121,6 +124,18 @@
     }
   })
 }
+
+const initUser = async ()=> {
+  await request.get(`/BasicWarehouse/BasicWarehouseTypeUser/` + t('machine.cutting')).then((res) => {
+
+    if (res.code == 200) {
+      userNameCutting.value=res.data.userName
+    } else {
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
 //鍒楁煡璇�
 const getWork = async ()=> {
   await request.get(`/BasicWarehouse/BasicWarehouseType/`+t('ingredients.originalFilm')+'|'+t('ingredients.accessories')).then((res) => {
@@ -154,6 +169,8 @@
 onMounted(async()=>{
   await initOrder()
 
+  await initUser()
+
 
   //鍚敤琛ㄦ牸鎷栧姩閫変腑
   addListener(xGrid.value,gridOptions,cellArea.value)
@@ -168,7 +185,6 @@
       request.post("/materialInventory/getSelectMaterialInventory/1/100",filterData.value).then((res) => {
 
         if(res.code==200){
-          console.log("b"+titleSelectJson.value)
           titleUploadData.value.warehouseManager=userStore.user.userName
           titleUploadData.value.outboundType = titleSelectJson.value.outboundType[0].operateTypeName
           materialStore.value=[]
@@ -241,6 +257,7 @@
           if(titleUploadData.value.reviewedState!==0){
             gridOptions.toolbarConfig.buttons[1].disabled = true
             gridOptions.toolbarConfig.buttons[0].disabled = true
+            gridOptions.toolbarConfig.buttons[3].disabled = true
 
 
           }
@@ -378,6 +395,46 @@
           })
           break
         }
+        case 'addToExamine': {
+          const selectRecords = $grid.getCheckboxRecords()
+          if (selectRecords.length === 0) {
+            ElMessage.warning(t('productStock.unselectedData'))
+            return
+          }
+          const errMap = await $grid.validate(selectRecords)
+          if (errMap) {
+            ElMessage.warning(t('productStock.dataVerificationFailed'))
+            return
+          }
+          //琛ㄥご鏁版嵁鏍¢獙
+          const outboundType = titleUploadData.value.outboundType
+          if(outboundType === null || outboundType === undefined || outboundType === ''){
+            ElMessage.error(t('ingredientsStock.pleaseOutboundType'))
+            return
+          }
+          let flowData = ref({
+            materialOutboundDetail: selectRecords,
+            title: titleUploadData.value,
+            materialOutboundId: route.query.materialOutboundId,
+            userName:userStore.user.userName,
+            userId:userStore.user.userId
+
+          })
+          request.post("/materialInventory/saveToExamineMaterialOutbound", flowData.value).then((res) => {
+            if(res.code==200 && res.data==="true"){
+              ElMessage.success(t('basicData.msg.saveSuccess'))
+              router.push({path: '/main/ingredientsStock/MaterialOutbound', query:{random:Math.random()}})
+            }else if(res.data==="false1"){
+              ElMessage.warning(t('basicData.msg.quantityError'))
+            }else{
+              ElMessage.warning(t('basicData.msg.saveFail'))
+            }
+          }).catch((err)=>{
+            ElMessage.error(t('basicData.msg.ServerConnectionError'))
+            router.push("/login")
+          })
+          break
+        }
 
       }
     }
@@ -457,7 +514,8 @@
     buttons: [
       {'code': 'add', 'name': t('basicData.save'),status: 'primary',icon: 'vxe-icon-save'},
       {'code': 'toExamine', 'name': t('basicData.review'),status: 'primary'},
-      {'code': 'CounterExamination', 'name': t('basicData.cancelReview'),status: 'primary'}
+      {'code': 'CounterExamination', 'name': t('basicData.cancelReview'),status: 'primary'},
+      {'code': 'addToExamine', 'name': t('reportingWorks.saveAndReview'),status: 'primary',icon: 'vxe-icon-save'},
     ],
     /*import: false,
     export: true,
@@ -507,6 +565,28 @@
 })
 
 
+const getproject = () =>  {
+  if(titleUploadData.value.orderId!==''){
+    request.post(`/order/getOrderById/` +titleUploadData.value.orderId ).then((res) => {
+      if (res.code == 200) {
+        if(res.data.order!=null){
+          titleUploadData.value.project=res.data.order.project
+          titleUploadData.value.batch=res.data.order.batch
+        }else{
+          titleUploadData.value.project=''
+          titleUploadData.value.batch=''
+        }
+
+      } else {
+        ElMessage.warning(res.msg)
+      }
+    })
+  }
+
+}
+
+
+
 
 </script>
 
@@ -515,14 +595,25 @@
   <div class="head" style="background-color: white">
     <el-row>
       <el-col  :span="2"><el-text>{{$t('ingredientsStock.materialRequisitionDate')}}:</el-text></el-col>
-      <el-col  :span="3"><el-input  v-model="titleUploadData.materialRequisitionDate" :readonly="true" ></el-input></el-col>
+      <el-col  :span="3">
+        <el-date-picker
+            v-model="titleUploadData.materialRequisitionDate"
+            type="date"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            :placeholder="$t('delivery.selectDate')"/>
+      </el-col>
       <el-col  :span="2"><el-text>{{$t('ingredientsStock.materialRequisitionPersonnel')}}:</el-text></el-col>
-      <el-col  :span="3"><el-input v-model="titleUploadData.materialRequisitionPersonnel" /></el-col>
+      <el-col  :span="3">
+        <el-select v-model="titleUploadData.materialRequisitionPersonnel" clearable placeholder=" " >
+          <el-option v-for="item in userNameCutting"
+                     :key="item.id"
+                     :label="item"
+                     :value="item"/>
+        </el-select>
+      </el-col>
       <el-col  :span="2"><el-text>{{$t('ingredientsStock.materialRequisitionTeam')}}:</el-text></el-col>
       <el-col  :span="3"><el-input v-model="titleUploadData.materialRequisitionTeam" /></el-col>
-
-    </el-row>
-    <el-row>
       <el-col  :span="2"><el-text>{{$t('ingredientsStock.outboundType')}}锛�</el-text></el-col>
       <el-col  :span="3">
         <el-select v-model="titleUploadData.outboundType"  clearable placeholder=""  >
@@ -534,11 +625,17 @@
           />
         </el-select>
       </el-col>
-      <el-col  :span="2"><el-text>{{$t('order.orderId')}}:</el-text></el-col>
-      <el-col  :span="3"><el-input v-model="titleUploadData.orderId" /></el-col>
+
+    </el-row>
+    <el-row>
       <el-col  :span="2"><el-text>{{$t('ingredientsStock.warehouseManager')}}:</el-text></el-col>
       <el-col  :span="3"><el-input v-model="titleUploadData.warehouseManager" :readonly="true" /></el-col>
-
+      <el-col  :span="2"><el-text>{{$t('order.orderId')}}:</el-text></el-col>
+      <el-col  :span="3"><el-input  @blur="getproject"  v-model="titleUploadData.orderId" /></el-col>
+      <el-col  :span="2"><el-text>{{$t('order.project')}}:</el-text></el-col>
+      <el-col  :span="3"><el-input v-model="titleUploadData.project" /></el-col>
+      <el-col  :span="2"><el-text>{{$t('order.batch')}}:</el-text></el-col>
+      <el-col  :span="3"><el-input v-model="titleUploadData.batch" /></el-col>
     </el-row>
   </div>
 
diff --git a/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/MaterialOutbound.vue b/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/MaterialOutbound.vue
index 786d3bc..097ee50 100644
--- a/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/MaterialOutbound.vue
+++ b/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/MaterialOutbound.vue
@@ -226,6 +226,8 @@
     {field: 'outboundType', width: '100',title: t('ingredientsStock.outboundType'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'warehouseManager',width: '100', title: t('ingredientsStock.warehouseManager'), sortable: true,showOverflow:"ellipsis",filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'materialRequisitionDate', width: '80',title: t('ingredientsStock.materialRequisitionDate'), sortable: true},
+    {field: 'project',width: '100', title: t('order.project'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'batch',width: '100', title: t('order.batch'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'reviewed',width: '100', title: t('ingredientsStock.reviewed'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'reviewedTime', width: '100',title: t('ingredientsStock.reviewedTime'), sortable: true},
     {field: 'createTime',width: '100', title: t('basicData.creationTime'), sortable: true},
diff --git a/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/SelectIngredientsStock.vue b/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/SelectIngredientsStock.vue
index 3fc3b15..06c7155 100644
--- a/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/SelectIngredientsStock.vue
+++ b/north-glass-erp/northglass-erp/src/views/mm/ingredientStock/SelectIngredientsStock.vue
@@ -1,6 +1,6 @@
 <script setup>
 
-import {reactive, ref} from "vue";
+import {onMounted, reactive, ref} from "vue";
 import {useRouter} from  'vue-router'
 import request from "@/utils/request";
 import deepClone from "@/utils/deepClone";
@@ -8,13 +8,16 @@
 import {ElMessage, ElMessageBox} from "element-plus";
 import {Search} from "@element-plus/icons-vue";
 import { useI18n } from 'vue-i18n'
-import {toolbarButtonClickEvent} from "@/hook/mouseMove";
+import {addListener, toolbarButtonClickEvent} from "@/hook/mouseMove";
 import {changeFilterEvent,filterChanged} from "@/hook"
 import {divideAuto, multiply} from "@/utils/decimal";
+import companyInfo from "@/stores/sd/companyInfo";
+import footSum from "@/hook/footSum";
 
 //璇█鑾峰彇
 const { t } = useI18n()
 const userStore = useUserInfoStore()
+const company = companyInfo()
 const router = useRouter()
 let produceList = ref([])
 let produceLists = ref([])
@@ -101,27 +104,32 @@
 
 
 
+onMounted(() => {
+  addListener(xGrid.value,gridOptions)
 
+  //绗竴娆¤皟鐢�
+  request.get(`/BasicWarehouse/BasicWarehouseType/`+t('ingredients.originalFilm')+'|'+t('ingredients.accessories')).then((res) => {
+    if(res.code==200){
+      gridOptions.columns.splice(0,gridOptions.columns.length)
+      BasicData.value = res.data
+      //娣诲姞鍒�
+      gridOptions.columns=arr.slice()
 
-request.get(`/BasicWarehouse/BasicWarehouseType/`+t('ingredients.originalFilm')+'|'+t('ingredients.accessories')).then((res) => {
-  if(res.code==200){
-    gridOptions.columns.splice(0,gridOptions.columns.length)
-    BasicData.value = res.data
-    //娣诲姞鍒�
-    gridOptions.columns=arr.slice()
+      for (let i=0;i<BasicData.value.length;i++){
+        let aa={field: "json."+BasicData.value[i].OperateType, width: '150',title: BasicData.value[i].OperateTypeName, sortable: true,showOverflow:'ellipsis' ,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged}
+        gridOptions.columns.push(aa)
 
-    for (let i=0;i<BasicData.value.length;i++){
-      let aa={field: "json."+BasicData.value[i].OperateType, width: '150',title: BasicData.value[i].OperateTypeName, sortable: true,showOverflow:'ellipsis' ,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged}
-      gridOptions.columns.push(aa)
+      }
+      values.value=t('ingredientsStock.inventory')
+      getInventoryWorks()
 
+    }else{
+      ElMessage.warning(res.msg)
     }
-    values.value=t('ingredientsStock.inventory')
-    getInventoryWorks()
-
-  }else{
-    ElMessage.warning(res.msg)
-  }
+  })
 })
+
+
 
 
 
@@ -307,9 +315,10 @@
         if (columnIndex === 0) {
           return t('basicData.total')
         }
-        // if (props.tableProp.footList.includes(column.field)) {
-        //   return sumNum(data, column.field)
-        // }
+        const List = ["inventoryQuantity",'availableQuantity','totalArea']
+        if (List.includes(column.field)) {
+          return footSum(data, column.field)
+        }
         return ''
       })
     ]
@@ -324,6 +333,7 @@
     if ($grid) {
       switch (code) {
         case 'out': {
+          $grid.clearFilter()
           const selectRecords = $grid.getCheckboxRecords()
 
 
@@ -391,7 +401,7 @@
         }
 
         case 'delete': {
-
+          $grid.clearFilter()
           const selectRecords = $grid.getCheckboxRecords()
           if (selectRecords.length === 0) {
             ElMessage.warning(t('productStock.unselectedData'))
@@ -691,6 +701,36 @@
 }
 
 
+const rowStyle = ({ row,rowIndex  }) => {
+  if(company.materialOutboundColor){
+    let date = new Date();
+    let date1=new Date();
+    let date2=new Date();
+    date1.setMonth(date.getMonth()-3);
+    date2.setMonth(date.getMonth()-6);
+
+    const date3=new Date(row.createTime);
+
+    const diff = date1.getTime() - date2.getTime();
+    const diffInDays = diff / (1000 * 60 * 60 * 24);
+    if(date3>=date1){
+      return {
+        backgroundColor: '#ffffff',
+      }
+    }else if(date3>=date2&&date1>date3){
+      return {
+        backgroundColor: '#e0e7c8',
+      }
+    }else{
+      return {
+        backgroundColor: '#afa7ab',
+      }
+    }
+  }
+
+}
+
+
 </script>
 
 <template>
@@ -727,6 +767,7 @@
           ref="xGrid"
           v-bind="gridOptions"
           v-on="gridEvents"
+          :row-style="rowStyle"
 
       >
         <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
@@ -872,4 +913,11 @@
   width: 100%;
   height: calc(100% - 35px);
 }
+.vxe-grid {
+  /* 绂佺敤娴忚鍣ㄩ粯璁ら�変腑 */
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
 </style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/mm/productStock/CreateProductStock.vue b/north-glass-erp/northglass-erp/src/views/mm/productStock/CreateProductStock.vue
index ccee565..6077922 100644
--- a/north-glass-erp/northglass-erp/src/views/mm/productStock/CreateProductStock.vue
+++ b/north-glass-erp/northglass-erp/src/views/mm/productStock/CreateProductStock.vue
@@ -9,10 +9,11 @@
 import {ElMessage} from "element-plus";
 import { useI18n } from 'vue-i18n'
 import footSum from "@/hook/footSum";
+import companyInfo from "@/stores/sd/companyInfo";
 
 //璇█鑾峰彇
 const { t } = useI18n()
-
+const company = companyInfo()
 const userStore = useUserInfoStore()
 const username = userStore.user.userName
 const userid = userStore.user.userId
@@ -275,6 +276,7 @@
               return
             }
             let flowData = ref({
+              decValue:company.decValue,
               userId: userid,
               userName: username,
               storageRegion: storageRegion.value,
diff --git a/north-glass-erp/northglass-erp/src/views/mm/productStock/FinishedProductOut.vue b/north-glass-erp/northglass-erp/src/views/mm/productStock/FinishedProductOut.vue
index 88b6107..928d073 100644
--- a/north-glass-erp/northglass-erp/src/views/mm/productStock/FinishedProductOut.vue
+++ b/north-glass-erp/northglass-erp/src/views/mm/productStock/FinishedProductOut.vue
@@ -340,7 +340,7 @@
 <template>
   <div class="main-div-customer">
     <vxe-grid
-        max-height="100%"
+        height="100%"
         @filter-change="filterChanged"
         class="mytable-scrollbar"
         ref="xGrid"
diff --git a/north-glass-erp/northglass-erp/src/views/mm/productStock/ProductStockList.vue b/north-glass-erp/northglass-erp/src/views/mm/productStock/ProductStockList.vue
index 943f08c..3823495 100644
--- a/north-glass-erp/northglass-erp/src/views/mm/productStock/ProductStockList.vue
+++ b/north-glass-erp/northglass-erp/src/views/mm/productStock/ProductStockList.vue
@@ -1,12 +1,13 @@
 <script setup>
 
-import {reactive, ref} from "vue";
+import {onMounted, reactive, ref} from "vue";
 import {useRouter} from  'vue-router'
 import request from "@/utils/request";
 import deepClone from "@/utils/deepClone";
 import {ElMessage} from "element-plus";
 import { useI18n } from 'vue-i18n'
 import footSum from "@/hook/footSum";
+import {addListener} from "@/hook/mouseMove";
 
 //璇█鑾峰彇
 const { t } = useI18n()
@@ -75,21 +76,27 @@
 
 
 
-//绗竴娆¤皟鐢�
-request.post(`/finishedGoodsInventory/getSelect/1/${total.pageSize}`,filterData.value).then((res) => {
+onMounted(() => {
+  addListener(xGrid.value,gridOptions)
 
-  if(res.code==200){
-    total.dataTotal = res.data.total.total*1
-    total.pageTotal= res.data.total.pageTotal
-    pageNum.value=1
-    produceList = deepClone(res.data.data)
-    xGrid.value.loadData(produceList)
-    gridOptions.loading=false
-  }else{
-    ElMessage.warning(res.msg)
-    router.push("/login")
-  }
+  //绗竴娆¤皟鐢�
+  request.post(`/finishedGoodsInventory/getSelect/1/${total.pageSize}`,filterData.value).then((res) => {
+
+    if(res.code==200){
+      total.dataTotal = res.data.total.total*1
+      total.pageTotal= res.data.total.pageTotal
+      pageNum.value=1
+      produceList = deepClone(res.data.data)
+      xGrid.value.loadData(produceList)
+      gridOptions.loading=false
+    }else{
+      ElMessage.warning(res.msg)
+      router.push("/login")
+    }
+  })
 })
+
+
 
 
 //瀹氫箟褰撳墠椤垫暟
@@ -196,8 +203,13 @@
     {field: 'order.orderId', width: '150',title: t('order.orderId'),showOverflow:"ellipsis" ,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'order.project', width: '120',title: t('order.project'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'order.orderType', width: '100',title: t('order.orderType'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'order.customerId', width: '120',title: t('processCard.customerId'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'order.customerName', width: '100',title: t('processCard.customerName'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'order.batch', width: '100',title: t('order.batch'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'order.salesman', width: '100',title: t('order.salesman'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'orderDetail.productName', width: '100',title: t('order.product'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'orderDetail.productId',width: '100', title: t('order.productId'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'orderDetail.buildingNumber',width: '100', title: t('order.buildingNumber'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
 
     {field: 'orderDetail.width', width: '100',title: t('order.width'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'orderDetail.height',width: '100', title: t('order.height'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
@@ -206,7 +218,8 @@
 
     {field: 'actualSignalArea',width: '140', title: t('productStock.singlePieceArea'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'area',width: '100', title: t('productStock.totalArea'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
-
+    {field: 'weight',width: '100', title: t('processCard.weight'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'boxNo',width: '100', title: t('productStock.boxNumber'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'storageRegion',width: '100', title: t('productStock.inventoryArea'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'status',width: '100', title: t('productStock.status'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
 
@@ -225,6 +238,7 @@
     /*import: false,
    export: true,
    print: true,*/
+    export: true,
     zoom: true,
     custom: true
   },
@@ -283,7 +297,7 @@
 <template>
   <div class="main-div-customer">
     <vxe-grid
-        max-height="100%"
+        height="100%"
         @filter-change="filterChanged"
         class="mytable-scrollbar"
         ref="xGrid"
@@ -339,4 +353,11 @@
   width: 99%;
   height: 100%;
 }
+.vxe-grid {
+  /* 绂佺敤娴忚鍣ㄩ粯璁ら�変腑 */
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
 </style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecord.vue b/north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecord.vue
index 05a324c..3f43be0 100644
--- a/north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecord.vue
+++ b/north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecord.vue
@@ -10,11 +10,13 @@
 import {Search} from "@element-plus/icons-vue";
 import { useI18n } from 'vue-i18n'
 import footSum from "@/hook/footSum";
+import companyInfo from "@/stores/sd/companyInfo";
 
 //璇█鑾峰彇
 const { t } = useI18n()
 const router = useRouter()
 const route = useRoute()
+
 const userStore = useUserInfoStore()
 const username = userStore.user.userName
 const userid = userStore.user.userId
@@ -211,10 +213,15 @@
     {field: 'operationNumber', width: '100',title: t('order.OrderNum'), showOverflow:"ellipsis" ,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'processId', width: '150',title: t('processCard.processId'), showOverflow:"ellipsis" ,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'quantity', width: '140',title: t('order.quantity'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'orderDetail.price', width: '140',title: t('order.price'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'orderDetail.productId',width: '100', title: t('order.productId'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'orderDetail.productName',width: '140', title: t('order.product'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'orderDetail.width', width: '100',title: t('order.width'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'orderDetail.height',width: '100', title: t('order.height'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'area',width: '100', title: t('order.area'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'money',width: '100', title: t('order.grossAmount'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'order.project',width: '100', title: t('order.project'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'order.customerName',width: '100', title: t('order.customers'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'operator', width: '100',title: t('productStock.creator'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'operateTime', width:'140', title: t('productStock.productionDate'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'reviewed', width: '100',title: t('productStock.reviewed'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
@@ -234,12 +241,13 @@
     /*import: false,
    export: true,
    print: true,*/
+    export: true,
     zoom: true,
     custom: true
   },
 
   footerMethod ({ columns, data }) {//椤佃剼鍑芥暟
-    let footList = ['quantity']
+    let footList = ['quantity','area','money']
     return[
       columns.map((column, columnIndex) => {
         if (columnIndex === 0) {
diff --git a/north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecordPint.vue b/north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecordPint.vue
index 18ba3d6..4d6a6fb 100644
--- a/north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecordPint.vue
+++ b/north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecordPint.vue
@@ -12,14 +12,18 @@
 import footSum from "@/hook/footSum";
 import {VXETable} from "vxe-table";
 import PrintPackingList from "@/components/mm/PrintPackingList.vue";
+import PrintPackingListLuoyang from "@/components/mm/PrintPackingListLuoyang.vue";
 import {CircleCheck, Download, Printer} from "@element-plus/icons-vue/global";
 import print from "vue3-print-nb";
+import companyInfo from "@/stores/sd/companyInfo"
 
 //璇█鑾峰彇
 const { t } = useI18n()
 const router = useRouter()
 const route = useRoute()
+const company = companyInfo()
 const dialogTableVisible = ref(false)
+const dialogTableVisible1 = ref(false)
 let produceList = ref([])
 const getTableRow = (row,type) =>{
   switch (type) {
@@ -265,14 +269,21 @@
           const $table = xGrid.value
           //gridOptions.columns.unshift(a)
           if ($table) {
+
             const selectRecords = $table.getCheckboxRecords()
 
             if (selectRecords.length <= 0) {
               ElMessage.warning(t('productStock.unselectedData'))
               return
             }
-            printRow.value.list = JSON.stringify(selectRecords)
-            dialogTableVisible.value = true
+            if(company.companyName==="娲涢槼鍖楁柟鐜荤拑鎶�鏈偂浠芥湁闄愬叕鍙�"){
+              printRow.value.list = JSON.stringify(selectRecords)
+              dialogTableVisible1.value = true
+            }else{
+              printRow.value.list = JSON.stringify(selectRecords)
+              dialogTableVisible.value = true
+            }
+
           }
           return;
 
@@ -300,7 +311,11 @@
   reserve:true
 }
 
-
+const companyList = ref([
+  {key: 1,value: '娲涢槼鍖楁柟鐜荤拑鎶�鏈偂浠芥湁闄愬叕鍙�'},
+    {key: 2,value: '涓婃捣鍖楃幓鐜荤拑鎶�鏈伐涓氭湁闄愬叕鍙�'}
+])
+let companyVal = ref(1)
 
 </script>
 
@@ -395,6 +410,28 @@
           :printList="printRow.list"
           style="width: 100%;height: 100%"/>
     </el-dialog>
+    <el-dialog
+        id="sizePrintCalrd1"
+        v-model="dialogTableVisible1"
+        title="瑁呯鍗曟墦鍗�"
+        destroy-on-close
+        style="width: 75%;height:75% ">
+      <template #header="{ close, titleId, titleClass }">
+        <el-button v-print="printRecord" :icon="Printer" circle/>
+        <el-select v-model="companyVal" style="width: 120px;margin-left: 10px">
+          <el-option
+             v-for="item in companyList"
+            :key="item.key"
+            :label="item.value"
+            :value="item.key" />
+        </el-select>
+      </template>
+      <print-packing-list-luoyang
+          id="record"
+          :printList="printRow.list"
+          :companyVal="companyVal"
+          style="width: 100%;height: 100%"/>
+    </el-dialog>
   </div>
 </template>
 
@@ -415,4 +452,12 @@
   display: flex;
   flex-wrap: wrap
 }
+
+:deep(#sizePrintCalrd1 .el-dialog__body) {
+  height: 90%;
+  width: 100%;
+  overflow-y: auto;
+  display: flex;
+  flex-wrap: wrap
+}
 </style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/mm/stockReport/MaterialOutboundReport.vue b/north-glass-erp/northglass-erp/src/views/mm/stockReport/MaterialOutboundReport.vue
index 90912a8..e095f29 100644
--- a/north-glass-erp/northglass-erp/src/views/mm/stockReport/MaterialOutboundReport.vue
+++ b/north-glass-erp/northglass-erp/src/views/mm/stockReport/MaterialOutboundReport.vue
@@ -14,7 +14,9 @@
     {field: 'operationOrderNumber', width:'150', title: t('productStock.operationOrderNumber'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'operationNumber', width: '100',title: t('order.OrderNum'), showOverflow:"ellipsis" ,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'operateType', width: '120',title:t('warehouseBasicData.type'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
-    {field: 'projectNo', width: '120',title:t('ingredientsStock.projectNo'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'materialOutbound.orderId', width: '120',title:t('order.orderId'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'materialOutbound.project', width: '120',title:t('order.project'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
+    {field: 'materialOutbound.batch', width: '120',title:t('order.batch'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'quantity', width: '140',title: t('order.quantity'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'inventoryId',width: '100', title: t('ingredientsStock.id'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
     {field: 'materialCode',width: '140', title: t('ingredients.materialCode'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/GlassComputed.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/GlassComputed.vue
index 6eabc84..2480e55 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/GlassComputed.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/GlassComputed.vue
@@ -5,6 +5,7 @@
 import {onMounted, ref} from 'vue';
 import {ElMessage, ElLoading} from "element-plus";
 import request from "@/utils/request";
+import requestTemp from "@/utils/requestTemp";
 
 const props = defineProps({
   project : null
@@ -58,6 +59,35 @@
 // 鐢ㄤ簬瀛樺偍浠庡悗绔幏鍙栧埌鐨勬暟鎹紝鍒濆鍖栦负绌烘暟缁�
 const receivedData = ref([]);
 
+const fetchProjectInfo = async (projectNumber) => {
+  try {
+    const res = await request.post(`/glassOptimize/getProjectByProjectNo/${projectNumber}`);
+    console.log('瀹屾暣鍝嶅簲鏁版嵁:', res); // 鐢ㄤ簬璋冭瘯鏌ョ湅瀹屾暣鍝嶅簲缁撴瀯
+
+    if (Number(res.code) === 200 && res.data && res.data.data && res.data.data.length > 0) {
+      // 姝g‘璁块棶宓屽鐨勬暟鎹粨鏋�
+      const projectData = res.data.data[0]; // 娉ㄦ剰杩欓噷鏄� res.data.data[0]
+
+      console.log('鑾峰彇鍒扮殑glass_thickness:', projectData.glass_thickness);
+      console.log('鑾峰彇鍒扮殑glass_type:', projectData.glass_type);
+
+      // 纭繚computed.value宸插垵濮嬪寲
+      if (!computed.value) {
+        computed.value = {};
+      }
+
+      computed.value.glass_thickness = projectData.glass_thickness;
+      computed.value.glass_type = projectData.glass_type;
+
+      console.log('璁剧疆鍚庣殑computed.value:', computed.value);
+    } else {
+      console.warn('鏈壘鍒伴」鐩俊鎭垨鏁版嵁鏍煎紡涓嶆纭�');
+    }
+  } catch (error) {
+    console.error('鑾峰彇椤圭洰淇℃伅澶辫触', error);
+    ElMessage.error('鑾峰彇椤圭洰淇℃伅澶辫触');
+  }
+};
 
 console.log(receivedData)
 const handleFetchData = async (projectNumber) => {
@@ -65,6 +95,8 @@
     const res = await request.post(`/glassOptimize/selectProjectCompute/${projectNumber}`);
     if (Number(res.code) === 200 && res.data && res.data.data) {
       receivedData.value = res.data.data;
+      // 鑾峰彇椤圭洰淇℃伅
+      await fetchProjectInfo(projectNumber);
     } else {
       console.error('璇锋眰鍑虹幇闂锛岀姸鎬佺爜锛�', res.code, '锛岄敊璇俊鎭細', res.msg);
       if (res.code === 404) {
@@ -86,6 +118,65 @@
   console.log('鐖剁粍浠舵帴鏀跺埌鐨勬暟鎹�1:', data);
 }
 
+// 鍙戦�佹暟鎹埌閽㈠寲璁$畻鎺ュ彛
+// 鍙戦�佹暟鎹埌閽㈠寲璁$畻鎺ュ彛
+const sendToComputeTempering = async () => {
+  let loading;
+  try {
+    // 鏄剧ず鍔犺浇鎻愮ず
+    loading = ElLoading.service({
+      lock: true,
+      text: '姝e湪璁$畻涓紝璇风◢鍊�...',
+      background: 'rgba(0, 0, 0, 0.7)'
+    });
+
+    console.log('鍙戦�佸埌鍚庣鐨勬暟鎹�', JSON.stringify(computedCard.value, null, 2));
+
+    // 鍙戦�佹暟鎹埌閽㈠寲璁$畻鎺ュ彛
+    const response = await requestTemp.post('/computeTempering/inputTemperingData', computedCard.value);
+
+    console.log('鍚庣鍘熷鍝嶅簲:', response);
+
+    // 妫�鏌ュ搷搴旂粨鏋勫苟姝g‘澶勭悊
+    if (response && (response.code === 200 || response.status === 200)) {
+      // ElMessage.success('妯℃嫙璁$畻鎴愬姛!');
+
+      // 澶勭悊杩斿洖鐨勬暟鎹�
+      let resultData = response.data;
+
+      // 濡傛灉data鏄瓧绗︿覆锛岄渶瑕佽В鏋怞SON
+      if (typeof resultData === 'string') {
+        try {
+          resultData = JSON.parse(resultData);
+        } catch (parseError) {
+          console.error('瑙f瀽杩斿洖鏁版嵁澶辫触:', parseError);
+          ElMessage.warning('杩斿洖鏁版嵁鏍煎紡寮傚父锛屼娇鐢ㄥ師濮嬫暟鎹�');
+          // 鍗充娇瑙f瀽澶辫触涔熺户缁娇鐢ㄥ師濮嬫暟鎹�
+        }
+      }
+
+      // 鏇存柊computedData浠ユ樉绀鸿繑鍥炵殑缁撴灉
+      computedData.value = {
+        code: 200,
+        data: resultData
+      };
+
+      console.log('鎺ユ敹鍒扮殑澶勭悊鍚庢暟鎹�:', computedData.value);
+    } else {
+      // 澶勭悊閿欒鎯呭喌
+      const errorMessage = response?.msg || response?.message || '妯℃嫙璁$畻澶辫触';
+      ElMessage.error(errorMessage);
+    }
+  } catch (error) {
+    console.error('璇锋眰澶辫触:', error);
+
+    // 纭繚鍏抽棴鍔犺浇鎻愮ず
+    if (loading) {
+      loading.close();
+    }
+  }
+};
+
 const handleSimulation = async () => {
   let arry = computeCardRef.value.selectFullData();
   let data = arry;
@@ -96,77 +187,108 @@
     return acc;
   }, []);
 
-  if(data.length===arry.length){
-    state.value=1
-  }else{
-    state.value=2
+  if (data.length === arry.length) {
+    state.value = 1
+  } else {
+    state.value = 2
   }
+  // 璁$畻閽㈠寲娴佺▼鍗$殑鏁伴噺鎬诲拰
+  let maxQty = 0;
+  if (data.length > 0) {
+    // 閬嶅巻鎵�鏈夊嬀閫変簡閽㈠寲鐨勬祦绋嬪崱锛岀疮鍔犲畠浠殑鏁伴噺
+    arry.forEach(item => {
+      if (item.tempering) {
+        maxQty += item.total_num || 0;
+      }
+    });
 
-  if(props.project!=null){
-    computed.value.glass_thickness=props.project.glass_thickness
-    computed.value.glass_type=props.project.glass_type
-  }
-  if(data.length>0){
-    data.forEach(item=>{
-      const processCard = {
-        process_no: item.processId,
-        layers: item.technologyNumber,
-        total_layers: item.total_layers,
-        total_num: item.total_num,
-        total_area: item.total_area,
-        is_must: true,
-        allow_rotate: item.allow_rotate,
-        priority_level: 0,
-        tempering: item.tempering,
-        curtain_wall: item.curtain_wall,
-        patch_state: item.patch_state,
-        merge: item.merge,
-        glass_details: []
-      };
+    // 灏嗚绠楀嚭鐨勯挗鍖栨暟閲忔�诲拰娣诲姞鍒� computed.value 涓�
+    computed.value.max_qty = maxQty;
 
-      request.post(`/glassOptimize/selectComputeDetail/${item.processId}/${item.technologyNumber}/${item.patch_state}`).then((res) => {
-        if(Number(res.code) === 200){
-          res.data.data.forEach(items=>{
-            const detail={
-              process_id:null,
-              technology_number:null,
-              order_number:null,
-              layers_number:null,
-              max_width:null,
-              max_height:null,
-              child_width:null,
-              child_height:null,
-              quantity:null,
-              patch_state:null
-            }
-            detail.process_id=items.process_id
-            detail.technology_number=items.technology_number
-            detail.order_number=items.order_number
-            detail.layers_number=item.total_layers
-            detail.max_width=items.maxwidth
-            detail.max_height=items.maxheight
-            detail.child_width=items.width
-            detail.child_height=items.height
-            detail.quantity=items.quantity
-            detail.patch_state=item.patch_state
+    if (data.length > 0) {
+      // 鍒涘缓鎵�鏈夊紓姝ヨ姹傜殑Promise鏁扮粍
+      const detailPromises = [];
+      data.forEach(item => {
+        const processCard = {
+          process_no: item.processId,
+          layers: item.technologyNumber,
+          total_layers: item.total_layers,
+          total_num: item.total_num,
+          total_area: item.total_area,
+          is_must: true,
+          allow_rotate: item.allow_rotate,
+          priority_level: 0,
+          tempering: item.tempering,
+          curtain_wall: item.curtain_wall,
+          patch_state: item.patch_state,
+          merge: item.merge,
+          glass_details: []
+        };
 
-            processCard.glass_details.push(detail)
-          })
+        // 鍒涘缓寮傛璇锋眰Promise骞朵繚瀛�
+        const detailPromise = request.post(`/glassOptimize/selectComputeDetail/${item.processId}/${item.technologyNumber}/${item.patch_state}`).then((res) => {
+          if (Number(res.code) === 200) {
+            res.data.data.forEach(items => {
+              const detail = {
+                process_id: items.process_id,
+                technology_number: items.technology_number,
+                order_number: items.order_number,
+                layers_number: item.total_layers,
+                max_width: items.maxwidth,
+                max_height: items.maxheight,
+                child_width: items.width,
+                child_height: items.height,
+                quantity: items.quantity,
+                patch_state: item.patch_state
+              }
+              processCard.glass_details.push(detail)
+            })
+            return processCard;
+          } else {
+            ElMessage.warning(res.msg)
+            return processCard;
+          }
+        }).catch(error => {
+          console.error('鑾峰彇璇︽儏澶辫触:', error);
+          return processCard;
+        });
 
+        detailPromises.push(detailPromise);
+      });
 
-        }else{
-          ElMessage.warning(res.msg)
+      // 绛夊緟鎵�鏈夊紓姝ヨ姹傚畬鎴�
+      try {
+        const completedProcessCards = await Promise.all(detailPromises);
+
+        // 灏嗗畬鎴愮殑娴佺▼鍗℃坊鍔犲埌computed.value涓�
+        if (!computed.value.process_cards) {
+          computed.value.process_cards = [];
         }
-      })
-      computed.value.process_cards.push(processCard)
-    })
-    console.log(computed.value)
-  }else{
-    ElMessage.warning("娌℃湁闇�瑕侀挗鍖栧伐鑹虹殑鏁版嵁璇风洿鎺ヤ繚瀛�")
-    state.value=3
-    return
-  }
+        computed.value.process_cards = completedProcessCards;
 
+        console.log('瀹屾暣鐨刢omputed.value鏁版嵁:', computed.value);
+      } catch (error) {
+        console.error('澶勭悊娴佺▼鍗¤鎯呮椂鍑洪敊:', error);
+        ElMessage.error('鑾峰彇娴佺▼鍗¤鎯呭け璐�');
+      }
+    } else {
+      ElMessage.warning("娌℃湁闇�瑕侀挗鍖栧伐鑹虹殑鏁版嵁璇风洿鎺ヤ繚瀛�")
+      state.value = 3
+      // 鍗充娇娌℃湁閽㈠寲鏁版嵁锛屼篃瑕佽缃� max_qty 涓� 0
+      computed.value.max_qty = 0;
+      return
+    }
+
+    // 鍚堝苟鏁版嵁
+    computedCard.value = {
+      ...computed.value,
+      ...computedCard.value
+    };
+
+    // console.log('鏈�缁堝彂閫佸埌鍚庣鐨勬暟鎹�:', computedCard.value);
+
+    await sendToComputeTempering();
+  };
 
 
   /*request.post(`/glassOptimize/simulationCalculate`,computed.value).then((res) => {
@@ -265,7 +387,7 @@
       text: '姝e湪璁$畻涓紝璇风◢鍊�...',
       background: 'rgba(0, 0, 0, 0.7)'
     });
-   console.log('鍙戦�佸埌鍚庣鐨勬暟鎹�',computedCard.value)
+   // console.log('鍙戦�佸埌鍚庣鐨勬暟鎹�',computedCard.value)
   const mockData = {
       code: 200,
       data: [
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue
index 68ced28..c13860e 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue
@@ -122,12 +122,18 @@
       const projectNumber = row.projectNumber;
       const thickness = row.glass_thickness;
       const glassType = row.glass_type;
+      const quantity = row.quantity;
+      const area = row.glass_total_area;
+      const optimizeState = row.optimize_state;
       await router.push({
         name: 'optimizeInfo',
         params: {
           projectNo: projectNumber,
           thickNess: thickness,
-          model: glassType
+          model: glassType,
+          quantity: quantity,
+          area: area,
+          optimizeState:optimizeState
         }
       });
     }
@@ -183,13 +189,16 @@
 }
 
 // 鍏叡澶勭悊鍑芥暟锛屽鐞嗙浉鍚屾暟鎹椂鐨勬搷浣滐紝骞惰繑鍥瀟argetRoute瀵硅薄锛堝彸閿彍鍗曞拰鍙屽嚮鎵撳紑锛�
-const handleSameDataOperation = async ({projectNumber, thickness, glassType}) => {
+const handleSameDataOperation = async ({projectNumber, thickness, glassType,quantity,glass_total_area,optimize_state}) => {
   const targetRoute = {
     name: 'optimizeInfo',
     params: {
       projectNo: projectNumber,
-      thickNess: String(thickness),
-      model: glassType
+      thickNess: thickness,
+      model: glassType,
+      quantity: quantity,
+      area: glass_total_area,
+      optimizeState:optimize_state
     }
   };
   const currentRoute = router.currentRoute.value;
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/Compute.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/Compute.vue
index 6a8d2d7..379488d 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/Compute.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/Compute.vue
@@ -215,6 +215,11 @@
  
 };
 const handleSimulationClick = () => {
+      inputValues.project_no = inputValue.value;
+
+      inputValues.glass_thickness =  props.project.glass_thickness ;
+      inputValues.glass_type = props.project.glass_type;
+      inputValues.tempering_time = heatingTime.value || inputValues.tempering_time || 0;
 
       inputValues.load_width = furnaceWidth.value
       inputValues.load_length = furnaceLength.value
@@ -228,7 +233,7 @@
   // 瑙﹀彂鐖剁粍浠剁殑 simulate-click 浜嬩欢
   emit('simulate-click');
 
- 
+
 };
 
 
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ComputeCard.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ComputeCard.vue
index 88d8093..f2aa11a 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ComputeCard.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ComputeCard.vue
@@ -100,6 +100,8 @@
   processId: null,
   technologyNumber: null,
   patchState: null,
+  glassThickness: String,  // 娣诲姞鐜荤拑鍘氬害灞炴��
+  glassType: String        // 娣诲姞鐜荤拑绫诲瀷灞炴��
 });
 
 
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue
index b87f6e7..c512cd7 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue
@@ -1,5 +1,5 @@
 <script setup>
-import {onMounted, reactive, ref} from "vue";
+import {onMounted, reactive, ref, watch} from "vue";
 import {useI18n} from "vue-i18n";
 import {Search} from "@element-plus/icons-vue";
 import request from "@/utils/request";
@@ -76,6 +76,18 @@
 })
 
 const xGrid = ref()
+
+// 娣诲姞鐩戝惉鍣� - 鐩戝惉鑶滅郴閫夋嫨鍙樺寲
+watch(optionVal, (newVal, oldVal) => {
+  if (oldVal !== undefined && newVal !== oldVal) {
+    // 褰撹啘绯绘敼鍙樻椂锛岃嚜鍔ㄥ埛鏂版暟鎹�
+    if (newVal) {
+      selectFlowCardList();
+    }
+  }
+});
+
+
 const gridOptions = reactive({
 
   height: '100%',
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCardDetail.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCardDetail.vue
index 21d790a..053a9ff 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCardDetail.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCardDetail.vue
@@ -96,8 +96,18 @@
     }
 );
 
+
+watch(() => props.technologyNumber,
+    (newValue, oldValue) => {
+  if (props.technologyNumber != null) {
+    getWorkOrder();
+  }
+});
+
+
 const getWorkOrder = () => {
-  if (props.processId!=null || props.processId!=""){
+  if ((props.processId != null && props.processId != "") && 
+      (props.technologyNumber != null && props.technologyNumber != "")) {
     request.post(`/glassOptimize/getProcessCardDetail/${props.processId}/${props.technologyNumber}`).then((res) => {
       if(res.code==200){
         xGrid.value.loadData(res.data.data)
@@ -106,7 +116,6 @@
       }
     })
   }
-
 }
 </script>
 
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue
index 2c030f3..48ae345 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue
@@ -609,11 +609,9 @@
           return formattedItem;
         });
         data.forEach(item => {
+
           if(formattedData[0].autoFillEdge==="true"){
-            item.longGrind1=0
-            item.longGrind2=0
-            item.shortGrind1=0
-            item.shortGrind2=0
+
             if(item.width>=formattedData[0].minAutoLenght){
               item.longGrind1 = formattedData[0].leftEdge;
               item.longGrind2 = formattedData[0].rightEdge;
@@ -623,6 +621,10 @@
               item.shortGrind2 = formattedData[0].downEdge;
             }
           }
+          item.longGrind1=0
+          item.longGrind2=0
+          item.shortGrind1=0
+          item.shortGrind2=0
           item.height=parseFloat(item.height.toFixed(2))
           item.width=parseFloat(item.width.toFixed(2))
 
diff --git a/north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue b/north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue
index 266ed08..2472063 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue
@@ -2,7 +2,7 @@
 
 import request from "@/utils/request"
 import deepClone from "@/utils/deepClone"
-import {ElDatePicker, ElMessage} from "element-plus"
+import {ElCheckbox, ElDatePicker, ElMessage} from "element-plus"
 import useProductGlassTypeStore from "@/stores/sd/product/productGlassType"
 import {nextTick, onMounted, onUnmounted, reactive, ref, watch} from "vue"
 import {ArrowLeftBold, Search} from "@element-plus/icons-vue"
@@ -33,6 +33,22 @@
   }
   flag = !flag
 }
+
+//鍊掑彊
+let  flashback = ref(1)
+
+//瀹氫箟鎺掑簭瑙勫垯
+const optionVal = ref(0)
+const options = [
+  {
+    value: 0,
+    label: t('processCard.mainWidth'),
+  },
+  {
+    value: 1,
+    label: t('processCard.mainHeight'),
+  },
+]
 
 //瀹氫箟鏃堕棿
 const form = reactive({
@@ -101,6 +117,10 @@
 
     })
     produceList = produceList.value.concat(deepClone(res.data.data))
+    produceList.forEach(item => {
+      // 濡傛灉 shape 鍙兘鏄瓧绗︿覆灏辩敤 ==锛屽鏋滀竴瀹氭槸鏁板瓧灏辩敤 ===
+      item.shape = (item.shape == 2) ? t('order.alien') : t('order.universalShape');
+    });
     xGrid.value.reloadData(produceList)
     gridOptions.loading = false
   } else {
@@ -152,10 +172,10 @@
       spacerThickness: 0,
       inWeight: 4000,
       inMaxQuantity: 20,
-      inLenMin:400,
+      inLenMin:350,
       inLenMax:3500,
       inShortMax:2500,
-      inShortMin:400
+      inShortMin:350
     },
     rules:{
       shelfThickness: [
@@ -263,9 +283,12 @@
   ],//琛ㄥご鎸夐挳
 
   toolbarConfig: {
-    // buttons: [{
-    //
-    // }],
+    slots:{
+      buttons: "toolbar_buttons"
+    },
+    buttons: [{
+
+    }],
     // import: false,
     // export: true,
     // print: true,
@@ -300,6 +323,49 @@
 
 })
 const gridEventsRight = {
+  toolbarButtonClick({code}) {
+    const $grid = xGridLeft.value
+    if ($grid) {
+      switch (code) {
+        case 'sorting': {
+          request.post(`/processCard/selectSortingCard/${orderId}/${productionId}/${flashback.value}/${optionVal.value}`, filterData.value).then((res) => {
+
+            if (res.code == 200) {
+              pageTotal.value = res.data.total
+              maxProcseeId=res.data.maxFlowCard[0].process_id
+              orderOtherMoney.value = res.data.orderOtherMoney
+              orderOtherMoney.value.forEach(item => {
+                let column = {
+                  field: `${item.column}`,
+                  width: 100,
+                  title: item.alias,
+                  filters: [{data: ''}],
+                  slots: {filter: 'num1_filter'},
+                  filterMethod: filterChanged,
+                  sortable: true
+                }
+
+                gridOptions.columns.push(column)
+
+              })
+              produceList = res.data.data
+              produceList.forEach(item => {
+                // 濡傛灉 shape 鍙兘鏄瓧绗︿覆灏辩敤 ==锛屽鏋滀竴瀹氭槸鏁板瓧灏辩敤 ===
+                item.shape = (item.shape == 2) ? t('order.alien') : t('order.universalShape');
+              });
+              xGrid.value.reloadData(produceList)
+              gridOptions.loading = false
+            } else {
+              ElMessage.warning(res.msg)
+            }
+          })
+          return;
+
+        }
+
+      }
+    }
+  },
   formSubmit () {
     let form = gridOptions.formConfig.data
     form.orderId =orderId
@@ -440,92 +506,89 @@
     ElMessage.warning(t('processCard.schedulingOk'))
     return
   }
-  //productionId
+
   const $gridLeft = xGridLeft.value
   const leftData = $gridLeft.getTableData().fullData
+
+  //钀芥灦椤哄簭
   let index = 1
   if (leftData.length !== 0) {
-    index = leftData[0].landingSequence + 1
-    //index = index.toString().padStart(2, '0')
+    index = Math.max(...leftData.map(d => d.landingSequence || 0)) + 1
   }
-  let processId= null
-  // if (leftData.length !== 0){
-  //   processId = productionId + index.toString().padStart(3, '0')
-  // }
-  // else {
-    if (maxProcseeId!== null || maxProcseeId!== undefined|| maxProcseeId!== ''){
-      if (leftData.length !== 0){
-        const str=leftData[0].processId
-        const lastThree = str.slice(-3);
-        const result =  lastThree*1 + 1;
-        processId= productionId + result.toString().padStart(3, '0')
-      }
-      else {
-        // 鎴彇鍚庝笁浣�
-        const lastThree = maxProcseeId.slice(-3);
-        const result =  lastThree*1 + 1;
-        processId= productionId + result.toString().padStart(3, '0')
-      }
 
-    }
-    else {
-      processId = productionId + index.toString().padStart(3, '0')
-    }
-  //}
+  // 娴佺▼鍗″彿
+  let processId = null
+  if (maxProcseeId) {
+    const base = leftData.length !== 0 ? leftData[0].processId : maxProcseeId
+    const lastThree = base.slice(-3)
+    const result = parseInt(lastThree) + 1
+    processId = productionId + result.toString().padStart(3, '0')
+  } else {
+    processId = productionId + index.toString().padStart(3, '0')
+  }
 
-
-  const regex = /^(\d+|)$/;
+  const regex = /^(\d+|)$/
   if (!regex.test(checkedNum.value)) {
     ElMessage.warning(t('processCard.schedulingNo'))
     return
   }
-  //鍒ゆ柇姝f暣鏁�
-  if (/^[1-9]\d*$/.test(checkedNum.value)) {
-    checkedList.forEach((item) => {
-      //瀹氫箟key鍊间繚鎸�
-      //鍒ゆ柇鍙敤鏁伴噺鏄惁澶т簬绛変簬杈撳叆鐨勬暟閲�,涓嶆弧瓒冲垯鎶涘嚭寮傚父
-      if (item.baiscQuantity * 1 < checkedNum.value * 1) throw new Error(t('processCard.schedulingQuantity'));
-      item.quantity = checkedNum.value
-      item.processId = processId
-      item.landingSequence = index
-      item.baiscQuantity = item.baiscQuantity - checkedNum.value
-      item.computeGrossArea = (item.computeGrossArea - item.width * item.height * checkedNum.value / 1000000).toFixed(2)
 
-      //鍒犻櫎key
-      let key = item._X_ROW_KEY
-      delete item._X_ROW_KEY
-      if (item.baiscQuantity === 0) {
-        $grid.remove(item)
-      }
-      $gridLeft.insertAt(item)
-      //閲嶆柊璧嬪�糼ey
-      item._X_ROW_KEY = key
-    })
+  try {
+    if (/^[1-9]\d*$/.test(checkedNum.value)) {
+      //鏈夎緭鍏ユ暟閲�
+      checkedList.forEach((item) => {
+        if (item.baiscQuantity < checkedNum.value * 1) {
+          throw new Error(t('processCard.schedulingQuantity'))
+        }
+        item.quantity = checkedNum.value * 1
+        item.processId = processId
+        item.landingSequence = index  // 鉁� 鍚屼竴鎵规锛岃惤鏋堕『搴忎竴鑷�
+        item.baiscQuantity -= checkedNum.value * 1
+        item.computeGrossArea = (
+            item.computeGrossArea - item.width * item.height * checkedNum.value / 1000000
+        ).toFixed(2)
 
-    //娓呴櫎涓よ竟澶嶉�夋
+        const key = item._X_ROW_KEY
+        delete item._X_ROW_KEY
+
+        if (item.baiscQuantity === 0) {
+          $grid.remove(item)
+        }
+
+        const currentLeft = $gridLeft.getTableData().fullData
+        $gridLeft.clearSort()
+        $gridLeft.loadData([...currentLeft, item])
+        item._X_ROW_KEY = key
+      })
+    } else if (checkedNum.value === '') {
+      //娌℃湁杈撳叆鏁伴噺
+      checkedList.forEach((item) => {
+        item.processId = processId
+        item.landingSequence = index
+        item.quantity = item.baiscQuantity
+        delete item._X_ROW_KEY
+      })
+
+      $grid.remove(checkedList)
+      const currentLeft = $gridLeft.getTableData().fullData
+      $gridLeft.clearSort()
+      $gridLeft.loadData([...currentLeft, ...checkedList])
+    }
+
     $gridLeft.clearCheckboxRow()
     $grid.clearCheckboxRow()
-  } else if (checkedNum.value === '') {//鍒ゆ柇鏁伴噺杈撳叆妗嗘棤杈撳叆鏁板瓧
+    checkedNum.value = ''
 
-    checkedList.forEach((item) => {
-      item.processId = processId
-      item.landingSequence = index
-      item.quantity = item.baiscQuantity
-    })
-    //鍒犻櫎key
-    checkedList.forEach((item) => {
-      delete item._X_ROW_KEY
-    })
-    $gridLeft.insertAt(checkedList)
-    $grid.remove(checkedList)
-    //娓呴櫎涓よ竟澶嶉�夋
-    $gridLeft.clearCheckboxRow()
-    $grid.clearCheckboxRow()
-  }
-  if (checkedNum.value){
-    checkedNum.value =''
+    // 鎻掑叆鍚庤瑙夋帓搴�
+    // $nextTick(() => {
+    //   $gridLeft.sort('landingSequence', 'asc')
+    // })
+  } catch (e) {
+    ElMessage.warning(e.message )
   }
 }
+
+
 
 
 //鎸夌紪鍙峰垱寤烘祦绋嬪崱
@@ -964,6 +1027,10 @@
   weight.value = parseFloat(weightsum.toFixed(2));
 };
 
+//鍊掑簭璧嬪��
+function onFlashbackChange(checked) {
+  flashback.value = checked ? 0 : 1
+}
 </script>
 
 <template>
@@ -1048,14 +1115,56 @@
             <vxe-grid
                 id="rightTable"
                 ref="xGrid"
-                checkbox-config="{ reserve: true, strict: true }"
+                :checkbox-config="{labelField: 'name', highlight: true, range: true,reserve: true, strict: true}"
                 class="mytable-scrollbar"
                 height="100%"
                 v-bind="gridOptions"
                 v-on="gridEventsRight"
                 @checkbox-change="handleCheckboxChange"
                 @checkbox-all="handleCheckboxChange"
+                @checkbox-range-end="handleCheckboxChange"
             >
+
+              <!-- 鑷畾涔� toolbar_buttons 鎻掓Ы -->
+              <template #toolbar_buttons="{ $grid }">
+
+
+                <!-- 鎵嬪姩鍐欏嚭鎵�鏈夋寜閽� -->
+                &nbsp;
+                <el-select
+                    :default-first-option="true"
+                    ref="getSelect" style="width: 80px"
+                    v-model="optionVal"
+                    class="m-2"
+                >
+                  <el-option
+                      v-for="item in options"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value"
+                  />
+                </el-select>
+                &nbsp;
+                <el-button
+                    type="primary"
+                    style="margin-right:8px;width: 50px"
+                    @click="$grid.dispatchEvent('toolbar-button-click', { code: 'sorting' })"
+                >
+                  {{ t('processCard.sorting') }}
+                </el-button>
+
+                <el-checkbox
+                    :model-value="flashback === 0"
+                    @change="onFlashbackChange"
+                >
+                  {{ t('processCard.flashback') }}
+                </el-checkbox>
+
+
+              </template>
+
+
+
               <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
               <!--      涓嬫媺鏄剧ず鎵�鏈変俊鎭彃妲�-->
               <template #content="{ row }">
diff --git a/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCard.vue b/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCard.vue
index 062129b..4c4a3b3 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCard.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCard.vue
@@ -22,6 +22,9 @@
 import {CircleCheck, Download, Printer} from "@element-plus/icons-vue/global";
 import TagStyleDesigner from "@/components/pp/TagStyleDesigner.vue";
 import useUserInfoStore from "@/stores/userInfo";
+import { ElCheckbox } from 'element-plus'
+
+
 const company = companyInfo()
 const userStore = useUserInfoStore()
 const userId = userStore.user.userId
@@ -62,7 +65,11 @@
   list: null,
   printMergeVal: null,
   like: null,
-  merge: null
+  merge: null,
+  printFc:null,
+  flashback:null,
+  landingSequence:null,
+  compound:null
 })
 
 //鏍囩
@@ -73,6 +80,12 @@
   lableType: null//鏍囩绫诲瀷
 })
 
+//鍊掑彊
+let  flashback = ref(1)
+//钀芥灦椤哄簭
+let landingSequence= ref(1)
+//鍚堟灦鎵撳嵃
+let compound = ref(null)
 
 const getTableRow = (row, type) => {
   switch (type) {
@@ -191,6 +204,7 @@
 let orderId = route.query.orderId
 data.value.printList = JSON.parse(route.query.printList)
 
+let printFc = route.query.printNumberFc
 let inquiryMode = route.query.checkedValue
 
 // 绗竴娆″姞杞芥煡璇�
@@ -209,7 +223,6 @@
     gridOptions.loading = false
 
 
-    hideButton();
     hideHead()
   } else {
     ElMessage.warning(res.msg)
@@ -234,6 +247,7 @@
 
 
 const gridOptions = reactive({
+  toolbar: true,
   loading: true,
   border: "full",//琛ㄦ牸鍔犺竟妗�
   keepSource: true,//淇濇寔婧愭暟鎹�
@@ -302,10 +316,11 @@
       field: 'technology_number',
       title: t('processCard.technologyNumber'),
       showOverflow: "ellipsis",
-      width: 110,
+      width: 120,
       filters: [{data: ''}],
       slots: {filter: 'num1_filter'},
       filterMethod: filterChanged,
+      sortable: true
     },
     {field: 'glass_address', title: t('processCard.glassAddress'), width: 90},
     {field: 'quantity', title: t('order.quantity'), width: 90},
@@ -339,14 +354,15 @@
   ],//琛ㄥご鎸夐挳
 
   toolbarConfig: {
+    slots:{
+      buttons: "toolbar_buttons"
+    },
     buttons: [
-      {code: 'print', name: t('processCard.print'), status: 'primary'},
-      {code: 'customLabel', name: t('processCard.customLabelPrinting'), status: 'primary'},
-      {code: 'printLabel', name: t('processCard.labelPrinting'), status: 'primary'},
-      {code: 'printLabel2', name: t('processCard.labelPrinting2'), status: 'primary'},
-      {code: 'sortTable', name: t('processCard.sortSummary'), status: 'primary'},
-      // {code: 'printTest', name: "娴嬭瘯鎵撳嵃", status: 'primary'},
-      // {code: 'printLike', name: "鍚岄厤缃墦鍗�", status: 'primary'},
+      // {code: 'print', name: t('processCard.print'), status: 'primary'},
+      // {code: 'customLabel', name: t('processCard.customLabelPrinting'), status: 'primary'},
+      // {code: 'printLabel', name: t('processCard.labelPrinting'), status: 'primary'},
+      // {code: 'printLabel2', name: t('processCard.labelPrinting2'), status: 'primary'},
+      // {code: 'sortTable', name: t('processCard.sortSummary'), status: 'primary'},
     ],
     // import: false,
     // export: true,
@@ -406,6 +422,10 @@
           printRow.value.printMergeVal = printMerge.value
           printRow.value.like = null
           printRow.value.merge = company.flowCardMerge
+          printRow.value.printFc= printFc
+          printRow.value.flashback = flashback.value
+          printRow.value.landingSequence=landingSequence.value
+          printRow.value.compound = compound.value
           // router.push({path: '/main/processCard/printProcess', query: {printList: JSON.stringify(selectRecords),printMerge:printMergeVal}})
           if(company.companyName=='甯稿窞甯傚悏鍒╃幓鐠冩湁闄愬叕鍙�'){
             dialogTableVisibleStraight.value = true
@@ -653,29 +673,21 @@
   addListener(xGridDetail.value, detailGridOptions)
 }
 
-const hideButton = () => {
-  // 鏍规嵁鏉′欢鍊� hidePrintLabels 杩囨护鎸夐挳鏁扮粍
-  gridOptions.toolbarConfig.buttons = gridOptions.toolbarConfig.buttons.filter(button => {
-    // 鏍规嵁 hidePrintLabels 杩囨护 printLabel 鍜� printLabel2 鎸夐挳
-    if (hidePrintLabels === 'true') {
-      if (button.code === 'printLabel' || button.code === 'printLabel2') {
-        return false; // 闅愯棌 printLabel 鍜� printLabel2
-      }
-    }
-    // 濡傛灉 printBtn 涓� '1'锛屽垯闅愯棌 customLabel 鎸夐挳
-    if (btnType == 1 && button.code === 'customLabel') {
-      console.log('Hiding customLabel button');
-      return false; // 闅愯棌 customLabel 鎸夐挳
-    }
 
-    // 榛樿鎯呭喌涓嬭繑鍥� true锛屼繚鐣欏叾浠栨寜閽�
-    return true;
-  });
+//鍒ゆ柇鏌愪釜鎸夐挳 code 鏄惁瑕佹樉绀�
+function isButtonVisible(code) {
+  // 濡傛灉瑕侀殣钘� printLabel/printLabel2
+  if (hidePrintLabels && (code === 'printLabel' || code === 'printLabel2')) {
+    return false
+  }
+  // 濡傛灉 btnType 涓� 1锛岃闅愯棌 customLabel
+  if (btnType === 1 && code === 'customLabel') {
+    return false
+  }
+  return true
 }
 
-
 const hideHead = () => {
-
   // 鍒ゆ柇 btnType 鏄惁绛変簬 '1' (鍙互鏍规嵁闇�瑕佽皟鏁翠负鏁板瓧 1)
   if (btnType == 1) {
     const headDiv = document.querySelector('.head');
@@ -700,6 +712,13 @@
   })
 }
 
+function onFlashbackChange(checked) {
+  flashback.value = checked ? 0 : 1
+}
+
+function onlandingSequenceChange(checked) {
+  landingSequence.value = checked ? 0 : 1
+}
 </script>
 
 <template>
@@ -748,8 +767,77 @@
           v-bind="gridOptions"
           v-on="gridEvents"
 
-
       >
+        <!-- 鑷畾涔� toolbar_buttons 鎻掓Ы -->
+        <template #toolbar_buttons="{ $grid }">
+
+
+          <!-- 鎵嬪姩鍐欏嚭鎵�鏈夋寜閽� -->
+          <el-button
+              v-if="isButtonVisible('print')"
+              type="primary"
+              style="margin-right:8px;"
+              @click="$grid.dispatchEvent('toolbar-button-click', { code: 'print' })"
+          >
+            {{ t('processCard.print') }}
+          </el-button>
+
+          <el-button
+              v-if="isButtonVisible('customLabel')"
+              type="primary"
+              style="margin-right:8px;"
+              @click="$grid.dispatchEvent('toolbar-button-click', { code: 'customLabel' })"
+          >
+            {{ t('processCard.customLabelPrinting') }}
+          </el-button>
+
+          <el-button
+              v-if="isButtonVisible('printLabel')"
+              type="primary"
+              style="margin-right:8px;"
+              @click="$grid.dispatchEvent('toolbar-button-click', { code: 'printLabel' })"
+          >
+            {{ t('processCard.labelPrinting') }}
+          </el-button>
+
+          <el-button
+              v-if="isButtonVisible('printLabel2')"
+              type="primary"
+              style="margin-right:8px;"
+              @click="$grid.dispatchEvent('toolbar-button-click', { code: 'printLabel2' })"
+          >
+            {{ t('processCard.labelPrinting2') }}
+          </el-button>
+
+          <el-button
+              v-if="isButtonVisible('sortTable')"
+              type="primary"
+              style="margin-right:8px;"
+              @click="$grid.dispatchEvent('toolbar-button-click', { code: 'sortTable' })"
+          >
+            {{ t('processCard.sortSummary') }}
+          </el-button>
+
+          <el-checkbox
+              :model-value="flashback === 0"
+              @change="onFlashbackChange"
+          >
+            {{ t('processCard.flashback') }}
+          </el-checkbox>
+          <el-checkbox
+              :model-value="landingSequence === 0"
+              @change="onlandingSequenceChange"
+          >
+            {{ t('processCard.landingSequence') }}
+          </el-checkbox>
+          <el-input
+              v-model="compound"
+              :placeholder="$t('processCard.printCompound')"
+              clearable
+              style="margin-left:20px; width: 110px;"
+          />
+
+        </template>
         <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
         <!--      涓嬫媺鏄剧ず鎵�鏈変俊鎭彃妲�-->
         <template #content="{ row }">
@@ -804,7 +892,11 @@
           :printLike="printRow.like"
           :printList="printRow.list"
           :printMerge="printRow.printMergeVal"
+          :printFc="printRow.printFc"
           :merges="printRow.merge"
+          :flashback = "printRow.flashback"
+          :landingSequence = "printRow.landingSequence"
+          :compound = "printRow.compound"
           style="width: 100%;height: 100%"/>
     </el-dialog>
 
diff --git a/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCardDetails.vue b/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCardDetails.vue
index efa5037..2e52072 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCardDetails.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCardDetails.vue
@@ -2,7 +2,7 @@
 
 import request from "@/utils/request"
 import deepClone from "@/utils/deepClone"
-import {ElDatePicker, ElMessage} from "element-plus"
+import {ElCheckbox, ElDatePicker, ElMessage} from "element-plus"
 import {nextTick, onMounted, onUnmounted, reactive, ref, watch} from "vue"
 import {useRouter} from 'vue-router'
 import {useI18n} from 'vue-i18n'
@@ -50,7 +50,8 @@
   technologyNumber: null,
   process: null
 })
-
+//钀芥灦椤哄簭
+let landingSequence= ref(1)
 //鎵撳嵃
 let printRow = ref({
   list: null,
@@ -64,7 +65,8 @@
   faceOrientation: null,//鍐呭闈�
   type: null,//鏍囩妯℃澘
   lableType: null,//鏍囩绫诲瀷
-  dataType: null//鏍囩绫诲瀷
+  dataType: null,
+  landingSequence:null
 })
 
 
@@ -223,6 +225,7 @@
   hiprintTemplate.value.print(object)
 
 }
+const orderOtherMoney = ref(null)
 
 const {currentRoute} = useRouter()
 const route = currentRoute.value
@@ -241,7 +244,21 @@
         newDataCollection.push(item);
       })
     }
+    orderOtherMoney.value = res.data.orderOtherMoney
+    orderOtherMoney.value.forEach(item => {
+      let column = {
+        field: `${item.column}`,
+        width: 100,
+        title: item.alias,
+        filters: [{data: ''}],
+        slots: {filter: 'num1_filter'},
+        filterMethod: filterChanged,
+        sortable: true
+      }
 
+      gridOptions.columns.push(column)
+
+    })
     titleSelectJson.value.dataType = res.data.type
     xGrid.value.reloadData(newDataCollection)
     gridOptions.loading = false
@@ -338,14 +355,16 @@
       title: t('order.OrderNum'),
       filters: [{data: ''}],
       slots: {filter: 'num1_filter'},
-      filterMethod: filterChanged, width: 100
+      filterMethod: filterChanged, width: 120
+      , sortable: true
     },
     {
       field: 'technology_number',
       title: t('processCard.technologyNumber'),
       filters: [{data: ''}],
       slots: {filter: 'num1_filter'},
-      filterMethod: filterChanged, width: 100
+      filterMethod: filterChanged, width: 120
+      , sortable: true
     },
     {
       field: 'width',
@@ -698,7 +717,7 @@
               id += selectRecords[i].id + "|"
             }
           }
-
+          labelRow.value.landingSequence = landingSequence
           labelRow.value.list = JSON.stringify(selectRecords)
           labelRow.value.faceOrientation = faceOrientation
           labelRow.value.type = type
@@ -803,6 +822,10 @@
     }
   })
 }
+
+function onlandingSequenceChange(checked) {
+  landingSequence.value = checked ? 0 : 1
+}
 </script>
 
 <template>
@@ -839,6 +862,13 @@
             :value="item.value"
         />
       </el-select>
+      &nbsp;
+      <el-checkbox
+          :model-value="landingSequence === 0"
+          @change="onlandingSequenceChange"
+      >
+        {{ t('processCard.landingSequence') }}
+      </el-checkbox>
     </div>
 
     <div class="main-table">
@@ -974,6 +1004,7 @@
                           :lableType="labelRow.lableType"
                           :list="labelRow.list"
                           :type="labelRow.type"
+                          :landingSequence="labelRow.landingSequence"
                           style="width: 100%;height: 100%"/>
     </el-dialog>
 
diff --git a/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintLabel.vue b/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintLabel.vue
index 8706999..cbba23a 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintLabel.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/processCard/PrintLabel.vue
@@ -15,6 +15,7 @@
 let labelList = ref([])
 let projectNo = ref([])
 let type = ref([])
+let printStyle = ref([])
 let orderId = ref([])
 const data = ref({
   printList: []
@@ -29,10 +30,13 @@
 const printType=route.query.printType
 projectNo.value = route.query.projectNo
 type.value = route.query.type
+printStyle.value = route.query.printStyle
 
 
 
 onMounted(() => {
+      console.log(printStyle.value)
+      console.log(type)
       if (localStorage.getItem('hasRefreshed')=="false") {
         // 璁剧疆鏍囧織锛岃〃绀哄凡缁忓埛鏂拌繃
         localStorage.setItem('hasRefreshed', 'true');
@@ -161,8 +165,8 @@
   <el-input v-if="!company.showDeliveryCreator" v-model="remarks" style="background-color: transparent;border: none;margin-top: -20px;width: 100px"/>
   <div id="printFlowCard" >
 <!--     鍗婃垚鍝佹爣绛�-->
-    <template v-for="(item,id) in labelList">
-    <div v-if="type!=='3'" id="entirety" >
+    <template v-if="type!=='3'&&printStyle==='1'" v-for="(item,id) in labelList">
+    <div  id="entirety" >
       <div  class="row1" >
 <!--閽㈠寲鐗堝浘搴忓彿锛岄挗鍖栫増鍥鹃噷鐨勯『搴�-->
 <!--        <div class="cell" v-if="item.heat_layout_id!==undefined">{{ item.heat_layout_id }}/{{ item.heat_layout_sort }}</div>-->
@@ -222,8 +226,8 @@
 
 
 <!--鎴愬搧鍚嶇О-->
-    <template v-if="type==='3'"  v-for="(item,id) in labelList">
-      <div v-if="type==='3'" id="entirety" v-for="n in item.quantity" >
+    <template v-if="type==='3'&&printStyle==='1'"  v-for="(item,id) in labelList">
+      <div  id="entirety" v-for="n in item.quantity" >
 
         <div class="row1" v-if="item.heat_layout_id!=null">
 
@@ -265,6 +269,114 @@
         </div>
       </div>
       <div class="element-to-break-after" v-if="(id+1)%44==0"></div>
+    </template>
+
+
+
+
+
+
+
+    <template v-if="type!=='3'&&printStyle==='2'" v-for="(item,id) in labelList">
+      <div id="entirety1" >
+
+        <div  class="row1" >
+          <!--閽㈠寲鐗堝浘搴忓彿锛岄挗鍖栫増鍥鹃噷鐨勯『搴�-->
+          <!--        <div class="cell" v-if="item.heat_layout_id!==undefined">{{ item.heat_layout_id }}/{{ item.heat_layout_sort }}</div>-->
+          <span >{{ item.customer_name }}</span>
+
+          <template v-if="company.showDeliveryCreator">
+            <span v-if="item.process.includes('澶硅兌')||item.process.includes('澶瑰眰')">鑳剁墖</span>
+            <span v-else-if="item.process.includes('涓┖')">涓┖</span>
+            <span v-else-if="item.process.includes('鐧惧彾')">鐧惧彾</span>
+            <span v-else></span>
+          </template>
+
+          <!--stock_id 鐗堝浘-->
+          <!--        <div class="cell1" v-if="item.stock_id!=undefined">{{ item.stock_id+'/'+item.polys_id }}</div>-->
+
+        </div>
+        <div v-if="item.customer_name!==undefined" class="row9">
+          <span v-if="company.showDeliveryCreator">{{ item.order_id }}</span>
+          <span v-if="!company.showDeliveryCreator">{{ item.process_id }}</span>
+        </div>
+        <div class="row3" v-if="item.other_columns!=null&&(JSON.parse(item.other_columns).S02!=null)">
+        <span v-if="item.heat_layout_id!==undefined && company.showDeliveryCreator"  style="font-size: 7pt;">
+          ({{ item.stock_id }}) {{ item.heat_layout_id }}/{{ item.heat_layout_sort }}
+        </span>
+          <span v-if="item.stock_id!==undefined && !company.showDeliveryCreator"  style="font-size: 7pt">
+              {{ item.stock_id }}/{{ item.polys_id }}
+        </span>
+          {{JSON.parse(item.other_columns).S02}}={{item.quantity}}
+        </div>
+        <div class="row3" v-else>
+        <span v-if="item.heat_layout_sort!==undefined && company.showDeliveryCreator" >
+          ({{ item.stock_id }}) {{ item.heat_layout_id }}/{{ item.heat_layout_sort }}
+        </span>
+          <span v-if="item.stock_id!==undefined && !company.showDeliveryCreator"  >
+              {{ item.stock_id }}/{{ item.polys_id }}
+        </span>
+          {{Math.round(item.width)}}x{{Math.round(item.height)}}={{item.quantity}}
+        </div>
+        <div v-if="item.customer_name!==undefined" class="row5">
+          <span>{{item.project}}</span>&nbsp;
+          <span>{{item.building_number?item.building_number.replace(/\r|\n|\s/g,''):''}}</span>&nbsp;
+          <span v-if="item.bend_radius!=null">R={{item.bend_radius}}</span>&nbsp;
+        </div>
+        <div v-if="item.customer_name!==undefined" class="row6">
+          <span>{{item.glass_child}}</span>&nbsp;
+          <span v-if="company.showDeliveryCreator" style="font-size: 8pt" >{{item.processing_note}}</span>
+          <span v-else style="font-size: 8pt"></span>
+
+          <br v-if="!company.showDeliveryCreator" />
+          <span v-if="!company.showDeliveryCreator" style="font-size: 8pt;margin-top: -10px">{{item.product_name}}</span>
+        </div>
+      </div>
+      <div class="element-to-break-after" v-if="(id+1)%18==0"></div>
+    </template>
+
+
+
+    <template v-if="type==='3'&&printStyle==='2'" v-for="(item,id) in labelList">
+      <div  id="entirety1" v-for="n in item.quantity" >
+
+        <div class="row1" v-if="item.heat_layout_id!=null">
+          <span>{{ item.customer_name }}</span>&nbsp;
+        </div>
+        <div class="row1" v-else>
+          <span >{{ item.customer_name }}</span>&nbsp;
+        </div>
+        <div class="row2"  >
+          <span > {{item.order_id}}</span>&nbsp;
+          <span >{{ remarks }}</span>&nbsp;
+        </div>
+        <div class="row3" v-if="item.other_columns!=null&&(JSON.parse(item.other_columns).S02!=null)">
+        <span v-if="item.heat_layout_id!==null && company.showDeliveryCreator"  >
+          ({{ item.stock_id }}) {{ item.heat_layout_id }}/{{ item.heat_layout_sort }}
+        </span>
+          <span v-if="item.stock_id!==null && !company.showDeliveryCreator" >
+              {{ item.stock_id }}/{{ item.polys_id }}
+        </span>
+          {{JSON.parse(item.other_columns).S02}}={{item.quantity}}
+        </div>
+        <div class="row3" v-else>
+        <span v-if="item.heat_layout_id!==null && company.showDeliveryCreator"  >
+         ({{ item.stock_id }}) {{ item.heat_layout_id }}/{{ item.heat_layout_sort }}
+        </span>
+          <span v-if="item.stock_id!==null && !company.showDeliveryCreator"  >
+              {{ item.stock_id }}/{{ item.polys_id }}
+        </span>
+          {{Math.round(item.width)}}x{{Math.round(item.height)}}={{item.quantity}}
+        </div>
+
+        <div class="row5">
+          <span style="white-space: pre-wrap;">{{ item.building_number?item.building_number.replace(/\r|\n|\s/g,''):'' }}</span>
+          <span v-if="item.bend_radius!=null">R={{item.bend_radius}}</span>
+        </div>
+        <div class="row6">
+          <span style="font-size: 10pt">{{item.glass_child}}</span>&nbsp;
+        </div>
+      </div>
     </template>
 
   </div>
@@ -324,12 +436,6 @@
 }
 
 
-
-
-
-
-
-
 .row3 {
   margin-top: -5px;
   height: 18px;
@@ -386,6 +492,82 @@
 }
 
 
+#entirety1{
+  text-align: center;
+  width: 240px;
+  height: 170px;
+  margin-bottom: 7px;
+  margin-right: 5px;
+  overflow: hidden;
+  white-space: nowrap;
+}
+
+
+#entirety1 .row1 {
+  font-weight: bold;
+  height: 30px;
+}
+#entirety1 .row1 span {
+  font-size: 15pt;
+  font-weight: bold;
+}
+#entirety1 .row2 span {
+  font-size: 12pt;
+  font-weight: bold;
+}
+
+#entirety1 .row2 {
+  font-weight: bold;
+  height: 30px;
+}
+
+
+
+#entirety1 .row3 {
+  margin-top: -5px;
+  height: 36px;
+  font-size: 25px;
+  font-weight: bolder;
+}
+
+#entirety1 .row3 span {
+  font-size: 15px;
+}
+
+#entirety1 .row9 {
+  margin-top: -15px;
+  height: 40px;
+  font-size: 18pt;
+  font-weight: bolder;
+}
+
+#entirety1 .row9 span {
+  font-size: 15pt;
+  font-weight: bold;
+}
+
+#entirety1 .row5 {
+  height: 30px;
+  font-weight: bold;
+  font-size: 6pt;
+}
+#entirety1 .row5 span {
+  font-size: 15pt;
+  font-weight: bold;
+}
+
+#entirety1 .row6 {
+  margin-top: -10px;
+  height: 50px;
+  font-weight: bold;
+  font-size: 18px;
+}
+#entirety1 .row6 span {
+  white-space: normal;
+  font-size: 16px;
+  font-weight: bold;
+}
+
 
 
 
diff --git a/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintFlowCard.vue b/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintFlowCard.vue
index 66a5a32..b44b520 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintFlowCard.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintFlowCard.vue
@@ -22,7 +22,7 @@
 const printVisible= ref(false)
 const orderInfo = useOrderInfoStore()
 
-
+let printNumberFc = company.printNumber;
 const userStore = useUserInfoStore()
 const userId = userStore.user.userId
 
@@ -131,11 +131,11 @@
 
   if (res.code == 200) {
     produceList = produceList.value.concat(deepClone(res.data.data))
-    gridOptions.toolbarConfig.buttons[2].visible=false
+    /*gridOptions.toolbarConfig.buttons[2].visible=false
     let roleId=res.data.user
     if (roleId=='1' || roleId=='17'){
       gridOptions.toolbarConfig.buttons[2].visible=true
-    }
+    }*/
 
     xGrid.value.reloadData(produceList)
     gridOptions.loading = false
@@ -301,7 +301,10 @@
             }
           }
           let array = orderIdList.split('|');
-         router.push({path: '/main/processCard/PrintFlowCard', query: {printList: JSON.stringify(selectRecords),checkedValue:checkedValue.value.value}})
+          if (selectRecords.length==1){
+            printNumberFc = true
+          }
+         router.push({path: '/main/processCard/PrintFlowCard', query: {printList: JSON.stringify(selectRecords),checkedValue:checkedValue.value.value,printNumberFc:printNumberFc}})
           return;
 
         }
diff --git a/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintProject.vue b/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintProject.vue
index 8a858ec..75896e7 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintProject.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintProject.vue
@@ -30,6 +30,7 @@
 let produceList = ref([])
 let titleStyleVisible = ref(false)
 let print = ref("1")
+let printStyle = ref("1")
 
 //鏍囩
 let labelRow = ref({
@@ -43,6 +44,13 @@
 const company = companyInfo()
 let hidePrintLabels = company.printLabel.hideButton;
 
+//鍊掑彊
+let  flashback = ref(1)
+//钀芥灦椤哄簭
+let landingSequence= ref(1)
+//鍚堟灦鎵撳嵃
+let compound = ref(null)
+
 const form = reactive({
   date1: '',
   orderId: '',
@@ -55,13 +63,16 @@
   printMergeVal: null,
   like: null,
   project:null,
-  merge: null
+  merge: null,
+  flashback:null,
+  compound:null,
+  landingSequence:null,
 })
 const getTableRow = (row, type) => {
   switch (type) {
     case 'edit' :{
       if(parseInt(print.value)==1){
-        router.push({path: '/main/processCard/PrintLabel', query: { projectNo: row.project_no,type:1 }})
+        router.push({path: '/main/processCard/PrintLabel', query: { projectNo: row.project_no,type:1,printStyle:parseInt(printStyle.value) }})
       }else{
         router.push({path: '/main/processCard/PrintCustomLabelSemi2', query: { projectNo: row.project_no,type:1 }})
       }
@@ -70,19 +81,22 @@
     }
     case 'edit1' :{
       if(parseInt(print.value)==1){
-        router.push({path: '/main/processCard/PrintLabel', query: { projectNo: row.project_no,type:2 }})
+        router.push({path: '/main/processCard/PrintLabel', query: { projectNo: row.project_no,type:2,printStyle:parseInt(printStyle.value) }})
       }else{
         router.push({path: '/main/processCard/PrintCustomLabelSemi2', query: { projectNo: row.project_no,type:2 }})
       }
       break
     }
     case 'edit2' :{
-      router.push({path: '/main/processCard/PrintLabel', query: { projectNo: row.project_no,type:3 }})
+      router.push({path: '/main/processCard/PrintLabel', query: { projectNo: row.project_no,type:3,printStyle:parseInt(printStyle.value) }})
       break
     }
     case 'edit3' :{
       printRow.value.project=row.project_no
       printRow.value.merge = company.flowCardMerge
+      printRow.value.flashback = flashback.value
+      printRow.value.compound = compound.value
+      printRow.value.landingSequence=landingSequence.value
       if(company.companyName=='甯稿窞甯傚悏鍒╃幓鐠冩湁闄愬叕鍙�'){
         dialogTableVisibleStraight.value = true
       }else{
@@ -138,7 +152,7 @@
   if (res.code == 200) {
     if(hidePrintLabels=="true"){
       //鍒犻櫎涓嬫媺妗�
-      remove(gridOptions.toolbarConfig.slots)
+      //remove(gridOptions.toolbarConfig.slots)
       const button = {'code': 'printLabel',
         status: 'primary',
         'name': t('processCard.finishedProductPrinting2')}
@@ -265,7 +279,7 @@
     buttons: [
     ],
     slots:{
-      buttons: "toolbar_buttons"
+      buttons: "toolbar_buttons",
     },
     zoom: true,
     custom: true
@@ -417,11 +431,19 @@
         </template>
 
         <template #toolbar_buttons>
+          <vxe-select @change="changeOrderType" v-model="printStyle" >
+            <vxe-option value="1" label="11鍒�4琛�"></vxe-option>
+            <vxe-option value="2" label="6琛�3鍒�"></vxe-option>
+          </vxe-select>
+        </template>
+
+        <template #toolbar_button2>
           <vxe-select @change="changeOrderType" v-model="print" >
             <vxe-option value="1" label="EPSON LQ-82KF ESC/P2"></vxe-option>
             <vxe-option value="2" label="TSC TTP-244Pro"></vxe-option>
           </vxe-select>
         </template>
+
 
 
 
@@ -476,6 +498,9 @@
           :printMerge="printRow.printMergeVal"
           :printProject="printRow.project"
           :merges="printRow.merge"
+          :flashback = "printRow.flashback"
+          :compound = "printRow.compound"
+          :landingSequence = "printRow.landingSequence"
           style="width: 100%;height: 100%"/>
     </el-dialog>
 
diff --git a/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectProcessCard.vue b/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectProcessCard.vue
index 8f8d8d3..f1ab3df 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectProcessCard.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/processCard/SelectProcessCard.vue
@@ -351,6 +351,9 @@
       {code: 'delete', name: t('basicData.delete'), status: 'primary'},
       {code: 'rack', name: t('processCard.combinedFrame'), status: 'primary'},
     ],
+    slots: {
+      tools: 'toolbar_buttons'
+    },
     import: false,
     // export: true,
     // print: true,
@@ -399,6 +402,8 @@
 
             let composingData = ref({
               composing: selectRecords,
+              userId: user.user.userId,
+              userName:user.user.userName
             })
 
             //淇敼鎺掔増鐘舵��
@@ -534,7 +539,41 @@
   reserve: true
 }
 
+function exportExcel(url, fileName,date) {
+  if(date===null){
+    ElMessage.warning(t('report.pleaseSelectADateFirst'))
+    return
+  }
 
+
+  const date1 = new Date(date[0]);
+  const date2 = new Date(date[1]);
+  const timeDiff = Math.abs(date2.getTime() - date1.getTime());
+  const daysDiff = timeDiff / (1000 * 3600 * 24);
+  if(Math.floor(daysDiff)>180){
+    ElMessage.warning(t('report.theFilteringTimeForExportCannotExceed180Days'))
+    return
+  }
+  let dataMp = ref({
+    date: date,
+  })
+  request.post(url,dataMp.value,{responseType :'blob'}).then(res => {
+    const blob = new Blob([res])
+    if ('download' in document.createElement('a')) { // 闈濱E涓嬭浇
+      const elink = document.createElement('a')
+      elink.download = `${fileName}.xlsx`
+      elink.style.display = 'none'
+      elink.href = URL.createObjectURL(blob)
+      document.body.appendChild(elink)
+      elink.click()
+      URL.revokeObjectURL(elink.href) // 閲婃斁URL 瀵硅薄
+      document.body.removeChild(elink)
+    } else { // IE10+涓嬭浇
+      navigator.msSaveBlob(blob, fileName)
+    }
+
+  })
+}
 </script>
 
 <template>
@@ -642,6 +681,13 @@
           >
           </vxe-pager>
         </template>
+        <template #toolbar_buttons>
+          <vxe-button style="margin-right: 0.5rem"
+                      @click="exportExcel('/processCard/exportDateProcess',
+                                          t('order.processCard'),
+                                          orderInfo.workOrderDate)">
+            {{t('basicData.export')}}</vxe-button>
+        </template>
 
       </vxe-grid>
     </div>
diff --git a/north-glass-erp/northglass-erp/src/views/pp/replenish/PrintReplenishFlowCard.vue b/north-glass-erp/northglass-erp/src/views/pp/replenish/PrintReplenishFlowCard.vue
index ee48c1b..39a2e6e 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/replenish/PrintReplenishFlowCard.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/replenish/PrintReplenishFlowCard.vue
@@ -326,6 +326,7 @@
       filterMethod: filterChanged,
       width:110
     },
+    {field: 'batch', width: 90, title: t('order.batch')},
     {
       field: 'order_number',
       title:  t('order.OrderNum'),
diff --git a/north-glass-erp/northglass-erp/src/views/pp/report/DamageReport.vue b/north-glass-erp/northglass-erp/src/views/pp/report/DamageReport.vue
index 9994944..9678c3a 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/report/DamageReport.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/report/DamageReport.vue
@@ -6,7 +6,6 @@
 import deepClone from "@/utils/deepClone";
 import {ElDatePicker, ElMessage} from "element-plus";
 import {useI18n} from 'vue-i18n'
-import exportExcel from "@/hook/exportExcel";
 import footSum from "@/hook/footSum"
 import {changeFilterEvent} from "@/hook"
 //璇█鑾峰彇
@@ -54,15 +53,21 @@
 
 //鑾峰彇涓冨ぉ鍓嶅埌褰撳墠鏃堕棿
 function getNowTime() {
-  const start = new Date(new Date().getTime() - 3600 * 1000 * 24 * 3)
-      .toISOString()
-      .replace('T', ' ')
-      .slice(0, 10) //榛樿寮�濮嬫椂闂�7澶╁墠
-  const end = new Date(new Date().getTime())
-      .toISOString()
-      .replace('T', ' ')
-      .slice(0, 10)//榛樿缁撴潫鏃堕棿褰撳墠鏃堕棿
-  return [start, end]
+  const pad = (n) => n.toString().padStart(2, '0');
+
+  const formatDate = (date) => {
+    const year = date.getFullYear();
+    const month = pad(date.getMonth() + 1);
+    const day = pad(date.getDate());
+    return `${year}-${month}-${day} 08:00:00`;
+  };
+
+  const now = new Date();
+  const startDate = new Date(now.getTime() - 3600 * 1000 * 24 * 3); // 涓夊ぉ鍓�
+  const start = formatDate(startDate);
+  const end = formatDate(now);
+
+  return [start, end];
 }
 
 
@@ -83,7 +88,11 @@
 
 // 浣跨敤 setDate 鏂规硶鍔犱竴澶�
 date.setDate(date.getDate() + 1);
-let newEndTime = date.toISOString().split('T')[0]; // 鑾峰彇 YYYY-MM-DD 鏍煎紡鐨勫瓧绗︿覆
+const pad = (n) => n.toString().padStart(2, '0');
+let year = date.getFullYear();
+let month = pad(date.getMonth() + 1);
+let day = pad(date.getDate());
+let newEndTime = `${year}-${month}-${day} 08:00:00`;
 //绗竴娆″姞杞芥暟鎹�
 request.post(`/report/damageReport/1/${total.pageSize}/${startTime}/${newEndTime}`, filterData.value).then((res) => {
 
@@ -102,13 +111,20 @@
 
 //椤佃剼缈婚〉鏌ヨ
 const selectPageList = () => {
-  let startTime = form.date1[0]
-  let endTime = form.date1[1]
-  let date = new Date(endTime); // 灏嗘棩鏈熷瓧绗︿覆杞负 Date 瀵硅薄
-
-// 浣跨敤 setDate 鏂规硶鍔犱竴澶�
-  date.setDate(date.getDate() + 1);
-  let newEndTime = date.toISOString().split('T')[0]; // 鑾峰彇 YYYY-MM-DD 鏍煎紡鐨勫瓧绗︿覆
+  const rawStart = new Date(form.date1[0]);
+  const rawEnd = new Date(form.date1[1]);
+  // 濡傛灉鏃堕棿閮ㄥ垎鏄� 00:00锛屽垯璁剧疆涓� 08:00
+  if (rawStart.getHours() === 8 || rawStart.getHours() === 0) {
+    rawStart.setHours(8, 0, 0, 0);
+  }
+  if (rawEnd.getHours() === 8 || rawEnd.getHours() === 0) {
+    rawEnd.setHours(8, 0, 0, 0);
+  }
+  const startTime = formatDateTime(rawStart);
+  const endPlusOne = new Date(rawEnd);
+  endPlusOne.setDate(endPlusOne.getDate());
+  const newEndTime = formatDateTime(endPlusOne);
+  form.date1 = [startTime, newEndTime];
   request.post(`/report/damageReport/${pageNum.value}/${total.pageSize}/${startTime}/${newEndTime}`, filterData.value).then((res) => {
     if (res.code == 200) {
 
@@ -121,15 +137,35 @@
   })
 }
 
+const formatDateTime = (date) => {
+  const year = date.getFullYear();
+  const month = pad(date.getMonth() + 1);
+  const day = pad(date.getDate());
+  const hour = pad(date.getHours());
+  const minute = pad(date.getMinutes());
+  return `${year}-${month}-${day} ${hour}:${minute}:00`;
+};
+
+
 //鐐瑰嚮鏌ヨ
 const getWorkOrder = () => {
   gridOptions.loading = true
-  let startTime = form.date1[0]
-  let endTime = form.date1[1]
-  let date = new Date(endTime); // 灏嗘棩鏈熷瓧绗︿覆杞负 Date 瀵硅薄
-// 浣跨敤 setDate 鏂规硶鍔犱竴澶�
-  date.setDate(date.getDate() + 1);
-  let newEndTime = date.toISOString().split('T')[0]; // 鑾峰彇 YYYY-MM-DD 鏍煎紡鐨勫瓧绗︿覆
+  // 鍘熷 form.date1 鏄棩鏈熷璞℃暟缁�
+  const rawStart = new Date(form.date1[0]);
+  const rawEnd = new Date(form.date1[1]);
+  // 濡傛灉鏃堕棿閮ㄥ垎鏄� 00:00锛屽垯璁剧疆涓� 08:00
+  if (rawStart.getHours() === 8 || rawStart.getHours() === 0) {
+    rawStart.setHours(8, 0, 0, 0);
+  }
+  if (rawEnd.getHours() === 8 || rawEnd.getHours() === 0) {
+    rawEnd.setHours(8, 0, 0, 0);
+  }
+
+  const startTime = formatDateTime(rawStart);
+  const endPlusOne = new Date(rawEnd);
+  endPlusOne.setDate(endPlusOne.getDate());
+  const newEndTime = formatDateTime(endPlusOne);
+  form.date1 = [startTime, newEndTime];
   request.post(`/report/damageReport/${pageNum.value}/${total.pageSize}/${startTime}/${newEndTime}`, filterData.value).then((res) => {
 
     if (res.code == 200) {
@@ -170,13 +206,20 @@
   }
   gridOptions.loading = true
 
-  let startTime = form.date1[0]
-  let endTime = form.date1[1]
-  let date = new Date(endTime); // 灏嗘棩鏈熷瓧绗︿覆杞负 Date 瀵硅薄
-
-// 浣跨敤 setDate 鏂规硶鍔犱竴澶�
-  date.setDate(date.getDate() + 1);
-  let newEndTime = date.toISOString().split('T')[0]; // 鑾峰彇 YYYY-MM-DD 鏍煎紡鐨勫瓧绗︿覆
+  const rawStart = new Date(form.date1[0]);
+  const rawEnd = new Date(form.date1[1]);
+  // 濡傛灉鏃堕棿閮ㄥ垎鏄� 00:00锛屽垯璁剧疆涓� 08:00
+  if (rawStart.getHours() === 8 || rawStart.getHours() === 0) {
+    rawStart.setHours(8, 0, 0, 0);
+  }
+  if (rawEnd.getHours() === 8 || rawEnd.getHours() === 0) {
+    rawEnd.setHours(8, 0, 0, 0);
+  }
+  const startTime = formatDateTime(rawStart);
+  const endPlusOne = new Date(rawEnd);
+  endPlusOne.setDate(endPlusOne.getDate());
+  const newEndTime = formatDateTime(endPlusOne);
+  form.date1 = [startTime, newEndTime];
   request.post(`/report/damageReport/1/${total.pageSize}/${startTime}/${newEndTime}`, filterData.value).then((res) => {
 
     if (res.code == 200) {
@@ -244,6 +287,7 @@
       showOverflow: "ellipsis",
       filters:[{ data: '' }],slots: { filter: 'num1_filter' }
     },
+    {field: 'batch', width: 90, title: t('order.batch')},
     {
       field: 'processId', width: 130, title: t('processCard.processId'), filters:[{ data: '' }],slots: { filter: 'num1_filter' }
     },
@@ -302,7 +346,41 @@
 
 })
 
+function exportExcel(url, fileName,date) {
+  if(date===null){
+    ElMessage.warning(t('report.pleaseSelectADateFirst'))
+    return
+  }
 
+
+  const date1 = new Date(date[0]);
+  const date2 = new Date(date[1]);
+  const timeDiff = Math.abs(date2.getTime() - date1.getTime());
+  const daysDiff = timeDiff / (1000 * 3600 * 24);
+  if(Math.floor(daysDiff)>180){
+    ElMessage.warning(t('report.theFilteringTimeForExportCannotExceed180Days'))
+    return
+  }
+  let dataMp = ref({
+    date: date,
+  })
+  request.post(url,dataMp.value,{responseType :'blob'}).then(res => {
+    const blob = new Blob([res])
+    if ('download' in document.createElement('a')) { // 闈濱E涓嬭浇
+      const elink = document.createElement('a')
+      elink.download = `${fileName}.xlsx`
+      elink.style.display = 'none'
+      elink.href = URL.createObjectURL(blob)
+      document.body.appendChild(elink)
+      elink.click()
+      URL.revokeObjectURL(elink.href) // 閲婃斁URL 瀵硅薄
+      document.body.removeChild(elink)
+    } else { // IE10+涓嬭浇
+      navigator.msSaveBlob(blob, fileName)
+    }
+
+  })
+}
 </script>
 
 <template>
@@ -312,9 +390,9 @@
             v-model="form.date1"
             :start-placeholder="$t('basicData.startDate')"
             :end-placeholder="$t('basicData.endDate')"
-            format="YYYY/MM/DD"
+            format="YYYY/MM/DD HH:mm"
             type="daterange"
-            value-format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD HH:mm"
         />
         &nbsp;&nbsp;
         <el-button type="primary" @click="getWorkOrder">{{$t('basicData.search')}}</el-button>
diff --git a/north-glass-erp/northglass-erp/src/views/pp/report/OrderReportingWorks.vue b/north-glass-erp/northglass-erp/src/views/pp/report/OrderReportingWorks.vue
index 1db1d0a..257e77d 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/report/OrderReportingWorks.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/report/OrderReportingWorks.vue
@@ -9,6 +9,7 @@
 import {changeFilterEvent, filterChanged} from "@/hook"
 import exportExcel from "@/hook/exportExcel";
 import footSum from "@/hook/footSum"
+import moment from "moment";
 //璇█鑾峰彇
 const {t} = useI18n()
 let router = useRouter()
@@ -217,6 +218,12 @@
       title: t('processCard.splitFrameTime'),
       type: 'date',
       attrs: {placeholder: '', type: 'date'},
+      formatter: ({ cellValue }) => {
+        if (!cellValue) return ''
+        return moment(cellValue)
+            .utcOffset(8)
+            .format('YYYY-MM-DD HH:mm:ss')
+      }
     }
   ],//琛ㄥご鎸夐挳
 
diff --git a/north-glass-erp/northglass-erp/src/views/pp/report/ProcessToBeCompleted.vue b/north-glass-erp/northglass-erp/src/views/pp/report/ProcessToBeCompleted.vue
index 2852eb0..6109db0 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/report/ProcessToBeCompleted.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/report/ProcessToBeCompleted.vue
@@ -98,7 +98,7 @@
     // total.dataTotal = res.data.total.total*1
     // total.pageTotal= res.data.total.pageTotal
     // pageTotal.value = res.data.total
-    total.value = res.data.footSum
+    //total.value = res.data.footSum
     produceList = produceList.value.concat(deepClone(res.data.data))
     titleSelectJson.value.processType = res.data.process
     xGrid.value.reloadData(produceList)
@@ -123,7 +123,7 @@
   request.post(`/report/selectProcessToBeCompleted/${pageNum.value}/${total.pageSize}/${startTime}/${newEndTime}/${inputVal}`, filterData.value).then((res) => {
     if (res.code == 200) {
 
-      total.value = res.data.footSum
+      //total.value = res.data.footSum
       produceList = deepClone(res.data.data)
       xGrid.value.reloadData(produceList)
     } else {
@@ -156,7 +156,7 @@
       // total.dataTotal = res.data.total.total*1
       // total.pageTotal= res.data.total.pageTotal
       // pageTotal.value = res.data.total
-      total.value = res.data.footSum
+      //total.value = res.data.footSum
       produceList = deepClone(res.data.data)
       xGrid.value.reloadData(produceList)
     } else {
@@ -310,8 +310,7 @@
         }
         const List = ["quantity",'childArea','actualArea','completeNum','completeArea','incompleteNum','incompleteArea']
         if (List.includes(column.field)) {
-          //return footSum(data, column.field)
-          return total.value?.[column.field] ?? 0
+          return footSum(data, column.field)
         }
         return ''
       })
diff --git a/north-glass-erp/northglass-erp/src/views/pp/report/Report.vue b/north-glass-erp/northglass-erp/src/views/pp/report/Report.vue
index 251b88a..a78fd55 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/report/Report.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/report/Report.vue
@@ -46,6 +46,7 @@
 
         <el-sub-menu index="1" >
           <template #title >{{$t('report.productionReport')}}</template>
+          <el-menu-item index="/main/report/WorkInProgressCombination">{{$t('report.WorkInProgressCombination')}}</el-menu-item>
           <el-menu-item index="/main/report/WorkInProgress">{{$t('report.workInProgressReport')}}</el-menu-item>
           <el-menu-item index="/main/report/ProcessToBeCompleted">{{$t('report.processToBeCompleted')}}</el-menu-item>
           <el-menu-item index="/main/report/ProductionSchedule">{{$t('report.productionAndShippingProgress')}}</el-menu-item>
diff --git a/north-glass-erp/northglass-erp/src/views/pp/report/SplittingDetailsOutside.vue b/north-glass-erp/northglass-erp/src/views/pp/report/SplittingDetailsOutside.vue
index 4fd17fe..f2aad7d 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/report/SplittingDetailsOutside.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/report/SplittingDetailsOutside.vue
@@ -96,6 +96,7 @@
   })
 }
 
+const orderOtherMoney = ref(null)
 //鐐瑰嚮鏌ヨ
 const getWorkOrder = () => {
   let inputVal = form.orderId
@@ -108,6 +109,21 @@
       // total.dataTotal = res.data.total.total*1
       // total.pageTotal= res.data.total.pageTotal
       // pageTotal.value = res.data.total
+      orderOtherMoney.value = res.data.orderOtherMoney
+      orderOtherMoney.value.forEach(item => {
+        let column = {
+          field: `${item.column}`,
+          width: 100,
+          title: item.alias,
+          filters: [{data: ''}],
+          slots: {filter: 'num1_filter'},
+          filterMethod: filterChanged,
+          sortable: true
+        }
+
+        gridOptions.columns.push(column)
+
+      })
       produceList = deepClone(res.data.data)
       xGrid.value.reloadData(produceList)
     } else {
@@ -189,7 +205,7 @@
     {type: 'expand', fixed: "left", slots: {content: 'content'}, width: 50},
     {type: 'seq', fixed: "left", title: t('basicData.Number'), width: 50},
     {
-      field: 'processId', width: 120, title: t('processCard.processId'), filters: [{data: ''}],
+      field: 'processId', width: 135, title: t('processCard.processId'), filters: [{data: ''}],
       slots: {filter: 'num1_filter'},
       filterMethod: filterChanged
     },
@@ -217,8 +233,12 @@
       slots: {filter: 'num1_filter'},
       filterMethod: filterChanged
     },
-    {field: 'childWidth', width: 120, title: t('order.width')},
-    {field: 'childHeight', width: 120, title: t('order.height')},
+    {field: 'childWidth', width: 120, title: t('order.width'), filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+      filterMethod: filterChanged},
+    {field: 'childHeight', width: 120, title: t('order.height'), filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+      filterMethod: filterChanged},
     {field: 'quantity', width: 120, title: t('order.quantity')},
 
     {field: 'area', width: 100, title: t('order.area')},
diff --git a/north-glass-erp/northglass-erp/src/views/pp/report/TaskCompletionStatus.vue b/north-glass-erp/northglass-erp/src/views/pp/report/TaskCompletionStatus.vue
index 875e0c9..3126dc7 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/report/TaskCompletionStatus.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/report/TaskCompletionStatus.vue
@@ -90,13 +90,17 @@
 let column = [1,2,3]
 //鐐瑰嚮鏌ヨ
 const getWorkOrder = () => {
+  let orderId = form.orderId
+  if (orderId === '') {
+    orderId = null
+  }
   let startTime = time.date1[0]
   let endTime = time.date1[1]
   let date = new Date(endTime); // 灏嗘棩鏈熷瓧绗︿覆杞负 Date 瀵硅薄
 // 浣跨敤 setDate 鏂规硶鍔犱竴澶�
   date.setDate(date.getDate() + 1);
   let newEndTime = date.toISOString().split('T')[0]; // 鑾峰彇 YYYY-MM-DD 鏍煎紡鐨勫瓧绗︿覆
-  request.post(`/report/taskCompletionStatus/${startTime}/${newEndTime}`,column).then((res) => {
+  request.post(`/report/taskCompletionStatus/${startTime}/${newEndTime}/${orderId}`,column).then((res) => {
     if (res.code == 200) {
       if(res.data.data.length===0){
         ElMessage.warning(t('report.noDataFoundForThisOrder'))
@@ -111,7 +115,7 @@
         item.reportWorkQuantity=JSON.parse(item.reportWorkQuantity)
         item.reportWorkQuantityCount=JSON.parse(item.reportWorkQuantityCount)
       })
-      mergeCells.value = res.data.mergeCell
+      //mergeCells.value = res.data.mergeCells
       xGrid.value.loadData(res.data.data)
     } else {
       ElMessage.warning(res.msg)
@@ -178,7 +182,7 @@
     // export: true,
     // print: true,
     slots: {
-      tools: 'toolbar_buttons'
+      //tools: 'toolbar_buttons'
     },
     zoom: true,
     custom: true
@@ -280,13 +284,13 @@
         <template #quantitySum="{ row,column }">
           <span>{{ quantitySum(row,column) }} </span>
         </template>
-        <template #toolbar_buttons>
-          <vxe-button style="margin-right: 0.5rem"
-                      @click="exportExcel('/report/exportTaskCompletionStatus',
-                                          t('report.TaskCompletionStatus'),
-                                          time.date1)">
-            {{t('basicData.export')}}</vxe-button>
-        </template>
+<!--        <template #toolbar_buttons>-->
+<!--          <vxe-button style="margin-right: 0.5rem"-->
+<!--                      @click="exportExcel('/report/exportTaskCompletionStatus',-->
+<!--                                          t('report.TaskCompletionStatus'),-->
+<!--                                          time.date1)">-->
+<!--            {{t('basicData.export')}}</vxe-button>-->
+<!--        </template>-->
 
       </vxe-grid>
     </div>
diff --git a/north-glass-erp/northglass-erp/src/views/pp/report/TeamOutput.vue b/north-glass-erp/northglass-erp/src/views/pp/report/TeamOutput.vue
index fd8a244..b5f9e1a 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/report/TeamOutput.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/report/TeamOutput.vue
@@ -1,12 +1,14 @@
 <script setup>
 
-import {reactive, ref} from "vue";
+import {onMounted, reactive, ref} from "vue";
 import {useRouter} from 'vue-router'
 import request from "@/utils/request";
 import deepClone from "@/utils/deepClone";
 import {ElDatePicker, ElMessage} from "element-plus";
 import {useI18n} from 'vue-i18n'
 import footSum from "@/hook/footSum"
+import {addListener, toolbarButtonClickEvent} from "@/hook/mouseMove"
+import {VxeUI} from "vxe-pc-ui";
 //璇█鑾峰彇
 const {t} = useI18n()
 let router = useRouter()
@@ -59,17 +61,28 @@
 
 //鑾峰彇涓冨ぉ鍓嶅埌褰撳墠鏃堕棿
 function getNowTime() {
-  const start = new Date(new Date().getTime() - 3600 * 1000 * 24 * 3)
-      .toISOString()
-      .replace('T', ' ')
-      .slice(0, 10) //榛樿寮�濮嬫椂闂�7澶╁墠
-  const end = new Date(new Date().getTime())
-      .toISOString()
-      .replace('T', ' ')
-      .slice(0, 10)//榛樿缁撴潫鏃堕棿褰撳墠鏃堕棿
-  return [start, end]
+  const pad = (n) => n.toString().padStart(2, '0');
+
+  const formatDate = (date) => {
+    const year = date.getFullYear();
+    const month = pad(date.getMonth() + 1);
+    const day = pad(date.getDate());
+    return `${year}-${month}-${day} 08:00:00`;
+  };
+
+  const now = new Date();
+  const startDate = new Date(now.getTime() - 3600 * 1000 * 24 * 3); // 涓夊ぉ鍓�
+  const start = formatDate(startDate);
+  const end = formatDate(now);
+
+  return [start, end];
 }
 
+onMounted(() => {
+  //鍚敤琛ㄦ牸鎷栧姩閫変腑
+  addListener(xGrid.value, gridOptions)
+
+})
 
 //绗竴娆″姞杞借幏鍙栬繎涓冨ぉ鏃堕棿鍜岄粯璁ょ姸鎬�
 form.date1 = getNowTime()
@@ -89,7 +102,11 @@
 let date = new Date(endTime); // 灏嗘棩鏈熷瓧绗︿覆杞负 Date 瀵硅薄
 // 浣跨敤 setDate 鏂规硶鍔犱竴澶�
 date.setDate(date.getDate() + 1);
-let newEndTime = date.toISOString().split('T')[0]; // 鑾峰彇 YYYY-MM-DD 鏍煎紡鐨勫瓧绗︿覆
+const pad = (n) => n.toString().padStart(2, '0');
+let year = date.getFullYear();
+let month = pad(date.getMonth() + 1);
+let day = pad(date.getDate());
+let newEndTime = `${year}-${month}-${day} 08:00:00`;
 //绗竴娆″姞杞芥暟鎹�
 request.post(`/report/teamOutput/1/${total.pageSize}/${startTime}/${newEndTime}/${selectProcesses}`, filterData.value).then((res) => {
 
@@ -114,13 +131,21 @@
 //椤佃剼缈婚〉鏌ヨ
 const selectPageList = () => {
   gridOptions.loading = true
-  let startTime = form.date1[0]
-  let endTime = form.date1[1]
-  let selectProcesses = procseeValue.value
-  let date = new Date(endTime); // 灏嗘棩鏈熷瓧绗︿覆杞负 Date 瀵硅薄
-// 浣跨敤 setDate 鏂规硶鍔犱竴澶�
-  date.setDate(date.getDate() + 1);
-  let newEndTime = date.toISOString().split('T')[0]; // 鑾峰彇 YYYY-MM-DD 鏍煎紡鐨勫瓧绗︿覆
+  const rawStart = new Date(form.date1[0]);
+  const rawEnd = new Date(form.date1[1]);
+  // 濡傛灉鏃堕棿閮ㄥ垎鏄� 00:00锛屽垯璁剧疆涓� 08:00
+  if (rawStart.getHours() === 8 || rawStart.getHours() === 0) {
+    rawStart.setHours(8, 0, 0, 0);
+  }
+  if (rawEnd.getHours() === 8 || rawEnd.getHours() === 0) {
+    rawEnd.setHours(8, 0, 0, 0);
+  }
+  const startTime = formatDateTime(rawStart);
+  const endPlusOne = new Date(rawEnd);
+  endPlusOne.setDate(endPlusOne.getDate());
+  const newEndTime = formatDateTime(endPlusOne);
+  const selectProcesses = procseeValue.value;
+  form.date1 = [startTime, newEndTime];
   request.post(`/report/teamOutput/${pageNum.value}/${total.pageSize}/${startTime}/${newEndTime}/${selectProcesses}`, filterData.value).then((res) => {
     if (res.code == 200) {
 
@@ -136,17 +161,36 @@
     }
   })
 }
+const formatDateTime = (date) => {
+  const year = date.getFullYear();
+  const month = pad(date.getMonth() + 1);
+  const day = pad(date.getDate());
+  const hour = pad(date.getHours());
+  const minute = pad(date.getMinutes());
+  return `${year}-${month}-${day} ${hour}:${minute}:00`;
+};
+
 
 //鐐瑰嚮鏌ヨ
 const getWorkOrder = () => {
   gridOptions.loading = true
-  let startTime = form.date1[0]
-  let endTime = form.date1[1]
-  let selectProcesses = procseeValue.value
-  let date = new Date(endTime); // 灏嗘棩鏈熷瓧绗︿覆杞负 Date 瀵硅薄
-// 浣跨敤 setDate 鏂规硶鍔犱竴澶�
-  date.setDate(date.getDate() + 1);
-  let newEndTime = date.toISOString().split('T')[0]; // 鑾峰彇 YYYY-MM-DD 鏍煎紡鐨勫瓧绗︿覆
+  // 鍘熷 form.date1 鏄棩鏈熷璞℃暟缁�
+  const rawStart = new Date(form.date1[0]);
+  const rawEnd = new Date(form.date1[1]);
+  // 濡傛灉鏃堕棿閮ㄥ垎鏄� 00:00锛屽垯璁剧疆涓� 08:00
+  if (rawStart.getHours() === 8 || rawStart.getHours() === 0) {
+    rawStart.setHours(8, 0, 0, 0);
+  }
+  if (rawEnd.getHours() === 8 || rawEnd.getHours() === 0) {
+    rawEnd.setHours(8, 0, 0, 0);
+  }
+
+  const startTime = formatDateTime(rawStart);
+  const endPlusOne = new Date(rawEnd);
+  endPlusOne.setDate(endPlusOne.getDate());
+  const newEndTime = formatDateTime(endPlusOne);
+  const selectProcesses = procseeValue.value;
+  form.date1 = [startTime, newEndTime];
   request.post(`/report/teamOutput/${pageNum.value}/${total.pageSize}/${startTime}/${newEndTime}/${selectProcesses}`, filterData.value).then((res) => {
 
     if (res.code == 200) {
@@ -158,7 +202,6 @@
       produceList.forEach(item => {
         item.mmTotal = sumMmValues(item.workProcessName);
       });
-      console.log(produceList)
       xGrid.value.loadData(produceList)
       gridOptions.loading = false
     } else {
@@ -208,12 +251,20 @@
   }
   gridOptions.loading = true
 
-  let startTime = form.date1[0]
-  let endTime = form.date1[1]
-  let date = new Date(endTime); // 灏嗘棩鏈熷瓧绗︿覆杞负 Date 瀵硅薄
-// 浣跨敤 setDate 鏂规硶鍔犱竴澶�
-  date.setDate(date.getDate() + 1);
-  let newEndTime = date.toISOString().split('T')[0]; // 鑾峰彇 YYYY-MM-DD 鏍煎紡鐨勫瓧绗︿覆
+  const rawStart = new Date(form.date1[0]);
+  const rawEnd = new Date(form.date1[1]);
+  // 濡傛灉鏃堕棿閮ㄥ垎鏄� 00:00锛屽垯璁剧疆涓� 08:00
+  if (rawStart.getHours() === 8 || rawStart.getHours() === 0) {
+    rawStart.setHours(8, 0, 0, 0);
+  }
+  if (rawEnd.getHours() === 8 || rawEnd.getHours() === 0) {
+    rawEnd.setHours(8, 0, 0, 0);
+  }
+  const startTime = formatDateTime(rawStart);
+  const endPlusOne = new Date(rawEnd);
+  endPlusOne.setDate(endPlusOne.getDate());
+  const newEndTime = formatDateTime(endPlusOne);
+  form.date1 = [startTime, newEndTime];
   request.post(`/report/teamOutput/1/${total.pageSize}/${startTime}/${newEndTime}/${selectProcesses}`, filterData.value).then((res) => {
 
     if (res.code == 200) {
@@ -290,6 +341,8 @@
     {
       field: 'project', width: 120, title: t('order.project'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }
     },
+    {field: 'batch', width: 90, title: t('order.batch')},
+    {field: 'orderType', width: 90, title: t('order.orderType')},
     {
       field: 'processId', width: 140, title: t('processCard.processId'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }
     },
@@ -384,6 +437,10 @@
 
   })
 }
+
+const handleCellDblClick = ({ row, column, cell, $event }) => {
+  VxeUI.clipboard.copy(row[column.property])
+}
 </script>
 
 <template>
@@ -396,10 +453,10 @@
             v-model="form.date1"
             :start-placeholder="$t('basicData.startDate')"
             :end-placeholder="$t('basicData.endDate')"
-            format="YYYY/MM/DD"
-            style="width: 250px"
+            format="YYYY/MM/DD HH:mm"
+            style="width: 350px"
             type="daterange"
-            value-format="YYYY-MM-DD"
+            value-format="YYYY/MM/DD HH:mm"
         />
         &nbsp;&nbsp;
         <el-select v-model="procseeValue" clearable default-value="default_city" style="width: 120px">
@@ -421,6 +478,7 @@
           height="100%"
           v-bind="gridOptions"
           @filter-change="filterChanged"
+          @cell-dblclick="handleCellDblClick"
 
       >
         <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
@@ -479,4 +537,11 @@
   width: 100%;
   height: calc(100% - 35px);
 }
+.vxe-grid {
+  /* 绂佺敤娴忚鍣ㄩ粯璁ら�変腑 */
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
 </style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgress.vue b/north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgress.vue
index 45a2ed5..7e6f643 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgress.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgress.vue
@@ -1,13 +1,14 @@
 <script setup>
 
-import {reactive, ref} from "vue";
+import {onMounted, reactive, ref} from "vue";
 import {useRouter} from 'vue-router'
 import request from "@/utils/request";
 import deepClone from "@/utils/deepClone";
 import {ElDatePicker, ElMessage} from "element-plus";
 import {useI18n} from 'vue-i18n'
-//import {changeFilterEvent, filterChanged} from "@/hook"
 import footSum from "@/hook/footSum"
+import {addListener} from "@/hook/mouseMove";
+import {VxeUI} from "vxe-pc-ui";
 //璇█鑾峰彇
 const {t} = useI18n()
 let router = useRouter()
@@ -20,7 +21,7 @@
 })
 
 //宸ュ簭
-const value = ref()
+const valueProcess = ref()
 
 //鏍规嵁浠ヤ笅瀛楁姹囨�绘煡璇�
 const stateValue = ref('')
@@ -72,10 +73,13 @@
 let pageNum = ref(1)
 let pageState = null
 
-
+onMounted(() => {
+  //鍚敤琛ㄦ牸鎷栧姩閫変腑
+  addListener(xGrid.value, gridOptions)
+})
 
 //绗竴娆″姞杞�
-let selectProcesses = value.value
+let selectProcesses = valueProcess.value
 let inputVal = form.orderId
 if (inputVal == '') {
   inputVal = null
@@ -88,6 +92,12 @@
   pageTotal: 0,
   dataTotal: 0,
   pageSize: 100
+})
+let newItem= ref({
+  basic_name: '鍏ㄩ儴',
+  basic_type: 'product',
+  basic_category: 'process',
+  id: "001"
 })
 //瀹氫箟鎺ユ敹鍔犺浇琛ㄥご涓嬫媺鏁版嵁
 const titleSelectJson = ref({
@@ -108,7 +118,8 @@
     produceList = produceList.value.concat(deepClone(res.data.data))
     titleSelectJson.value.processType = res.data.process
     titleSelectJson.value.processType.splice(0,1)
-    xGrid.value.reloadData(produceList)
+    titleSelectJson.value.processType.unshift(newItem.value)
+    //xGrid.value.reloadData(produceList)
     gridOptions.loading = false
   } else {
     ElMessage.warning(res.msg)
@@ -118,7 +129,7 @@
 //椤佃剼缈婚〉鏌ヨ
 const selectPageList = () => {
   let inputVal = form.orderId
-  let selectProcesses = value.value
+  let selectProcesses = valueProcess.value
   if (inputVal == '') {
     inputVal = null
   }
@@ -134,6 +145,10 @@
     if (res.code == 200) {
       total.value = res.data.total
       produceList = deepClone(res.data.data)
+      produceList.forEach(item => {
+        // 濡傛灉 shape 鍙兘鏄瓧绗︿覆灏辩敤 ==锛屽鏋滀竴瀹氭槸鏁板瓧灏辩敤 ===
+        item.shape = (item.shape == 2) ? t('order.alien') : t('order.universalShape');
+      });
       xGrid.value.loadData(produceList)
       gridOptions.loading = false
     } else {
@@ -145,7 +160,7 @@
 //鐐瑰嚮鏌ヨ
 const getWorkOrder = () => {
   gridOptions.loading = true
-  let selectProcesses = value.value
+  let selectProcesses = valueProcess.value
   let inputVal = form.orderId
   if (inputVal == '') {
     inputVal = null
@@ -165,6 +180,10 @@
       total.pageTotal = res.data.total.pageTotal
       pageTotal.value = res.data.total
       total.value = res.data.total
+      res.data.data.forEach(item => {
+        // 濡傛灉 shape 鍙兘鏄瓧绗︿覆灏辩敤 ==锛屽鏋滀竴瀹氭槸鏁板瓧灏辩敤 ===
+        item.shape = (item.shape == 2) ? t('order.alien') : t('order.universalShape');
+      });
       xGrid.value.loadData(res.data.data)
       gridOptions.loading = false
     } else {
@@ -203,27 +222,38 @@
     filterData.value[column.property] = value
   }
 
-  getWorkOrder()
-  // let selectProcesses = value.value
-  // let optionVal=stateValue.value
-  // if (optionVal == '') {
-  //   optionVal = null
-  // }
-  // request.post(`/report/workInProgress/1/${total.pageSize}/${inputVal}/${inputProject}/${selectProcesses}/${optionVal}`, filterData.value).then((res) => {
-  //
-  //   if (res.code == 200) {
-  //     total.dataTotal = res.data.total.total*1
-  //     total.pageTotal=parseInt(res.data.total)
-  //     pageNum.value=1
-  //     produceList = deepClone(res.data.data)
-  //     console.log(res.data.data)
-  //     xGrid.value.reloadData(produceList)
-  //     gridOptions.loading=false
-  //   } else {
-  //     ElMessage.warning(res.msg)
-  //   }
-  //   //handleUpdateData(produceList)
-  // })
+  let selectProcesses = valueProcess.value
+  let inputVal = form.orderId
+  if (inputVal == '') {
+    inputVal = null
+  }
+  let inputProject = form.project
+  if (inputProject == '') {
+    inputProject = null
+  }
+  let optionVal=stateValue.value
+  if (optionVal == '') {
+    optionVal = null
+  }
+  request.post(`/report/workInProgress/${pageNum.value}/${total.pageSize}/${inputVal}/${inputProject}/${selectProcesses}/${optionVal}`, filterData.value).then((res) => {
+
+    if (res.code == 200) {
+      total.dataTotal = res.data.total.total * 1
+      total.pageTotal = res.data.total.pageTotal
+      pageTotal.value = res.data.total
+      total.value = res.data.total
+      res.data.data.forEach(item => {
+        // 濡傛灉 shape 鍙兘鏄瓧绗︿覆灏辩敤 ==锛屽鏋滀竴瀹氭槸鏁板瓧灏辩敤 ===
+        item.shape = (item.shape == 2) ? t('order.alien') : t('order.universalShape');
+      });
+      xGrid.value.reloadData(res.data.data)
+      gridOptions.loading = false
+    } else {
+      ElMessage.warning(res.msg)
+    }
+    //handleUpdateData(produceList)
+  })
+
 
 }
 
@@ -269,7 +299,9 @@
     {type: 'seq', fixed: "left", title: t('basicData.Number'), width: 50},
     {
       field: 'thisProcess', width: 120, title: t('report.workingProcedure'),
-      visible: true
+      visible: true,filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+
     },
     {
       field: 'orderId',
@@ -309,7 +341,6 @@
     {field: 'orderNumber', width: 100, title: t('order.OrderNum'),visible: true},
     {field: 'technologyNumber', width: 120, title: t('processCard.technologyNumber'),filters: [{data: ''}],
       slots: {filter: 'num1_filter'}, showOverflow: "ellipsis",visible: true},
-    {field: 'bend_radius', width: 100, title: t('order.bendRadius'),visible: true},
     {field: 'shape', width: 100, title: t('order.shape'),visible: true},
     {field: 'process', width: 120, title: t('craft.process'),visible: true},
     {field: 'quantity', width: 120, title: t('order.quantity'),visible: true},
@@ -318,8 +349,9 @@
     {field: 'stockNum', width: 120, title: t('productStock.inventoryQuantity'),visible: true},
     {field: 'stockArea', width: 120, title: t('report.inventoryArea'),visible: true},
     {field: 'productName', width: 120, title:  t('order.product'),visible: true},
+    {field: 'glassName', width: 120, title:  t('report.workProcessName'),visible: true},
     {field: 'bendRadius', width: 120, title: t('order.bendRadius'),visible: true},
-    {field: 'teamsGroupsName', width: 110,title: '涓婂伐搴忔姤宸�',showOverflow:"ellipsis",filters: [{data: ''}],
+    {field: 'teamsGroupsName', width: 110,title: t('report.teamsGroupsName'),showOverflow:"ellipsis",filters: [{data: ''}],
       slots: {filter: 'num1_filter'}},
   ],//琛ㄥご鎸夐挳
 
@@ -347,7 +379,7 @@
         const List = ["quantity",'stockNum','stockArea',]
         if (List.includes(column.field)) {
           //return footSum(data, column.field)
-          return total.value?.[column.field] ?? 0
+          return footSum(data, column.field)
         }
         return ''
       })
@@ -357,7 +389,7 @@
 })
 
 function exportExcel(url, fileName,date) {
-  let processes = value.value
+  let processes = valueProcess.value
   let inputVal = form.orderId
   if (inputVal == '') {
     inputVal = null
@@ -429,17 +461,21 @@
   //   VXETable.updateColumns(tableRef.value, columns);
   // }
 }
+
+const handleCellDblClick = ({ row, column, cell, $event }) => {
+  VxeUI.clipboard.copy(row[column.property])
+}
 </script>
 
 <template>
   <div  style="width: 100%;height: 100%">
     <div class="head">
 
-        <el-input v-model="form.orderId" :placeholder="$t('order.orderId')" clearable style="width: 130px"></el-input>
+        <el-input v-model="form.orderId" :placeholder="$t('order.orderId')" clearable style="width: 130px;display: none"></el-input>
         &nbsp;&nbsp;
-        <el-input v-model="form.project" clearable :placeholder="$t('order.project')" style="width: 130px"></el-input>
-        &nbsp;
-        <el-select v-model="stateValue" class="m-2" :placeholder="$t('processCard.pleaseSelect')" clearable allow-create filterable style="width: 140px">
+        <el-input v-model="form.project" clearable :placeholder="$t('order.project')" style="width: 130px;display: none"></el-input>
+
+        <el-select v-model="stateValue" class="m-2" :placeholder="$t('processCard.pleaseSelect')" clearable allow-create filterable style="width: 140px;display: none">
           <el-option
               v-for="item in stateOptions"
               :key="item.value"
@@ -447,8 +483,8 @@
               :value="item.value"
           />
         </el-select>
-        &nbsp;
-        <el-select v-model="value" clearable :placeholder="$t('reportingWorks.selectProcess')" default-value="default_city" style="width: 120px">
+       {{$t('report.workingProcedure')}}锛�
+        <el-select v-model="valueProcess" clearable :placeholder="$t('reportingWorks.selectProcess')" default-value="default_city" style="width: 120px">
           <el-option
               v-for="item in titleSelectJson['processType']"
               :key="item.id"
@@ -456,6 +492,7 @@
               :value="item.basic_name"
           />
         </el-select>
+        &nbsp;
         <el-button type="primary" @click="getWorkOrder">{{$t('basicData.search')}}</el-button>
     </div>
     <div class="main-table">
@@ -466,7 +503,7 @@
           v-bind="gridOptions"
           :optimize="true"
           @filter-change="filterChanged"
-
+          @cell-dblclick="handleCellDblClick"
       >
         <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
         <!--      涓嬫媺鏄剧ず鎵�鏈変俊鎭彃妲�-->
@@ -531,4 +568,11 @@
   width: 100%;
   height: calc(100% - 35px);
 }
+.vxe-grid {
+  /* 绂佺敤娴忚鍣ㄩ粯璁ら�変腑 */
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
 </style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgressCombination.vue b/north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgressCombination.vue
new file mode 100644
index 0000000..ff4828e
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgressCombination.vue
@@ -0,0 +1,467 @@
+<script setup>
+
+import {onMounted, reactive, ref} from "vue";
+import {useRouter} from 'vue-router'
+import request from "@/utils/request";
+import deepClone from "@/utils/deepClone";
+import {ElCheckbox, ElDatePicker, ElMessage} from "element-plus";
+import {useI18n} from 'vue-i18n'
+import { filterChanged} from "@/hook"
+import footSum from "@/hook/footSum"
+import {addListener} from "@/hook/mouseMove";
+import {VxeUI} from "vxe-pc-ui";
+//璇█鑾峰彇
+const {t} = useI18n()
+let router = useRouter()
+let filterData = ref({})
+//鎻愪氦鐨勮〃鍗�
+const form = reactive({
+  date1: '',
+  orderId: '',
+  project: ''
+})
+
+//椤圭洰鍚嶇О姹囨��
+let projectSummary= ref(1)
+//宸ュ簭
+const value = ref()
+
+//鏍规嵁浠ヤ笅瀛楁姹囨�绘煡璇�
+const stateValue = ref('')
+const stateOptions = [
+  {
+    value: 1,
+    label: t('order.orderId'),
+  },
+  {
+    value: 2,
+    label: t('processCard.processId'),
+  },
+  // {
+  //   value: 3,
+  //   label: t('order.project'),
+  // },
+  {
+    value: 4,
+    label: t('processCard.technologyNumber'),
+  },
+]
+
+//琛ㄥ熬姹傚拰
+const sumNum = (list, field) => {
+  let count = 0
+  list.forEach(item => {
+    count += Number(item[field])
+  })
+  return count.toFixed(2)
+}
+
+//瀹氫箟婊氬姩鏉¢珮搴�
+let scrollTop = ref(null)
+let scrollHeight = ref(null)
+let clientHeight = ref(null)
+const scrollEvnt = (row) => {
+  // 鍐呭楂樺害
+  scrollTop.value = row.$event.target.scrollTop
+  scrollHeight.value = row.$event.target.scrollHeight
+  clientHeight.value = row.$event.target.clientHeight
+}
+
+
+//瀹氫箟椤甸潰鎬婚〉鏁�
+let pageTotal = ref('')
+//瀹氫箟鏁版嵁杩斿洖缁撴灉
+let produceList = ref([])
+//瀹氫箟褰撳墠椤垫暟
+let pageNum = ref(1)
+let pageState = null
+
+onMounted(() => {
+  //鍚敤琛ㄦ牸鎷栧姩閫変腑
+  addListener(xGrid.value, gridOptions)
+})
+
+//绗竴娆″姞杞�
+let selectProcesses = value.value
+let inputVal = form.orderId
+if (inputVal == '') {
+  inputVal = null
+}
+let inputProject = form.project
+if (inputProject == '') {
+  inputProject = null
+}
+let total = reactive({
+  pageTotal: 0,
+  dataTotal: 0,
+  pageSize: 100
+})
+let newItem= ref({
+  basic_name: '鍏ㄩ儴',
+  basic_type: 'product',
+  basic_category: 'process',
+  id: "001"
+})
+//瀹氫箟鎺ユ敹鍔犺浇琛ㄥご涓嬫媺鏁版嵁
+const titleSelectJson = ref({
+  processType: [],
+})
+let optionVal=projectSummary.value
+if (optionVal == '') {
+  optionVal = null
+}
+//绗竴娆″姞杞芥暟鎹�
+request.post(`/report/workInProgressCombination/1/${total.pageSize}/${selectProcesses}/${inputVal}/${inputProject}/${optionVal}`, filterData.value).then((res) => {
+
+  if (res.code == 200) {
+    // total.dataTotal = res.data.total.total*1
+    // total.pageTotal= res.data.total.pageTotal
+    // pageTotal.value = res.data.total
+     total.value = res.data.total
+    // produceList = produceList.value.concat(deepClone(res.data.data))
+    titleSelectJson.value.processType = res.data.process
+    titleSelectJson.value.processType.splice(0,1)
+    titleSelectJson.value.processType.unshift(newItem.value)
+    xGrid.value.reloadData(produceList)
+    gridOptions.loading = false
+  } else {
+    ElMessage.warning(res.msg)
+  }
+})
+
+//椤佃剼缈婚〉鏌ヨ
+const selectPageList = () => {
+  let inputVal = form.orderId
+  let selectProcesses = value.value
+  if (inputVal == '') {
+    inputVal = null
+  }
+  let inputProject = form.project
+  if (inputProject == '') {
+    inputProject = null
+  }
+  let optionVal=projectSummary.value
+  if (optionVal == '') {
+    optionVal = null
+  }
+  request.post(`/report/workInProgressCombination/${pageNum.value}/${total.pageSize}/${inputVal}/${inputProject}/${selectProcesses}/${optionVal}`, filterData.value).then((res) => {
+    if (res.code == 200) {
+      total.value = res.data.total
+      produceList = deepClone(res.data.data)
+      produceList.forEach(item => {
+        // 濡傛灉 shape 鍙兘鏄瓧绗︿覆灏辩敤 ==锛屽鏋滀竴瀹氭槸鏁板瓧灏辩敤 ===
+        item.shape = (item.shape == 2) ? t('order.alien') : t('order.universalShape');
+      });
+      xGrid.value.loadData(produceList)
+      gridOptions.loading = false
+    } else {
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
+//鐐瑰嚮鏌ヨ
+const getWorkOrder = () => {
+  gridOptions.loading = true
+  let selectProcesses = value.value
+  let inputVal = form.orderId
+  if (inputVal == '') {
+    inputVal = null
+  }
+  let inputProject = form.project
+  if (inputProject == '') {
+    inputProject = null
+  }
+  let optionVal=projectSummary.value
+  if (optionVal == '') {
+    optionVal = null
+  }
+  request.post(`/report/workInProgressCombination/${pageNum.value}/${total.pageSize}/${inputVal}/${inputProject}/${selectProcesses}/${optionVal}`, filterData.value).then((res) => {
+
+    if (res.code == 200) {
+      // total.dataTotal = res.data.total.total * 1
+      // total.pageTotal = res.data.total.pageTotal
+      // pageTotal.value = res.data.total
+       total.value = res.data.total
+      xGrid.value.loadData(res.data.data)
+      gridOptions.loading = false
+    } else {
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
+//椤佃剼璺宠浆
+const handlePageChange = ({currentPage, pageSize}) => {
+  pageNum.value = currentPage
+  total.pageTotal = pageSize
+  selectPageList()
+}
+
+
+/*浣跨敤绛涢�夛紝鍚庣鑾峰彇鏁版嵁*/
+const changeFilterEvent = (event, option, $panel,) => {
+  // 鎵嬪姩瑙﹀彂绛涢��
+  $panel.changeOption(event, !!option.data, option)
+}
+
+
+
+/*鍚庣杩斿洖缁撴灉澶氬眰宓屽灞曠ず*/
+const hasDecimal = (value) => {
+  const regex = /\./; // 瀹氫箟姝e垯琛ㄨ揪寮忥紝鏌ユ壘灏忔暟鐐�
+  return regex.test(value); // 杩斿洖true/false
+}
+
+//瀛愮粍浠舵帴鏀跺弬鏁�
+const xGrid = ref()
+const gridOptions = reactive({
+  loading: true,
+  border: "full",//琛ㄦ牸鍔犺竟妗�
+  keepSource: true,//淇濇寔婧愭暟鎹�
+  align: 'center',//鏂囧瓧灞呬腑
+  stripe: true,//鏂戦┈绾�
+  rowConfig: {isCurrent: true, isHover: true, height: 30},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
+  id: 'WorkInProgress',
+  showFooter: true,//鏄剧ず鑴�
+  printConfig: {},
+  importConfig: {},
+  exportConfig: {},
+  scrollY: {enabled: true},//寮�鍚櫄鎷熸粴鍔�
+  showOverflow: true,
+  columnConfig: {
+    resizable: true,
+    useKey: true
+  },
+  filterConfig: {   //绛涢�夐厤缃」
+    // remote: true
+  },
+  customConfig: {
+    storage: true
+  },
+  editConfig: {
+    trigger: 'click',
+    mode: 'row',
+    showStatus: true
+  },//琛ㄥご鍙傛暟
+  columns: [
+    {type: 'expand', fixed: "left", slots: {content: 'content'}, width: 50},
+    {type: 'seq', fixed: "left", title: t('basicData.Number'), width: 50},
+    {
+      field: 'thisProcess', width: 120, title: t('report.workingProcedure'),
+      visible: true, filters: [{data: ''}],slots: {filter: 'num1_filter'},
+      filterMethod: filterChanged,
+    },
+    {
+      field: 'project', width: 220, title: t('order.project'), filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+      filterMethod: filterChanged,
+      visible: true
+    },
+    {field: 'stockNum', width: 120, title: t('productStock.inventoryQuantity'),visible: true},
+    {field: 'stockArea', width: 120, title: t('report.inventoryArea'),visible: true},
+    {field: 'glassName', width: 420, title:  t('report.workProcessName'),visible: true, filters: [{data: ''}]
+      ,slots: {filter: 'num1_filter'},
+      filterMethod: filterChanged,},
+  ],//琛ㄥご鎸夐挳
+
+  toolbarConfig: {
+    // buttons: [{
+    //
+    // }],
+    slots: {
+      tools: 'toolbar_buttons'
+    },
+    // import: false,
+    // export: true,
+    // print: true,
+    zoom: true,
+    custom: true
+  },
+  data: [],//table body瀹為檯鏁版嵁
+  //鑴氶儴姹傚拰
+  footerMethod ({ columns, data }) {//椤佃剼鍑芥暟
+    return[
+      columns.map((column, columnIndex) => {
+        if (columnIndex === 0) {
+          return t('basicData.total')
+        }
+        const List = ["quantity",'stockNum','stockArea',]
+        if (List.includes(column.field)) {
+          //return footSum(data, column.field)
+          return footSum(data, column.field)
+        }
+        return ''
+      })
+    ]
+  },
+
+})
+
+function onlandingSequenceChange(checked) {
+  projectSummary.value = checked ? 0 : 1
+}
+
+function exportExcel(url, fileName,date) {
+  let processes = value.value
+  let inputVal = form.orderId
+  if (inputVal == '') {
+    inputVal = null
+  }
+  let inputProject = form.project
+  if (inputProject == '') {
+    inputProject = null
+  }
+  if(date===null){
+    ElMessage.warning(t('report.pleaseSelectADateFirst'))
+    return
+  }
+
+  if(processes===null){
+    ElMessage.warning(t('report.pleaseSelectAProcessFirst'))
+    return
+  }
+
+  const date1 = new Date(date[0]);
+  const date2 = new Date(date[1]);
+  const timeDiff = Math.abs(date2.getTime() - date1.getTime());
+  const daysDiff = timeDiff / (1000 * 3600 * 24);
+  if(Math.floor(daysDiff)>180){
+    ElMessage.warning(t('report.theFilteringTimeForExportCannotExceed180Days'))
+    return
+  }
+  let dataMp = ref({
+    date: date,
+    processes: processes,
+    orderId: inputVal,
+    project: inputProject
+  })
+  request.post(url,dataMp.value,{responseType :'blob'}).then(res => {
+    const blob = new Blob([res])
+    if ('download' in document.createElement('a')) { // 闈濱E涓嬭浇
+      const elink = document.createElement('a')
+      elink.download = `${fileName}.xlsx`
+      elink.style.display = 'none'
+      elink.href = URL.createObjectURL(blob)
+      document.body.appendChild(elink)
+      elink.click()
+      URL.revokeObjectURL(elink.href) // 閲婃斁URL 瀵硅薄
+      document.body.removeChild(elink)
+    } else { // IE10+涓嬭浇
+      navigator.msSaveBlob(blob, fileName)
+    }
+
+  })
+}
+
+const handleCellDblClick = ({ row, column, cell, $event }) => {
+  VxeUI.clipboard.copy(row[column.property])
+}
+</script>
+
+<template>
+  <div  style="width: 100%;height: 100%">
+    <div class="head">
+      <el-input v-model="form.orderId" :placeholder="$t('order.orderId')" clearable style="width: 130px;display: none"></el-input>
+      &nbsp;&nbsp;
+      <el-input v-model="form.project" clearable :placeholder="$t('order.project')" style="width: 130px;display: none"></el-input>
+      {{$t('report.workingProcedure')}}锛�
+        <el-select v-model="value" clearable :placeholder="$t('reportingWorks.selectProcess')" default-value="default_city" style="width: 120px">
+          <el-option
+              v-for="item in titleSelectJson['processType']"
+              :key="item.id"
+              :label="item.basic_name"
+              :value="item.basic_name"
+          />
+        </el-select>
+      &nbsp;
+      <el-checkbox
+        :model-value="projectSummary === 0"
+        @change="onlandingSequenceChange"
+      >
+        {{ t('order.project') }}
+      </el-checkbox>
+      &nbsp;
+        <el-button type="primary" @click="getWorkOrder">{{$t('basicData.search')}}</el-button>
+    </div>
+    <div class="main-table">
+      <vxe-grid
+          ref="xGrid"
+          class="mytable-scrollbar"
+          height="100%"
+          v-bind="gridOptions"
+          :optimize="true"
+          @cell-dblclick="handleCellDblClick"
+      >
+        <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
+        <!--      涓嬫媺鏄剧ず鎵�鏈変俊鎭彃妲�-->
+        <template #content="{ row }">
+          <ul class="expand-wrapper">
+            <li v-for="(item,index) in gridOptions.columns" v-show="item.field!=undefined ">
+              <span style="font-weight: bold">{{ item.title + ':  ' }}</span>
+              <span>{{ row[item.field] }}</span>
+            </li>
+          </ul>
+        </template>
+
+        <!--宸﹁竟鍥哄畾鏄剧ず鐨勬彃妲�-->
+        <template #button_slot="{ row }">
+          <el-button link size="small" type="primary" @click="getTableRow(row,'edit')">{{$t('basicData.edit')}}</el-button>
+          <el-button link size="small" type="primary" @click="getTableRow(row,'setType')">{{$t('basicData.cancelReview')}}</el-button>
+          <el-button link size="small" type="primary" @click="getTableRow(row,'delete')">{{$t('basicData.delete')}}</el-button>
+        </template>
+
+        <template #num1_filter="{ column, $panel }">
+          <div>
+            <div v-for="(option, index) in column.filters" :key="index">
+              <input type="text"
+                     v-model="option.data"
+                     @keyup.enter.native="$panel.confirmFilter()"
+                     @input="changeFilterEvent($event, option, $panel)"/>
+            </div>
+          </div>
+        </template>
+<!--        <template #pager>-->
+<!--          &lt;!&ndash;浣跨敤 pager 鎻掓Ы&ndash;&gt;-->
+<!--          &lt;!&ndash;        'PrevJump','NextJump', &ndash;&gt;-->
+<!--          <vxe-pager-->
+<!--              v-model:current-page="pageNum"-->
+<!--              v-model:page-size="total.pageSize"-->
+<!--              v-model:pager-count="total.pageTotal"-->
+<!--              :layouts="[  'PrevPage', 'Jump','PageCount', 'NextPage',  'Total']"-->
+<!--              :total="total.dataTotal"-->
+<!--              @page-change="handlePageChange"-->
+<!--          >-->
+<!--          </vxe-pager>-->
+<!--        </template>-->
+        <template #toolbar_buttons>
+          <vxe-button style="margin-right: 0.5rem"
+                      @click="exportExcel('/report/exportWorkInProgressCombination',
+                                          t('report.WorkInProgressCombination'),
+                                          form.date1)">
+            {{t('basicData.export')}}</vxe-button>
+        </template>
+
+      </vxe-grid>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.head{
+  width: 100%;
+  height: 35px;
+}
+
+.main-table{
+  width: 100%;
+  height: calc(100% - 35px);
+}
+.vxe-grid {
+  /* 绂佺敤娴忚鍣ㄩ粯璁ら�変腑 */
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue b/north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue
index 562ef90..5f422ea 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue
@@ -55,6 +55,8 @@
   classes: '',
   //璐d换宸ュ簭
   responsibleProcess: '',
+  //鍖呰鏂瑰紡
+  packagingMethod:'',
   order: {
     //瀹㈡埛缂栧彿
     customerId: '',
@@ -90,6 +92,39 @@
 
 })
 
+let btnValue=company.storageBtn
+let teamsTypeValue=company.teamsType
+//鏄惁鐐瑰嚮鎶ュ伐鍏ュ簱
+let storageBtn = ref(false)
+//绠卞彿 搴撲綅 澶囨敞
+const storageRegion = ref(null);
+const container = ref(null);
+const remark = ref(null);
+
+//鍖呰鏂瑰紡
+const mannerPacking = ref(null)
+const mannerPackingOp = [
+  // {
+  //   value: t('reportingWorks.early'),
+  //   label: t('reportingWorks.early'),
+  // },
+  // {
+  //   value: t('reportingWorks.nightShift'),
+  //   label: t('reportingWorks.nightShift'),
+  // },
+   {
+    value: '鏈ㄧ',
+    label: '鏈ㄧ',
+  },
+  {
+    value: '閾佹灦',
+    label: '閾佹灦',
+  },
+  {
+    value: '鍊掓灦',
+    label: '鍊掓灦',
+  },
+]
 
 
 let inputDisabled = ref(false)
@@ -104,6 +139,7 @@
           && titleUploadData.value.thisProcess!=null){
         getWork()
         getQuantity()
+
       }
     }
   }
@@ -390,17 +426,10 @@
   },
   toolbarConfig: {//琛ㄥご鎸夐挳
     buttons: [
-      // {code: 'empty', name: '娓呯┖鎶ュ伐鏁伴噺'},
-      // {code: 'sameCompletion', name: '瀹屽伐鐩稿悓'},
-      // {code: 'sameDamage', name: '娆$牬鐩稿悓'},
-      // {code: 'sameOneCompletion', name: '瀹屽伐涓�鍒楃浉鍚�'},
-      // {code: 'sameOneDamage', name: '娆$牬涓�鍒楃浉鍚�'},
       {code: 'saveReportingWork', name: t('basicData.save'), status: 'primary', icon: 'vxe-icon-save',disabled:true},
       {code: 'saveReportingWorkReview', name: t('reportingWorks.saveAndReview'), status: 'primary', icon: 'vxe-icon-save',disabled:true},
+      {code: 'saveWorkStorage', name: t('reportingWorks.saveWorkStorage'), status: 'primary', icon: 'vxe-icon-save'},
     ],
-    // import: false,
-    // export: true,
-    // print: true,
     zoom: true,
     custom: true
   },
@@ -473,6 +502,46 @@
           // })
 
           break
+        }
+        case 'saveWorkStorage':{
+          if(xGrid.value.getTableData().fullData.length===0){
+            ElMessage.warning(t('reportingWorks.selectProcessCardData'))
+            return
+          }
+          const device = titleUploadData.value.deviceName
+          if(device === null || device === undefined || device === ''){
+            ElMessage.error(t('reportingWorks.selectWorkReportingEquipment'))
+            return
+          }
+          const teamsGroupsName = titleUploadData.value.teamsGroupsName
+          if(teamsGroupsName === null || teamsGroupsName === undefined || teamsGroupsName === ''){
+            ElMessage.error(t('reportingWorks.selectWorkReportingTeam'))
+            return
+          }
+
+          if (mannerPacking.value === null || mannerPacking.value === undefined || mannerPacking.value === ''){
+            ElMessage.error(t('reportingWorks.msgMannerPacking'))
+            return
+          }
+          const parts = technologicalProcess.split('->');
+          const last = parts[parts.length - 1];
+          let processId = titleUploadData.value.processId
+          //鍖归厤鈥�/鈥濆墠鍚庡瓧绗︿覆
+          const regex =  /([^\/]+)\/([^\/]+)/;
+          //鏌ユ壘鍖归厤鐨勫瓧绗︿覆
+          const resultProcessId = processId.match(regex);
+          //娴佺▼鍗″彿
+          let processIdStr = resultProcessId[1];
+          //灞傚彿
+          let technologyStr = resultProcessId[2];
+          if (last != titleUploadData.value.thisProcess){
+            ElMessage.error('璇烽�夋嫨鏈�鍚庡伐搴忔姤宸ュ叆搴�')
+            return
+          }
+          storageBtn.value = true
+          //鎶ュ伐鏂板
+          saveReportingWork(0,'save')
+
         }
       }
     }
@@ -816,6 +885,7 @@
 //绗竴娆″姞杞芥暟鎹�
 let groupChangeProcess = ref(false)//鐢ㄤ簬鏈彮缁勬樉绀洪棶棰�
 const initTiltle = async () => {
+  hideButton()
   await request.post(`/reportingWork/selectProcess/${user.user.userId}`).then((res) => {
     if (res.code == 200) {
       titleSelectJson.value.processType = res.data.process
@@ -907,7 +977,8 @@
       return false
     }
   }
-
+//鍖呰鏂瑰紡
+  titleUploadData.value.packagingMethod = mannerPacking.value
   titleUploadData.value.creator = user.user.userName
   titleUploadData.value.creatorId = user.user.userId
   const requestDetailData = xGrid.value.getTableData().fullData.filter((row) => {
@@ -943,6 +1014,10 @@
   request.post(`/reportingWork/saveReportingWork`,requestData).then(res =>{
     if (res.code == 200){
       ElMessage.success(t('reportingWorks.successfulJobApplication'))
+      //鎶ュ伐鍏ュ簱
+      if(storageBtn.value == true){
+        getStorageWork();
+      }
       router.push({path:'/main/reportingWorks/AddReportingWork',query:{processId:titleUploadData.value.processId,random:Math.random()}})
     }else{
       const errorObj = JSON.parse(res.msg)
@@ -1071,7 +1146,6 @@
 
 //涓嬫媺娆鹃�夋嫨宸ュ簭鏃舵煡璇�
 const getWork = () => {
-
   let processId = titleUploadData.value.processId
   if (processId == "" || processId == null) {
     ElMessage.warning(t('reportingWorks.theProcessCardNumberCannotBeEmpty'))
@@ -1127,7 +1201,10 @@
       //璁惧涓嬫媺妗�
       titleSelectJson.value.deviceType = res.data.device
       //鐝粍涓嬫媺妗�
-      //titleSelectJson.value.teamsType = res.data.teams
+      if (teamsTypeValue==true){
+        titleSelectJson.value.teamsType = res.data.teams
+      }
+
       //褰撳墠娴佺▼鍗″伐搴�
       titleSelectJson.value.thisProcessType = res.data.thisProcess
       //鍘嗗彶鐝粍
@@ -1192,6 +1269,7 @@
         }
       });
       xGrid.value.reloadData(modifiedCollection)
+      hideButton()
     } else {
       ElMessage.warning(res.msg)
     }
@@ -1360,6 +1438,126 @@
   }
 })
 
+
+//鎶ュ伐鍏ュ簱鏂规硶
+const getStorageWork = () => {
+  let processId = titleUploadData.value.processId
+  //鍖归厤鈥�/鈥濆墠鍚庡瓧绗︿覆
+  const regex =  /([^\/]+)\/([^\/]+)/;
+  //鏌ユ壘鍖归厤鐨勫瓧绗︿覆
+  const resultProcessId = processId.match(regex);
+  //娴佺▼鍗″彿
+  let processIdStr = resultProcessId[1];
+  //灞傚彿
+  let technologyStr = resultProcessId[2];
+  //寮�濮嬪鐞嗗叆搴撻渶瑕佺殑鏁版嵁
+  let rawData  = xGrid.value.getTableData().fullData
+  const seen = new Set();
+  const result = rawData.filter(item => {
+    // 1. 鍏堟妸 completedQuantity 涓� 0 鐨勫墧闄�
+    if (item.completedQuantity === 0) {
+      return false;
+    }
+    // 2. 閬囧埌鐩稿悓 order_number锛屽彧淇濈暀绗竴娆★紝鍚庨潰閮戒涪寮�
+    if (seen.has(item.order_number)) {
+      return false;
+    }
+    seen.add(item.order_number);
+    return true;
+  });
+
+  // 缁欐瘡鏉¤褰曡拷鍔� order 瀛楁
+  const resultData = result.map(item => ({
+    ...item,
+    order: {
+      orderId: titleUploadData.value.orderId
+    },
+    processId:processIdStr,
+    orderNumber:item.order_number
+  }));
+  let flowData = ref({
+    decValue:company.decValue,
+    userId: user.user.userId,
+    userName: user.user.userName,
+    storageRegion: storageRegion.value,
+    remark: remark.value,
+    container: container.value,
+    flowCard: resultData,
+  })
+  //璋冪敤鍏ュ簱鎺ュ彛
+  request.post("/finishedGoodsInventory/addSelectWarehousing",flowData.value).then((res) => {
+    if(res.code==200 && res.data==="true"){
+      ElMessage.success(t('productStock.receivedSuccessfully'))
+     // router.push({path:'/maiggn/productStock/CreateProductStock',query:{random:Math.random()}})
+    }else if(res.data==="false1"){
+      ElMessage.warning(t('basicData.msg.quantityError'))
+    }else if(res.data==="false2"){
+      ElMessage.warning(t('basicData.msg.dataDoesNotExist'))
+    }else{
+      ElMessage.warning(t('productStock.entryFailure'))
+    }
+  }).catch((err)=>{
+    ElMessage.error(t('basicData.msg.ServerConnectionError'))
+    router.push("/login")
+  })
+}
+
+const hideButton = () => {
+  // 鑾峰彇鏈�鍚庝竴閬撳伐搴�
+  const parts = technologicalProcess.split('->');
+  let last = parts[parts.length - 1];
+  if (last === '') {
+    last = null;
+  }
+  const els = document.querySelectorAll('.inventory_content');
+
+  // 鏄惁鏄剧ず鎶ュ伐鍏ュ簱鐩稿叧鎸夐挳鍐呭
+  if (btnValue == false || last != titleUploadData.value.thisProcess) {
+    els.forEach(el => {
+      el.style.display = 'none';
+    });
+  } else {
+    els.forEach(el => {
+      el.style.display = '';
+    });
+    // 閬垮厤閲嶅娣诲姞鎸夐挳
+    const exists = gridOptions.toolbarConfig.buttons.some(btn => btn.code === 'saveWorkStorage');
+    if (!exists) {
+      let buttons = {
+        code: 'saveWorkStorage',
+        name: t('reportingWorks.saveWorkStorage'),
+        status: 'primary',
+        icon: 'vxe-icon-save'
+      };
+      gridOptions.toolbarConfig.buttons.push(buttons);
+    }
+  }
+
+  // 杩囨护鎸夐挳锛岄殣钘� saveWorkStorage 鎸夐挳鏃舵満
+  gridOptions.toolbarConfig.buttons = gridOptions.toolbarConfig.buttons.filter(button => {
+    if ((btnValue == false || last != titleUploadData.value.thisProcess) && button.code === 'saveWorkStorage') {
+      return false;
+    }
+    return true;
+  });
+};
+
+
+
+const changeGroup = (value)=> {
+  //鍒ゆ柇鍘嗗彶鐝粍鏄惁鏈夋鐝粍淇℃伅
+  const exists = titleSelectJson.value.historyTeams.some(item => item.basic_name === value)
+  if(! exists){
+    titleSelectJson.value.historyTeams.push({
+      basic_name: value,
+      process: titleUploadData.value.thisProcess,
+      basic_type: 'teamsgroups',
+      id: 555
+    })
+  }
+
+
+}
 </script>
 
 <template>
@@ -1384,6 +1582,23 @@
       &nbsp;
       <el-button :disabled="disabledFlag" :loading="loadingFlag" @click="reviewReportingWork" type="primary">{{$t('reportingWorks.passAudit')}}
       </el-button>
+      &nbsp;
+      <span class="inventory_content">
+        <el-select style="width: 100px" v-model="mannerPacking" class="processesSt" :placeholder="$t('reportingWorks.mannerPacking')">
+          <el-option
+              v-for="item in mannerPackingOp"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+          />
+        </el-select>&nbsp;
+        <el-input style="width: 100px" v-model="container" class="m-2" :placeholder="$t('productStock.pleaseEnterTheBoxNumber')">
+      </el-input>&nbsp;
+        <el-input style="width: 100px" v-model="storageRegion" class="m-2" :placeholder="$t('productStock.pleaseEnterTheStorageLocation')">
+      </el-input>&nbsp;
+        <el-input style="width: 200px" v-model="remark" class="m-2" :placeholder="$t('productStock.pleaseEnterANote')">
+        </el-input>
+      </span>
 <!--      <el-button type="primary">瀹℃牳涓嶉�氳繃</el-button>-->
       &nbsp;
       <label>{{technologicalProcess}}</label>
@@ -1472,13 +1687,14 @@
         <el-col :span="3">
           <el-select :disabled="groupChangeProcess"
                      v-model="titleUploadData.teamsGroupsName"
+                     @change="changeGroup"
                      clearable
                      :placeholder="$t('reportingWorks.selectTeam')">
             <el-option
                 v-for="item in titleSelectJson['teamsType']"
                 :key="item.id"
-                :label="item.basicName"
-                :value="item.basicName"
+                :label="item.user_name"
+                :value="item.user_name"
             />
           </el-select>
         </el-col>
diff --git a/north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue b/north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue
index f4c8fac..12a7e8a 100644
--- a/north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue
+++ b/north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue
@@ -227,8 +227,8 @@
           <el-option  :label="$t('orderBasicData.commonProcess')" value="" />
           <el-option  :label="$t('orderBasicData.laminatingProcessA')" value="stepA" />
           <el-option  :label="$t('orderBasicData.laminatingProcessB')" value="stepB" />
-          <el-option  :label="$t('orderBasicData.laminatingProcessA')" value="stepC" />
-          <el-option  :label="$t('orderBasicData.laminatingProcessB')" value="stepD" />
+          <el-option  :label="$t('orderBasicData.laminatingProcessC')" value="stepC" />
+          <el-option  :label="$t('orderBasicData.laminatingProcessD')" value="stepD" />
         </el-select>
       </el-col>
     </el-row>
diff --git a/north-glass-erp/northglass-erp/src/views/sd/delivery/CreateDelivery.vue b/north-glass-erp/northglass-erp/src/views/sd/delivery/CreateDelivery.vue
index 89c30f2..27b8def 100644
--- a/north-glass-erp/northglass-erp/src/views/sd/delivery/CreateDelivery.vue
+++ b/north-glass-erp/northglass-erp/src/views/sd/delivery/CreateDelivery.vue
@@ -320,6 +320,7 @@
     {field: 'select',type:'checkbox',title: t('basicData.check'), width: 80,fixed:"left"},
     {type: 'seq', title: t('basicData.Number'), width: 80 ,fixed:"left"},
     {field: 'orderId',width:120,  title: t('order.orderId'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+    {field: 'finishedGoodsInventory.boxNo',width:120,  title: t('绠卞彿'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
     {field: 'productName',width:120,  title: t('order.product'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
     {field: 'width',width:120,  title: t('order.width'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
     {field: 'height',width:120,  title: t('order.height'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
diff --git a/north-glass-erp/northglass-erp/src/views/sd/delivery/SelectDelivery.vue b/north-glass-erp/northglass-erp/src/views/sd/delivery/SelectDelivery.vue
index 6b17992..df01636 100644
--- a/north-glass-erp/northglass-erp/src/views/sd/delivery/SelectDelivery.vue
+++ b/north-glass-erp/northglass-erp/src/views/sd/delivery/SelectDelivery.vue
@@ -13,13 +13,17 @@
 import {CircleCheck, Download, Printer} from "@element-plus/icons-vue/global";
 import PrintSheet1 from "@/components/sd/delivery/PrintSheet1.vue";
 import PrintSheet2 from "@/components/sd/delivery/PrintSheet2.vue";
+import PrintSheetLuoyang from "@/components/sd/delivery/PrintSheetLuoyang.vue";
+import PrintSheetLuoyangDetails from "@/components/sd/delivery/PrintSheetLuoyangDetails.vue";
 import useOrderInfoStore from "@/stores/sd/order/orderInfo";
 import { saveAs } from "file-saver"
+import companyInfo from "@/stores/sd/companyInfo";
 
 //璇█鑾峰彇
 const { t } = useI18n()
 const orderInfo = useOrderInfoStore()
 const router = useRouter()
+const company = companyInfo()
 const userStore = useUserInfoStore()
 const username = userStore.user.userName
 const userid = userStore.user.userId
@@ -107,6 +111,12 @@
     orderInfo.selectDeliveryDate = res.data.selectDate
     pageNum.value=1
     produceList = deepClone(res.data.data)
+    if(company.companyName=='娲涢槼鍖楁柟鐜荤拑鎶�鏈偂浠芥湁闄愬叕鍙�'){
+      xGrid.value.menuConfig.body.options[0][2].visible=true
+      xGrid.value.menuConfig.body.options[0][3].visible=true
+      xGrid.value.menuConfig.body.options[0][4].visible=true
+      xGrid.value.menuConfig.body.options[0][5].visible=true
+    }
     xGrid.value.loadData(produceList)
     gridOptions.loading=false
   }else{
@@ -146,6 +156,10 @@
       pageNum.value=1
       produceList = deepClone(res.data.data)
       xGrid.value.loadData(produceList)
+      if(company.companyName=='娲涢槼鍖楁柟鐜荤拑鎶�鏈偂浠芥湁闄愬叕鍙�'){
+        xGrid.value.menuConfig.body.options[0][2].visible=true
+        xGrid.value.menuConfig.body.options[0][3].visible=true
+      }
       gridOptions.loading=false
     }else{
       ElMessage.warning(res.msg)
@@ -165,6 +179,10 @@
       }
       produceList = deepClone(res.data.data)
       xGrid.value.loadData(produceList)
+      if(company.companyName=='娲涢槼鍖楁柟鐜荤拑鎶�鏈偂浠芥湁闄愬叕鍙�'){
+        xGrid.value.menuConfig.body.options[0][2].visible=true
+        xGrid.value.menuConfig.body.options[0][3].visible=true
+      }
       gridOptions.loading=false
     }else{
       ElMessage.warning(res.msg)
@@ -263,6 +281,137 @@
           }
           break
         }
+        case 'sheet3': {
+          const selectRecords = $grid.getCheckboxRecords()
+          if (selectRecords.length === 0) {
+            if(rowClickIndex.value.deliveryState>0){
+              ElMessage.warning(t('order.printingNumber')+rowClickIndex.value.printingNumber)
+              let delivery=([])
+              delivery.push(rowClickIndex.value)
+              flowData.value.delivery=delivery
+              dialogTableVisible.value = true
+              sheetIndex.value=3
+            }else{
+              ElMessage.warning(t('order.orderNotApproved'))
+            }
+          }else{
+            let a=0
+            selectRecords.forEach((item) => {
+              if(item.deliveryState==0){
+                ElMessage.warning(t('order.orderNotApproved'))
+                a=1
+              }
+            })
+            if(a==0){
+              flowData.value.delivery=selectRecords
+              dialogTableVisible.value = true
+              sheetIndex.value=3
+            }
+
+
+          }
+
+          break
+
+        }
+        case 'sheet4': {
+          const selectRecords = $grid.getCheckboxRecords()
+          if (selectRecords.length === 0) {
+            if(rowClickIndex.value.deliveryState>0){
+              ElMessage.warning(t('order.printingNumber')+rowClickIndex.value.printingNumber)
+              let delivery=([])
+              delivery.push(rowClickIndex.value)
+              flowData.value.delivery=delivery
+              dialogTableVisible.value = true
+              sheetIndex.value=4
+            }else{
+              ElMessage.warning(t('order.orderNotApproved'))
+            }
+          }else{
+            let a=0
+            selectRecords.forEach((item) => {
+              if(item.deliveryState==0){
+                ElMessage.warning(t('order.orderNotApproved'))
+                a=1
+              }
+            })
+            if(a==0){
+              flowData.value.delivery=selectRecords
+              dialogTableVisible.value = true
+              sheetIndex.value=4
+            }
+
+
+          }
+
+          break
+
+        }
+        case 'sheet5': {
+          const selectRecords = $grid.getCheckboxRecords()
+          if (selectRecords.length === 0) {
+            if(rowClickIndex.value.deliveryState>0){
+              ElMessage.warning(t('order.printingNumber')+rowClickIndex.value.printingNumber)
+              let delivery=([])
+              delivery.push(rowClickIndex.value)
+              flowData.value.delivery=delivery
+              dialogTableVisible.value = true
+              sheetIndex.value=5
+            }else{
+              ElMessage.warning(t('order.orderNotApproved'))
+            }
+          }else{
+            let a=0
+            selectRecords.forEach((item) => {
+              if(item.deliveryState==0){
+                ElMessage.warning(t('order.orderNotApproved'))
+                a=1
+              }
+            })
+            if(a==0){
+              flowData.value.delivery=selectRecords
+              dialogTableVisible.value = true
+              sheetIndex.value=5
+            }
+
+
+          }
+
+          break
+
+        }
+        case 'sheet6': {
+          const selectRecords = $grid.getCheckboxRecords()
+          if (selectRecords.length === 0) {
+            if(rowClickIndex.value.deliveryState>0){
+              ElMessage.warning(t('order.printingNumber')+rowClickIndex.value.printingNumber)
+              let delivery=([])
+              delivery.push(rowClickIndex.value)
+              flowData.value.delivery=delivery
+              dialogTableVisible.value = true
+              sheetIndex.value=6
+            }else{
+              ElMessage.warning(t('order.orderNotApproved'))
+            }
+          }else{
+            let a=0
+            selectRecords.forEach((item) => {
+              if(item.deliveryState==0){
+                ElMessage.warning(t('order.orderNotApproved'))
+                a=1
+              }
+            })
+            if(a==0){
+              flowData.value.delivery=selectRecords
+              dialogTableVisible.value = true
+              sheetIndex.value=6
+            }
+
+
+          }
+
+          break
+        }
       }
     }
   },
@@ -305,6 +454,10 @@
         [
           { code: 'sheet1', name: t('basicData.print'), prefixIcon: 'vxe-icon-file-txt', visible: true},
           { code: 'sheet2', name: t('basicData.print')+ t('delivery.noMoney'), prefixIcon: 'vxe-icon-file-txt', visible: true},
+          { code: 'sheet3', name: t('娲涢槼鎵撳嵃鏃犲昂瀵�'), prefixIcon: 'vxe-icon-file-txt', visible: false},
+          { code: 'sheet4', name: t('娲涢槼鎵撳嵃鏃犲昂瀵�')+ t('delivery.noMoney'), prefixIcon: 'vxe-icon-file-txt', visible: false},
+          { code: 'sheet5', name: t('娲涢槼鎵撳嵃鏈夊昂瀵�'), prefixIcon: 'vxe-icon-file-txt', visible: false},
+          { code: 'sheet6', name: t('娲涢槼鎵撳嵃鏈夊昂瀵�')+ t('delivery.noMoney'), prefixIcon: 'vxe-icon-file-txt', visible: false},
         ]
       ]
     }
@@ -501,6 +654,10 @@
       </template>
       <print-sheet1 id="child"  v-if="sheetIndex===1" :deliveryId="flowData.delivery" />
       <print-sheet2 id="child"  v-if="sheetIndex===2" :deliveryId="flowData.delivery" />
+      <print-sheet-luoyang id="child"  v-if="sheetIndex===3" :deliveryId="flowData.delivery" :type="1" />
+      <print-sheet-luoyang id="child"  v-if="sheetIndex===4" :deliveryId="flowData.delivery" :type="2" />
+      <print-sheet-luoyang-details id="child"  v-if="sheetIndex===5" :deliveryId="flowData.delivery" :type="3" />
+      <print-sheet-luoyang-details id="child"  v-if="sheetIndex===6" :deliveryId="flowData.delivery" :type="4" />
 
     </el-dialog>
   </div>
diff --git a/north-glass-erp/northglass-erp/src/views/sd/order/CreateOrder.vue b/north-glass-erp/northglass-erp/src/views/sd/order/CreateOrder.vue
index 9e89320..8a72eeb 100644
--- a/north-glass-erp/northglass-erp/src/views/sd/order/CreateOrder.vue
+++ b/north-glass-erp/northglass-erp/src/views/sd/order/CreateOrder.vue
@@ -12,6 +12,7 @@
 import CreateCustomer from "@/views/sd/customer/CreateCustomer.vue"
 import OrderOtherMoney from "@/components/sd/order/OrderOtherMoney.vue"
 import OrderSizeCheck from "@/components/sd/order/OrderSizeCheck.vue"
+import UpdateAlienEditor from "@/components/sd/order/UpdateAlienEditor.vue"
 import {changeFilterEvent,filterChanged} from "@/hook"
 import {addListener,toolbarButtonClickEvent} from "@/hook/mouseMove"
 import downLoadFile from "@/hook/downLoadFile"
@@ -29,6 +30,7 @@
 let sizeCheckVisible = ref(false)
 let dialogTransferVisible = ref(false)
 let uploadPictureVisible = ref(false)
+let alienEditorVisible = ref(false)
 const transferData = ref({
   oldOrderId:null,
   newOrderNumber:null,
@@ -129,7 +131,7 @@
           { code: 'sizeCheck', name: t('basicData.sizeReview'), prefixIcon: 'vxe-icon-eye-fill', visible: true, disabled: false },
           { code: 'updateOrderId', name: t('searchOrder.updateOrderId'), prefixIcon: 'vxe-icon-eye-fill', visible: true, disabled: false },
           { code: 'reportingTransfer', name: t('searchOrder.reportingTransfer'), prefixIcon: 'vxe-icon-send', visible: true, disabled: true },
-          /*{ code: 'uploadPicture', name: 'Upload Picture',  visible: true, }*/
+          { code: 'uploadPicture', name: t('order.graphic'),prefixIcon: 'vxe-icon-send',  visible: true, }
         ]
       ]
     }
@@ -182,6 +184,7 @@
     {field: 'bendRadius',width:160,  title: t('order.bendRadius'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
     {field: 'edgingType',width:160,  title: t('order.edgingType'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
     {field: 'processingNote',width:200,  title: t('order.processingNote'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+    {field: 'fileName',width:200,  title: t('order.drawingNo'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
     {field: 'remarks',width:140,  title: t('basicData.remarks'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
 
 
@@ -562,6 +565,7 @@
           }
           computedMoney(result.cell)
           gridOptions.menuConfig.body.options[0][5].disabled=false
+          xGrid.value.updateFooter()
           break
         }
         case 'copyAll' :{
@@ -600,6 +604,7 @@
           }
           computedMoney(result.cell)
           gridOptions.menuConfig.body.options[0][5].disabled=false
+          xGrid.value.updateFooter()
           break
         }
         case 'clearChecked' :{
@@ -614,6 +619,7 @@
           }
           computedMoney(result.cell)
           gridOptions.menuConfig.body.options[0][5].disabled=false
+
           break
         }
         case 'computedMoney' :{
@@ -702,6 +708,7 @@
           }
           computedMoney(result.cell)
           gridOptions.menuConfig.body.options[0][5].disabled=false
+          xGrid.value.updateFooter()
           break
         }
         case 'incrementalChecked' : {
@@ -766,6 +773,7 @@
           }
           computedMoney(result.cell)
           gridOptions.menuConfig.body.options[0][5].disabled = false
+          xGrid.value.updateFooter()
           break
         }
         case "reportingTransfer":{
@@ -785,8 +793,10 @@
             ElMessage.warning(t('components.pleaseClickToSelectARowFirst'))
             return
           }
-          uploadPictureVisible.value= true
+          rowIndex=row
+          alienEditorVisible.value= true
         }
+
       }
     }
   },
@@ -826,6 +836,11 @@
 onMounted(async ()=>{
   gridOptions.loading = true
   await initOrder(0)
+
+  //寮傚舰瀵煎叆
+  if(!company.alienFunction){
+    gridOptions.menuConfig.body.options[0][13].disabled=true
+  }
 
   //鍚敤琛ㄦ牸鎷栧姩閫変腑
   addListener(xGrid.value,gridOptions)
@@ -925,6 +940,12 @@
       const orderDetails = res.data.orderDetails
       orderDetails.forEach(item => {
         item.otherColumns = JSON.parse(item.otherColumns)
+        if(res.data.orderFile!=null){
+          res.data.orderFile.forEach(items=>{
+            if(items.order_number==item.orderNumber)
+            item.fileData=items.file_data
+          })
+        }
       })
       otherMoney.value =res.data.orderOtherMoneyList
           //鍔犺浇鍓〃鏁版嵁
@@ -1426,6 +1447,7 @@
    //   }
    // }
   titleUploadData.value.money=countMoney(xGrid.value.getTableData().fullData).toString()
+  xGrid.value.updateFooter()
 
 }
 
@@ -1483,6 +1505,15 @@
   if(flag){
     done()
     titleUploadData.value.money=countMoney(xGrid.value.getTableData().fullData).toString()
+  }
+}
+
+//鍏抽棴寮傚舰缂栬緫鐣岄潰
+const refAlienEditor = ref()
+const closeAlienEditorDialog = async (done) => {
+  const flag = await refAlienEditor.value.validate()
+  if(flag){
+    done()
   }
 }
 //鏀瑰彉璁$畻鏂瑰紡
@@ -1631,14 +1662,24 @@
 }
 
 //鍥剧墖涓婁紶鍚嶇О
-const getUploadPicture = (name) => {
-  uploadPictureVisible.value = false
+const getUploadPicture = async (name, fileData) => {
   const row = xGrid.value.getCurrentRecord()
-  if(!row.otherColumns){
-    row.otherColumns = {}
-  }
-  row.otherColumns.S02 = name
+  row.fileName = name
+  row.fileData = fileData
+  row.shape=2
+  ElMessage.success("淇濆瓨鎴愬姛")
+  alienEditorVisible.value=false
+
 }
+
+const fileToBase64 = (file) => {
+  return new Promise((resolve, reject) => {
+    const reader = new FileReader();
+    reader.onload = () => resolve(reader.result);
+    reader.onerror = reject;
+    reader.readAsDataURL(file);
+  });
+};
 
 </script>
 
@@ -1885,6 +1926,19 @@
           :otherMoney="otherMoney"
           style="width: 100%;height: 100%" />
     </el-dialog>
+<!--寮傚舰瀵煎叆-->
+    <el-dialog v-model="alienEditorVisible"
+               :title="$t('')"
+               :close-on-click-modal="false"
+               :close-on-press-escape="false"
+               destroy-on-close
+               style="width: 614px;height:470px ">
+      <update-alien-editor
+          ref="refAlienEditor"
+          :rowIndex="rowIndex"
+          @getUploadPicture="getUploadPicture"
+          style="width: 100%;height: 100%" />
+    </el-dialog>
 
 <!--    灏哄瀹℃牳绐楀彛-->
     <el-dialog
@@ -1923,7 +1977,7 @@
     <el-dialog v-model="uploadPictureVisible"
                :close-on-click-modal="false"
                destroy-on-close width="500">
-      <upload-picture  @getUploadPicture="getUploadPicture"/>
+      <upload-picture  />
     </el-dialog>
 
 
diff --git a/north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue b/north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue
index 9065a5f..7926fdc 100644
--- a/north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue
+++ b/north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue
@@ -670,7 +670,10 @@
                      size="small">
             {{ $t('basicData.edit') }}
           </el-button>
-          <el-popconfirm @confirm="getTableRow(row,'delete')" :title="$t('searchOrder.deleteConfirm')">
+          <el-popconfirm
+              v-if="userStore.user.permissions.indexOf('selectOrder.edit') > -1"
+              @confirm="getTableRow(row,'delete')"
+                         :title="$t('searchOrder.deleteConfirm')">
             <template #reference>
               <el-button  link type="primary" size="small">{{ $t('basicData.delete') }}</el-button>
             </template>
diff --git a/north-glass-erp/northglass-erp/src/views/sd/order/UpdateOrderCraft.vue b/north-glass-erp/northglass-erp/src/views/sd/order/UpdateOrderCraft.vue
index 98452b4..a1ec83a 100644
--- a/north-glass-erp/northglass-erp/src/views/sd/order/UpdateOrderCraft.vue
+++ b/north-glass-erp/northglass-erp/src/views/sd/order/UpdateOrderCraft.vue
@@ -1,5 +1,5 @@
 <script setup>
-import {computed, onMounted, reactive, ref, watch} from "vue"
+import {computed, onMounted, reactive, ref, watch,onUpdated,onBeforeUnmount} from "vue"
 import {useRouter,useRoute} from "vue-router"
 import request from "@/utils/request"
 import {ElMessage, ElMessageBox} from "element-plus"
@@ -8,6 +8,11 @@
 import {useI18n} from "vue-i18n"
 import companyInfo from "@/stores/sd/companyInfo"
 import UpdateOrderCraft from "@/components/sd/order/UpdateOrderCraft.vue"
+import { saveAs } from 'file-saver';
+import DXFWriter from 'dxf-writer';
+import DxfParser from 'dxf-parser';
+import { Leafer, Polygon,Ellipse,Line,Path } from 'leafer-ui'
+import {round} from "xe-utils";
 const { t } = useI18n()
 
 const router = useRouter()
@@ -38,7 +43,7 @@
   },
   mouseConfig:{selected: true},
   filterConfig: {   //绛涢�夐厤缃」
-   // remote: true
+    // remote: true
   },
   customConfig: {
     storage: true
@@ -62,6 +67,7 @@
     {field: 'childWidth',width:120,  title: t('craft.childWidth'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
     {field: 'childHeight',width:120,  title: t('craft.childHeight'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
     {field: 'arc',width:120,  title: t('craft.arc'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+    {field: 'archRise',width:120,  title: t('craft.archRise'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
     {field: 'area',width:120,  title: t('craft.area'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
     {field: 'orderDetail.quantity',width:120,  title: t('order.quantity'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
     {field: 'process',width:120,  title: t('craft.process'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
@@ -82,14 +88,14 @@
   menuConfig:{
     body:{
       options:[
-          [
-            { code: 'copyChecked', name: t('basicData.selectSame'), prefixIcon: 'vxe-icon-copy', visible: true, disabled: false },
-            { code: 'copyAll', name: t('basicData.sameAfterwards'), prefixIcon: 'vxe-icon-feedback', visible: true, disabled: false },
-            { code: 'clearChecked', name: t('basicData.clearSelection'), prefixIcon: 'vxe-icon-indicator', visible: true, disabled: false },
-            { code: 'computedSize', name: t('basicData.computedSize'), prefixIcon: 'vxe-icon-chart-line', visible: true, disabled: false },
-            { code: 'paste', name: t('basicData.paste'), prefixIcon: 'vxe-icon-paste', visible: true, disabled: false },
-            { code: 'sort', name: t('craft.sort'), prefixIcon: 'vxe-icon-sort-asc', visible: true, disabled: false },
-          ]
+        [
+          { code: 'copyChecked', name: t('basicData.selectSame'), prefixIcon: 'vxe-icon-copy', visible: true, disabled: false },
+          { code: 'copyAll', name: t('basicData.sameAfterwards'), prefixIcon: 'vxe-icon-feedback', visible: true, disabled: false },
+          { code: 'clearChecked', name: t('basicData.clearSelection'), prefixIcon: 'vxe-icon-indicator', visible: true, disabled: false },
+          { code: 'computedSize', name: t('basicData.computedSize'), prefixIcon: 'vxe-icon-chart-line', visible: true, disabled: false },
+          { code: 'paste', name: t('basicData.paste'), prefixIcon: 'vxe-icon-paste', visible: true, disabled: false },
+          { code: 'sort', name: t('craft.sort'), prefixIcon: 'vxe-icon-sort-asc', visible: true, disabled: false },
+        ]
       ]
     }
   },
@@ -100,7 +106,7 @@
       {'code': 'review', 'name': t('basicData.review'),status: 'primary'},
     ],
     // import: false,
-     export: true,
+    export: true,
     // print: true,
     zoom: true,
     custom: true
@@ -161,16 +167,16 @@
             inputPattern:/^(-?\d{1,4}(\.\d{1,2})?|-?0(\.\d{1,2})?)$/,
             inputErrorMessage: '-9999.99~9999.99',
           })
-          .then(({ value }) => {
-            const value1 = value*1
-            $grid.getTableData().visibleData.forEach((item,index) =>{
-              if(index>=result.start && index<=result.end){
+              .then(({ value }) => {
+                const value1 = value*1
+                $grid.getTableData().visibleData.forEach((item,index) =>{
+                  if(index>=result.start && index<=result.end){
 
-                item[result.cell] = item[result.cell]*1+value1
-              }
+                    item[result.cell] = item[result.cell]*1+value1
+                  }
 
-            })
-          })
+                })
+              })
 
           break
         }
@@ -236,15 +242,24 @@
 
           for (let i=0; i<uniqueArray.length; i++)  {
             const sameOrderNumber  =  xGrid.value.getTableData().fullData.filter((item) =>
-              parseInt(item.orderNumber) === i+1
+                parseInt(item.orderNumber) === i+1
             )
             let widthList = []
-            sameOrderNumber.forEach((item) =>
+            let arcList = []
+            let archRiseList = []
+            sameOrderNumber.forEach((item) =>{
               widthList.push(item.childWidth)
-            )
+              arcList.push(item.arc)
+              archRiseList.push(item.archRise)
+              console.log(item.archRise)
+            })
             widthList = widthList.sort();
+            arcList = arcList.sort();
+            archRiseList = archRiseList.sort();
             sameOrderNumber.forEach((item,index) =>{
               item.childWidth = widthList[index]
+              item.arc = arcList[index]
+              item.archRise = archRiseList[index]
             })
 
           }
@@ -324,7 +339,28 @@
 
 //淇敼鍟嗘爣閫夐」
 let trademarkVisible = ref(false)
-const updateTrademark = (row) => {
+let trademarkRow = ref(null)
+let dxfData =ref(null)
+const updateTrademark =  async(row) => {
+  let flowData = ref({
+    orderId: row.orderId,
+    orderNumber: row.orderNumber
+  })
+  await request.post("/order/selectUploadDxf",flowData.value).then((res) => {
+    if (res.code === "200") {
+      if(res.data.data!=null){
+        const b64Data = res.data.data.file_data;
+        const byteCharacters = atob(b64Data);
+        const parser = new DxfParser();
+        dxfData.value = parser.parseSync(byteCharacters)
+      }else{
+        dxfData.value =null
+      }
+
+    }
+  })
+
+  trademarkRow.value=row
   trademarkVisible.value= true
   /*Object.keys(trademarkAttr.value).forEach((key) => {
     if(key==='location'){
@@ -338,13 +374,13 @@
   trademarkAttr.value = {
     trademark:"3C",
     xImage:false,
-      yImage:false,
-      tag:true,
-      tag2:true ,
-      tag3:true,
-      xMargin:30,
-      yMargin:30,
-      location:t('craft.lowLeft')
+    yImage:false,
+    tag:true,
+    tag2:true ,
+    tag3:true,
+    xMargin:30,
+    yMargin:30,
+    location:t('craft.lowLeft')
   }
   if(row.icon!=null){
     trademarkAttr.value = JSON.parse(row.icon)
@@ -356,12 +392,17 @@
   })
 
   rowIndex.value = row
+
 }
 
 const changeTrademark = ()=>{
+  if(company.alienFunction){
+    exportToDXF()
+  }
   rowIndex.value.icon = JSON.stringify(trademarkAttr.value)
   trademarkVisible.value=false
   Object.keys(trademarkAttr.value).forEach((key) => (trademarkAttr.value[key] = ''))
+
 }
 
 
@@ -377,6 +418,11 @@
   craftVisible.value= false
 }
 
+onUpdated(() => {
+  if (trademarkVisible.value&&trademarkRow.value!=null) {
+    ongetproject(trademarkRow.value)
+  }
+})
 
 
 //鍒濆鍖栧垽鏂槸鍚︽湁id浼犲叆
@@ -412,7 +458,6 @@
 })
 //淇濆瓨淇敼宸ヨ壓
 const reviewOrderCraft = (state) => {
-
   request.post(`/order/reviewProcessById/${titleUploadData.value.orderId}/${state}`,xGrid.value.getRecordset().updateRecords).then(res =>{
     if(res.code==200){
       gridOptions.toolbarConfig.buttons[2].disabled = true
@@ -440,6 +485,7 @@
       trademarkAttr.value[key] = []
     }
   }
+
 }
 
 const iconChange = () => {
@@ -457,6 +503,626 @@
 let enlargementFlag = ref(false)
 const trademarkenlargement = () => {
   enlargementFlag.value = !enlargementFlag.value
+
+}
+
+
+
+
+
+
+/*dxf鏂囦欢瑙f瀽鍙婂叾瀵煎嚭*/
+
+let state=ref(false)
+let points=ref([])
+let data1=ref(0);let data2=ref(0);let data3=ref(0);let data4=ref(0)
+let data5=ref(0);let data6=ref(0);let data7=ref(0);let data8=ref(0)
+
+let datas1=ref(0);let datas2=ref(0);let datas3=ref(0);let datas4=ref(0)
+let datas5=ref(0);let datas6=ref(0);let datas7=ref(0);let datas8=ref(0)
+let big=10
+let leafer;
+let parsedDXFData = ref([]);
+let orderDetailWidth=ref(0)
+let orderDetailHeight=ref(0)
+let widthAgv=ref(0)
+let heightAgv=ref(0)
+
+const ongetproject = (row) =>  {
+
+  if(dxfData.value==null){
+    orderDetailWidth.value=row.childWidth
+    orderDetailHeight.value=row.childHeight
+    const main =document.getElementById('mains')
+    const width =document.getElementById('width')
+    const height =document.getElementById('height')
+    if(orderDetailWidth.value/400>orderDetailHeight.value/250){
+      big=orderDetailWidth.value/400
+    }else{
+      big=orderDetailHeight.value/250
+    }
+    let widthAgv=orderDetailWidth.value/big
+    let heightAgv=orderDetailHeight.value/big
+    main.style.width=widthAgv+"px"
+    main.style.height=heightAgv+"px"
+    main.style.backgroundColor = "#8d9095"
+    datas2.value=heightAgv
+    datas8.value=heightAgv
+    datas5.value=widthAgv
+    datas7.value=widthAgv
+    if(leafer!=undefined){
+      leafer.clear()
+    }
+    leafer=new Leafer({ view: 'canvas' })
+    points.value=[0, heightAgv, 0, 0, widthAgv, 0, widthAgv,heightAgv]
+    const polygon = new Polygon({
+      points: points.value,
+      fill: '#32cd79',
+      origin: [0, 0]
+    })
+    setTimeout(() => {
+      leafer.add(polygon);
+    }, 30);
+
+    trademarkAttr.value.location = t('craft.lowLeft')
+  }else{
+    state.value=false
+    handleFileUpload()
+  }
+
+
+}
+
+const getproject = () => {
+  if (dxfData.value == null||state.value){
+    leafer = new Leafer({view: 'canvas'})
+    points.value = [datas1.value + (parseInt(data5.value) / big), datas2.value - (parseInt(data6.value) / big), datas3.value + (parseInt(data1.value) / big), datas4.value + (parseInt(data2.value) / big),
+      datas5.value - (parseInt(data3.value) / big), datas6.value + (parseInt(data4.value) / big), datas7.value - (parseInt(data7.value) / big), datas8.value - (parseInt(data8.value) / big)]
+      const polygon = new Polygon({
+       points: points.value,
+      fill: '#32cd79',
+      origin: [0, 0]
+    })
+  leafer.add(polygon)
+  }
+}
+
+
+const exportToDXF = async () => {
+  const dxf = new DXFWriter();
+  const polygonPoints = points.value.map((coord, index) => ({
+    x: index % 2 === 0 ? coord : undefined,
+    y: index % 2 !== 0 ? -coord : undefined
+  })).filter(point => point.x !== undefined && point.y !== undefined);
+
+  let arr=[]
+  for (let i=0;i<points.value.length;i++){
+    let a=[]
+    if(i % 2 === 0){
+      a.push(points.value[i]*big)
+      a.push((points.value[i+1]*big))
+      a.push(0)
+      arr.push(a)
+    }
+
+  }
+  let minX = Infinity, minY = Infinity;
+  let maxX = -Infinity, maxY = -Infinity;
+  arr.forEach(p => {
+    minX = Math.min(Math.abs(p[0]),minX );
+    minY = Math.min(Math.abs(p[1]),minY);
+    maxX = Math.max(Math.abs(p[0]),maxX );
+    maxY = Math.max(Math.abs(p[1]),maxY);
+  });
+
+  arr.forEach(p => {
+    p[1]=maxY-minY-p[1]
+  });
+
+
+  dxf.drawPolyline(arr,{ closed: true, layer: '0' })
+
+  const blob = new Blob([dxf.toDxfString()], {type: 'text/plain;charset=utf-8'});
+  const base64 = await fileToBase64(blob);
+  let filterData=ref({
+    dataBase64:base64.replace(/^data:.+;base64,/, ""),
+    orderId:rowIndex.value.orderId,
+    orderNumber:rowIndex.value.orderNumber
+  })
+  request.post(`/order/updateOrderFile`,filterData.value).then(res =>{
+    if(res.code==200){
+      //saveAs(blob, 'map.dxf');
+    }else{
+      ElMessage.error(res.msg)
+    }
+  })
+  //saveAs(blob, 'map.dxf');
+}
+
+const fileToBase64 = (file) => {
+  return new Promise((resolve, reject) => {
+    const reader = new FileReader();
+    reader.onload = () => resolve(reader.result);
+    reader.onerror = reject;
+    reader.readAsDataURL(file);
+  });
+};
+
+
+function toBottomOrigin(y, canvasHeight) {
+  return canvasHeight - y; // 灏嗗乏涓婅Y鍧愭爣杞崲涓哄乏涓嬭鍧愭爣绯�
+}
+
+
+const handleFileUpload =  () => {
+  const main =document.getElementById('mains')
+  const width =document.getElementById('width')
+  const height =document.getElementById('height')
+  if(leafer!=undefined){
+    leafer.clear()
+  }
+  leafer = new Leafer({ view: 'canvas' });
+      try {
+        let minX = Infinity, minY = Infinity;
+        let maxX = -Infinity, maxY = -Infinity;
+        dxfData.value.entities.forEach(entity => {
+          if (entity.type === 'LINE' || entity.type === 'LWPOLYLINE') {
+            entity.vertices.forEach(vertices => {
+              minX = Math.min(vertices.x, minX);
+              minY = Math.min(vertices.y, minY);
+              maxX = Math.max(vertices.x, maxX);
+              maxY = Math.max(vertices.y, maxY);
+            })
+          }
+          if (entity.type === 'ARC') {
+            const center = {x: entity.center.x, y: entity.center.y};
+            const radius = entity.radius;
+            const startAngle = entity.startAngle * (180 / Math.PI);
+            const endAngle = entity.endAngle * (180 / Math.PI);
+
+            const points = [];
+            const steps = 32;
+            for (let i = 0; i <= steps; i++) {
+              const angle = startAngle + (endAngle - startAngle) * (i / steps);
+              const x = center.x + radius * Math.cos(angle * Math.PI / 180);
+              const y = center.y + radius * Math.sin(angle * Math.PI / 180);
+              points.push({x, y});
+            }
+
+
+            points.forEach(p => {
+              minX = Math.min(minX, p.x);
+              minY = Math.min(minY, p.y);
+              maxX = Math.max(maxX, p.x);
+              maxY = Math.max(maxY, p.y);
+            });
+          }
+        });
+        if ((maxX - minX) / 400 > (maxY - minY) / 250) {
+          big = (maxX - minX) / 400
+        } else {
+          big = (maxY - minY) / 250
+        }
+
+        Object.values(dxfData.value.entities).forEach(entity => {
+          switch (entity.type) {
+            case 'LINE':
+              main.style.width = (maxX - minX) / big + "px"
+              main.style.height = (maxY - minY) / big + "px"
+              main.style.backgroundColor = "#8d9095"
+              width.innerHTML = round(maxX - minX, 2)
+              height.innerHTML = round(maxY - minY, 2)
+              const line = new Line({
+                points: [(entity.vertices[0].x - minX) / big, ((maxY - minY) - (entity.vertices[0].y- minY)) / big,
+                  (entity.vertices[1].x - minX) / big, ((maxY - minY) - (entity.vertices[1].y - minY)) / big],
+                stroke: '#f00',
+                strokeWidth: 1
+              })
+              setTimeout(() => {
+                leafer.add(line);
+              }, 30);
+              break;
+            case 'LWPOLYLINE':
+
+              main.style.width = (maxX - minX) / big + "px"
+              main.style.height = (maxY - minY) / big + "px"
+              main.style.backgroundColor = "#8d9095"
+              width.innerHTML = round(maxX - minX, 2)
+              height.innerHTML = round(maxY - minY, 2)
+
+
+              let point = entity.vertices.map(v => [
+                (v.x - minX) / big,
+                toBottomOrigin((v.y - minY) / big, (maxY - minY) / big),
+              ]).flat()
+
+              if(entity.vertices.length==4){
+                isQuadrilateral(maxY,minY,maxX,minX,point)
+              }
+
+              const polygon = new Polygon({
+                points: point,
+                fill: '#32cd79',
+              })
+              setTimeout(() => {
+                leafer.add(polygon);
+              }, 30);
+
+              break;
+            case 'CIRCLE':
+              big = (entity.radius * 2) / 400
+              main.style.width = entity.radius * 2 / big + "px"
+              main.style.height = entity.radius * 2 / big + "px"
+              width.innerHTML = round(entity.radius * 2, 2)
+              height.innerHTML = round(entity.radius * 2, 2)
+              const ellipse = new Ellipse({
+                width: entity.radius * 2 / big,
+                height: entity.radius * 2 / big,
+                fill: "#32cd79"
+              })
+              setTimeout(() => {
+                leafer.add(ellipse);
+              }, 30);
+
+              break;
+            case 'ELLIPSE':
+              console.log(entity)
+
+              const {majorAxisEndPoint, axisRatio} = entity;
+
+              const dx = majorAxisEndPoint.x;
+              const dy = majorAxisEndPoint.y;
+              const a = Math.sqrt(dx ** 2 + dy ** 2);
+              const c = a * axisRatio;
+              const 胃 = Math.atan2(dy, dx);
+              const l = axisRatio * (180 / Math.PI);
+
+              if ((a * 2) / 400 > (c * 2) / 250) {
+                big = (a * 2) / 400
+              } else {
+                big = (c * 2) / 250
+              }
+
+              main.style.width = a * 2 / big + "px"
+              main.style.height = c * 2 / big + "px"
+              width.innerHTML = round(a * 2, 2)
+              height.innerHTML = round(c * 2, 2)
+              const ellipse2 = new Ellipse({
+                width: a * 2 / big,
+                height: c * 2 / big,
+                fill: "#32cd79",
+              })
+
+              setTimeout(() => {
+                leafer.add(ellipse2);
+              }, 30);
+
+              break;
+            case 'ARC':
+              const center = {x: entity.center.x, y: entity.center.y};
+              const radius = entity.radius;
+              const startAngle = entity.startAngle * (180 / Math.PI);
+              const endAngle = entity.endAngle * (180 / Math.PI);
+
+              if ((maxX - minX) / 400 > (maxY - minY) / 250) {
+                big = (maxX - minX) / 400
+              } else {
+                big = (maxY - minY) / 250
+              }
+
+
+              // 璁$畻鍦嗗姬鐨勮捣鐐瑰拰缁堢偣
+              const startX = (center.x + radius * Math.cos(entity.startAngle) - minX);
+              const startY = (maxY - minY) - ((center.y + radius * Math.sin(entity.startAngle)) - minY);
+              const endX = (center.x + radius * Math.cos(entity.endAngle) - minX);
+              const endY = (maxY - minY) - ((center.y + radius * Math.sin(entity.endAngle)) - minY);
+
+              // 鍒涘缓鍦嗗姬璺緞
+              const path = new Path({
+                path: `M ${startX / big} ${startY / big} A ${radius / big} ${radius / big} 0 ${endAngle - startAngle > 180 ? 1 : 0} 0 ${endX / big} ${endY / big}`,
+                stroke: '#f00',
+                strokeWidth: 1,
+              });
+
+
+              setTimeout(() => {
+                leafer.add(path);
+              }, 30);
+
+
+              break;
+
+          }
+        })
+        trademarkAttr.value.xMargin=trademarkAttr.value.xMargin+1
+        trademarkAttr.value.xMargin=trademarkAttr.value.xMargin-1
+        trademarkAttr.value.location = t('craft.lowLeft')
+      } catch (error) {
+        console.error('瑙f瀽DXF鏂囦欢鏃跺嚭閿�:', error);
+      }
+
+
+};
+const handleClosed = () => {
+  data1.value=0
+  data2.value=0
+  data3.value=0
+  data4.value=0
+  data5.value=0
+  data6.value=0
+  data7.value=0
+  data8.value=0
+  big=0
+}
+
+
+const isQuadrilateral =  (maxY,minY,maxX,minX,point) => {
+  state.value=true
+  datas1.value=0
+  datas2.value=(maxY - minY) / big
+  datas3.value=0
+  datas4.value=0
+  datas5.value=(maxX - minX) / big
+  datas6.value=0
+  datas7.value=(maxX - minX) / big
+  datas8.value=(maxY - minY) / big
+  //points.value=[0, heightAgv, 0, 0, widthAgv, 0, widthAgv,heightAgv]
+
+  let numbers = [point[0], point[2], point[4], point[6]]; // 绀轰緥鏁扮粍
+  let maxX1 = Math.max(...numbers); // 鎵惧埌鏈�澶у��
+  let maxIndex = numbers.findIndex(num => num === maxX1); // 瀹氫綅绗竴涓尮閰嶇储寮�
+  let remaining = [...numbers]; // 澶嶅埗鍘熸暟缁勯伩鍏嶇獊鍙�
+  remaining.splice(maxIndex, 1); // 浠呯Щ闄ょ涓�涓渶澶у�煎疄渚�
+  let maxX2 = Math.max(...remaining); // 鍦ㄥ墿浣欐暟缁勪腑鎵剧浜屽ぇ鍊�
+
+  let arr=[]
+  for (let i=0;i<point.length;i++){
+    let a=[]
+    if(i % 2 === 0){
+      a.push(point[i])
+      a.push((point[i+1]))
+      arr.push(a)
+    }
+
+  }
+  let x=[]
+  let y=[]
+
+  let upperRight=null //鍙充笂
+  let lowerRight=null //鍙充笅
+  let topLeft=null //宸︿笂
+  let lowerLeft=null //宸︿笅
+
+  arr.forEach(item=>{
+    if(item[0]==maxX1||item[0]==maxX2){
+      x.push(item)
+    }else{
+      y.push(item)
+    }
+  })
+
+  if(x[0][1]>x[1][1]){
+    lowerRight=x[0]
+    upperRight=x[1]
+  }else{
+    upperRight=x[0]
+    lowerRight=x[1]
+  }
+
+  if(y[0][1]>y[1][1]){
+    lowerLeft=y[0]
+    topLeft=y[1]
+  }else {
+    topLeft=y[0]
+    lowerLeft=y[1]
+  }
+
+
+  if(lowerLeft[0]*big===0){
+    data5.value=0
+  }else{
+    data5.value=round(lowerLeft[0]*big,0)
+  }
+  if(lowerLeft[1]*big===0){
+    data6.value=0
+  }else{
+    data6.value=round(maxY-minY-lowerLeft[1]*big,0)
+  }
+  if(topLeft[0]*big===0){
+    data1.value=0
+  }else{
+    data1.value=round(topLeft[0]*big,0)
+  }
+  if(topLeft[1]*big===0){
+    data2.value=0
+  }else{
+    data2.value=round(topLeft[1]*big,0)
+  }
+  if(upperRight[0]*big===0){
+    data3.value=0
+  }else{
+    data3.value=round(maxX-minX-upperRight[0]*big,0)
+  }
+  if(upperRight[1]*big===0){
+    data4.value=0
+  }else{
+    data4.value=round(upperRight[1]*big,0)
+  }
+  if(lowerRight[0]*big===0){
+    data7.value=0
+  }else{
+    data7.value=round(maxX-minX-lowerRight[0]*big,0)
+  }
+  if(lowerRight[1]*big===0){
+    data8.value=0
+  }else{
+    data8.value=round(maxY-minY-lowerRight[1]*big,0)
+  }
+}
+
+
+/*鍟嗘爣鎷栧姩*/
+
+const parent = ref(null)
+const draggable = ref(null)
+const isDragging = ref(false)
+const startPos = ref({ x: 0, y: 0 })
+
+const startDragUpperLeft = (e) => {
+  const parentRect = parent.value.getBoundingClientRect()
+  isDragging.value = true
+  startPos.value = {
+    x: parentRect.x+trademarkAttr.value.xMargin/big,
+    y: parentRect.y+trademarkAttr.value.yMargin/big
+  }
+
+  document.addEventListener('mousemove', dragUpperLeft)
+  document.addEventListener('mouseup', stopDragUpperLeft)
+}
+
+const dragUpperLeft = (e) => {
+  if (!isDragging.value) return
+
+  // 闄愬埗鍦ㄧ埗鍏冪礌鑼冨洿鍐�
+  const parentRect = parent.value.getBoundingClientRect()
+  const boxRect = draggable.value.getBoundingClientRect()
+
+  let newX = (e.clientX-parentRect.x)
+  let newY = (e.clientY-parentRect.y)
+
+  const maxX = parentRect.width - boxRect.width
+  const maxY = parentRect.height - boxRect.height
+
+  newX = Math.max(0, Math.min(newX, maxX))
+  newY = Math.max(0, Math.min(newY, maxY))
+
+  trademarkAttr.value.xMargin=round(newX*big,0)
+  trademarkAttr.value.yMargin=round(newY*big,0)
+
+}
+
+const stopDragUpperLeft = (e) => {
+  isDragging.value = false
+  document.removeEventListener('mousemove', dragUpperLeft)
+  document.removeEventListener('mouseup', stopDragUpperLeft)
+}
+
+const startDragUpperRight = (e) => {
+  const parentRect = parent.value.getBoundingClientRect()
+  const boxRect = draggable.value.getBoundingClientRect()
+  isDragging.value = true
+
+  startPos.value = {
+    x: parentRect.x+parentRect.width - (trademarkAttr.value.xMargin/big),
+    y: parentRect.y+trademarkAttr.value.yMargin/big
+  }
+  document.addEventListener('mousemove', dragUpperRight)
+  document.addEventListener('mouseup', stopDragUpperRight)
+}
+
+const dragUpperRight = (e) => {
+  if (!isDragging.value) return
+
+  // 闄愬埗鍦ㄧ埗鍏冪礌鑼冨洿鍐�
+  const parentRect = parent.value.getBoundingClientRect()
+  const boxRect = draggable.value.getBoundingClientRect()
+
+  let newX = (parentRect.x+parentRect.width-e.clientX)
+  let newY = (e.clientY-parentRect.y)
+
+  const maxX = parentRect.width - boxRect.width
+  const maxY = parentRect.height - boxRect.height
+
+  newX = Math.max(0, Math.min(newX, maxX))
+  newY = Math.max(0, Math.min(newY, maxY))
+
+  trademarkAttr.value.xMargin=round(newX*big,0)
+  trademarkAttr.value.yMargin=round(newY*big,0)
+
+}
+
+const stopDragUpperRight = (e) => {
+  isDragging.value = false
+  document.removeEventListener('mousemove', dragUpperRight)
+  document.removeEventListener('mouseup', stopDragUpperRight)
+}
+
+const startDragLowLeft = (e) => {
+  isDragging.value = true
+  const parentRect = parent.value.getBoundingClientRect()
+  startPos.value = {
+    x: parentRect.x+trademarkAttr.value.xMargin/big,
+    y: parentRect.y+parentRect.height-trademarkAttr.value.yMargin/big
+  }
+
+  document.addEventListener('mousemove', dragLowLeft)
+  document.addEventListener('mouseup', stopDragLowLeft)
+}
+
+const dragLowLeft = (e) => {
+  if (!isDragging.value) return
+  // 闄愬埗鍦ㄧ埗鍏冪礌鑼冨洿鍐�
+  const parentRect = parent.value.getBoundingClientRect()
+  const boxRect = draggable.value.getBoundingClientRect()
+
+  let newX = (e.clientX-parentRect.x)
+  let newY = (parentRect.y+parentRect.height-e.clientY)
+
+
+  const maxX = parentRect.width - boxRect.width
+  const maxY = parentRect.height - boxRect.height
+
+  newX = Math.max(0, Math.min(newX, maxX))
+  newY = Math.max(0, Math.min(newY, maxY))
+
+  trademarkAttr.value.xMargin=round(newX*big,0)
+  trademarkAttr.value.yMargin=round(newY*big,0)
+}
+
+const stopDragLowLeft = (e) => {
+  isDragging.value = false
+  document.removeEventListener('mousemove', dragLowLeft)
+  document.removeEventListener('mouseup', stopDragLowLeft)
+}
+
+
+const startDragLowRight = (e) => {
+  isDragging.value = true
+  const parentRect = parent.value.getBoundingClientRect()
+  const boxRect = draggable.value.getBoundingClientRect()
+  startPos.value = {
+    x: parentRect.x+parentRect.width-trademarkAttr.value.xMargin/big,
+    y: parentRect.y+parentRect.height-trademarkAttr.value.yMargin/big
+  }
+
+  document.addEventListener('mousemove', dragLowRight)
+  document.addEventListener('mouseup', stopDragLowRight)
+}
+
+const dragLowRight = (e) => {
+  if (!isDragging.value) return
+
+  const parentRect = parent.value.getBoundingClientRect()
+  const boxRect = draggable.value.getBoundingClientRect()
+
+  let newX = (parentRect.x+parentRect.width-e.clientX)
+  let newY = (parentRect.y+parentRect.height-e.clientY)
+
+  const maxX = parentRect.width - boxRect.width
+  const maxY = parentRect.height - boxRect.height
+
+  newX = Math.max(0, Math.min(newX, maxX))
+  newY = Math.max(0, Math.min(newY, maxY))
+
+
+  trademarkAttr.value.xMargin=round(newX*big,0)
+  trademarkAttr.value.yMargin=round(newY*big,0)
+}
+
+const stopDragLowRight = (e) => {
+  isDragging.value = false
+  document.removeEventListener('mousemove', dragLowRight)
+  document.removeEventListener('mouseup', stopDragLowRight)
 }
 
 
@@ -559,6 +1225,7 @@
         :title="$t('craft.TrademarkAttribute')"
         :close-on-click-modal="false"
         :close-on-press-escape="false"
+        @closed="handleClosed"
         style="width: 922px;height:443px ;
         position: relative;" >
       <div style="width: 50%;height: 100%;float: left">
@@ -622,14 +1289,14 @@
         </el-row>
 
         <el-row>
-          <el-col :span="4">{{$t('order.width')}}:</el-col>
+          <el-col :span="4">X:</el-col>
           <el-col :span="6">
             <el-input-number v-model="trademarkAttr.xMargin"/>
           </el-col>
         </el-row>
 
         <el-row>
-          <el-col :span="4">{{$t('order.height')}}:</el-col>
+          <el-col :span="4">Y:</el-col>
           <el-col :span="6">
             <el-input-number v-model="trademarkAttr.yMargin"/>
           </el-col>
@@ -649,93 +1316,54 @@
           </el-col>
         </el-row>
       </div>
-      <div v-if="!enlargementFlag" style="width: 400px;height: 250px;border: 2px solid #000;float: left;position: relative;">
-        <div
-            v-if="tagCheck(t('craft.upperLeft'))"
-            style="float: left;width: 50px;height: 90px;margin-left: 1rem;margin-top: 15px">
-          <el-row class="icon">
-            <el-col class="icon" >
-              <el-image @dblclick="trademarkenlargement" style="width: 100%;height: 100%" :class="{'xStyle':trademarkAttr.xImage,'yStyle':trademarkAttr.yImage}"  :src="iconNickname"/>
-            </el-col>
-          </el-row>
-          <el-row  >
-            <el-col :span="12" >{{$t('order.width')}}:</el-col>
-            <el-col :span="12" >{{trademarkAttr.xMargin}}</el-col>
-          </el-row>
-          <el-row >
-            <el-col :span="12" >{{$t('order.height')}}:</el-col>
-            <el-col :span="12" >{{trademarkAttr.yMargin}}</el-col>
-          </el-row>
-        </div>
+      <div style="width: 404px;height: 254px;border: 2px solid #000;float: left;
+      position: relative;display: flex;justify-content: center;align-content: center;">
 
-        <div
-            v-if="tagCheck(t('craft.upperRight'))"
-            style="float: right;width: 50px;height: 90px;margin-right: 1rem;margin-top: 15px">
-          <el-row class="icon">
-            <el-col class="icon" >
-              <el-image @dblclick="trademarkenlargement" style="width: 100%;height: 100%" :class="{'xStyle':trademarkAttr.xImage,'yStyle':trademarkAttr.yImage}"  :src="iconNickname"/>
-            </el-col>
-          </el-row>
-          <el-row  >
-            <el-col :span="12" >{{$t('order.width')}}:</el-col>
-            <el-col :span="12" >{{trademarkAttr.xMargin}}</el-col>
-          </el-row>
-          <el-row >
-            <el-col :span="12" >{{$t('order.height')}}:</el-col>
-            <el-col :span="12" >{{trademarkAttr.yMargin}}</el-col>
-          </el-row>
-        </div>
-
-
-        <div
-
-            v-if="tagCheck(t('craft.lowLeft'))"
-            style="width: 50px;height: 90px;margin-left: 1rem;float: left;position: absolute;bottom: 15px" >
-          <el-row  >
-            <el-col :span="12" >{{$t('order.width')}}:</el-col>
-            <el-col :span="12" >{{trademarkAttr.xMargin}}</el-col>
-          </el-row>
-          <el-row >
-            <el-col :span="12" >{{$t('order.height')}}:</el-col>
-            <el-col :span="12" >{{trademarkAttr.yMargin}}</el-col>
-          </el-row>
-          <el-row class="icon">
-            <el-col class="icon" >
-              <el-image @dblclick="trademarkenlargement" style="width: 100%;height: 100%" :class="{'xStyle':trademarkAttr.xImage,'yStyle':trademarkAttr.yImage}"  :src="iconNickname"/>
-            </el-col>
-          </el-row>
-
-        </div>
-
-
-        <div
-            v-if="tagCheck(t('craft.lowRight'))"
-            style="width: 50px;height: 90px;position: absolute;bottom: 15px;right: 1rem">
-          <el-row>
-            <el-col :span="12" >{{$t('order.width')}}:</el-col>
-            <el-col :span="12" >{{trademarkAttr.xMargin}}</el-col>
-          </el-row>
-          <el-row>
-            <el-col :span="12" >{{$t('order.height')}}:</el-col>
-            <el-col :span="12" >{{trademarkAttr.yMargin}}</el-col>
-          </el-row>
-          <el-row class="icon">
-            <el-col class="icon">
-              <el-image style="width: 100%;height: 100%"  @dblclick="trademarkenlargement" :class="{'xStyle':trademarkAttr.xImage,'yStyle':trademarkAttr.yImage}"  :src="iconNickname"/>
-            </el-col>
-          </el-row>
-
-        </div>
-        <div style="position: absolute;left: 405px;top: 115px;color: red">{{$t('order.height')}}</div>
-        <div style="position: absolute;left: 200px;top: 250px;color: red">{{$t('order.width')}}</div>
+          <div id="mains" ref="parent"  >
+            <div id="iocn" ref="draggable"
+                v-if="tagCheck(t('craft.upperLeft'))"
+                :style="{marginLeft:trademarkAttr.xMargin/big+'px',marginTop:trademarkAttr.yMargin/big+'px'}"
+                style="width: 20px;height: 20px;left: 0;top: 0;background-color: red;position: absolute;"
+                @mousedown="startDragUpperLeft"
+            >
+              <el-image @dblclick="trademarkenlargement" style="width: 100%;height: 100%"   :src="iconNickname"/>
+            </div>
+            <div id="iocn" ref="draggable" v-if="tagCheck(t('craft.upperRight'))"  @mousedown="startDragUpperRight" :style="{marginRight:trademarkAttr.xMargin/big+'px',marginTop:trademarkAttr.yMargin/big+'px'}" style="width: 20px;height: 20px;right: 0;top: 0;background-color: red;position: absolute;">
+              <el-image @dblclick="trademarkenlargement" style="width: 100%;height: 100%"   :src="iconNickname"/>
+            </div>
+            <div id="iocn" ref="draggable" v-if="tagCheck(t('craft.lowLeft'))" @mousedown="startDragLowLeft" :style="{marginLeft:trademarkAttr.xMargin/big+'px',marginBottom:trademarkAttr.yMargin/big+'px'}" style="width: 20px;height: 20px;left: 0;bottom: 0;background-color: red;position: absolute;">
+              <el-image @dblclick="trademarkenlargement" style="width: 100%;height: 100%"   :src="iconNickname"/>
+            </div>
+            <div id="iocn" ref="draggable" v-if="tagCheck(t('craft.lowRight'))" @mousedown="startDragLowRight" :style="{marginRight:trademarkAttr.xMargin/big+'px',marginBottom:trademarkAttr.yMargin/big+'px'}" style="width: 20px;height: 20px;right: 0;bottom: 0;background-color: red;position: absolute;">
+              <el-image @dblclick="trademarkenlargement" style="width: 100%;height: 100%"   :src="iconNickname"/>
+            </div>
+           <canvas  id="canvas" ></canvas>
+          </div>
 
 
       </div>
-      <div v-if="enlargementFlag" style="width: 400px;height: 250px;float: left;position: relative;">
+      <div id="width" style="height: 20px;position: absolute;top: 33px;left: 652px;">{{orderDetailWidth}}</div>
+      <div id="height" style="width: 60px;position: absolute;top: 178px;left: 390px;">{{orderDetailHeight}}</div>
+      <div style="float: left;margin-top: 20px;margin-left: 80px">
+        <el-input class="contactNumber" @blur="getproject" type="text" v-model="data1" />
+        <el-input class="contactNumber" @blur="getproject" type="text" v-model="data2"  />&nbsp;&nbsp;&nbsp;
+        <el-input class="contactNumber" @blur="getproject" type="text" v-model="data3"  />
+        <el-input class="contactNumber" @blur="getproject" type="text" v-model="data4"  /><br>
+        <el-input class="contactNumber" @blur="getproject" type="text" v-model="data5"  />
+        <el-input class="contactNumber" @blur="getproject" type="text" v-model="data6"  />&nbsp;&nbsp;&nbsp;
+        <el-input class="contactNumber" @blur="getproject" type="text" v-model="data7"  />
+        <el-input class="contactNumber" @blur="getproject" type="text" v-model="data8"  /><br>
+      </div>
+      <div id="width" style="height: 20px;position: absolute;top: 332px;left: 520px;">涓�</div>
+      <div id="width" style="height: 20px;position: absolute;top: 354px;left: 520px;">涓�</div>
+      <div id="width" style="height: 20px;position: absolute;top: 312px;left: 562px;">妯�</div>
+      <div id="width" style="height: 20px;position: absolute;top: 312px;left: 625px;">绔�</div>
+      <div id="width" style="height: 20px;position: absolute;top: 312px;left: 695px;">妯�</div>
+      <div id="width" style="height: 20px;position: absolute;top: 312px;left: 760px;">绔�</div>
+      <div v-if="enlargementFlag" style="width: 400px;height: 250px;float: left;position: relative;background-color: red">
         <el-image  @dblclick="trademarkenlargement" style="z-index: 9999;max-width: 100%;max-height: 100%" :src="iconNickname"/>
       </div>
     </el-dialog>
-
   </div>
 </template>
 
@@ -781,4 +1409,15 @@
   width: 50px;
   height: 50px;
 }
+.contactNumber{
+  width: 60px;
+  height:20px;
+  border: none;
+  box-shadow: none;
+  font-size: 15px;
+}
+
+#mains {
+  position: relative;
+}
 </style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/sd/product/CreateProduct.vue b/north-glass-erp/northglass-erp/src/views/sd/product/CreateProduct.vue
index 99d0505..b8ba475 100644
--- a/north-glass-erp/northglass-erp/src/views/sd/product/CreateProduct.vue
+++ b/north-glass-erp/northglass-erp/src/views/sd/product/CreateProduct.vue
@@ -152,7 +152,12 @@
     productTotal.value.id = null
     productTotal.value.state = 0
   }
-  if(productTotal.value.id!==null && productTotal.value.creator!==userInfo.user.userName || company.notChangeProduct){
+  console.log(productTotal.value.id)
+  if(productTotal.value.id != null
+      &&
+          productTotal.value.creator !== userInfo.user.userName
+          & company.notChangeProduct
+      ){
     ElMessage.warning('鍒涘缓浜烘槸锛�'+productTotal.value.creator+'    鏃犳硶鎿嶄綔锛�')
     return;
   }
@@ -191,7 +196,7 @@
 
 //瀹℃牳浜у搧鐘舵��
 const updateProductState =  (state) => {
-  if(productTotal.value.id!==null && productTotal.value.creator!==userInfo.user.userName || company.notChangeProduct){
+  if(productTotal.value.id!==null && productTotal.value.creator!==userInfo.user.userName && company.notChangeProduct){
     ElMessage.warning('鍒涘缓浜烘槸锛�'+productTotal.value.creator+'    鏃犳硶鎿嶄綔锛�')
     return;
   }
@@ -261,7 +266,7 @@
       if (hollowBasic.value[item] === '' && item !== 'GlueDepth')  {
         throw new Error(t('product.msg.HollowReview'))
       }
-      childName += hollowBasic.value[item]
+      childName += hollowBasic.value[item] || ''
     })
   }catch (e){
     ElMessage.warning(e.message)
@@ -295,7 +300,7 @@
   let childName = ''
   try {
     Object.keys(InterlayerBasic.value).forEach((item, index) => {
-      if (InterlayerBasic.value[item] === '') {
+      if (InterlayerBasic.value[item] === '' && item !== 'color') {
         throw new Error(t('product.msg.InterlayerReview'))
       }
       childName += InterlayerBasic.value[item]
@@ -424,7 +429,7 @@
         break
       }
       case 'hollow' :{
-        productName+='*'+item.detail+"*"
+        productName+=company.hollow + item.detail + company.hollow
         break
       }
     }
diff --git a/north-glass-erp/package-lock.json b/north-glass-erp/package-lock.json
new file mode 100644
index 0000000..5d4c51e
--- /dev/null
+++ b/north-glass-erp/package-lock.json
@@ -0,0 +1,6 @@
+{
+  "name": "north-glass-erp",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {}
+}
diff --git a/north-glass-erp/src/main/java/com/example/erp/controller/mm/BasicWarehouseTypeController.java b/north-glass-erp/src/main/java/com/example/erp/controller/mm/BasicWarehouseTypeController.java
index c1740ae..7ea0edc 100644
--- a/north-glass-erp/src/main/java/com/example/erp/controller/mm/BasicWarehouseTypeController.java
+++ b/north-glass-erp/src/main/java/com/example/erp/controller/mm/BasicWarehouseTypeController.java
@@ -3,9 +3,7 @@
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.example.erp.common.Result;
 import com.example.erp.entity.mm.BasicWarehouseType;
-import com.example.erp.entity.sd.BasicData;
 import com.example.erp.service.mm.BasicWarehouseTypeService;
-import com.example.erp.service.sd.BasicDateService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -58,4 +56,10 @@
         return  Result.seccess(basicWarehouseTypeService.deleteBasicWarehouse(basicWarehouseType));
     }
 
+    @ApiOperation("鐢ㄦ埛鍩虹鏁版嵁鏌ヨ杩斿洖json瀵硅薄鏍煎紡")
+    @GetMapping("/BasicWarehouseTypeUser/{type}")
+    public Result BasicWarehouseTypeUser(@PathVariable String type){
+        return Result.seccess(basicWarehouseTypeService.BasicWarehouseTypeUser(type));
+    }
+
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/controller/mm/FinishedGoodsInventoryController.java b/north-glass-erp/src/main/java/com/example/erp/controller/mm/FinishedGoodsInventoryController.java
index a6811d6..d53c7ab 100644
--- a/north-glass-erp/src/main/java/com/example/erp/controller/mm/FinishedGoodsInventoryController.java
+++ b/north-glass-erp/src/main/java/com/example/erp/controller/mm/FinishedGoodsInventoryController.java
@@ -201,4 +201,12 @@
     public Result getSelectPrint( @RequestBody Map<String, Object> object){
         return Result.seccess(finishedGoodsInventoryService.getSelectPrintSv(object));
     }
+
+    /*瑁呯鎵撳嵃鏌ヨ*/
+    @ApiOperation("瑁呯鎵撳嵃鍐呭鏌ヨ鎺ュ彛")
+    @SaCheckPermission("storageRecordPint.search")
+    @PostMapping("/getSelectPrints")
+    public Result getSelectPrints( @RequestBody Map<String, Object> object){
+        return Result.seccess(finishedGoodsInventoryService.getSelectPrintSvs(object));
+    }
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/controller/mm/MaterialInventoryController.java b/north-glass-erp/src/main/java/com/example/erp/controller/mm/MaterialInventoryController.java
index 02ccdce..dbe4b0e 100644
--- a/north-glass-erp/src/main/java/com/example/erp/controller/mm/MaterialInventoryController.java
+++ b/north-glass-erp/src/main/java/com/example/erp/controller/mm/MaterialInventoryController.java
@@ -188,6 +188,12 @@
         return  Result.seccess(materialInventoryService.mesMaterialOutbound(reportingWork));
     }
 
+    @ApiOperation("mes鍘熺墖鏌ヨ")
+    @PostMapping  ("/mesOriginalSelect")
+    public Result mesOriginalSelect()  {
+        return  Result.seccess(materialInventoryService.mesOriginalSelect());
+    }
+
     @ApiOperation("鐗╂枡鏂板杩斿洖鎺ュ彛")
     @PostMapping("/cancelMaterialAdditionRecord")
     public Result cancelMaterialAdditionRecord( @RequestBody Map<String,Object>  object){
@@ -201,5 +207,14 @@
         return Result.seccess(materialInventoryService.getOptimizeOutboundReport(type,pageNum,pageSize,selectDate,materialLog));
     }
 
+    @ApiOperation("鐗╂枡鍑哄簱淇濆瓨骞跺鏍告帴鍙�")
+    @SaCheckPermission("createOutbound.add")
+    @PostMapping("/saveToExamineMaterialOutbound")
+    public Result saveToExamineMaterialOutbound( @RequestBody Map<String,Object>  object){
+
+        return Result.seccess(materialInventoryService.saveToExamineMaterialOutbound(object));
+
+    }
+
 
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/controller/pp/GlassOptimizeController.java b/north-glass-erp/src/main/java/com/example/erp/controller/pp/GlassOptimizeController.java
index e6f0a0e..1e5d4fa 100644
--- a/north-glass-erp/src/main/java/com/example/erp/controller/pp/GlassOptimizeController.java
+++ b/north-glass-erp/src/main/java/com/example/erp/controller/pp/GlassOptimizeController.java
@@ -83,6 +83,16 @@
         return Result.seccess(glassOptimizeService.getProjectListSv());
     }
 
+    @ApiOperation("鏍规嵁宸ョ▼鍗″彿宸ョ▼鏌ヨ娴佺▼鍗�")
+    @PostMapping  ("/getProjectByProjectNo/{projectNo}")
+    public Result getProjectByProjectNo(
+            @PathVariable String projectNo
+    ){
+        return Result.seccess(glassOptimizeService.getProjectByProjectNoSv(projectNo));
+    }
+
+
+
     //宸ョ▼绠$悊鏌ヨ
     @ApiOperation("宸ョ▼绠$悊鏌ヨ鎺ュ彛")
     @PostMapping("/optimizeProjectMange/{startSelectTime}/{endSelectTime}")
diff --git a/north-glass-erp/src/main/java/com/example/erp/controller/pp/ProcessCardController.java b/north-glass-erp/src/main/java/com/example/erp/controller/pp/ProcessCardController.java
index 235d73c..5b933be 100644
--- a/north-glass-erp/src/main/java/com/example/erp/controller/pp/ProcessCardController.java
+++ b/north-glass-erp/src/main/java/com/example/erp/controller/pp/ProcessCardController.java
@@ -2,6 +2,8 @@
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.example.erp.common.Constants;
+import com.example.erp.dto.pp.FlowCardDTO;
+import com.example.erp.dto.pp.TeamOutputDTO;
 import com.example.erp.entity.pp.FlowCard;
 import com.example.erp.entity.sd.DeliveryDetail;
 import com.example.erp.entity.sd.Order;
@@ -10,11 +12,14 @@
 import com.example.erp.entity.sd.OrderGlassDetail;
 import com.example.erp.exception.ServiceException;
 import com.example.erp.service.pp.FlowCardService;
+import com.example.erp.tools.DownExcel;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.sql.Date;
 import java.util.List;
 import java.util.Map;
@@ -98,13 +103,25 @@
     }
 
     //鍒嗘灦鏂板鏄庣粏鏌ヨ
-    @ApiOperation("鍒嗘灦鏄庣粏鏂板鎺ュ彛")
+    @ApiOperation("鍒嗘灦鏂板鏄庣粏鏌ヨ")
     @PostMapping("/selectNoCard/{orderId}/{productionId}")
     public Result SelectNoCard(
             @PathVariable String orderId,
             @PathVariable String productionId,
             @RequestBody FlowCard flowCard) {
         return Result.seccess(flowCardService.selectNoCardSv(orderId, productionId, flowCard));
+
+    }
+
+    @ApiOperation("鍒嗘灦鏂板鏄庣粏鎺掑簭鏌ヨ")
+    @PostMapping("/selectSortingCard/{orderId}/{productionId}/{flashback}/{optionVal}")
+    public Result selectSortingCard(
+            @PathVariable String orderId,
+            @PathVariable String productionId,
+            @PathVariable String flashback,
+            @PathVariable String optionVal,
+            @RequestBody FlowCard flowCard) {
+        return Result.seccess(flowCardService.selectSortingCardSv(orderId, productionId,flashback,optionVal, flowCard));
 
     }
 
@@ -182,20 +199,23 @@
     }
 
     @ApiOperation("鎵撳嵃娴佺▼鍗℃暟鎹煡璇㈡帴鍙�")
-    @PostMapping("/getSelectPrinting/{printMerge}/{printLike}/{merge}")
+    @PostMapping("/getSelectPrinting/{printMerge}/{printLike}/{merge}/{flashback}/{compound}/{landingSequence}")
     public Result getSelectPrinting(
             @PathVariable String printMerge,
             @PathVariable String printLike,
             @PathVariable String merge,
+            @PathVariable String flashback,
+            @PathVariable String compound,
+            @PathVariable String landingSequence,
             @RequestBody Map<String, Object> object) {
-        return Result.seccess(flowCardService.getSelectPrintingSv(object,printMerge,printLike,merge));
+        return Result.seccess(flowCardService.getSelectPrintingSv(object,printMerge,printLike,merge,flashback,compound,landingSequence));
     }
 
     @ApiOperation("宸ョ▼鎵撳嵃娴佺▼鍗℃暟鎹煡璇㈡帴鍙�")
-    @PostMapping("/getSelectPrintProject/{printProject}/{merge}")
+    @PostMapping("/getSelectPrintProject/{printProject}/{merge}/{flashback}/{landingSequence}")
     public Result getSelectPrintProject(
-            @PathVariable String printProject,@PathVariable String merge) {
-        return Result.seccess(flowCardService.getSelectPrintProject(printProject,merge));
+            @PathVariable String printProject,@PathVariable String merge,@PathVariable String flashback,@PathVariable String landingSequence) {
+        return Result.seccess(flowCardService.getSelectPrintProject(printProject,merge,flashback,landingSequence));
     }
 
     @ApiOperation("鎵撳嵃鏍囩鏁版嵁鏌ヨ鎺ュ彛")
@@ -463,4 +483,13 @@
     public Result processCardAutoRack(@ RequestBody Map<String, Object> object) {
         return Result.seccess(flowCardService.processCardAutoRack(object));
     }
+
+    @ApiOperation("娴佺▼鍗℃煡璇㈠鍑�")
+    @PostMapping("/exportDateProcess")
+    public void exportDateProcess(HttpServletResponse response,
+                                 @RequestBody Map<String, Object> dates
+    ) throws IOException, IllegalAccessException, InstantiationException {
+        //鍙傛暟锛氱浉搴旂殑鏁版嵁锛屽疄浣撶被淇℃伅锛岀浉搴旂殑鏂规硶锛堟暟鎹幏鍙栵級锛岀敓鎴愮殑excel鍚嶅瓧
+        DownExcel.download(response, FlowCardDTO.class, flowCardService.exportDateProcessSv(dates), "DateProcess");
+    }
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportController.java b/north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportController.java
index 8e655a8..01bb4a6 100644
--- a/north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportController.java
+++ b/north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportController.java
@@ -1,28 +1,20 @@
 package com.example.erp.controller.pp;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import com.example.erp.common.Constants;
 import com.example.erp.common.Result;
 import com.example.erp.dto.pp.*;
-import com.example.erp.entity.pp.DamageDetails;
-import com.example.erp.entity.pp.FlowCard;
 import com.example.erp.entity.pp.Report;
-import com.example.erp.entity.sd.Order;
-import com.example.erp.entity.sd.OrderDetail;
-import com.example.erp.entity.sd.OrderGlassDetail;
-import com.example.erp.exception.ServiceException;
 import com.example.erp.service.pp.ReportService;
-import com.example.erp.service.pp.WorkOrderService;
 import com.example.erp.tools.DownExcel;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.sql.Date;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 
@@ -38,7 +30,7 @@
 
     //娴佺▼鍗¤繘搴�
     @ApiOperation("娴佺▼鍗¤繘搴�")
-    @SaCheckPermission("processCardProgress.search")
+    @SaCheckPermission("selectOrder.search")
     @PostMapping("/processCardProgress/{orderId}")
     public Result processCardProgress(@PathVariable String orderId, @RequestBody List<Integer> columns) {
         return Result.seccess(reportService.processCardProgressSv(orderId, columns));
@@ -90,8 +82,8 @@
     public Result damageReport(
             @PathVariable Integer pageNum,
             @PathVariable Integer pageSize,
-            @PathVariable Date selectTime1,
-            @PathVariable Date selectTime2,
+            @PathVariable String selectTime1,
+            @PathVariable String selectTime2,
             @RequestBody DamageReportDTO damageReportDTO) {
         return Result.seccess(reportService.selectDamageReportSv(pageNum, pageSize, selectTime1, selectTime2, damageReportDTO));
 
@@ -139,11 +131,12 @@
 
     @ApiOperation("浠诲姟瀹屾垚鎯呭喌姹囨�昏繘搴�")
     @SaCheckPermission("taskCompletionStatus.search")
-    @PostMapping("/taskCompletionStatus/{selectTime1}/{selectTime2}")
+    @PostMapping("/taskCompletionStatus/{selectTime1}/{selectTime2}/{orderId}")
     public Result taskCompletionStatus(@PathVariable Date selectTime1,
                                        @PathVariable Date selectTime2,
+                                       @PathVariable String orderId,
                                        @RequestBody List<Integer> columns) {
-        return Result.seccess(reportService.taskCompletionStatusSv(selectTime1, selectTime2, columns));
+        return Result.seccess(reportService.taskCompletionStatusSv(selectTime1, selectTime2,orderId, columns));
     }
 
     @ApiOperation("璁㈠崟璁″垝鍒嗚В")
@@ -179,8 +172,8 @@
     public Result teamOutput(
             @PathVariable Integer pageNum,
             @PathVariable Integer pageSize,
-            @PathVariable Date selectTime1,
-            @PathVariable Date selectTime2,
+            @PathVariable String selectTime1,
+            @PathVariable String selectTime2,
             @PathVariable String selectProcesses,
             @RequestBody TeamOutputDTO teamOutputDTO) {
         return Result.seccess(reportService.teamOutputSv(pageNum, pageSize, selectTime1, selectTime2,selectProcesses, teamOutputDTO));
@@ -195,7 +188,7 @@
 
     @ApiOperation("娆$牬鏄庣粏鎶ヨ〃瀵煎嚭")
     @PostMapping("/exportDamageReport")
-    public void exportDamageReport(HttpServletResponse response, @RequestBody List<LocalDate> dates) throws IOException, IllegalAccessException, InstantiationException {
+    public void exportDamageReport(HttpServletResponse response, @RequestBody Map<String, Object> dates) throws IOException, IllegalAccessException, InstantiationException {
         //鍙傛暟锛氱浉搴旂殑鏁版嵁锛屽疄浣撶被淇℃伅锛岀浉搴旂殑鏂规硶锛堟暟鎹幏鍙栵級锛岀敓鎴愮殑excel鍚嶅瓧
         DownExcel.download(response, DamageReportDTO.class, reportService.exportDamageReportSv(dates), "DamageReport");
     }
@@ -225,14 +218,23 @@
         DownExcel.download(response, WorkInProgressDTO.class, reportService.exportWorkInProgressSv(dates), "WorkInProgress");
     }
 
+    @ApiOperation("鍦ㄥ埗鍝佹眹鎬绘姤琛ㄥ鍑�")
+    @PostMapping("/exportWorkInProgressCombination")
+    public void exportWorkInProgressCombination(HttpServletResponse response,
+                                     @RequestBody Map<String, Object> dates)
+            throws IOException, IllegalAccessException, InstantiationException {
+        //鍙傛暟锛氱浉搴旂殑鏁版嵁锛屽疄浣撶被淇℃伅锛岀浉搴旂殑鏂规硶锛堟暟鎹幏鍙栵級锛岀敓鎴愮殑excel鍚嶅瓧
+        DownExcel.download(response, WorkInProgressCombinationDTO.class, reportService.exportWorkInProgressCombinationSv(dates), "WorkInProgressCombination");
+    }
+
 //
 
-    @ApiOperation("浠诲姟瀹屾垚鎯呭喌瀵煎嚭")
-    @PostMapping("/exportTaskCompletionStatus")
-    public void exportTaskCompletionStatus(HttpServletResponse response, @RequestBody List<LocalDate> dates) throws IOException, IllegalAccessException, InstantiationException {
-        //鍙傛暟锛氱浉搴旂殑鏁版嵁锛屽疄浣撶被淇℃伅锛岀浉搴旂殑鏂规硶锛堟暟鎹幏鍙栵級锛岀敓鎴愮殑excel鍚嶅瓧
-        DownExcel.download(response, TaskCompletionStatusDTO.class, reportService.exportDamageReportSv(dates), "TaskCompletionStatus");
-    }
+//    @ApiOperation("浠诲姟瀹屾垚鎯呭喌瀵煎嚭")
+//    @PostMapping("/exportTaskCompletionStatus")
+//    public void exportTaskCompletionStatus(HttpServletResponse response, @RequestBody List<LocalDate> dates) throws IOException, IllegalAccessException, InstantiationException {
+//        //鍙傛暟锛氱浉搴旂殑鏁版嵁锛屽疄浣撶被淇℃伅锛岀浉搴旂殑鏂规硶锛堟暟鎹幏鍙栵級锛岀敓鎴愮殑excel鍚嶅瓧
+//        DownExcel.download(response, TaskCompletionStatusDTO.class, reportService.exportDamageReportSv(dates), "TaskCompletionStatus");
+//    }
 
     @ApiOperation("鍘熺墖棰嗘枡瀵煎嚭")
     @PostMapping("/exportRawMaterialRequisition")
@@ -287,4 +289,19 @@
         //鍙傛暟锛氱浉搴旂殑鏁版嵁锛屽疄浣撶被淇℃伅锛岀浉搴旂殑鏂规硶锛堟暟鎹幏鍙栵級锛岀敓鎴愮殑excel鍚嶅瓧
         DownExcel.download(response, TeamOutputDTO.class, reportService.exportTeamOutputSv(dates), "TeamOutput");
     }
+
+    @ApiOperation("鍦ㄥ埗鍝佹眹鎬绘姤琛�")
+    @SaCheckPermission("workInProgress.search")
+    @PostMapping("/workInProgressCombination/{pageNum}/{pageSize}/{orderId}/{inputProject}/{selectProcesses}/{optionVal}")
+    public Result workInProgressCombination(
+            @PathVariable Integer pageNum,
+            @PathVariable Integer pageSize,
+            @PathVariable String orderId,
+            @PathVariable String inputProject,
+            @PathVariable String selectProcesses,
+            @PathVariable String optionVal,
+            @RequestBody WorkInProgressDTO workInProgressDTO) {
+        return Result.seccess(reportService.workInProgressCombinationSv(pageNum, pageSize, orderId, inputProject,selectProcesses,optionVal, workInProgressDTO));
+
+    }
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportingWorkController.java b/north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportingWorkController.java
index 8b732fc..7d548a8 100644
--- a/north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportingWorkController.java
+++ b/north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportingWorkController.java
@@ -83,6 +83,7 @@
             @RequestBody ReportingWork reportingWork){
         return Result.seccess(reportingWorkService.selectReportingWorkSv(pageNum,pageSize,selectTime1,selectTime2,orderId,reportingWork));
 
+
     }
 
     @ApiOperation("鍒犻櫎鎶ュ伐鎺ュ彛")
@@ -182,4 +183,13 @@
         return Result.seccess(reportingWorkService.selectReportingWorkRecordByPhoneSv(selectPam));
     }
 
-}
+@ApiOperation("鎵嬫満鏌ヨ鏈伐搴忚澶�")
+    @PostMapping("/selectEquipmentByProcess/{process}")
+    public Result selectEquipmentByProcess(@PathVariable String process)    {
+        return Result.seccess(reportingWorkService.selectEquipmentByProcessSv(process));
+    }@ApiOperation("鎶ュ伐鍏ュ簱鎺ュ彛")
+    @PostMapping("/saveWorkStorage")
+    public Result saveWorkStorage( @RequestBody Map<String,Object>  object){
+        return Result.seccess(reportingWorkService.saveWorkStorage(object));
+
+    }}
diff --git a/north-glass-erp/src/main/java/com/example/erp/controller/sd/BasicDataController.java b/north-glass-erp/src/main/java/com/example/erp/controller/sd/BasicDataController.java
index 818b89e..142087d 100644
--- a/north-glass-erp/src/main/java/com/example/erp/controller/sd/BasicDataController.java
+++ b/north-glass-erp/src/main/java/com/example/erp/controller/sd/BasicDataController.java
@@ -3,7 +3,7 @@
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.example.erp.common.Result;
 import com.example.erp.entity.sd.BasicData;
-import com.example.erp.service.sd.BasicDateService;
+import com.example.erp.service.sd.BasicDataService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.*;
@@ -15,23 +15,23 @@
 @Api(value="璁㈠崟鍩虹controller",tags={"璁㈠崟鍩虹鏁版嵁鎿嶄綔鎺ュ彛"})
 public class BasicDataController {
     final
-    BasicDateService basicDateService;
+    BasicDataService basicDataService;
 
-    public BasicDataController(BasicDateService basicDateService) {
-        this.basicDateService = basicDateService;
+    public BasicDataController(BasicDataService basicDataService) {
+        this.basicDataService = basicDataService;
     }
 
     @GetMapping("/orderBasicData")
     public Result getOrderBasicData(){
-        return Result.seccess(basicDateService.getOrderBasicData());
+        return Result.seccess(basicDataService.getOrderBasicData());
     }
     @GetMapping("/BasicDataByType/{type}")
     public Result getBasicDataByType(@PathVariable String type){
-        return Result.seccess(basicDateService.getBasicDataByType(type));
+        return Result.seccess(basicDataService.getBasicDataByType(type));
     }
     @GetMapping("/BasicDataByType/{type}/{childType}")
     public Result getBasicDataByTypeAndChildType(@PathVariable String type,@PathVariable String childType){
-        return Result.seccess(basicDateService.getBasicDataByTypeAndChildType(type,childType));
+        return Result.seccess(basicDataService.getBasicDataByTypeAndChildType(type,childType));
     }
 
 
@@ -39,32 +39,32 @@
     @SaCheckPermission("searchOrderBasicData.search")
     @GetMapping("/getBasicData")
     public Result getBasicData(){
-        return Result.seccess(basicDateService.getBasicData());
+        return Result.seccess(basicDataService.getBasicData());
     }
     @ApiOperation("鏌ヨ鍩虹鏁版嵁绫诲瀷")
     @SaCheckPermission("searchOrderBasicData.search")
     @GetMapping("/getBasicDataType")
     public Result getBasicDataType(){
-        return Result.seccess(basicDateService.getBasicDataType());
+        return Result.seccess(basicDataService.getBasicDataType());
     }
 
     @ApiOperation("鏂板鍩虹鏁版嵁")
     @SaCheckPermission("searchOrderBasicData.add")
     @PostMapping("addBasicData")
     public Result addBasicData(@RequestBody Map<String,Object> map){
-        return  Result.seccess(basicDateService.addBasicData(map));
+        return  Result.seccess(basicDataService.addBasicData(map));
     }
 
     @ApiOperation("鏇存柊鍩虹鏁版嵁")
     @SaCheckPermission("searchOrderBasicData.update")
     @PostMapping("updateBasicData")
     public Result updateBasicData(@RequestBody BasicData basicData){
-        return  Result.seccess(basicDateService.updateBasicData(basicData));
+        return  Result.seccess(basicDataService.updateBasicData(basicData));
     }
     @ApiOperation("鍒犻櫎鍩虹鏁版嵁")
     @SaCheckPermission("searchOrderBasicData.delete")
     @PostMapping("deleteBasicData")
     public Result deleteBasicData(@RequestBody BasicData basicData){
-        return  Result.seccess(basicDateService.deleteBasicData(basicData));
+        return  Result.seccess(basicDataService.deleteBasicData(basicData));
     }
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/controller/sd/OrderController.java b/north-glass-erp/src/main/java/com/example/erp/controller/sd/OrderController.java
index 08abee7..8454789 100644
--- a/north-glass-erp/src/main/java/com/example/erp/controller/sd/OrderController.java
+++ b/north-glass-erp/src/main/java/com/example/erp/controller/sd/OrderController.java
@@ -265,5 +265,20 @@
         return  Result.seccess(null);
     }
 
+    @PostMapping("/upload-dxf")
+    public Result uploadDxf(@RequestBody Map<String,Object> object) {
+        return  Result.seccess(orderService.uploadDxf(object));
+    }
+
+    @PostMapping("/selectUploadDxf")
+    public Result selectUploadDxf(@RequestBody Map<String,Object> object) {
+        return  Result.seccess(orderService.selectUploadDxf(object));
+    }
+
+    @PostMapping("/updateOrderFile")
+    public Result updateOrderFile(@RequestBody Map<String,Object> map)  {
+        return  Result.seccess(orderService.updateOrderFile(map));
+    }
+
 
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/dto/pp/DamageReportDTO.java b/north-glass-erp/src/main/java/com/example/erp/dto/pp/DamageReportDTO.java
index 7e298b4..bc78e65 100644
--- a/north-glass-erp/src/main/java/com/example/erp/dto/pp/DamageReportDTO.java
+++ b/north-glass-erp/src/main/java/com/example/erp/dto/pp/DamageReportDTO.java
@@ -13,6 +13,8 @@
     private String orderId;
     @ExcelProperty("椤圭洰鍚嶇О")
     private String project;
+    @ExcelProperty("鎵规")
+    private String batch;
     @ExcelProperty("娴佺▼鍗″彿")
     private String processId;
     @ExcelProperty("璁㈠崟搴忓彿")
diff --git a/north-glass-erp/src/main/java/com/example/erp/dto/pp/FlowCardDTO.java b/north-glass-erp/src/main/java/com/example/erp/dto/pp/FlowCardDTO.java
new file mode 100644
index 0000000..ce7d5d4
--- /dev/null
+++ b/north-glass-erp/src/main/java/com/example/erp/dto/pp/FlowCardDTO.java
@@ -0,0 +1,51 @@
+package com.example.erp.dto.pp;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.example.erp.entity.sd.Order;
+import com.example.erp.entity.sd.OrderDetail;
+import com.example.erp.entity.sd.OrderGlassDetail;
+import com.example.erp.entity.sd.Product;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class FlowCardDTO {
+    @TableId(type = IdType.AUTO)
+
+    //閿�鍞崟鍙�
+    @ExcelProperty("閿�鍞崟鍙�")
+    private String orderId;
+    //娴佺▼鍗″彿
+    @ExcelProperty("娴佺▼鍗″彿")
+    private String processId;
+    //瀹㈡埛鍚嶇О
+    @ExcelProperty("瀹㈡埛鍚嶇О")
+    private String customerName;
+    //鎵规
+    @ExcelProperty("鎵规")
+    private String batch;
+    @ExcelProperty("浜у搧ID")
+    private String productId;
+    @ExcelProperty("浜у搧鍚嶇О")
+    private String productName;
+    @ExcelProperty("椤圭洰鍚嶇О")
+    private String project;
+    @ExcelProperty("鏁伴噺")
+    private Integer quantity;
+    @ExcelProperty("闈㈢Н")
+    private Double computeGrossArea;
+    @ExcelProperty("鍒嗘灦鍛�")
+    private String founder;
+    @ExcelProperty("鍔犲伐瑕佹眰")
+    private String processingNote;
+    @ExcelProperty("鎺掔増鐘舵��")
+    private String layoutStatus;
+    @ExcelProperty("鍚堝苟鐘舵��")
+    private Integer merge;
+    @ExcelProperty("鏋跺彿")
+    private String rack;
+}
diff --git a/north-glass-erp/src/main/java/com/example/erp/dto/pp/TeamOutputDTO.java b/north-glass-erp/src/main/java/com/example/erp/dto/pp/TeamOutputDTO.java
index 33695c0..7fe713f 100644
--- a/north-glass-erp/src/main/java/com/example/erp/dto/pp/TeamOutputDTO.java
+++ b/north-glass-erp/src/main/java/com/example/erp/dto/pp/TeamOutputDTO.java
@@ -47,4 +47,8 @@
     private String workProcessName;
     @ExcelProperty("鎶ュ伐璁惧")
     private String deviceName;
+    @ExcelProperty("鎵规")
+    private String batch;
+    @ExcelProperty("璁㈠崟绫诲瀷")
+    private String orderType;
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressCombinationDTO.java b/north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressCombinationDTO.java
new file mode 100644
index 0000000..e45f8e6
--- /dev/null
+++ b/north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressCombinationDTO.java
@@ -0,0 +1,19 @@
+package com.example.erp.dto.pp;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class WorkInProgressCombinationDTO {
+    @ExcelProperty("宸ュ簭")
+    private String thisProcess;
+    @ExcelProperty("椤圭洰鍚嶇О")
+    private String project;
+
+    @ExcelProperty("搴撳瓨鏁�")
+    private Integer stockNum;
+    @ExcelProperty("搴撳瓨闈㈢Н")
+    private Double stockArea;
+    @ExcelProperty("鍦ㄥ埗鍝佸悕绉�")
+    private String glassName;
+}
diff --git a/north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressDTO.java b/north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressDTO.java
index 3da05ed..7c4df34 100644
--- a/north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressDTO.java
+++ b/north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressDTO.java
@@ -37,6 +37,8 @@
     private Double stockArea;
     @ExcelProperty("鎴愬搧鍚嶇О")
     private String productName;
+    @ExcelProperty("鍦ㄥ埗鍝佸悕绉�")
+    private String glassName;
     @ExcelProperty("寮挗鍗婂緞")
     private String bendRadius;
     @ExcelProperty("缂栧彿")
diff --git a/north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedGoodsInventory.java b/north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedGoodsInventory.java
index 1e3763b..bd66074 100644
--- a/north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedGoodsInventory.java
+++ b/north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedGoodsInventory.java
@@ -26,8 +26,9 @@
     private LocalDate updateTime;
     private LocalDate endTime;
     private String processId;
-
+    private String boxNo;
     private Order order;
     private OrderDetail orderDetail;
+    private Double weight;
 
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedOperateLog.java b/north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedOperateLog.java
index 344a800..7d65eee 100644
--- a/north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedOperateLog.java
+++ b/north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedOperateLog.java
@@ -31,6 +31,9 @@
     private String remarks;
     private String processId;
 
+    private Double area;
+    private Double money;
+
     private OrderDetail orderDetail;
 
     private Order order;
diff --git a/north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialLog.java b/north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialLog.java
index 3ecc6bb..75063e7 100644
--- a/north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialLog.java
+++ b/north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialLog.java
@@ -53,5 +53,7 @@
     @ExcelProperty("浼樺寲浣跨敤鏁伴噺")
     private Integer useCount;
 
+    private MaterialOutbound materialOutbound;
+
 
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialOutbound.java b/north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialOutbound.java
index 0826584..fcc05e6 100644
--- a/north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialOutbound.java
+++ b/north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialOutbound.java
@@ -22,6 +22,8 @@
     private LocalDate reviewedTime;
     private Integer reviewedState;
     private LocalDate createTime;
+    private String project;
+    private String batch;
 
 
 
diff --git a/north-glass-erp/src/main/java/com/example/erp/entity/sd/DeliveryDetail.java b/north-glass-erp/src/main/java/com/example/erp/entity/sd/DeliveryDetail.java
index dba87c4..11b3022 100644
--- a/north-glass-erp/src/main/java/com/example/erp/entity/sd/DeliveryDetail.java
+++ b/north-glass-erp/src/main/java/com/example/erp/entity/sd/DeliveryDetail.java
@@ -24,6 +24,7 @@
     private String deliveryDetailRemakes;
     private Integer deliveryDetailState;
     private String otherColumns;
+    private String boxNo;
     private LocalDate createTime;
     private LocalDate updateTime;
     private  Delivery delivery;
diff --git a/north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderDetail.java b/north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderDetail.java
index 38fbe40..4da708b 100644
--- a/north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderDetail.java
+++ b/north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderDetail.java
@@ -46,6 +46,9 @@
     private Integer deliveryNum;
     private Integer returnNum;
     private Integer state;
+    private String fileName;
+    @TableField(select = false,exist= false)
+    private String fileData;
     private LocalDate createTime;
     private LocalDate updateTime;
     @TableField(select = false,exist= false)
diff --git a/north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderGlassDetail.java b/north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderGlassDetail.java
index 89c8bf3..5d1636a 100644
--- a/north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderGlassDetail.java
+++ b/north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderGlassDetail.java
@@ -33,8 +33,10 @@
     @TableField(value = "`group`")
     private Integer group;
     private LocalDate productionTime;
+    private Double archRise;
     private LocalDate createTime;
 
+
     @TableField(select = false,exist = false)
     private  Integer thickness;
 
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/mm/BasicWarehouseTypeMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/mm/BasicWarehouseTypeMapper.java
index 8a9acb0..0288c12 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/mm/BasicWarehouseTypeMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/mm/BasicWarehouseTypeMapper.java
@@ -30,5 +30,7 @@
 
     Boolean updateBasicWarehouse(@Param("id") Long id,@Param("operateTypeName") String operateTypeName);
 
+    List<String> getBasicWarehouseUser(String type);
+
 
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedGoodsInventoryMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedGoodsInventoryMapper.java
index 7a7cb21..99ba49d 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedGoodsInventoryMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedGoodsInventoryMapper.java
@@ -24,6 +24,9 @@
 
     Map<String,Integer> getPageTotal(Integer offset, Integer pageSize, FinishedGoodsInventory finishedGoodsInventory);
 
+    FlowCard getSelectWarehousingByProcessId(@Param("order_id") String order_id,
+                                        @Param("order_number") Integer order_number,
+                                        @Param("process_id") String process_id);
     List<FlowCard> getSelectWarehousing(@Param("offset") Integer offset,
                                        @Param("pageSize") Integer pageSize,
                                        @Param("flowCard") FlowCard flowCard);
@@ -56,7 +59,7 @@
 
     Boolean updateInventory(@Param("flowCard") FlowCard flowCard,
                             @Param("storageRegion") String storageRegion,
-                            @Param("remark") String remark);
+                            @Param("remark") String remark, @Param("container") String container);
 
     Boolean updateInventoryOut(@Param("finishedOperateLog") FinishedOperateLog finishedOperateLog);
 
@@ -89,7 +92,7 @@
 
     Boolean insertFinishedGoodsInventory(@Param("flowCard") FlowCard flowCard,
                                          @Param("storageRegion") String storageRegion,
-                                         @Param("remark") String remark);
+                                         @Param("remark") String remark, @Param("container") String container);
 
 
     List<OrderDetail> getSelectDeliveryDetail(@Param("offset") Integer offset,
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedOperateLogMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedOperateLogMapper.java
index bd6a361..6bd9690 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedOperateLogMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedOperateLogMapper.java
@@ -17,7 +17,9 @@
 public interface FinishedOperateLogMapper extends CrudRepository<FinishedOperateLog,Long> {
     FinishedOperateLog getselectFinishedOperateLog();
 
-    Boolean insertIntFinishedOperateLog(@Param("flowCard") FlowCard flowCard ,@Param("userName") String userName,@Param("oddNumber") String oddNumber,@Param("container") String container);
+    Boolean insertIntFinishedOperateLog(@Param("flowCard") FlowCard flowCard ,@Param("userName") String userName,
+                                        @Param("oddNumber") String oddNumber,@Param("container") String container,
+                                        @Param("deliveryDetailMoney") Double deliveryDetailMoney,@Param("deliveryDetailArea") Double deliveryDetailArea);
 
     Boolean insertOutFinishedOperateLog(@Param("orderDetail") OrderDetail orderDetail,@Param("userName") String userName,@Param("oddNumber") String oddNumber);
 
@@ -92,5 +94,11 @@
 
     List<Map<String, String>> getPrimaryListLimt(String orderId, String processId, String remarks);
 
+    List<Map<String, String>> getPrimaryListLimts(String customerName, String project, String remarks);
+
     List<Map<String, Object>> getDetailList(String orderId, String processId, String remarks);
+
+    List<Map<String, Object>> getDetailLists(String orderId, String remarks, Integer productId,String thickness);
+
+    List<Map<String, Object>> getDetailList2(String orderId, String processId, String remarks);
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/mm/MaterialInventoryMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/mm/MaterialInventoryMapper.java
index af97ddb..80e57b1 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/mm/MaterialInventoryMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/mm/MaterialInventoryMapper.java
@@ -269,4 +269,6 @@
     List<MaterialLog> getOptimizeOutboundReport(Integer offset, Integer pageSize, String startDate, String endDate, MaterialLog materialLog, String type);
 
     Map<String,Integer> getOptimizeOutboundReportTotal(Integer offset, Integer pageSize, String startDate, String endDate, MaterialLog materialLog, String type);
+
+    List<Map<String,Object>> getSelectMaterialInventoryMes();
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/pp/FlowCardMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/pp/FlowCardMapper.java
index 9f2f4cc..1ec5f5e 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/pp/FlowCardMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/pp/FlowCardMapper.java
@@ -1,12 +1,14 @@
 package com.example.erp.mapper.pp;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.example.erp.dto.pp.FlowCardDTO;
 import com.example.erp.entity.pp.FlowCard;
 import com.example.erp.entity.sd.OrderDetail;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.sql.Date;
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
 
@@ -81,7 +83,7 @@
 
     List<Map<String, String>> getPrimaryLists(String processId, String technologyNumber, String glassChild, String process, String orderId,Integer quantity);
 
-    List<Map<String, Object>> getDetailList(String processId, String technologyNumber, String process);
+    List<Map<String, Object>> getDetailList(String processId, String technologyNumber, String process, String flashback, String landingSequence);
 
     List<Map<String, Object>> getDetailLists(String processId, String technologyNumber, String process,Integer orderNumber);
 
@@ -111,7 +113,7 @@
 
     List<Map<String, Object>> getCustomLabelDetailMp(String name, String form, String id, FlowCard flowCard);
 
-    List<Map<String, Object>>  getPrintCustomData(String processId, Integer orderNumber);
+    List<Map<String, Object>>  getPrintCustomData(String processId, Integer orderNumber, Integer printQuantity);
 
     List<Map<String, Object>>  getPrintCustomData2(String processId);
 
@@ -135,9 +137,9 @@
 
     List<Map<String, String>> selectReworkPrintMp(Date selectTime1, Date selectTime2, FlowCard flowCard);
 
-    List<Map<String, Object>> getDetailListLike(String processId, String technologyNumber, String process);
+    List<Map<String, Object>> getDetailListLike(String processId, String technologyNumber, String process, String flashback, String landingSequence);
 
-    List<Map<String, Object>> getDetailListMerge(String processId, String process);
+    List<Map<String, Object>> getDetailListMerge(String processId, String process, String flashback, String landingSequence);
 
     List<Map<String, Object>> getDetailListLikes(String processId, String technologyNumber, String process,String printProject,Integer quantity);
 
@@ -157,7 +159,7 @@
 
     List<Map<String, Object>> getDetailListLikeRework(String processId, String printMerge, Integer orderNumber, String reportingWorkId);
 
-    List<Map<String, Object>> getPrintCustomDataSemi(String processId, String technologyNumber, String process);
+    List<Map<String, Object>> getPrintCustomDataSemi(String processId, String technologyNumber, String process, Integer orderNumber);
 
     List<Map<String, String>> selectPrintNotMp(String orderId);
 
@@ -251,4 +253,18 @@
     String getProcessName(String processSub);
 
     List<Map<String, Object>> getProcessNameList();
+
+    List<FlowCardDTO> exportDateProcessMp(List<LocalDate> date);
+
+    Integer getSumQuantity(String orderId);
+
+    List<Map<String, Object>> getDetailCompoundList(String processId, String technologyNumber, String process, String flashback, String compound, String landingSequence);
+
+    List<Map<String, Object>> getDetailListLikeCompound(String processId, String s, String process, String flashback, String compound, String landingSequence);
+
+    List<Map<String, Object>> getPrintCustomDataSemiTj(String processId, String technologyNumber, String process);
+
+    Integer getLayoutStatus(String processId);
+
+    List<Map<String, String>> selectSortingCardMp(String orderId, String productionId, String flashback, String optionVal, FlowCard flowCard);
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java
index 2bf47f0..a3c714a 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java
@@ -176,4 +176,5 @@
     //宸ョ▼淇℃伅娴佺▼鍗�
     List<Map<String, Object>> getProcessCardMpThirdParty(String projectNo);
 
+    List<Map<String, Object>> getProjectByProjectNoSv(String projectNo);
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportMapper.java
index 936b03b..a31ada5 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportMapper.java
@@ -28,7 +28,7 @@
     List<Map<String, String>> processToBeCompletedMp(Date selectTime1, Date selectTime2, String orderId,
                                                      String inputProject, String selectProcesses, Report report);
 
-    List<DamageReportDTO> selectDamageReportMp(Integer offset, Integer pageSize, Date selectTime1, Date selectTime2, DamageReportDTO damageReportDTO);
+    List<DamageReportDTO> selectDamageReportMp(Integer offset, Integer pageSize, String selectTime1, String selectTime2, DamageReportDTO damageReportDTO);
 
     List<Map<String, String>> splittingDetailsOutsideMp(String orderId, Report report);
 
@@ -38,7 +38,7 @@
 
     List<Map<String, String>> productionScheduleMp(String orderId);
 
-    List<Map<String, String>> taskCompletionStatusMp(Date selectTime1, Date selectTime2);
+    List<Map<String, String>> taskCompletionStatusMp(Date selectTime1, Date selectTime2, String orderId);
 
     List<Map<String, String>> orderPlanDecompositionMp(Date selectTime1, Date selectTime2, Report report);
 
@@ -48,7 +48,7 @@
 
     List<CrossProcessBreakingDTO> exportCrossProcessBreakingMp(List<LocalDate> dates);
 
-    Map<String, Integer> getDamageReportPageTotal(Integer offset, Integer pageSize, Date selectTime1, Date selectTime2, DamageReportDTO damageReportDTO);
+    Map<String, Integer> getDamageReportPageTotal(Integer offset, Integer pageSize, String selectTime1, String selectTime2, DamageReportDTO damageReportDTO);
 
     List<DamageReportDTO> exportDamageReportMp(List<LocalDate> dates);
 
@@ -66,9 +66,9 @@
 
     List<YieldDTO> exportYieldMp(List<LocalDate> date, String process);
 
-    List<TeamOutputDTO> teamOutputMp(Integer offset, Integer pageSize, Date selectTime1, Date selectTime2, String selectProcesses, String laminating, TeamOutputDTO teamOutputDTO);
+    List<TeamOutputDTO> teamOutputMp(Integer offset, Integer pageSize, String selectTime1, String selectTime2, String selectProcesses, String laminating, TeamOutputDTO teamOutputDTO);
 
-    Map<String, Integer> teamOutputPageTotal(Integer offset, Integer pageSize, Date selectTime1, Date selectTime2, String selectProcesses, String laminating, TeamOutputDTO teamOutputDTO);
+    Map<String, Integer> teamOutputPageTotal(Integer offset, Integer pageSize, String selectTime1, String selectTime2, String selectProcesses, String laminating, TeamOutputDTO teamOutputDTO);
 
     List<Map<String, String>> workInProgressOrderMp(Integer offset, Integer pageSize, String orderId, String inputProject, String selectProcesses, WorkInProgressDTO workInProgressDTO);
 
@@ -92,12 +92,36 @@
 
     Map<String,Float> processToBeCompletedFootSum(Date selectTime1, Date selectTime2, String orderId, String inputProject, String selectProcesses, Report report);
 
-    Map<String,Float> damageReportFootSum(Date selectTime1, Date selectTime2, DamageReportDTO damageReportDTO);
+    Map<String,Float> damageReportFootSum(String selectTime1, String selectTime2, DamageReportDTO damageReportDTO);
 
-    Map<String,Float> teamOutputFootSum(Date selectTime1, Date selectTime2, String selectProcesses, String laminating, TeamOutputDTO teamOutputDTO);
+    Map<String,Float> teamOutputFootSum(String selectTime1, String selectTime2, String selectProcesses, String laminating, TeamOutputDTO teamOutputDTO);
 
     String getLaminating(String selectProcesses);
 
+    List<WorkInProgressDTO> workInProgressMpdataList1(Integer offset, Integer pageSize, String orderId, String inputProject, String selectProcesses, String laminating, WorkInProgressDTO workInProgressDTO);
+
+    List<WorkInProgressDTO> workInProgressMpdataList2(Integer offset, Integer pageSize, String orderId, String inputProject, String selectProcesses, WorkInProgressDTO workInProgressDTO);
+
+    List<WorkInProgressDTO> workInProgressOrderMpList1(Integer offset, Integer pageSize, String orderId, String inputProject, String selectProcesses, WorkInProgressDTO workInProgressDTO);
+
+    List<WorkInProgressDTO> workInProgressProcessMpList1(Integer offset, Integer pageSize, String orderId, String inputProject, String selectProcesses, WorkInProgressDTO workInProgressDTO);
+
+    List<WorkInProgressDTO> exportWorkInProgressMpdataList2(String process);
+
+    List<WorkInProgressDTO> workInProgressCombinationMpdataList2(Integer offset, Integer pageSize, String selectProcesses, WorkInProgressDTO workInProgressDTO);
+
+    List<WorkInProgressDTO> workInProgressCombinationMpdataList1(Integer offset, Integer pageSize, String selectProcesses, WorkInProgressDTO workInProgressDTO);
+
+    Map<String,Float> workInProgressCombinationOrderFootSum(Integer offset, Integer pageSize, String orderId, String inputProject, String selectProcesses, WorkInProgressDTO workInProgressDTO);
+
+    List<Map<String, Object>> getWorkInProgressCombination(String process, String laminating, String optionVal);
+
+    List<String> selectProcess();
+
+    Map<String,Object> getWorkInProgressCombinationFootSum(String process, String laminating, String optionVal);
+
+    List<WorkInProgressCombinationDTO> exportWorkInProgressCombination(String process, String laminating, String inputVal);
+
 
 //    Map<String, Integer> getWorkInProgressTotal(
 //                                                @Param("selectTime1") Date selectTime1, @Param("selectTime2") Date selectTime2,
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportingWorkMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportingWorkMapper.java
index 45f14aa..38fdee8 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportingWorkMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportingWorkMapper.java
@@ -16,7 +16,7 @@
 
     List<BasicDataProduce> SelectWorkBasicDeviceMp(String process);
 
-    List<BasicDataProduce> SelectWorkBasicTeamsMp(String process);
+    List<Map<String,String>> SelectWorkBasicTeamsMp(String process);
 
     String SelectTechnologicalProcess(String processIdStr, String technologyStr);
 
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReworkMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReworkMapper.java
index 14b0df8..681eb3c 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReworkMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReworkMapper.java
@@ -2,9 +2,6 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.example.erp.dto.pp.ReworkDTO;
-import com.example.erp.entity.mm.FinishedGoodsInventory;
-import com.example.erp.entity.pp.FlowCard;
-import com.example.erp.entity.pp.ReportingWorkDetail;
 import com.example.erp.entity.pp.Rework;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -38,7 +35,7 @@
 
     Boolean deleteReworkMp(String reworkId);
 
-    Boolean updateReworkDdMp(String reportingWorkId, String orderSort, Integer technologyNumber, Integer reworkNum);
+    Boolean updateReworkDdMp(String reportingWorkId, String orderSort, Integer technologyNumber, Integer reworkNum, String reworkType, String reworkReason);
 
     Boolean updateReworkBgMp(String reportingWorkId, String orderSort, Integer technologyNumber);
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/BasicDateMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/BasicDataMapper.java
similarity index 69%
rename from north-glass-erp/src/main/java/com/example/erp/mapper/sd/BasicDateMapper.java
rename to north-glass-erp/src/main/java/com/example/erp/mapper/sd/BasicDataMapper.java
index b709bfd..74bcacb 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/BasicDateMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/BasicDataMapper.java
@@ -2,16 +2,12 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.example.erp.entity.sd.BasicData;
-import com.example.erp.entity.sd.Order;
-import com.example.erp.service.sd.BasicDateService;
 import org.apache.ibatis.annotations.Mapper;
-import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.List;
-import java.util.Map;
 
 @Mapper
-public interface BasicDateMapper extends BaseMapper<BasicData> {
+public interface BasicDataMapper extends BaseMapper<BasicData> {
 
     List<BasicData> getOrderBasicData(String type);
     List<String> getOrderBasicDataType(String type);
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/DeliveryDetailMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/DeliveryDetailMapper.java
index 1e75c89..4c6de76 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/DeliveryDetailMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/DeliveryDetailMapper.java
@@ -27,6 +27,16 @@
 
     List<DeliveryDetail> getSelectDeliveryPrinting(@Param("deliveryId") String deliveryId,@Param("type") String type);
 
+    List<DeliveryDetail> getSelectDeliveryPrintingMoney(@Param("deliveryId") String deliveryId,@Param("type") String type);
+
+    List<DeliveryDetail> getSelectDeliveryPrintingNoMoney(@Param("deliveryId") String deliveryId,@Param("type") String type);
+
+    List<Map<String, Object>> getSelectDeliveryPrintingMoneySpecifications(@Param("deliveryId") String deliveryId,
+                                                                           @Param("productId") Integer productId,@Param("orderId") String orderId);
+
+    List<Map<String, Object>> getSelectDeliveryPrintingNoMoneySpecifications(@Param("deliveryId") String deliveryId,
+                                                                             @Param("productId") Integer productId,@Param("orderId") String orderId);
+
     List<OrderDetail> getSelectOrderPrinting(Object productId, String orderId);
 
     List <Map<String, Object>> getSelectDeliveryDetailPrinting(@Param("deliveryId") String deliveryId,
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderDetailMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderDetailMapper.java
index 69266bb..2492db1 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderDetailMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderDetailMapper.java
@@ -49,5 +49,7 @@
 
     List<Order> exportOrderSummary(List<LocalDate> dates);
 
+    boolean deleteOrderFile(String orderId);
+
 
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderGlassDetailMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderGlassDetailMapper.java
index 53f2ba2..4385cd6 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderGlassDetailMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderGlassDetailMapper.java
@@ -26,4 +26,9 @@
     List<OrderGlassDetail> getOrderGlassDetailByProductIdGlassChild(String orderId, Integer orderNumber);
 
     Integer getMinIdByGroup(String orderId, String orderNumber, String group);
+    Integer getMaxIdByGroup(String orderId, String orderNumber, String group);
+
+    Integer getMinTechnologyNumberByGroup(String orderId, String orderNumber, String group);
+
+    Integer getMaxTechnologyNumberByGroup(String orderId, String orderNumber, String group);
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderMapper.java
index 41efa3e..fd19d96 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderMapper.java
@@ -60,4 +60,12 @@
     Map<String,String> scannerGlassInfo(String projectNo, Integer layoutId, Integer sort, String orderId);
 
     String getProcessIdByOptimizeHeatDetail(String projectId, Integer layoutId, Integer sort);
+
+    Boolean saveOrderFile(String fileName,String dxfData,String orderId,Integer orderNumber);
+
+    Boolean updateOrderFile(String fileName,String dxfData,String orderId,Integer orderNumber);
+
+    Map<String,String> selectOrderFile( String orderId,Integer orderNumber);
+
+    List<Map<String,String>> selectOrderFileList( String orderId);
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderProcessDetailMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderProcessDetailMapper.java
index 8714e05..2123a09 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderProcessDetailMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderProcessDetailMapper.java
@@ -26,11 +26,11 @@
 
     void insertByReportingWorkDetail(ReportingWorkDetail reportingWorkDetail, String processId, String thisProcess);
 
-    List<Map<String,String>> filterOrderProcessCollect(Date selectTime1, Date selectTime2);
+    List<Map<String,String>> filterOrderProcessCollect(Date selectTime1, Date selectTime2, String orderId);
 
-    List<Map<String, Integer>> getGlassLRowCollect(Date selectTime1, Date selectTime2);
+    List<Map<String, Integer>> getGlassLRowCollect(Date selectTime1, Date selectTime2, String orderId);
 
-    String selectNextProcess(String processId, String technologyNumber, String thisProcess);
+    String selectNextProcess(String processId, String technologyNumber, String thisProcess, String orderNumber);
 
     List<Map<String, String>> selectShiftQuantitySv(String creatorId, String startDatetime, String endDatetime, String step);
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductDetailMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductDetailMapper.java
index a1d193d..c0b78e1 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductDetailMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductDetailMapper.java
@@ -11,4 +11,6 @@
     List<ProductDetail> getGlassDetailList();
 
     boolean insertList(List<ProductDetail> getProductDetails);
+
+    String getGlassNameByGroup(Integer productId, Integer minTechnologyNumberByGroup, Integer maxTechnologyNumberByGroup);
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductMapper.java b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductMapper.java
index e0adbdd..b160fe0 100644
--- a/north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductMapper.java
+++ b/north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductMapper.java
@@ -21,4 +21,6 @@
     List<Product> selectProduct(@Param("productName") String productName,@Param("productNameValue") String productNameValue);
 
     List<Product> selectProductId(@Param("productName") String productName,@Param("productNameValue") String productNameValue,@Param("id") Long id);
+
+    Double getGlassThickness(Integer productId, Integer technologyNumber);
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/mm/BasicWarehouseTypeService.java b/north-glass-erp/src/main/java/com/example/erp/service/mm/BasicWarehouseTypeService.java
index 89b3589..ec8ecae 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/mm/BasicWarehouseTypeService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/mm/BasicWarehouseTypeService.java
@@ -2,11 +2,7 @@
 
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.example.erp.entity.mm.BasicWarehouseType;
-import com.example.erp.entity.sd.BasicData;
-import com.example.erp.entity.sd.Customer;
 import com.example.erp.mapper.mm.BasicWarehouseTypeMapper;
-import com.example.erp.mapper.sd.BasicDateMapper;
-import com.example.erp.mapper.sd.CustomerMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -84,4 +80,11 @@
     }
 
 
+    public Map<String, Object> BasicWarehouseTypeUser(String type){
+        Map<String, Object> map = new HashMap<>();
+        map.put("userName",basicWarehouseTypeMapper.getBasicWarehouseUser(type));
+        return map;
+    }
+
+
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/mm/FinishedGoodsInventoryService.java b/north-glass-erp/src/main/java/com/example/erp/service/mm/FinishedGoodsInventoryService.java
index a25dfff..2fcb3ef 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/mm/FinishedGoodsInventoryService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/mm/FinishedGoodsInventoryService.java
@@ -26,6 +26,8 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.sql.SQLException;
 import java.sql.Wrapper;
 import java.text.SimpleDateFormat;
@@ -77,6 +79,7 @@
             String storageRegion = "";
             String remark = "";
             String container = "";
+            int decValue = 0;
             if (object.get("remark") != null) {
                 remark = object.get("remark").toString();
             }
@@ -95,6 +98,9 @@
             if (object.get("userId") != null) {
                 userId = object.get("userId").toString();
             }
+            if (object.get("decValue") != null) {
+                decValue = Integer.parseInt(object.get("decValue").toString());
+            }
             Log log = new Log();
             log.setOperator(userName);
             log.setOperatorId(userId);
@@ -107,9 +113,52 @@
             if (!flowCardlist.isEmpty()){
                 //鑾峰彇鍗曞彿
                 String oddNumber= orderNumberSetting("鍏ュ簱");
-                for (FlowCard flowCard : flowCardlist) {
+                for (FlowCard flowCards : flowCardlist) {
+                    FlowCard flowCard = finishedGoodsInventoryMapper.getSelectWarehousingByProcessId(flowCards.getOrder().getOrderId(),flowCards.getOrderNumber(),flowCards.getProcessId());
+                    Integer calculateType=flowCard.getOrder().getCalculateType();
+                    double deliveryDetailMoney = 0.0;
+                    double deliveryDetailArea = 0.0;
+                    BigDecimal getComputeArea= BigDecimal.valueOf(flowCard.getOrderDetail().getComputeArea());
+                    BigDecimal getQuantity= BigDecimal.valueOf(flowCard.getInventoryQuantity());
+                    BigDecimal getPrice= BigDecimal.valueOf(flowCard.getOrderDetail().getPrice());
+                    BigDecimal getWidth= BigDecimal.valueOf(flowCard.getOrderDetail().getWidth());
+                    BigDecimal getHeight= BigDecimal.valueOf(flowCard.getOrderDetail().getHeight());
+                    BigDecimal singlePieceArea =getComputeArea.multiply(getQuantity).setScale(decValue, RoundingMode.HALF_UP)
+                            .multiply(getPrice).setScale(2, RoundingMode.HALF_UP);
+                    //鏍规嵁璁㈠崟璁$畻鏂瑰紡杩涜閲戦璁$畻
+                    if (calculateType==1){
+                        deliveryDetailMoney=singlePieceArea.doubleValue();
+                        deliveryDetailArea=getComputeArea.multiply(getQuantity).doubleValue();
+
+                    }else if (calculateType==2){
+                        //鍒ゆ柇瀹為檯鍗曠墖闈㈢Н璺熺粨绠楀崟鐗囬潰绉槸鍚︾浉绛� 缁撶畻鎬婚潰绉窡瀹為檯鎬婚潰绉槸鍚︾浉绛�
+                        if(Objects.equals(flowCard.getOrderDetail().getArea(), flowCard.getOrderDetail().getComputeArea())&&Objects.equals(flowCard.getOrderDetail().getGrossArea(), flowCard.getOrderDetail().getComputeGrossArea())){
+                            deliveryDetailMoney=getWidth.multiply(getHeight).multiply(getQuantity).divide(BigDecimal.valueOf(1000000), decValue, RoundingMode.HALF_UP)
+                                    .multiply(getPrice).setScale(2, RoundingMode.HALF_UP).doubleValue();
+                            deliveryDetailArea=getWidth.multiply(getHeight).multiply(getQuantity).divide(BigDecimal.valueOf(1000000), decValue, RoundingMode.HALF_UP).doubleValue();
+                        }else{
+                            deliveryDetailMoney=singlePieceArea.doubleValue();
+                            deliveryDetailArea=getComputeArea.multiply(getQuantity).doubleValue();
+                        }
+                    }else if (calculateType==3){
+                        deliveryDetailMoney=getQuantity.multiply(getPrice).setScale(2, RoundingMode.HALF_UP).doubleValue();
+                        deliveryDetailArea=getComputeArea.multiply(getQuantity).doubleValue();
+
+                    }else if (calculateType==4){
+                        //鍒ゆ柇瀹為檯鍗曠墖闈㈢Н璺熺粨绠楀崟鐗囬潰绉槸鍚︾浉绛� 缁撶畻鎬婚潰绉窡瀹為檯鎬婚潰绉槸鍚︾浉绛�
+                        if(Objects.equals(flowCard.getOrderDetail().getArea(), flowCard.getOrderDetail().getComputeArea())&&Objects.equals(flowCard.getOrderDetail().getGrossArea(), flowCard.getOrderDetail().getComputeGrossArea())){
+                            deliveryDetailMoney=getWidth.multiply(getHeight).multiply(getQuantity).multiply(getPrice).
+                                    divide(BigDecimal.valueOf(1000000), 2, RoundingMode.HALF_UP).doubleValue();
+                            deliveryDetailArea=getWidth.multiply(getHeight).multiply(getQuantity).divide(BigDecimal.valueOf(1000000), decValue, RoundingMode.HALF_UP).doubleValue();
+                        }else{
+                            deliveryDetailMoney=getComputeArea.multiply(getQuantity).multiply(getPrice).setScale(decValue, RoundingMode.HALF_UP).doubleValue();
+                            deliveryDetailArea=getComputeArea.multiply(getQuantity).doubleValue();
+                        }
+                    }
+
+
                     //娣诲姞鍑哄叆搴撹褰�
-                    finishedOperateLogMapper.insertIntFinishedOperateLog(flowCard,userName,oddNumber,container);
+                    finishedOperateLogMapper.insertIntFinishedOperateLog(flowCard,userName,oddNumber,container,deliveryDetailMoney,deliveryDetailArea);
                     Integer finishedGoodsInventorycount = finishedGoodsInventoryMapper.findOrderNumberdcount(flowCard.getOrder().getOrderId(),flowCard.getOrderNumber());
                     Integer ordersum = finishedGoodsInventoryMapper.findOrderQuantity(flowCard.getOrder().getOrderId());
                     Integer ordernumbersum = finishedGoodsInventoryMapper.findOrderNumberdsum(flowCard.getOrder().getOrderId());
@@ -119,7 +168,7 @@
                         /*System.out.println("璁㈠崟鎬绘暟:" + ordersum + "宸插叆搴撴暟閲忥細" + ordernumbersum + "鍑嗗鍏ュ簱鏁伴噺" + flowCard.getInventoryQuantity());*/
                         if (finishedGoodsInventorycount > 0) {
                             //淇敼搴撳瓨琛ㄥ叆搴撴暟閲�
-                            finishedGoodsInventoryMapper.updateInventory(flowCard,storageRegion, remark);
+                            finishedGoodsInventoryMapper.updateInventory(flowCard,storageRegion, remark,container);
                             //淇敼娴佺▼鍗¤〃鍏ュ簱鏁伴噺
                             finishedGoodsInventoryMapper.updateflowcard(flowCard);
                             //淇敼璁㈠崟琛ㄥ叆搴撶姸鎬�
@@ -132,7 +181,7 @@
                                 finishedGoodsInventoryMapper.updateOrderWarehousingState(flowCard.getOrder().getOrderId(),2);
                             }
                         } else {
-                            if (finishedGoodsInventoryMapper.insertFinishedGoodsInventory(flowCard, storageRegion, remark)) {
+                            if (finishedGoodsInventoryMapper.insertFinishedGoodsInventory(flowCard, storageRegion, remark,container)) {
                                 //淇敼娴佺▼鍗¤〃鍏ュ簱鏁伴噺
                                 finishedGoodsInventoryMapper.updateflowcard(flowCard);
                                 //淇敼璁㈠崟鏄庣粏琛ㄥ叆搴撴暟閲�
@@ -789,6 +838,58 @@
         return map;
     }
 
+    public Map<String, Object> getSelectPrintSvs(Map<String, Object> object) {
+        Map<String, Object> map = new HashMap<>();
+        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();//鏈�缁堢粨鏋�
+        List<FinishedOperateLog> finishedOperateLogList = JSONArray.parseArray(JSONObject.toJSONString(object.get("printList")), FinishedOperateLog.class);
+        if (!finishedOperateLogList.isEmpty()) {
+            Set<String> processedProcessIds = new HashSet<>();
+            for (FinishedOperateLog finishedOperateLog : finishedOperateLogList) {
+                String OrderId = finishedOperateLog.getOrderId();
+                String Remarks = finishedOperateLog.getRemarks();
+
+                // 妫�鏌ユ槸鍚﹀凡缁忓鐞嗚繃璇� OrderId锛屽鏋滃鐞嗚繃鍒欒烦杩�
+                if (processedProcessIds.contains(OrderId) && processedProcessIds.contains(Remarks)) {
+                    continue;
+                }
+
+                Map<String, Object> itemmap = new HashMap<>();
+                itemmap.put("detail", finishedOperateLogMapper.getPrimaryListLimts(finishedOperateLog.getOrder().getCustomerName(),finishedOperateLog.getOrder().getProject(),finishedOperateLog.getRemarks()));
+
+                List<Map<String, Object>> detailList = finishedOperateLogMapper.getDetailList2(finishedOperateLog.getOrderId(),finishedOperateLog.getProcessId(),finishedOperateLog.getRemarks());
+
+                List<Map<String, Object>> detailsmaplist = new ArrayList<Map<String, Object>>();
+
+                for(Map<String, Object> details:detailList){
+                    Map<String, Object> detailsmap = new HashMap<>();
+                    detailsmap.put("product_name",details.get("product_name").toString());
+                    List<Map<String, Object>> orderDetailList = finishedOperateLogMapper
+                            .getDetailLists(
+                                    finishedOperateLog.getOrderId(),
+                                    finishedOperateLog.getRemarks(),
+                                    Integer.valueOf(details.get("product_id").toString()),
+                                    details.get("thickness").toString()
+                            );
+                    /*for (Map<String, Object>orderDetail:orderDetailList){
+
+                    }*/
+
+                    detailsmap.put("detailList",orderDetailList);
+                    detailsmaplist.add(detailsmap);
+
+                }
+                itemmap.put("detailList", detailsmaplist);
+                list.add(itemmap);
+
+
+                processedProcessIds.add(OrderId);
+                processedProcessIds.add(Remarks);
+            }
+        }
+        map.put("data", list);
+        return map;
+    }
+
 
     public String deliveryDetailLogic(List<OrderDetail> list,Object savePoint,String userName) {
         for (OrderDetail orderDetail : list) {
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/mm/MaterialInventoryService.java b/north-glass-erp/src/main/java/com/example/erp/service/mm/MaterialInventoryService.java
index 46dc82b..d1863e6 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/mm/MaterialInventoryService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/mm/MaterialInventoryService.java
@@ -978,28 +978,29 @@
             List<MaterialOutbound> materialOutboundList=materialInventoryMapper.getSelectMaterialOutboundProjectNo(projectNo);
             OptimizeUse optimizeUses=materialInventoryMapper.getSelectOptimizeUses(projectNo,width,height);
 
-
-            MaterialInventory materialInventory=materialInventoryMapper.getMaterialInventoryById(Long.valueOf(optimizeUses.getRawStockCode()));
-            if(materialOutboundList.size()==1){
-                List<MaterialOutboundDetail> materialOutboundDetailList=materialInventoryMapper.getSelectMaterialOutboundOptimizeUses(materialOutboundList.get(0).getMaterialOutboundId(),optimizeUses.getId());
-                List<MaterialOutboundDetail> materialOutboundDetailList1=materialInventoryMapper.getSelectMaterialOutboundOptimizeUses(materialOutboundList.get(0).getMaterialOutboundId(),null);
-                if(materialOutboundDetailList.size()==1){
-                    materialInventoryMapper.updateMaterialOutboundOptimizeUses(optimizeUses.getId(),quantity);
-                }else{
-                    materialInventoryMapper.insertMaterialOutboundDetailOptimizeUses(materialOutboundList.get(0).getMaterialOutboundId(),
-                            materialOutboundDetailList1.size()+1,Long.valueOf(optimizeUses.getRawStockCode()),materialInventory.getMaterialCode(),materialInventory.getInventoryArea(),
+            if(optimizeUses.getNotUseCount()>0){
+                MaterialInventory materialInventory=materialInventoryMapper.getMaterialInventoryById(Long.valueOf(optimizeUses.getRawStockCode()));
+                if(materialOutboundList.size()==1){
+                    List<MaterialOutboundDetail> materialOutboundDetailList=materialInventoryMapper.getSelectMaterialOutboundOptimizeUses(materialOutboundList.get(0).getMaterialOutboundId(),optimizeUses.getId());
+                    List<MaterialOutboundDetail> materialOutboundDetailList1=materialInventoryMapper.getSelectMaterialOutboundOptimizeUses(materialOutboundList.get(0).getMaterialOutboundId(),null);
+                    if(materialOutboundDetailList.size()==1){
+                        materialInventoryMapper.updateMaterialOutboundOptimizeUses(optimizeUses.getId(),quantity);
+                    }else{
+                        materialInventoryMapper.insertMaterialOutboundDetailOptimizeUses(materialOutboundList.get(0).getMaterialOutboundId(),
+                                materialOutboundDetailList1.size()+1,Long.valueOf(optimizeUses.getRawStockCode()),materialInventory.getMaterialCode(),materialInventory.getInventoryArea(),
+                                optimizeUses.getId(),quantity,materialInventory.getSinglePieceArea(),materialInventory.getDateOfManufacture());
+                    }
+                }else if(materialOutboundList.isEmpty()){
+                    String oddNumber = orderNumberSetting("鍑哄簱");
+                    materialInventoryMapper.insertMaterialOutboundOptimizeUses(oddNumber,projectNo,reportingWorkJson.get("userName").toString());
+                    materialInventoryMapper.insertMaterialOutboundDetailOptimizeUses(oddNumber, 1,Long.valueOf(optimizeUses.getRawStockCode()),materialInventory.getMaterialCode(),materialInventory.getInventoryArea(),
                             optimizeUses.getId(),quantity,materialInventory.getSinglePieceArea(),materialInventory.getDateOfManufacture());
+                }else{
+                    return false;
                 }
-            }else if(materialOutboundList.isEmpty()){
-                String oddNumber = orderNumberSetting("鍑哄簱");
-                materialInventoryMapper.insertMaterialOutboundOptimizeUses(oddNumber,projectNo,reportingWorkJson.get("userName").toString());
-                materialInventoryMapper.insertMaterialOutboundDetailOptimizeUses(oddNumber, 1,Long.valueOf(optimizeUses.getRawStockCode()),materialInventory.getMaterialCode(),materialInventory.getInventoryArea(),
-                        optimizeUses.getId(),quantity,materialInventory.getSinglePieceArea(),materialInventory.getDateOfManufacture());
-            }else{
-                return false;
+                materialInventoryMapper.updateMaterialInventoryAvailableInventoryOutMes(Long.valueOf(optimizeUses.getRawStockCode()),quantity);
+                materialInventoryMapper.updateOptimizeUsesMes(optimizeUses.getId(),quantity);
             }
-            materialInventoryMapper.updateMaterialInventoryAvailableInventoryOutMes(Long.valueOf(optimizeUses.getRawStockCode()),quantity);
-            materialInventoryMapper.updateOptimizeUsesMes(optimizeUses.getId(),quantity);
 
             //淇濆瓨鏃ュ織
             Log log = new Log();
@@ -1104,4 +1105,141 @@
         map.put("selectDate",list);
         return map;
     }
+
+    public Map<String, Object> mesOriginalSelect() {
+        Map<String, Object> map = new HashMap<>();
+        map.put("data", materialInventoryMapper.getSelectMaterialInventoryMes());
+        return map;
+    }
+
+    public String saveToExamineMaterialOutbound(Map<String,Object> object) {
+        String saveState = "true";
+        //璁剧疆鍥炴粴鐐�
+        Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
+        String materialOutboundId = "";
+        String oddNumber;
+        if (object.get("materialOutboundId") != null) {
+            materialOutboundId = object.get("materialOutboundId").toString();
+        }
+        Log log = new Log();
+        log.setOperatorId(object.get("userId").toString());
+        log.setOperator(object.get("userName").toString());
+        log.setContent(object.toString());
+        try {
+            MaterialOutbound materialOutbound = JSONObject.parseObject(JSONObject.toJSONString(object.get("title")), MaterialOutbound.class);
+            List<MaterialOutboundDetail> materialOutboundDetailList = JSONArray.parseArray(JSONObject.toJSONString(object.get("materialOutboundDetail")), MaterialOutboundDetail.class);
+            //鏌ヨ鍑哄簱鍗曟槸鍚﹀瓨鍦�
+            Integer MaterialOutboundConut = materialInventoryMapper.getMaterialOutboundCount(materialOutboundId);
+            if (MaterialOutboundConut != 0) {
+
+                List<MaterialOutboundDetail> materialOutboundDetailLists = materialInventoryMapper.getIsNotMaterialOutboundDetail(materialOutboundId);
+                if (!materialOutboundDetailLists.isEmpty()) {
+                    for (MaterialOutboundDetail materialOutboundDetail : materialOutboundDetailLists) {
+                        //杩樺師鐗╂枡搴撳瓨鏁�
+                        materialInventoryMapper.updateMaterialInventoryAvailableInt(materialOutboundDetail.getInventoryId(), materialOutboundDetail.getOutboundQuantity());
+                        if(materialOutboundDetail.getUseId()!=null){
+                            //杩樺師浼樺寲宸ョ▼搴撳瓨鏁�
+                            materialInventoryMapper.updateMaterialInventoryAvailableOptInt(materialOutboundDetail.getUseId(), materialOutboundDetail.getOutboundQuantity());
+                        }/*else{
+                            //杩樺師鐗╂枡搴撳瓨鏁�
+                            materialInventoryMapper.updateMaterialInventoryAvailableInt(materialOutboundDetail.getId(), materialOutboundDetail.getOutboundQuantity());
+                        }*/
+
+                    }
+                }
+                //鍒犻櫎鏉愭枡鍑哄簱鏄庣粏鐨勬暟鎹�
+                materialInventoryMapper.deleteMaterialOutboundDetail(materialOutboundId);
+                materialInventoryMapper.updateMaterialOutbound(materialOutbound, materialOutboundId);
+                materialInventoryMapper.deleteMaterialLog(materialOutboundId);
+                oddNumber = materialOutboundId;
+                log.setFunction("saveMaterialOutbound淇敼:"+oddNumber);
+            } else {
+                //鑾峰彇鍗曞彿
+                oddNumber = orderNumberSetting("鍑哄簱");
+                //鏂板鏉愭枡鍑哄簱琛ㄦ暟鎹�
+                materialInventoryMapper.insertMaterialOutbound(materialOutbound, oddNumber);
+                log.setFunction("saveMaterialOutbound鏂板:"+oddNumber);
+            }
+
+            //鑾峰彇瀵硅薄闆嗗悎寰幆杩涜鏂板淇敼
+
+            if (!materialOutboundDetailList.isEmpty()) {
+                for (MaterialOutboundDetail materialOutboundDetail : materialOutboundDetailList) {
+                    MaterialInventory materialInventory = materialInventoryMapper.getMaterialInventoryById(materialOutboundDetail.getId());
+                    if(materialInventory.getAvailableQuantity()>=materialOutboundDetail.getOutboundQuantity()){
+                        Integer materialOutboundDetailMaximum = materialInventoryMapper.getMaterialOutboundDetailMaximum(oddNumber);
+                        //鏂板鏉愭枡鍑哄簱鏄庣粏鏁版嵁
+                        materialInventoryMapper.insertMaterialOutboundDetail(materialOutboundDetail, oddNumber, materialOutboundDetailMaximum + 1);
+                        //淇敼鐗╂枡搴撳瓨琛ㄥ嚭搴撴暟閲�
+                        materialInventoryMapper.updateMaterialInventoryAvailableOut(materialOutboundDetail.getId(), materialOutboundDetail.getOutboundQuantity());
+
+                        String projectNo="";
+                        if(materialOutboundDetail.getUseId()!=null){
+                            projectNo = materialInventoryMapper.selectProjectNo(materialOutboundDetail.getUseId());
+                            //淇敼浼樺寲宸ョ▼琛ㄥ嚭搴撴暟閲�
+                            materialInventoryMapper.updateMaterialInventoryAvailableOptOut(materialOutboundDetail.getUseId(), materialOutboundDetail.getOutboundQuantity());
+
+                        }/*else{
+                        //淇敼鐗╂枡搴撳瓨琛ㄥ嚭搴撴暟閲�
+                        materialInventoryMapper.updateMaterialInventoryAvailableOut(materialOutboundDetail.getId(), materialOutboundDetail.getOutboundQuantity());
+                        }*/
+
+                        if(materialOutboundDetail.getUseId()!=null){
+                            //淇敼鐗╂枡搴撳瓨鏁伴噺
+                            materialInventoryMapper.updateMaterialInventoryInventoryPlanQuantityOut(materialOutboundDetail.getId(), materialOutboundDetail.getOutboundQuantity());
+                        }else{
+                            materialInventoryMapper.updateMaterialInventoryInventoryOut(materialOutboundDetail.getId(), materialOutboundDetail.getOutboundQuantity());
+                        }
+
+                        materialInventoryMapper.updateMaterialOutboundToExamine(oddNumber,1,object.get("userName").toString());
+                        String json="";
+                        MaterialStore materialStore=materialStoreMapper.getSelectMaterialStoreById(Long.valueOf(materialOutboundDetail.getMaterialCode()));
+                        json=materialStore.getJson().substring(1, materialStore.getJson().length() - 1);
+                        MaterialLog materialLog=new MaterialLog();
+                        materialLog.setOperationOrderNumber(oddNumber);
+                        materialLog.setOperationNumber(materialOutboundDetailMaximum + 1);
+                        materialLog.setOperateType("鐗╂枡鍑哄簱");
+                        materialLog.setMaterialCode(Long.valueOf(materialOutboundDetail.getMaterialCode()));
+                        materialLog.setMaterialName(convertString(json,"\"name\""));
+                        materialLog.setProducer(materialInventory.getProducer());
+                        materialLog.setUnit(convertString(json,"\"unit\""));
+                        materialLog.setWidth(convertDouble(json,"\"width\""));
+                        materialLog.setHeight(convertDouble(json,"\"height\""));
+                        materialLog.setThickness(convertDouble(json,"\"thickness\""));
+                        materialLog.setQuantity(materialOutboundDetail.getOutboundQuantity());
+                        materialLog.setSinglePieceArea(materialOutboundDetail.getSinglePieceArea());
+                        materialLog.setInventoryId(materialOutboundDetail.getId());
+                        materialLog.setInventoryArea(materialInventory.getInventoryArea());
+                        materialLog.setRemarks(materialOutboundDetail.getRemarks());
+                        materialLog.setProjectNo(projectNo);
+                        materialLog.setOperator(object.get("userName").toString());
+                        materialLog.setOperateTime(LocalDate.now());
+                        materialLogMapper.insert(materialLog);
+                    }else{
+                        TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
+                        return "false1";
+                    }
+
+
+
+
+                }
+
+            }
+            logService.saveLog(log);
+
+        } catch (Exception e) {
+            TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
+            //灏嗗紓甯镐紶鍏ユ暟鎹簱
+            SysError sysError = new SysError();
+            sysError.setError(e+Arrays.toString(e.getStackTrace()));
+            sysError.setFunc("saveMaterialOutbound");
+            sysErrorService.insert(sysError);
+            saveState = "false";
+
+        }
+        return saveState;
+
+    }
+
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/pp/FlowCardService.java b/north-glass-erp/src/main/java/com/example/erp/service/pp/FlowCardService.java
index e41fea7..d5cb01f 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/pp/FlowCardService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/pp/FlowCardService.java
@@ -14,9 +14,9 @@
 import com.example.erp.mapper.sd.*;
 import com.example.erp.service.userInfo.LogService;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.awt.*;
 import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
@@ -297,7 +297,7 @@
         }
     }
 
-    public Map<String, Object> getSelectPrintingSv(Map<String, Object> object, String printMerge, String printLike, String merge) {
+    public Map<String, Object> getSelectPrintingSv(Map<String, Object> object, String printMerge, String printLike, String merge, String flashback, String compound, String landingSequence) {
         if (printMerge == null) {
             printMerge = "";
         }
@@ -322,16 +322,27 @@
                 if (printMerge.equals("") || printMerge.equals("null")) {
                     //鏄惁鍖呭惈鍒囧壊
                     //boolean containsCutting = flowCard.getProcess().contains("鍒囧壊");
-                    String processSub = flowCard.getProcess().substring(0, 2);
+                    String processSub = flowCard.getProcess().split("->")[0];
                     //鑾峰彇宸ュ簭瀵瑰簲鐨勫埆绉�
                     String processName = flowCardMapper.getProcessName(processSub);
                     if (processName.equals("stepC") || processName.equals("stepD")) {//宸ヨ壓鏄惁鍖呭惈澶硅兌涓┖
-                        itemmap.put("detail", flowCardMapper.getPrimaryListLimt(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getGlassChild(), flowCard.getProcess(), flowCard.getOrderId()));
+                        itemmap.put("detail", flowCardMapper.getPrimaryListLimt(flowCard.getProcessId(),
+                                String.valueOf("null".equals(compound)
+                                        ? flowCard.getTechnologyNumber()//姝e父灞�
+                                        : compound ),//鍚屾灦灞�
+                                flowCard.getGlassChild(), flowCard.getProcess(), flowCard.getOrderId()));
 
-                        List<Map<String, Object>> detailList = flowCardMapper.getDetailList(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess());
-                        itemmap.put("detailList", detailList);
+                        if (compound == null
+                                || "null".equals(compound)
+                                || compound.trim().isEmpty()){
+                            List<Map<String, Object>> detailList = flowCardMapper.getDetailList(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess(),flashback,landingSequence);
+                            itemmap.put("detailList", detailList);
+                        }else {//鏈夐渶瑕佸悓鏋剁殑灞�
+                            List<Map<String, Object>> detailList = flowCardMapper.getDetailCompoundList(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess(),flashback,compound,landingSequence);
+                            itemmap.put("detailList", detailList);
+                        }
                     } else {
-                        if (merge.equals("1") && flowCard.getMerge().equals(1)) {
+                        if (merge.equals("1") && flowCard.getMerge().equals(1)) {//鍚�
                             // 妫�鏌ユ槸鍚﹀凡缁忓鐞嗚繃璇� processId锛屽鏋滃鐞嗚繃鍒欒烦杩�
                             if (processedKeys.contains(uniqueKey)) {
                                 continue;
@@ -339,29 +350,38 @@
                             // 灏嗚 processId 鍔犲叆宸插鐞嗛泦鍚�
                             processedKeys.add(uniqueKey);
                             itemmap.put("detail", flowCardMapper.getPrimaryList(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getGlassChild(), flowCard.getProcess(), flowCard.getOrderId()));
-
-                            List<Map<String, Object>> detailList = flowCardMapper.getDetailListMerge(flowCard.getProcessId(), flowCard.getProcess());
+                            List<Map<String, Object>> detailList = flowCardMapper.getDetailListMerge(flowCard.getProcessId(), flowCard.getProcess(),flashback,landingSequence);
                             itemmap.put("detailList", detailList);
                         } else {
-                            itemmap.put("detail", flowCardMapper.getPrimaryList(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getGlassChild(), flowCard.getProcess(), flowCard.getOrderId()));
-
-                            List<Map<String, Object>> detailList = flowCardMapper.getDetailListLike(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getProcess());
-                            itemmap.put("detailList", detailList);
+                            itemmap.put("detail", flowCardMapper.getPrimaryListLimt(flowCard.getProcessId(),
+                                    String.valueOf("null".equals(compound)
+                                            ? flowCard.getTechnologyNumber()//姝e父灞�
+                                            : compound ),//鍚屾灦灞�
+                                    flowCard.getGlassChild(), flowCard.getProcess(), flowCard.getOrderId()));
+                            if (compound == null
+                                    || "null".equals(compound)
+                                    || compound.trim().isEmpty()){
+                                List<Map<String, Object>> detailList = flowCardMapper.getDetailListLike(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getProcess(),flashback,landingSequence);
+                                itemmap.put("detailList", detailList);
+                            }else {//鏈夐渶瑕佸悓鏋剁殑灞�
+                                List<Map<String, Object>> detailList = flowCardMapper.getDetailListLikeCompound(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getProcess(),flashback,compound,landingSequence);
+                                itemmap.put("detailList", detailList);
+                            }
                         }
 
                     }
 
-                } else {
+                } else {//鍚�
                     //娴佺▼鍗℃槑缁嗘暟鎹�
                     if (printLike.equals("") || printLike.equals("null")) {
                         itemmap.put("detail", flowCardMapper.getPrimaryListMerge(flowCard.getProcessId(), printMerge, flowCard.getOrderId()));
 
-                        List<Map<String, Object>> detailList = flowCardMapper.getDetailList(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess());
+                        List<Map<String, Object>> detailList = flowCardMapper.getDetailList(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess(), flashback, landingSequence);
                         itemmap.put("detailList", detailList);
                     } else {
                         itemmap.put("detail", flowCardMapper.getPrimaryList(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getGlassChild(), flowCard.getProcess(), flowCard.getOrderId()));
 
-                        List<Map<String, Object>> detailList = flowCardMapper.getDetailListLike(flowCard.getProcessId(), printMerge, flowCard.getProcess());
+                        List<Map<String, Object>> detailList = flowCardMapper.getDetailListLike(flowCard.getProcessId(), printMerge, flowCard.getProcess(), flashback, landingSequence);
                         itemmap.put("detailList", detailList);
                     }
                 }
@@ -401,7 +421,7 @@
         return map;
     }
 
-    public Map<String, Object> getSelectPrintProject(String printProject, String merge) {
+    public Map<String, Object> getSelectPrintProject(String printProject, String merge, String flashback, String landingSequence) {
 
         Map<String, Object> map = new HashMap<>();
         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();//鏈�缁堢粨鏋�
@@ -426,7 +446,7 @@
                 if (processName.equals("stepC") || processName.equals("stepD")) {//宸ヨ壓鏄惁鍖呭惈澶硅兌涓┖
                     itemmap.put("detail", flowCardMapper.getPrimaryListLimt(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getGlassChild(), flowCard.getProcess(), flowCard.getOrderId()));
                     if (flowCard.getPatchState().equals(0)) {
-                        List<Map<String, Object>> detailList = flowCardMapper.getDetailList(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess());
+                        List<Map<String, Object>> detailList = flowCardMapper.getDetailList(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess(), flashback, landingSequence);
                         itemmap.put("detailList", detailList);
                     } else {
                         List<Map<String, Object>> detailList = flowCardMapper.getDetailLists(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess(), flowCard.getOrderNumber());
@@ -445,11 +465,11 @@
                             processedKeys.add(uniqueKey);
                             itemmap.put("detail", flowCardMapper.getPrimaryList(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getGlassChild(), flowCard.getProcess(), flowCard.getOrderId()));
 
-                            List<Map<String, Object>> detailList = flowCardMapper.getDetailListMerge(flowCard.getProcessId(), flowCard.getProcess());
+                            List<Map<String, Object>> detailList = flowCardMapper.getDetailListMerge(flowCard.getProcessId(), flowCard.getProcess(), flashback, landingSequence);
                             itemmap.put("detailList", detailList);
                         } else {
                             itemmap.put("detail", flowCardMapper.getPrimaryList(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getGlassChild(), flowCard.getProcess(), flowCard.getOrderId()));
-                            List<Map<String, Object>> detailList = flowCardMapper.getDetailListLike(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getProcess());
+                            List<Map<String, Object>> detailList = flowCardMapper.getDetailListLike(flowCard.getProcessId(), String.valueOf(flowCard.getTechnologyNumber()), flowCard.getProcess(), flashback, landingSequence);
                             itemmap.put("detailList", detailList);
                         }
 
@@ -506,8 +526,24 @@
         List<FlowCard> flowCardList = JSONArray.parseArray(JSONObject.toJSONString(object.get("composing")), FlowCard.class);
         if (!flowCardList.isEmpty()) {
             for (FlowCard flowCard : flowCardList) {
-                flowCardMapper.updateComposing(flowCard.getProcessId());
+                //鍏堣幏鍙栨帓鐗堢姸鎬�
+                Integer layoutStatus = flowCardMapper.getLayoutStatus(flowCard.getProcessId());
+                //2浼樺寲鍗犵敤
+                if (layoutStatus!=2){
+                    flowCardMapper.updateComposing(flowCard.getProcessId());
+                }
+                else {
+                    return false;
+                }
+
             }
+            //淇濆瓨鏃ュ織
+            Log log = new Log();
+            log.setContent(object.toString());
+            log.setFunction("FlowCardSv娴佺▼鍗℃帓鐗堢姸鎬�");
+            log.setOperatorId((String) object.get("userId"));
+            log.setOperator((String) object.get("userName"));
+            logService.saveLog(log);
             return true;
         } else {
             return false;
@@ -598,6 +634,10 @@
 
 
     public Map<String, Object> getSelectPrintCustomLabelSv(String type, Integer lableType, Map<String, Object> object) {
+        //鏍规嵁mse浼犺繃鏉ョ殑鍊�,濡傛灉涓嶅瓨鍦� 璧嬪�糵alse
+        String isRepeat = Optional.ofNullable(object.get("isRepeat"))
+                .map(Object::toString)
+                .orElse("false");
         Map<String, Object> map = new HashMap<>();
         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();//鏈�缁堢粨鏋�
         List<FlowCard> flowCardList = JSONArray.parseArray(JSONObject.toJSONString(object.get("printList")), FlowCard.class);
@@ -609,21 +649,51 @@
                     String processId = flowCard.getProcessId();
                     Integer orderNumber = flowCard.getOrderNumber();
                     String uniqueKey = processId + "|" + orderNumber;  // 鐢ㄧ壒娈婂瓧绗﹁繛鎺ラ槻姝㈠啿绐�
-                    // 妫�鏌ユ槸鍚﹀凡缁忓鐞嗚繃璇� processId锛屽鏋滃鐞嗚繃鍒欒烦杩�
-                    if (processedKeys.contains(uniqueKey)) {
-                        continue;
+                    if (isRepeat=="false"){//鏍规嵁mse浼犺繃鏉ョ殑鍊煎垽鏂槸鍚﹀幓闄ら噸澶�
+                        // 妫�鏌ユ槸鍚﹀凡缁忓鐞嗚繃璇� processId锛屽鏋滃鐞嗚繃鍒欒烦杩�
+                        if (processedKeys.contains(uniqueKey)) {
+                            continue;
+                        }
                     }
-                    Map<String, Object> itemmap = new HashMap<>();
-                    itemmap.put("data", flowCardMapper.getPrintCustomData(flowCard.getProcessId(), flowCard.getOrderNumber()));
-                    list.add(itemmap);
 
+                    Map<String, Object> itemmap = new HashMap<>();
+
+                    Integer sumQuantity = flowCardMapper.getSumQuantity(flowCard.getOrderId());
+                    List<Map<String, Object>> details = flowCardMapper.getPrintCustomData(flowCard.getProcessId(), flowCard.getOrderNumber(), flowCard.getPrintQuantity());
+
+                    for (Map<String, Object> detail : details) {
+                        detail.put("sumQuantity", sumQuantity);
+                    }
+
+                    itemmap.put("data", details);
+                    list.add(itemmap);
                     // 灏嗚 processId 鍔犲叆宸插鐞嗛泦鍚�
                     processedKeys.add(uniqueKey);
                 }
             } else {//灏忕墖鏍囩
                 for (FlowCard flowCard : flowCardList) {
                     Map<String, Object> itemmap = new HashMap<>();
-                    itemmap.put("data", flowCardMapper.getPrintCustomDataSemi(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess()));
+                    String orderNumber = "";
+                    if (flowCard.getOrderNumber() != null) {
+                        orderNumber = String.valueOf(flowCard.getOrderNumber());
+                    }
+                    // 鍒ゆ柇鏄惁涓洪潪绌哄瓧绗︿覆
+                    if (orderNumber != null && !orderNumber.trim().isEmpty()) {
+
+                        itemmap.put("data", flowCardMapper.getPrintCustomDataSemi(
+                                flowCard.getProcessId(),
+                                flowCard.getTechnologyNumber(),
+                                flowCard.getProcess(),
+                                flowCard.getOrderNumber()
+                        ));
+                    } else {
+
+                        itemmap.put("data", flowCardMapper.getPrintCustomDataSemiTj(
+                                flowCard.getProcessId(),
+                                flowCard.getTechnologyNumber(),
+                                flowCard.getProcess()
+                        ));
+                    }
                     list.add(itemmap);
                 }
             }
@@ -659,7 +729,7 @@
             } else {//灏忕墖鏍囩
                 for (FlowCard flowCard : flowCardList) {
                     Map<String, Object> itemmap = new HashMap<>();
-                    itemmap.put("data", flowCardMapper.getPrintCustomDataSemi(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess()));
+                    itemmap.put("data", flowCardMapper.getPrintCustomDataSemi(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess(), flowCard.getOrderNumber()));
                     list.add(itemmap);
                 }
             }
@@ -826,11 +896,16 @@
             }
         }
         map.put("data", list);
+        map.put("orderOtherMoney", flowCardMapper.selectorderOtherMoney());
         map.put("type", flowCardMapper.selectType());
         return map;
     }
 
     public Map<String, Object> getSelectPrintCustomLabelDetailsSv(String type, Integer lableType, Map<String, Object> object) {
+        String landingSequence = "";
+        if (object.get("landingSequence") != null) {
+            landingSequence = object.get("landingSequence").toString();
+        }
         Map<String, Object> map = new HashMap<>();
         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();//鏈�缁堢粨鏋�
         List<FlowCard> flowCardList = JSONArray.parseArray(JSONObject.toJSONString(object.get("printList")), FlowCard.class);
@@ -849,7 +924,13 @@
                                continue;
                            }
                            Map<String, Object> itemmap = new HashMap<>();
-                           itemmap.put("data", flowCardMapper.getPrintCustomDataDetails(flowCard.getProcessId(), flowCard.getOrderNumber(), flowCard.getPrintQuantity()));
+                           Integer sumQuantity = flowCardMapper.getSumQuantity(flowCard.getOrderId());
+                           List<Map<String, Object>> details = flowCardMapper.getPrintCustomDataDetails(flowCard.getProcessId(), flowCard.getOrderNumber(), flowCard.getPrintQuantity());
+
+                           for (Map<String, Object> detail : details) {
+                               detail.put("sumQuantity", sumQuantity);
+                           }
+                           itemmap.put("data", details);
                            list.add(itemmap);
 
                            // 灏嗚 processId 鍔犲叆宸插鐞嗛泦鍚�
@@ -865,10 +946,30 @@
             } else {//灏忕墖鏍囩
                 for (FlowCard flowCard : flowCardList) {
                     Map<String, Object> itemmap = new HashMap<>();
-                    itemmap.put("data", flowCardMapper.getPrintCustomDataSemi(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess()));
+                    itemmap.put("data", flowCardMapper.getPrintCustomDataSemi(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess(), flowCard.getOrderNumber()));
                     list.add(itemmap);
                 }
             }
+        }
+
+        if (!"1".equals(landingSequence)) {
+            // 鏋勯�犱竴涓厛鎸夌煭杈广�佸啀鎸夐暱杈圭殑姣旇緝鍣�
+            Comparator<Map<String,Object>> comparator = Comparator
+                    .comparingDouble((Map<String,Object> m) -> {
+                        Map<String,Object> first = ((List<Map<String,Object>>)m.get("data")).get(0);
+                        double w = ((Number) first.get("width")).doubleValue();
+                        double h = ((Number) first.get("height")).doubleValue();
+                        return Math.min(w, h);
+                    })
+                    .thenComparingDouble(m -> {
+                        Map<String,Object> first = ((List<Map<String,Object>>)m.get("data")).get(0);
+                        double w = ((Number) first.get("width")).doubleValue();
+                        double h = ((Number) first.get("height")).doubleValue();
+                        return Math.max(w, h);
+                    });
+
+            // 瀵规暣涓� list 鎺掑簭锛屽苟鏁翠綋鍙嶈浆锛岀煭杈瑰ぇ鈫掑墠锛岀煭杈圭浉鍚屾椂闀胯竟澶р啋鍓�
+            list.sort(comparator.reversed());
         }
         map.put("data", list);
         map.put("title", flowCardMapper.getPrintTitle(type));
@@ -1326,6 +1427,18 @@
     }
 
 
+    public List exportDateProcessSv(Map<String, Object> dates) {
+        List<LocalDate> date= (List<LocalDate>) dates.get("date");
+        return flowCardMapper.exportDateProcessMp(date);
+    }
+
+    public Map<String, Object> selectSortingCardSv(String orderId, String productionId, String flashback, String optionVal, FlowCard flowCard) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("data", flowCardMapper.selectSortingCardMp(orderId, productionId,flashback,optionVal, flowCard));
+        map.put("maxFlowCard", flowCardMapper.selectMaxFlowCard(orderId, productionId));
+        map.put("orderOtherMoney", flowCardMapper.selectorderOtherMoney());
+        return map;
+    }
 }
 
 
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java b/north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java
index c890126..b514fe3 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java
@@ -834,7 +834,9 @@
     }
 
 
-
-
-
+    public Map<String, Object> getProjectByProjectNoSv(String projectNo) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("data", glassOptimizeMapper.getProjectByProjectNoSv(projectNo));
+        return map;
+    }
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/pp/ProductionSchedulingService.java b/north-glass-erp/src/main/java/com/example/erp/service/pp/ProductionSchedulingService.java
index 94449b7..6aaee9b 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/pp/ProductionSchedulingService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/pp/ProductionSchedulingService.java
@@ -78,7 +78,7 @@
         List<ProductionScheduling> schedulinglist = JSONArray.parseArray(JSONObject.toJSONString(object.get("scheduling")), ProductionScheduling.class);
         if (!schedulinglist.isEmpty()) {
             for (ProductionScheduling productionScheduling : schedulinglist) {
-             productionSchedulingMapper.insertSelective(schedulingId,productionScheduling.getOrderGlassDetail().getOrderId(),productionScheduling.getOrderNumber(),productionScheduling.getTechnologyNumber(),processes,productionScheduling.getSchedulingQuantity(),productionScheduling.getScheduledStartTime(),productionScheduling.getPlanEndTime(),productionScheduling.getNotes());
+             productionSchedulingMapper.insertSelective(schedulingId,productionScheduling.getOrder().getOrderId(),productionScheduling.getOrderNumber(),productionScheduling.getTechnologyNumber(),processes,productionScheduling.getSchedulingQuantity(),productionScheduling.getScheduledStartTime(),productionScheduling.getPlanEndTime(),productionScheduling.getNotes());
             }
             return true;
         }
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportService.java b/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportService.java
index ef5cc4a..3beb8f1 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportService.java
@@ -1,19 +1,33 @@
 
 package com.example.erp.service.pp;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
 import com.baomidou.dynamic.datasource.annotation.DS;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.example.erp.dto.pp.*;
-import com.example.erp.entity.pp.DamageDetails;
 import com.example.erp.entity.pp.Report;
+import com.example.erp.entity.sd.BasicData;
+import com.example.erp.entity.sd.OrderDetail;
+import com.example.erp.entity.sd.OrderGlassDetail;
+import com.example.erp.entity.sd.ProductDetail;
+import com.example.erp.mapper.pp.FlowCardMapper;
 import com.example.erp.mapper.pp.ProductionSchedulingMapper;
 import com.example.erp.mapper.pp.ReportMapper;
-import com.example.erp.mapper.sd.OrderProcessDetailMapper;
+import com.example.erp.mapper.pp.ReportingWorkMapper;
+import com.example.erp.mapper.sd.*;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
+import java.math.BigDecimal;
 import java.sql.Date;
 import java.time.LocalDate;
 import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static cn.hutool.core.convert.Convert.toDouble;
 
 @Service
 @DS("pp")
@@ -23,18 +37,109 @@
     private final OrderProcessDetailMapper orderProcessDetailMapper;
     private final ProductionSchedulingMapper productionSchedulingMapper;
 
+    private final OrderGlassDetailMapper orderGlassDetailMapper;
+    private final BasicDataMapper basicDataMapper;
+    private final ProductDetailMapper productDetailMapper;
+    private final OrderDetailMapper orderDetailMapper;
 
-    public ReportService(ReportMapper reportMapper, OrderProcessDetailMapper orderProcessDetailMapper, ProductionSchedulingMapper productionSchedulingMapper) {
+    FlowCardMapper flowCardMapper;
+    private ReportingWorkMapper reportingWorkMapper;
+
+
+    //涓婂伐搴忔姤宸ョ彮缁�
+    private void mergeTeamsGroupsName( List<WorkInProgressDTO> dataList1,List<WorkInProgressDTO> dataList2) {
+
+        for (WorkInProgressDTO dto1 : dataList1) {
+            //鏍规嵁褰撳墠宸ュ簭鑾峰彇 鏄惁涓哄崟鐗囥�佸す鑳躲�佹垨鑰呭叏閮�
+          BasicData basicData =  basicDataMapper.
+                  selectOne(new QueryWrapper<BasicData>()
+                          .eq("basic_name", dto1.getThisProcess())
+                          .last("limit 1")
+                  );
+
+          OrderDetail orderDetail = orderDetailMapper
+                .selectOne(
+                        new QueryWrapper<OrderDetail>()
+                                .eq("order_id", dto1.getOrderId())
+                                .eq("order_number", dto1.getOrderNumber())
+                );
+
+          //濡傛灉涓哄崟鐗囷紝鍒欐牴鎹骇鍝佸悕绉板拰宸ヨ壓缂栧彿鑾峰彇鐜荤拑鍚嶇О
+          if(basicData.getNickname()==null || basicData.getNickname().isEmpty()){
+              ProductDetail productDetail = productDetailMapper.
+                      selectOne(new QueryWrapper<ProductDetail>()
+                              .eq("prod_id", orderDetail.getProductId())
+                              .eq("glass_sort",dto1.getTechnologyNumber())
+                      );
+              dto1.setGlassName(productDetail.getDetail());
+
+          }else if(basicData.getNickname().equals("stepC")){
+              OrderGlassDetail orderGlassDetailGroup = orderGlassDetailMapper
+                      .selectOne(new QueryWrapper<OrderGlassDetail>()
+                              .eq("order_id", dto1.getOrderId())
+                              .eq("order_number", dto1.getOrderNumber())
+                              .eq("technology_number",dto1.getTechnologyNumber())
+                      );
+
+              String glassName = productDetailMapper.getGlassNameByGroup(
+                      orderDetail.getProductId(),
+                      orderGlassDetailMapper.getMinTechnologyNumberByGroup(dto1.getOrderId(),dto1.getOrderNumber(), String.valueOf(orderGlassDetailGroup.getGroup())),
+                      orderGlassDetailMapper.getMaxTechnologyNumberByGroup(dto1.getOrderId(),dto1.getOrderNumber(), String.valueOf(orderGlassDetailGroup.getGroup()))
+              );
+              dto1.setGlassName(glassName);
+
+          }else{
+              dto1.setGlassName(dto1.getProductName());
+          }
+
+        }
+
+        Function<WorkInProgressDTO, String> keyFn = dto ->
+                dto.getProcessId() + "|" +
+                        dto.getOrderNumber() + "|" +
+                        dto.getTechnologyNumber();
+
+        Map<String, WorkInProgressDTO> map2 = dataList2.stream()
+                .collect(Collectors.toMap(
+                        keyFn,
+                        Function.identity(),
+                        (existing, replacement) -> existing
+                ));
+
+        for (WorkInProgressDTO dto1 : dataList1) {
+            WorkInProgressDTO dto2 = map2.get(keyFn.apply(dto1));
+            if (dto2 != null) {
+                String tgn = dto2.getTeamsGroupsName();
+                if (StringUtils.hasText(tgn)) {
+                    dto1.setTeamsGroupsName(tgn);
+                }
+            }
+        }
+    }
+
+
+    public ReportService(ReportMapper reportMapper, OrderProcessDetailMapper orderProcessDetailMapper,
+                         ProductionSchedulingMapper productionSchedulingMapper, FlowCardMapper flowCardMapper,
+                         OrderGlassDetailMapper orderGlassDetailMapper, BasicDataMapper basicDataMapper,
+                         ProductDetailMapper productDetailMapper, OrderDetailMapper orderDetailMapper,
+                         ReportingWorkMapper reportingWorkMapper) {
         this.reportMapper = reportMapper;
         this.orderProcessDetailMapper = orderProcessDetailMapper;
         this.productionSchedulingMapper = productionSchedulingMapper;
+        this.flowCardMapper = flowCardMapper;
+        this.orderGlassDetailMapper = orderGlassDetailMapper;
+        this.basicDataMapper = basicDataMapper;
+        this.productDetailMapper = productDetailMapper;
+        this.orderDetailMapper = orderDetailMapper;
+        this.reportingWorkMapper = reportingWorkMapper;
     }
 
     //娴佺▼鍗¤繘搴︽柟娉�
     public Map<String, Object> processCardProgressSv(String orderId, List<Integer> columns) {
         Map<String, Object> map = new HashMap<>();
         //鑾峰彇琛ㄦ牸鍐呭鏁版嵁
-        map.put("data", reportMapper.processCardProgressMp(orderId));
+        List<Map<String, String>> dataList = reportMapper.processCardProgressMp(orderId);
+
 
         //鑾峰彇琛ㄥご宸ュ簭绛涢�夋暟鎹�
         List<Map<String, String>> processFilterList = orderProcessDetailMapper.filterOrderProcess(orderId);
@@ -78,6 +183,24 @@
             }
         }
         map.put("title", uniqueList);
+        Map<String,Integer> clos = new HashMap<>();
+        for (int i=0;i<uniqueList.size();i++){
+            //鏍规嵁娴佺▼鏌ヨ鍩虹鏁版嵁
+            BasicData basicData =  basicDataMapper.selectOne(
+                    new QueryWrapper<BasicData>()
+                            .eq("basic_category","process")
+                            .eq("basic_name",uniqueList.get(i).get("process"))
+                            .last("limit 1")
+            );
+            //鍒ゆ柇纾ㄨ竟鍜岀(杈瑰悗宸ュ簭
+            if(Objects.equals(basicData.getNickname(), "stepA") || Objects.equals(basicData.getNickname(), "stepC")){
+                clos.put(uniqueList.get(i).get("process"), 15+i);
+            }
+            //鍒ゆ柇涓┖鍜屼腑绌哄悗宸ュ簭
+            if(Objects.equals(basicData.getNickname(), "stepB") || Objects.equals(basicData.getNickname(), "stepD")){
+                columns.add(15+i);
+            }
+        }
 
 
         List<Map<String, Integer>> getRowCount = orderProcessDetailMapper.getGlassLRow(orderId);
@@ -86,20 +209,54 @@
             getRowCount.forEach(row -> {
                 Map<String, Integer> getRow = new HashMap<>();
                 // { row: 0, col: 1, rowspan: 3, colspan: 0},
-                Object rowNumObj = row.get("RowNum");
-                if (rowNumObj instanceof Double) {
-                    getRow.put("row", ((Double) rowNumObj).intValue());
-                } else if (rowNumObj instanceof Integer) {
-                    getRow.put("row", (Integer) rowNumObj);
-                }
+                getRow.put("row",  row.get("RowNum"));
                 getRow.put("col", col);
                 getRow.put("rowspan", row.get("rowCount"));
                 getRow.put("colspan", 0);
                 rowCount.add(getRow);
             });
         });
+        if(!clos.isEmpty()){
+            //寰幆缁撴灉
+            for (int i=0;i<dataList.size();i++ ) {
+                Map<String, String> data = JSON.parseObject(dataList.get(i).get("reportWorkQuantity"),
+                        new TypeReference<Map<String, String>>() {
+                        });
+
+                for (String key : clos.keySet()) {
+                    if(data.get(key) != null){
+                       Integer max = orderGlassDetailMapper
+                               .getMaxTechnologyNumberByGroup(dataList.get(i).get("order_id"),
+                                       String.valueOf(dataList.get(i).get("order_number")),
+                                       String.valueOf(dataList.get(i).get("group"))
+                                       );
+                       Integer min = orderGlassDetailMapper
+                            .getMinTechnologyNumberByGroup(dataList.get(i).get("order_id"),
+                                    String.valueOf(dataList.get(i).get("order_number")),
+                                    String.valueOf(dataList.get(i).get("group"))
+                       );
+                       if(min == Integer.parseInt(String.valueOf(dataList.get(i).get("technology_number")))  ){
+                            Map<String, Integer> getRow = new HashMap<>();
+                            // { row: 0, col: 1, rowspan: 3, colspan: 0},
+                            getRow.put("row", i );
+                            getRow.put("col", clos.get(key));
+                            getRow.put("rowspan", max-min+1);
+                            getRow.put("colspan", 0);
+                            rowCount.add(getRow);
+                        }else{
+                           data.put(key,"0");
+                       }
+
+                    }
+                }
+                dataList.get(i).put("reportWorkQuantity",JSON.toJSONString(data));
+
+            }
+        }
 
 
+
+        map.put("data",dataList );
         map.put("mergeCells", rowCount);
 
         return map;
@@ -138,24 +295,37 @@
         if ("null".equals(optionVal)) {
             optionVal = ("");
         }
-
+        if (selectProcesses.equals("鍏ㄩ儴")){
+            selectProcesses="";
+        }
+        String laminating = reportMapper.getLaminating(selectProcesses);
         Map<String, Object> map = new HashMap<>();
+        List<WorkInProgressDTO> dataList2  =reportMapper.workInProgressMpdataList2(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO);
         if (optionVal.equals("1")){
             /* 鏍规嵁閿�鍞崟鍙锋眹鎬�*/
-            map.put("data", reportMapper.workInProgressOrderMp(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO));
-           // map.put("total", reportMapper.workInProgressOrderTotal(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO));
+            //map.put("data", reportMapper.workInProgressOrderMp(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO));
+            List<WorkInProgressDTO> dataList1  =reportMapper.workInProgressOrderMpList1(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO);
+            mergeTeamsGroupsName(dataList1, dataList2);
+            map.put("data",dataList1);
+            // map.put("total", reportMapper.workInProgressOrderTotal(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO));
             map.put("total" ,reportMapper.workInProgressOrderFootSum(offset, pageSize,orderId, inputProject, selectProcesses, workInProgressDTO));
         }else if(optionVal.equals("2")){
-            /* 鏍规祦绋嬪崱鍙锋眹鎬�*/
-            map.put("data", reportMapper.workInProgressProcessMp(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO));
-           // map.put("total", reportMapper.workInProgressProcessTotal(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO));
+            /* 鏍规嵁娴佺▼鍗″彿姹囨��*/
+            //map.put("data", reportMapper.workInProgressProcessMp(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO));
+            List<WorkInProgressDTO> dataList1  =reportMapper.workInProgressProcessMpList1(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO);
+            mergeTeamsGroupsName(dataList1, dataList2);
+            map.put("data",dataList1);
+            // map.put("total", reportMapper.workInProgressProcessTotal(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO));
             map.put("total" ,reportMapper.workInProgressOrderFootSum(offset, pageSize,orderId, inputProject, selectProcesses, workInProgressDTO));
 
         } else if (optionVal.equals("3")) {
 
         } else {
             //娌℃湁閫夋嫨鍒嗙粍
-            map.put("data", reportMapper.workInProgressMp(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO));
+            //map.put("data", reportMapper.workInProgressMp(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO));
+            List<WorkInProgressDTO> dataList1  =reportMapper.workInProgressMpdataList1(offset, pageSize, orderId, inputProject, selectProcesses,laminating, workInProgressDTO);
+            mergeTeamsGroupsName(dataList1, dataList2);
+            map.put("data",dataList1);
             //map.put("total", reportMapper.workInProgressTotal(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO));
             map.put("total" ,reportMapper.workInProgressOrderFootSum(offset, pageSize,orderId, inputProject, selectProcesses, workInProgressDTO));
 
@@ -179,7 +349,7 @@
         return map;
     }
 
-    public Map<String, Object> selectDamageReportSv(Integer pageNum, Integer pageSize, Date selectTime1, Date selectTime2, DamageReportDTO damageReportDTO) {
+    public Map<String, Object> selectDamageReportSv(Integer pageNum, Integer pageSize, String selectTime1, String selectTime2, DamageReportDTO damageReportDTO) {
         Integer offset = (pageNum - 1) * pageSize;
         Map<String, Object> map = new HashMap<>();
         map.put("data", reportMapper.selectDamageReportMp(offset, pageSize, selectTime1, selectTime2, damageReportDTO));
@@ -191,6 +361,7 @@
     public Map<String, Object> splittingDetailsOutsideSv(String orderId, Report report) {
         Map<String, Object> map = new HashMap<>();
         map.put("data", reportMapper.splittingDetailsOutsideMp(orderId, report));
+        map.put("orderOtherMoney", flowCardMapper.selectorderOtherMoney());
         return map;
     }
 
@@ -276,13 +447,16 @@
         return map;
     }
 
-    public Map<String, Object> taskCompletionStatusSv(Date selectTime1, Date selectTime2, List<Integer> columns) {
+    public Map<String, Object> taskCompletionStatusSv(Date selectTime1, Date selectTime2, String orderId, List<Integer> columns) {
+        if ("null".equals(orderId)) {
+            orderId = "";
+        }
         Map<String, Object> map = new HashMap<>();
         //鑾峰彇琛ㄦ牸鍐呭鏁版嵁
-        map.put("data", reportMapper.taskCompletionStatusMp(selectTime1, selectTime2));
+        map.put("data", reportMapper.taskCompletionStatusMp(selectTime1, selectTime2,orderId));
 
         //鑾峰彇琛ㄥご宸ュ簭绛涢�夋暟鎹�
-        List<Map<String, String>> processFilterList = orderProcessDetailMapper.filterOrderProcessCollect(selectTime1, selectTime2);
+        List<Map<String, String>> processFilterList = orderProcessDetailMapper.filterOrderProcessCollect(selectTime1, selectTime2,orderId);
         List<Map<String, String>> processList = processFilterList;
 
         List<String> filterList = new ArrayList<>();
@@ -324,22 +498,24 @@
         }
         map.put("title", uniqueList);
 
-
-        List<Map<String, Integer>> getRowCount = orderProcessDetailMapper.getGlassLRowCollect(selectTime1, selectTime2);
+        List<Map<String, Integer>> getRowCount = orderProcessDetailMapper.getGlassLRowCollect(selectTime1, selectTime2,orderId);
         List<Map<String, Integer>> rowCount = new ArrayList<>();
         columns.forEach(col -> {
             getRowCount.forEach(row -> {
                 Map<String, Integer> getRow = new HashMap<>();
                 // { row: 0, col: 1, rowspan: 3, colspan: 0},
-                getRow.put("row", row.get("RowNum"));
+                Object rowNumObj = row.get("RowNum");
+                if (rowNumObj instanceof Double) {
+                    getRow.put("row", ((Double) rowNumObj).intValue());
+                } else if (rowNumObj instanceof Integer) {
+                    getRow.put("row", (Integer) rowNumObj);
+                }
                 getRow.put("col", col);
                 getRow.put("rowspan", row.get("rowCount"));
                 getRow.put("colspan", 0);
                 rowCount.add(getRow);
             });
         });
-
-
         map.put("mergeCells", rowCount);
 
         return map;
@@ -367,12 +543,18 @@
         return reportMapper.exportCrossProcessBreakingMp(dates);
     }
 
-    public List exportDamageReportSv(List<LocalDate> dates) {
-        if (dates != null && dates.size() > 1) {
-            dates.set(1, dates.get(1).plusDays(1)); // 灏嗙浜屼釜鏃ユ湡鍔犱竴澶�
-        }
-        System.out.println(dates);
-        return reportMapper.exportDamageReportMp(dates);
+    //    public List exportTeamOutputSv(Map<String, Object> dates) {
+//        List<LocalDate> date= (List<LocalDate>) dates.get("date");
+//        String process= (String) dates.get("processes");
+//        if (process.equals("鍏ㄩ儴")){
+//            process="";
+//        }
+//        String laminating = reportMapper.getLaminating(process);
+//        return reportMapper.exportTeamOutputMp(date,process,laminating);
+//    }
+    public List exportDamageReportSv(Map<String, Object> dates) {
+        List<LocalDate> date= (List<LocalDate>) dates.get("date");
+        return reportMapper.exportDamageReportMp(date);
     }
 
     public List exportOrderPlanDecompositionSv(List<LocalDate> dates) {
@@ -395,6 +577,9 @@
 
     public List exportWorkInProgressSv(Map<String, Object> dates) {
         String process= (String) dates.get("processes");
+        if (process.equals("鍏ㄩ儴")){
+            process="";
+        }
         String inputVal= (String) dates.get("inputVal");
         String project= (String) dates.get("project");
         if ("null".equals(inputVal)) {
@@ -403,7 +588,11 @@
         if ("null".equals(project)) {
             project = "";
         }
-        return reportMapper.exportWorkInProgressMp(process,inputVal,project);
+        List<WorkInProgressDTO> dataList1  =reportMapper.exportWorkInProgressMp(process,inputVal,project);
+        List<WorkInProgressDTO> dataList2  =reportMapper.exportWorkInProgressMpdataList2(process);
+
+        mergeTeamsGroupsName(dataList1, dataList2);
+        return dataList1;
     }
 
     public List exportTaskCompletionStatusSv(Map<String, Object> dates) {
@@ -424,7 +613,7 @@
         return reportMapper.exportYieldMp(date,process);
     }
 
-    public Map<String, Object> teamOutputSv(Integer pageNum, Integer pageSize, Date selectTime1, Date selectTime2, String selectProcesses, TeamOutputDTO teamOutputDTO) {
+    public Map<String, Object> teamOutputSv(Integer pageNum, Integer pageSize, String selectTime1, String selectTime2, String selectProcesses, TeamOutputDTO teamOutputDTO) {
         if (selectProcesses.equals("鍏ㄩ儴")){
             selectProcesses="";
         }
@@ -462,4 +651,143 @@
         String laminating = reportMapper.getLaminating(process);
         return reportMapper.exportTeamOutputMp(date,process,laminating);
     }
+
+    public Map<String, Object> workInProgressCombinationSv(
+            Integer pageNum, Integer pageSize,
+            String orderId, String inputProject, String selectProcesses,
+            String optionVal, WorkInProgressDTO workInProgressDTO) {
+
+        Integer offset = (pageNum - 1) * pageSize;
+
+        if ("null".equals(orderId)) {
+            orderId = "";
+        }
+        if ("null".equals(inputProject)) {
+            inputProject = "";
+        }
+        if ("null".equals(optionVal)) {
+            optionVal = "";
+        }
+        if ("鍏ㄩ儴".equals(selectProcesses)) {
+            selectProcesses = "";
+        }
+
+        String laminating = "";
+        Map<String, Object> map = new HashMap<>();
+        Map<String, Double> totalSumMap = new HashMap<>();
+
+        double totalStockNum = 0;
+        double totalStockArea = 0;
+
+        // 鑾峰彇鎵�鏈夊伐搴�
+        List<String> processList = reportMapper.selectProcess();
+
+        // 鏈�缁堟暟鎹泦鍚�
+        List<Map<String, Object>> resultList = new ArrayList<>();
+
+        if (!"".equals(selectProcesses)) {
+            laminating = reportingWorkMapper.getProcessLaminating(selectProcesses);
+            List<Map<String, Object>> singleResult =
+                    reportMapper.getWorkInProgressCombination(selectProcesses, laminating, optionVal);
+            if (singleResult != null && !singleResult.isEmpty()) {
+                resultList.addAll(singleResult);
+            }
+
+            Map<String, Object> total =
+                    reportMapper.getWorkInProgressCombinationFootSum(selectProcesses, laminating, optionVal);
+            if (total != null) {
+                BigDecimal stockNum = (BigDecimal) total.get("stockNum");
+                BigDecimal stockArea = (BigDecimal) total.get("stockArea");
+
+                if (stockNum != null) {
+                    totalStockNum += stockNum.doubleValue();
+                }
+                if (stockArea != null) {
+                    totalStockArea += stockArea.doubleValue();
+                }
+            }
+
+        } else {
+            for (String process : processList) {
+                laminating = reportingWorkMapper.getProcessLaminating(process);
+
+                List<Map<String, Object>> singleResult =
+                        reportMapper.getWorkInProgressCombination(process, laminating, optionVal);
+
+                if (singleResult != null && !singleResult.isEmpty()) {
+                    resultList.addAll(singleResult);
+                }
+
+                Map<String, Object> total =
+                        reportMapper.getWorkInProgressCombinationFootSum(process, laminating, optionVal);
+                if (total != null) {
+                    BigDecimal stockNum = (BigDecimal) total.get("stockNum");
+                    BigDecimal stockArea = (BigDecimal) total.get("stockArea");
+
+                    if (stockNum != null) {
+                        totalStockNum += stockNum.doubleValue();
+                    }
+                    if (stockArea != null) {
+                        totalStockArea += stockArea.doubleValue();
+                    }
+                }
+            }
+        }
+
+        totalSumMap.put("stockNum", totalStockNum);
+        totalSumMap.put("stockArea", totalStockArea);
+
+        map.put("data", resultList);
+        map.put("total", totalSumMap);
+        map.put("process", productionSchedulingMapper.selectProcess());
+
+        return map;
+    }
+
+    public List exportWorkInProgressCombinationSv(Map<String, Object> dates) {
+        String process= (String) dates.get("processes");
+        if (process.equals("鍏ㄩ儴")){
+            process="";
+        }
+        String inputVal= (String) dates.get("inputVal");
+        String project= (String) dates.get("project");
+        if ("null".equals(inputVal)) {
+            inputVal = "";
+        }
+        if ("null".equals(project)) {
+            project = "";
+        }
+
+        String laminating = "";
+
+        // 鑾峰彇鎵�鏈夊伐搴�
+        List<String> processList = reportMapper.selectProcess();
+
+        // 鏈�缁堟暟鎹泦鍚�
+        List<WorkInProgressCombinationDTO> resultList = new ArrayList<>();
+
+        if (!"".equals(process)) {
+            laminating = reportingWorkMapper.getProcessLaminating(process);
+            List<WorkInProgressCombinationDTO> singleResult =
+                    reportMapper.exportWorkInProgressCombination(process, laminating, inputVal);
+            if (singleResult != null && !singleResult.isEmpty()) {
+                resultList.addAll((Collection<? extends WorkInProgressCombinationDTO>) singleResult);
+            }
+
+
+        } else {
+            for (String processVal : processList) {
+                laminating = reportingWorkMapper.getProcessLaminating(processVal);
+
+                List<WorkInProgressCombinationDTO> singleResult =
+                        reportMapper.exportWorkInProgressCombination(processVal, laminating, inputVal);
+
+                if (singleResult != null && !singleResult.isEmpty()) {
+                    resultList.addAll((Collection<? extends WorkInProgressCombinationDTO>) singleResult);
+                }
+            }
+        }
+
+        return resultList;
+    }
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java b/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
index 890f148..0bb3950 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
@@ -22,6 +22,7 @@
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.example.erp.mapper.sd.*;
 import com.example.erp.mapper.userInfo.LogMapper;
+import com.example.erp.service.mm.FinishedGoodsInventoryService;
 import com.example.erp.service.sd.OrderProcessDetailService;
 import com.example.erp.service.userInfo.LogService;
 import com.example.erp.service.userInfo.SysErrorService;
@@ -69,7 +70,8 @@
     private final RestTemplate restTemplate;
     private final PatchLogMapper patchLogMapper;
     private final ReworkMapper reworkMapper;
-    private final BasicDateMapper basicDataMapper;
+    private final BasicDataMapper basicDataMapper;
+    private final FinishedGoodsInventoryService finishedGoodsInventoryService;
 
 
     /*public ReportingWorkService(ReportingWorkMapper reportingWorkMapper, BasicDateProduceMapper basicDateProduceMapper, DamageDetailsMapper damageDetailsMapper, ReportingWorkDetailMapper reportingWorkDetailMapper, OrderProcessDetailMapper orderProcessDetailMapper, OrderProcessDetailService orderProcessDetailService, OrderMapper orderMapper, FlowCardMapper flowCardMapper, LogService logService, LogMapper logMapper, OrderGlassDetailMapper orderGlassDetailMapper, SysErrorService sysErrorService, OrderDetailMapper orderDetailMapper, FinishedOperateLogMapper finishedOperateLogMapper, ReportingWorkTransferMapper reportingWorkTransferMapper) {
@@ -252,6 +254,8 @@
         reportingWork.setReportingWorkId(reportingWorkId);
         String[] processIdStr = reportingWork.getProcessId().split("/");
         reportingWork.setProcessId(processIdStr[0]);
+        reportingWork.setThisWornQuantity(0);
+        reportingWork.setThisCompletedQuantity(0);
 
         int reviewState = (int) reportingWorkJson.get("type");
         if (reviewState == 1) {//瀹℃牳閫氳繃
@@ -267,16 +271,23 @@
         //鏄惁绾胯ˉ 1鐜拌ˉ 0鏈幇琛�
         int isPatch = (reportingWorkJson.get("isPatch") != null) ? (int) reportingWorkJson.get("isPatch") : 0;
 
-        reportingWork.setNextProcess(orderProcessDetailMapper.selectNextProcess(processIdStr[0],processIdStr[1],reportingWork.getThisProcess()));
         //涓昏〃鎻掑叆
         reportingWorkMapper.insert(reportingWork);
         //鍓〃寰幆鎻掑叆锛屽苟涓旀彃鍏ユ鐮翠俊鎭〃銆傚啀鏍规嵁娆$牬淇℃伅淇敼璁㈠崟鐜荤拑娴佺▼琛ㄧ殑瀹屽伐鏁伴噺涓庡埡鐮存暟閲�
+        final Integer[] maxTechnologyNumber = {0,0};
         reportingWorkDetails.forEach(reportingWorkDetail -> {
+            //鍚堢墖鏁伴噺姹囨�诲噺灏�
+            if(Integer.parseInt(reportingWorkDetail.getTechnologyNumber()) > maxTechnologyNumber[0]){
+                maxTechnologyNumber[0] = Integer.valueOf(reportingWorkDetail.getTechnologyNumber());
+                maxTechnologyNumber[1]+=1;
+            }
             reportingWork.setThisCompletedQuantity(reportingWork.getThisCompletedQuantity() + reportingWorkDetail.getCompletedQuantity());
             reportingWork.setThisWornQuantity(reportingWork.getThisWornQuantity() + reportingWorkDetail.getBreakageQuantity());
             int qualityInsStatus = (int) reportingWorkJson.get("qualityInsStatus");
             reportingWorkDetail.setReportingWorkId(reportingWorkId);
             List<DamageDetails> damageDetails = reportingWorkDetail.getDamageDetails();
+            reportingWork.setNextProcess(orderProcessDetailMapper.selectNextProcess(processIdStr[0],processIdStr[1],reportingWork.getThisProcess(),reportingWorkDetail.getOrderNumber()));
+
             //娆$牬鏄庣粏琛ㄦ彃鍏ユ暟鎹�
             if (damageDetails != null && !damageDetails.isEmpty()) {
                 damageDetails.forEach(damageDetail -> {
@@ -365,7 +376,7 @@
             }
 
             //鏇存柊娴佺▼鍗¤〃鐨勬姤宸ユ暟閲�
-            if (Objects.equals(reportingWork.getNextProcess(), "")|| Objects.equals(reportingWork.getNextProcess(), null)) {
+            if (reportingWork.getNextProcess() == null || reportingWork.getNextProcess().isEmpty()) {
                 LambdaUpdateWrapper<FlowCard> flowCardLambdaUpdateWrapper =
                         new LambdaUpdateWrapper<>();
                 flowCardLambdaUpdateWrapper
@@ -378,6 +389,11 @@
 
 
         });
+        //鑾峰彇鎶ュ伐宸ュ簭鏄惁涓哄鍚堝伐绋�
+
+        reportingWork.setThisCompletedQuantity(reportingWork.getThisCompletedQuantity()/maxTechnologyNumber[1]);
+
+
         reportingWorkMapper.update(reportingWork, new LambdaUpdateWrapper<ReportingWork>()
                 .eq(ReportingWork::getId, reportingWork.getId()));
 
@@ -1165,7 +1181,10 @@
         date.add(endDate);
         Map<String, Object> result = new HashMap<>();
         BasicData basicData = basicDataMapper
-                .selectOne(new QueryWrapper<BasicData>().eq("basic_name", reportingWork.get("process")));
+                .selectOne(new QueryWrapper<BasicData>()
+                        .eq("basic_name", reportingWork.get("process"))
+                        .last("limit 1")
+                );
         result.put("data",orderProcessDetailMapper.selectShiftQuantitySv(creatorId, startDate, endDate,basicData==null?null:basicData.getNickname()));
         result.put("date",date);
         return result;
@@ -1199,5 +1218,12 @@
 
     }
 
+		public List<BasicDataProduce> selectEquipmentByProcessSv(String process) {
+		       return reportingWorkMapper.SelectWorkBasicDeviceMp(process);
+		    }
 
-}
+		public String saveWorkStorage(Map<String, Object> object) {
+		        //List<Map<String, Object>> flowCard = reportingWorkMapper.getStorageData();
+		        //finishedGoodsInventoryService.addSelectWarehousing(object);
+		        return null;
+		    }}
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/pp/ReworkService.java b/north-glass-erp/src/main/java/com/example/erp/service/pp/ReworkService.java
index 5fa3c2f..287f654 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/pp/ReworkService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/pp/ReworkService.java
@@ -208,7 +208,7 @@
                     //鍒犻櫎杩斿伐琛ㄥ搴旇ˉ鐗噄d鏁版嵁
                     reworkMapper.deleteReworkMp(rework.getReworkId());
                     //淇敼娆$牬鏄庣粏琛ㄨˉ鐗囨暟閲忓拰鐘舵��
-                    reworkMapper.updateReworkDdMp(rework.getReportingWorkId(),rework.getOrderSort(),rework.getTechnologyNumber(),rework.getReworkNum());
+                    reworkMapper.updateReworkDdMp(rework.getReportingWorkId(),rework.getOrderSort(),rework.getTechnologyNumber(),rework.getReworkNum(),rework.getReworkType(),rework.getReworkReason());
                     //淇敼鎶ュ伐鏄庣粏琛ㄧ姸鎬�
                     reworkMapper.updateReworkBgMp(rework.getReportingWorkId(),rework.getOrderSort(),rework.getTechnologyNumber());
 
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/sd/BasicDateService.java b/north-glass-erp/src/main/java/com/example/erp/service/sd/BasicDataService.java
similarity index 86%
rename from north-glass-erp/src/main/java/com/example/erp/service/sd/BasicDateService.java
rename to north-glass-erp/src/main/java/com/example/erp/service/sd/BasicDataService.java
index d544ce6..4d98c89 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/sd/BasicDateService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/sd/BasicDataService.java
@@ -5,24 +5,23 @@
 import com.example.erp.entity.sd.BasicData;
 import com.example.erp.entity.sd.BasicOtherMoney;
 import com.example.erp.entity.sd.Customer;
-import com.example.erp.mapper.sd.BasicDateMapper;
+import com.example.erp.mapper.sd.BasicDataMapper;
 import com.example.erp.mapper.sd.BasicOtherMoneyMapper;
 import com.example.erp.mapper.sd.CustomerMapper;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
 
 @Service
 @DS("sd")
-public class BasicDateService {
-    private final BasicDateMapper basicDateMapper;
+public class BasicDataService {
+    private final BasicDataMapper basicDataMapper;
 
     private final CustomerMapper customerMapper;
     private final BasicOtherMoneyMapper basicOtherMoneyMapper;
 
-    public BasicDateService(BasicDateMapper basicDateMapper, CustomerMapper customerMapper, BasicOtherMoneyMapper basicOtherMoneyMapper) {
-        this.basicDateMapper = basicDateMapper;
+    public BasicDataService(BasicDataMapper basicDataMapper, CustomerMapper customerMapper, BasicOtherMoneyMapper basicOtherMoneyMapper) {
+        this.basicDataMapper = basicDataMapper;
         this.customerMapper = customerMapper;
         this.basicOtherMoneyMapper = basicOtherMoneyMapper;
     }
@@ -79,9 +78,9 @@
 
     public Map<String, List<Object>> getBasicDataByType(String type){
         //杩斿洖鍩虹鏁版嵁閲岀殑鎵�鏈夌被鍨�
-        List<String> orderBasicDataType = basicDateMapper.getOrderBasicDataType(type);
+        List<String> orderBasicDataType = basicDataMapper.getOrderBasicDataType(type);
         //杩斿洖姝ょ被鍨嬪熀纭�鏁版嵁鎵�鏈夋暟鎹�
-        List<BasicData> orderBasicData = basicDateMapper.getOrderBasicData(type);
+        List<BasicData> orderBasicData = basicDataMapper.getOrderBasicData(type);
         Map<String, List<Object>> BasicDataMap = new HashMap<>();
         //鍒涘缓List瀵硅薄
 
@@ -102,17 +101,17 @@
 
     public List<BasicData> getBasicDataByTypeAndChildType(String type, String childType) {
         Map<String, List<Object>> BasicDataMap = new HashMap<>();
-        return basicDateMapper.getOrderBasicDataByTypeAndChildType(type, childType);
+        return basicDataMapper.getOrderBasicDataByTypeAndChildType(type, childType);
 
     }
 
     public List<BasicData> getBasicData() {
-        return basicDateMapper.getBasicData();
+        return basicDataMapper.getBasicData();
     }
 
     public Object getBasicDataType() {
-       List<BasicData> lastType =  basicDateMapper.getBasicDataLastType();
-       List<BasicData> firstType= basicDateMapper.getBasicDataFirstType();
+       List<BasicData> lastType =  basicDataMapper.getBasicDataLastType();
+       List<BasicData> firstType= basicDataMapper.getBasicDataFirstType();
        List<Map<String,Object>> list = new ArrayList<>();
        if(!firstType.isEmpty()){
            firstType.forEach(item->{
@@ -143,17 +142,17 @@
             basicData.setBasicCategory(basicTypeList.get(1));
             basicData.setBasicName(map.get("input").toString());
             basicData.setNickname(map.get("nickname").toString());
-            basicDateMapper.insert(basicData);
+            basicDataMapper.insert(basicData);
         }
         return true;
     }
 
     public int deleteBasicData(BasicData basicData) {
 
-        return  basicDateMapper.deleteById(basicData.getId());
+        return  basicDataMapper.deleteById(basicData.getId());
     }
 
     public int updateBasicData(BasicData basicData) {
-        return  basicDateMapper.updateById(basicData);
+        return  basicDataMapper.updateById(basicData);
     }
 }
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/sd/DeliveryService.java b/north-glass-erp/src/main/java/com/example/erp/service/sd/DeliveryService.java
index 404611c..e87d781 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/sd/DeliveryService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/sd/DeliveryService.java
@@ -521,21 +521,41 @@
         if (object.get("type") != null) {
             type = object.get("type").toString();
         }
+        int state = 0;
+        if (object.get("state") != null) {
+            state = Integer.parseInt(object.get("state").toString());
+        }
         List <Map<String, Object>> list1=new ArrayList<Map<String, Object>>();//鏈�缁堢粨鏋�
         for(Delivery deliverys:deliveries){
 
             Map<String, Object> map = new HashMap<>();
             List <Map<String, Object>> list=new ArrayList<Map<String, Object>>();//鏈�缁堢粨鏋�
             List <Map<String, Object>> moneryList=new ArrayList<Map<String, Object>>();//鏈�缁堢粨鏋�
-            List<DeliveryDetail> deliveryDetailList=deliveryDetailMapper.getSelectDeliveryPrinting(deliverys.getDeliveryId(),type);
+            List<DeliveryDetail> deliveryDetailList;
+            if(state==1){
+                deliveryDetailList=deliveryDetailMapper.getSelectDeliveryPrintingMoney(deliverys.getDeliveryId(),type);
+            }else if(state==2){
+                deliveryDetailList=deliveryDetailMapper.getSelectDeliveryPrintingNoMoney(deliverys.getDeliveryId(),type);
+            }else{
+                deliveryDetailList=deliveryDetailMapper.getSelectDeliveryPrinting(deliverys.getDeliveryId(),type);
+            }
             String orderId="";
             double otherMoney=0.0;
             for (DeliveryDetail detail : deliveryDetailList) {
                 orderId=detail.getOrderDetail().getOrderId();
                 Map<String, Object> itemmap = new HashMap<>();
 
-                List<Map<String, Object>> deliveryDetailList2 = deliveryDetailMapper.getSelectDeliveryDetailPrinting(detail.getDeliveryId(),
-                        detail.getOrderDetail().getProductId(), detail.getOrderDetail().getOrderId());
+                List<Map<String, Object>> deliveryDetailList2;
+                if(state==3){
+                    deliveryDetailList2=deliveryDetailMapper.getSelectDeliveryPrintingMoneySpecifications(detail.getDeliveryId(),
+                            detail.getOrderDetail().getProductId(), detail.getOrderDetail().getOrderId());
+                }else if(state==4){
+                    deliveryDetailList2=deliveryDetailMapper.getSelectDeliveryPrintingNoMoneySpecifications(detail.getDeliveryId(),
+                            detail.getOrderDetail().getProductId(), detail.getOrderDetail().getOrderId());
+                }else{
+                    deliveryDetailList2 = deliveryDetailMapper.getSelectDeliveryDetailPrinting(detail.getDeliveryId(),
+                            detail.getOrderDetail().getProductId(), detail.getOrderDetail().getOrderId());
+                }
 
                 for (Map<String, Object> stringObjectMap : deliveryDetailList2) {
                     if(stringObjectMap.get("other_columns")!=null){
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/sd/OrderService.java b/north-glass-erp/src/main/java/com/example/erp/service/sd/OrderService.java
index 8f479a8..b0a7bd5 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/sd/OrderService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/sd/OrderService.java
@@ -232,6 +232,8 @@
         //鍒犻櫎璁㈠崟宸ヨ壓琛�
         // orderProcessDetailMapper.delete(new LambdaQueryWrapper<OrderProcessDetail>().eq(OrderProcessDetail::getOrderId, order.getOrderId()));
 
+        orderDetailMapper.deleteOrderFile(order.getOrderId());
+
         insertOtherDetail(order.getOrderId(),OrderDetails,orderOtherMoneyList);
     }
 
@@ -256,7 +258,7 @@
             Product product = productMapper.selectById(OrderDetails.get(i).getProductId());
 
             OrderDetails.get(i).setWeight(Double.valueOf(String.format("%.2f",product.getThickness()*OrderDetails.get(i).getWidth()*OrderDetails.get(i).getHeight()/1000000*2.5)));
-            if(OrderDetails.get(i).getBendRadius()!=null && OrderDetails.get(i).getBendRadius()!=0){
+            /*if(OrderDetails.get(i).getBendRadius()!=null && OrderDetails.get(i).getBendRadius()!=0){
                 //鑾峰彇寮挗寮у害
                 Double bendRadius = OrderDetails.get(i).getBendRadius();
                 //鑾峰彇瀹�
@@ -265,7 +267,7 @@
                 String archRiseS =  String.format("%.1f",bendRadius-(bendRadius*Math.cos(width/2/bendRadius)));
                 Double archRise = Double.parseDouble(archRiseS);
                 OrderDetails.get(i).setArchRise(archRise);
-            }
+            }*/
 
             Map<String,Object> otherColumns = JSON.parseObject(OrderDetails.get(i).getOtherColumns(), new TypeReference<Map<String, Object>>(){});
             int finalI = i;
@@ -289,6 +291,14 @@
                 OrderDetails.get(i).setOtherColumns("{}");
             }
 
+            if(OrderDetails.get(i).getFileName()!=null&&!OrderDetails.get(i).getFileName().trim().isEmpty()){
+                orderMapper.saveOrderFile(OrderDetails.get(i).getFileName(), OrderDetails.get(i).getFileData(),orderId,OrderDetails.get(i).getOrderNumber());
+            }
+
+            if(OrderDetails.get(i).getShape()==null){
+                OrderDetails.get(i).setShape("1");
+            }
+
         }
 
 
@@ -298,6 +308,50 @@
         orderDetailMapper.insertBatch(OrderDetails);
         //寰�灏忕墖琛ㄤ紶鍏ヤ骇鍝佹暟鎹�
         orderGlassDetailMapper.insertOrderGlassDetail(orderId);
+
+        //淇敼鎴愬搧鎷遍珮
+        List<OrderDetail> orderDetails = orderDetailMapper
+                .selectList(new LambdaQueryWrapper<OrderDetail>()
+                        .eq(OrderDetail::getOrderId, orderId)
+                        .isNotNull(OrderDetail::getBendRadius)
+                );
+
+        orderDetails.forEach(orderDetail -> {
+            //鑾峰彇鏈�灏忓姬搴�
+            List<OrderGlassDetail> orderGlassDetails = orderGlassDetailMapper
+                    .selectList(new LambdaQueryWrapper<OrderGlassDetail>()
+                            .eq(OrderGlassDetail::getOrderId, orderId)
+                            .eq(OrderGlassDetail::getOrderNumber, orderDetail.getOrderNumber())
+                    );
+
+            for(OrderGlassDetail orderGlassDetail:orderGlassDetails) {
+                //鑾峰彇褰撳墠灞傛暟涓庝箣鍓嶅眰鏁扮殑鍘氬害
+                Double glassThickness = productMapper
+                        .getGlassThickness(orderDetail.getProductId(), orderGlassDetail.getTechnologyNumber());
+                //鍐呭崐寰�
+                Double radius = orderDetail.getBendRadius() - glassThickness;
+
+
+                //鍐呯墖鍐呭姬闀�
+                Double innerArc = orderGlassDetails.get(0).getArc()
+                        - orderGlassDetails.get(0).getArc() * glassThickness / orderDetail.getBendRadius();
+
+                //鎷遍珮
+                String archRiseS = String.format("%.1f", radius - radius * Math.cos(innerArc / 2 / radius));
+                Double archRise = Double.parseDouble(archRiseS);
+                orderGlassDetailMapper.update(null, new LambdaUpdateWrapper<OrderGlassDetail>()
+                        .set(OrderGlassDetail::getArchRise, archRise)
+                        .eq(OrderGlassDetail::getId, orderGlassDetail.getId())
+                );
+
+//                orderDetailMapper.update(null,new LambdaUpdateWrapper<OrderDetail>()
+//                        .set(OrderDetail::getArchRise,archRise)
+//                        .eq(OrderDetail::getId, orderDetail.getId())
+            }
+
+        });
+
+
         if(orderOtherMoneyList!=null){
             orderOtherMoneyList.forEach(orderOtherMoney ->{
                 orderOtherMoney.setId(null);
@@ -339,7 +393,7 @@
     public Map<String,Object> getOrderList(Integer pageNum, Integer pageSize, List<String> selectDate, Map<String,Object> config,Integer orderType) {
         Integer offset = (pageNum-1)*pageSize;
         String endDate = LocalDate.now().toString();
-        String startDate = LocalDate.now().minusDays(15).toString();
+        String startDate = LocalDate.now().minusDays(365).toString();
         if(selectDate !=null && selectDate.size()==2){
             if(!selectDate.get(0).isEmpty()){
                 startDate = selectDate.get(0);
@@ -365,7 +419,8 @@
     }
     //鍒犻櫎璁㈠崟
     public Integer deleteOrder(String id) {
-        return  orderMapper.delete(
+        orderDetailMapper.deleteOrderFile(id);
+        return orderMapper.delete(
                 new QueryWrapper<Order>().eq("order_id",id)
         );
     }
@@ -376,12 +431,14 @@
         Order order = orderMapper.selectOne(new QueryWrapper<Order>().eq("order_id",id));
         List<OrderDetail> orderDetails = orderDetailMapper.selectList(new QueryWrapper<OrderDetail>().eq("order_id",id));
         List<OrderOtherMoney> orderOtherMoneyList = orderOtherMoneyMapper.findById(id);
+        List<Map<String,String>> orderFileList = orderMapper.selectOrderFileList(id);
 
 
         Map<String,Object> map = new HashMap<>();
         map.put("order",order);
         map.put("orderDetails",orderDetails);
         map.put("orderOtherMoneyList",orderOtherMoneyList);
+        map.put("orderFile",orderFileList);
         return map;
     }
     //璁㈠崟瀹℃牳
@@ -933,4 +990,56 @@
         }
 
     }
+
+    public Object uploadDxf(Map<String,Object> object)  {
+        String fileName = "";
+        if (object.get("fileName") != null) {
+            fileName = object.get("fileName").toString();
+        }
+        String fileData = "";
+        if (object.get("fileData") != null) {
+            fileData = object.get("fileData").toString();
+        }
+        byte[] dxfData = Base64.getDecoder().decode(fileData);
+        String orderId="NG25010101";
+        Integer orderNumber=1;
+        orderMapper.saveOrderFile(fileName, fileData,orderId,orderNumber);
+        return true;
+    }
+
+    public Map<String,Object> selectUploadDxf(Map<String,Object> object)  {
+        String orderId = "";
+        if (object.get("orderId") != null) {
+            orderId = object.get("orderId").toString();
+        }
+        int orderNumber =0;
+        if (object.get("orderNumber") != null) {
+            orderNumber = Integer.parseInt(object.get("orderNumber").toString());
+        }
+        Map<String,Object> map = new HashMap<>();
+        map.put("data",orderMapper.selectOrderFile(orderId,orderNumber));
+        return map;
+    }
+
+    public boolean updateOrderFile(Map<String,Object> object)  {
+        String orderId = "";
+        if (object.get("orderId") != null) {
+            orderId = object.get("orderId").toString();
+        }
+        int orderNumber =0;
+        if (object.get("orderNumber") != null) {
+            orderNumber = Integer.parseInt(object.get("orderNumber").toString());
+        }
+        String dataBase64 = "";
+        if (object.get("dataBase64") != null) {
+            dataBase64 = object.get("dataBase64").toString();
+        }
+        Map<String,String> orderFile =orderMapper.selectOrderFile(orderId,orderNumber);
+        if(orderFile!=null){
+            orderMapper.updateOrderFile("map.dxf", dataBase64,orderId,orderNumber);
+        }else{
+            orderMapper.saveOrderFile("map.dxf", dataBase64,orderId,orderNumber);
+        }
+        return true;
+    }
 }
diff --git a/north-glass-erp/src/main/resources/application-prod.yml b/north-glass-erp/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..16ed97d
--- /dev/null
+++ b/north-glass-erp/src/main/resources/application-prod.yml
@@ -0,0 +1,49 @@
+
+
+
+server:
+  port: 8086
+
+ip: localhost
+port: 3309
+
+#sa-token:
+#  timeout: 86400
+
+
+spring:
+  profiles:
+    active: prod
+  datasource:
+    dynamic:
+      primary: user_info #璁剧疆榛樿鐨勬暟鎹簮鎴栬�呮暟鎹簮缁�,榛樿鍊煎嵆涓簃aster
+      strict: false #璁剧疆涓ユ牸妯″紡,榛樿false涓嶅惎鍔�. 鍚姩鍚庡湪鏈尮閰嶅埌鎸囧畾鏁版嵁婧愭椂鍊欏洖鎶涘嚭寮傚父,涓嶅惎鍔ㄤ細浣跨敤榛樿鏁版嵁婧�.
+      datasource:
+        user_info:
+          url: jdbc:mysql://${ip}:${port}/erp_user_info?serverTimezone=GMT%2b8
+          username: root
+          password: beibo.123/
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        sd:
+          url: jdbc:mysql://${ip}:${port}/sd?serverTimezone=GMT%2b8&allowMultiQueries=true
+          username: root
+          password: beibo.123/
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        mm:
+          url: jdbc:mysql://${ip}:${port}/mm?serverTimezone=GMT%2b8
+          username: root
+          password: beibo.123/
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        pp:
+          url: jdbc:mysql://${ip}:${port}/pp?serverTimezone=GMT%2b8
+          username: root
+          password: beibo.123/
+          driver-class-name: com.mysql.cj.jdbc.Driver
+        log:
+          url: jdbc:mysql://${ip}:${port}/erp_log?serverTimezone=GMT%2b8
+          username: root
+          password: beibo.123/
+          driver-class-name: com.mysql.cj.jdbc.Driver
+#mybatis-plus:
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
\ No newline at end of file
diff --git a/north-glass-erp/src/main/resources/application.yml b/north-glass-erp/src/main/resources/application.yml
index fa7851d..48f46c8 100644
--- a/north-glass-erp/src/main/resources/application.yml
+++ b/north-glass-erp/src/main/resources/application.yml
@@ -1,4 +1,6 @@
 
+
+
 server:
   port: 8086
 
@@ -10,6 +12,8 @@
 
 
 spring:
+#  profiles:
+#    active: prod
   datasource:
     dynamic:
       primary: user_info #璁剧疆榛樿鐨勬暟鎹簮鎴栬�呮暟鎹簮缁�,榛樿鍊煎嵆涓簃aster
diff --git a/north-glass-erp/src/main/resources/mapper/mm/BasicWarehouseType.xml b/north-glass-erp/src/main/resources/mapper/mm/BasicWarehouseType.xml
index f1ddbd1..1afd6dd 100644
--- a/north-glass-erp/src/main/resources/mapper/mm/BasicWarehouseType.xml
+++ b/north-glass-erp/src/main/resources/mapper/mm/BasicWarehouseType.xml
@@ -40,6 +40,10 @@
         update mm.basic_warehouse_type set operate_type_name=#{operateTypeName},create_time=now() where id=#{id}
     </update>
 
+    <select id="getBasicWarehouseUser" >
+        select user_name from erp_user_info.user u where u.address regexp #{type};
+    </select>
+
 
 
 
diff --git a/north-glass-erp/src/main/resources/mapper/mm/FinishedGoodsInventory.xml b/north-glass-erp/src/main/resources/mapper/mm/FinishedGoodsInventory.xml
index 7944b3a..469830d 100644
--- a/north-glass-erp/src/main/resources/mapper/mm/FinishedGoodsInventory.xml
+++ b/north-glass-erp/src/main/resources/mapper/mm/FinishedGoodsInventory.xml
@@ -18,10 +18,16 @@
         <result column="remark" property="remark"/>
         <result column="update_time" property="updateTime"/>
         <result column="end_time" property="endTime"/>
+        <result column="box_no" property="boxNo"/>
+        <result column="weight" property="weight"/>
 
         <result column="order_id" property="order.orderId"/>
         <result column="project" property="order.project"/>
         <result column="order_type" property="order.orderType"/>
+        <result column="customer_id" property="order.customerId"/>
+        <result column="customer_name" property="order.customerName"/>
+        <result column="batch" property="order.batch"/>
+        <result column="salesman" property="order.salesman"/>
 
 
         <result column="order_number" property="orderDetail.orderNumber"/>
@@ -29,6 +35,7 @@
         <result column="height" property="orderDetail.height"/>
         <result column="product_name" property="orderDetail.productName"/>
         <result column="product_id" property="orderDetail.productId"/>
+        <result column="building_number" property="orderDetail.buildingNumber"/>
 
     </resultMap>
     <!--鏄犲皠鎴愬搧鍏ュ簱-->
@@ -46,6 +53,7 @@
         <result column="area" property="order.area"/>
         <result column="batch" property="order.batch"/>
         <result column="order_quantity" property="order.quantity"/>
+        <result column="calculate_type" property="order.calculateType"/>
 
         <result column="building_number" property="orderDetail.buildingNumber"/>
         <result column="width" property="orderDetail.width"/>
@@ -53,6 +61,12 @@
         <result column="product_name" property="orderDetail.productName"/>
         <result column="product_id" property="orderDetail.productId"/>
         <result column="quantity" property="orderDetail.quantity"/>
+
+        <result column="price" property="orderDetail.price"/>
+        <result column="areas" property="orderDetail.area"/>
+        <result column="gross_area" property="orderDetail.grossArea"/>
+        <result column="compute_area" property="orderDetail.computeArea"/>
+        <result column="compute_gross_area" property="orderDetail.computeGrossArea"/>
     </resultMap>
 
     <!--鏄犲皠鎴愬搧鍑哄簱-->
@@ -503,6 +517,9 @@
         <if test="remark != null and remark != ''">
             , remark= #{remark}
         </if>
+        <if test="container != null and container != ''">
+            , box_no= #{container}
+        </if>
         where order_number=#{flowCard.orderNumber}  and order_id=#{flowCard.order.orderId}
     </update>
 
@@ -525,6 +542,7 @@
                                                  storage_region,
                                                  `status`,
                                                  enter_storage_time,
+                                                 box_no,
                                                  update_time,
                                                  end_time,
                                                  remark
@@ -533,7 +551,7 @@
                    #{flowCard.order.orderId} ,#{flowCard.orderNumber},#{flowCard.processId},#{flowCard.inventoryQuantity},ROUND(#{flowCard.orderDetail.width}*#{flowCard.orderDetail.height}/1000000,2),
                    ROUND(#{flowCard.orderDetail.width}*#{flowCard.orderDetail.height}*#{flowCard.inventoryQuantity}/1000000,2),
                 #{flowCard.inventoryQuantity},null,#{storageRegion},
-                0,now(),now(),null,#{remark}
+                0,now(),#{container},now(),null,#{remark}
                )
     </insert>
 
@@ -565,6 +583,38 @@
 
     </select>
 
+    <select id="getSelectWarehousingByProcessId" resultMap="selectFlowCard">
+        select
+        fc.id,
+        o.order_id,
+        od.building_number,
+        od.product_id,
+        od.product_name,
+        od.width,
+        od.height,
+        o.creator,
+        o.project,
+        fc.order_number,
+        od.quantity,
+        fc.inventory_quantity-fc.received_quantity as inventory_quantity,
+        o.area,
+        fc.process_id,
+        fc.received_quantity,
+        o.batch,
+        o.calculate_type,
+        od.compute_area,
+        od.price,
+        od.area as areas,
+        od.gross_area,
+        od.compute_gross_area
+        from (select *,min(inventory_quantity) as min_inventory_quantity from pp.flow_card  group by  order_id,order_number,process_id) as fc
+        left join sd.order_detail od on fc.order_id=od.order_id and fc.order_number=od.order_number inner join sd.`order` o on
+        o.order_id=fc.order_id
+        where fc.received_quantity <![CDATA[<]]> fc.min_inventory_quantity and o.create_order>0 and
+            fc.order_id=#{order_id} and fc.order_number=#{order_number} and fc.process_id=#{process_id};
+
+    </select>
+
 
     <select id="getSelectWarehousing" resultMap="selectFlowCard">
         select
@@ -583,7 +633,13 @@
         o.area,
         fc.process_id,
         fc.received_quantity,
-        o.batch
+        o.batch,
+        o.calculate_type,
+        od.compute_area,
+        od.price,
+        od.area as areas,
+        od.gross_area,
+        od.compute_gross_area
         from (select *,min(inventory_quantity) as min_inventory_quantity from pp.flow_card  group by  order_id,order_number,process_id) as fc
         left join sd.order_detail od on fc.order_id=od.order_id and fc.order_number=od.order_number inner join sd.`order` o on
         o.order_id=fc.order_id
@@ -703,10 +759,15 @@
         o.order_id,
         o.project,
         o.order_type,
+        o.customer_id,
+        o.customer_name,
+        o.batch,
+        o.salesman,
         od.product_name,
         od.product_id,
         od.width,
         od.height,
+        od.building_number,
         fgi.inventory,
         fgi.quantity_available,
         fgi.actual_signal_area,
@@ -717,10 +778,13 @@
         fgi.update_time,
         fgi.enter_storage_time,
         fgi.end_time,
-        fgi.remark
+        fgi.remark,
+        fgi.box_no,
+        round(fgi.area*p.total_thickness*2.5/1000,5) as weight
         from finished_goods_inventory fgi
         left join sd.order_detail od on fgi.order_id = od.order_id and fgi.order_number = od.order_number
         left join sd.`order` o on fgi.order_id = o.order_id
+        left join sd.product p on p.id=od.product_id
         <where>
                 and fgi.status = 0 and fgi.quantity_available>0 and o.create_order>0
             <if test="finishedGoodsInventory.orderDetail.width != null and finishedGoodsInventory.orderDetail.width != ''">
@@ -735,6 +799,9 @@
             <if test="finishedGoodsInventory.orderDetail.productId != null and finishedGoodsInventory.orderDetail.productId != ''">
                 and od.product_id regexp #{finishedGoodsInventory.orderDetail.productId}
             </if>
+            <if test="finishedGoodsInventory.orderDetail.buildingNumber != null and finishedGoodsInventory.orderDetail.buildingNumber != ''">
+                and od.building_number regexp #{finishedGoodsInventory.orderDetail.buildingNumber}
+            </if>
             <if test="finishedGoodsInventory.order.orderId != null and finishedGoodsInventory.order.orderId != ''">
                 and o.order_id regexp #{finishedGoodsInventory.order.orderId}
             </if>
@@ -744,6 +811,20 @@
             <if test="finishedGoodsInventory.order.orderType != null and finishedGoodsInventory.order.orderType != ''">
                 and o.order_type regexp #{finishedGoodsInventory.order.orderType}
             </if>
+
+            <if test="finishedGoodsInventory.order.customerId != null and finishedGoodsInventory.order.customerId != ''">
+                and o.customer_id regexp #{finishedGoodsInventory.order.customerId}
+            </if>
+            <if test="finishedGoodsInventory.order.customerName != null and finishedGoodsInventory.order.customerName != ''">
+                and o.customer_name regexp #{finishedGoodsInventory.order.customerName}
+            </if>
+            <if test="finishedGoodsInventory.order.batch != null and finishedGoodsInventory.order.batch != ''">
+                and o.batch regexp #{finishedGoodsInventory.order.batch}
+            </if>
+            <if test="finishedGoodsInventory.order.salesman != null and finishedGoodsInventory.order.salesman != ''">
+                and o.salesman regexp #{finishedGoodsInventory.order.salesman}
+            </if>
+
             <if test="finishedGoodsInventory.orderDetail.height != null and finishedGoodsInventory.orderDetail.height != ''">
                 and od.height regexp REGEXP_REPLACE(#{finishedGoodsInventory.orderDetail.height},'\\.0+$','')
             </if>
@@ -779,6 +860,9 @@
             </if>
             <if test="finishedGoodsInventory.remark != null and finishedGoodsInventory.remark != ''">
                 and fgi.remark regexp #{finishedGoodsInventory.remark}
+            </if>
+            <if test="finishedGoodsInventory.boxNo != null and finishedGoodsInventory.boxNo != ''">
+                and fgi.box_no regexp #{finishedGoodsInventory.boxNo}
             </if>
 
         </where>
@@ -809,6 +893,9 @@
             <if test="finishedGoodsInventory.orderDetail.productId != null and finishedGoodsInventory.orderDetail.productId != ''">
                 and od.product_id regexp #{finishedGoodsInventory.orderDetail.productId}
             </if>
+            <if test="finishedGoodsInventory.orderDetail.buildingNumber != null and finishedGoodsInventory.orderDetail.buildingNumber != ''">
+                and od.building_number regexp #{finishedGoodsInventory.orderDetail.buildingNumber}
+            </if>
             <if test="finishedGoodsInventory.order.orderId != null and finishedGoodsInventory.order.orderId != ''">
                 and o.order_id regexp #{finishedGoodsInventory.order.orderId}
             </if>
@@ -818,6 +905,20 @@
             <if test="finishedGoodsInventory.order.orderType != null and finishedGoodsInventory.order.orderType != ''">
                 and o.order_type regexp #{finishedGoodsInventory.order.orderType}
             </if>
+
+            <if test="finishedGoodsInventory.order.customerId != null and finishedGoodsInventory.order.customerId != ''">
+                and o.customer_id regexp #{finishedGoodsInventory.order.customerId}
+            </if>
+            <if test="finishedGoodsInventory.order.customerName != null and finishedGoodsInventory.order.customerName != ''">
+                and o.customer_name regexp #{finishedGoodsInventory.order.customerName}
+            </if>
+            <if test="finishedGoodsInventory.order.batch != null and finishedGoodsInventory.order.batch != ''">
+                and o.batch regexp #{finishedGoodsInventory.order.batch}
+            </if>
+            <if test="finishedGoodsInventory.order.salesman != null and finishedGoodsInventory.order.salesman != ''">
+                and o.salesman regexp #{finishedGoodsInventory.order.salesman}
+            </if>
+
             <if test="finishedGoodsInventory.orderDetail.height != null and finishedGoodsInventory.orderDetail.height != ''">
                 and od.height regexp REGEXP_REPLACE(#{finishedGoodsInventory.orderDetail.height},'\\.0+$','')
             </if>
@@ -854,6 +955,9 @@
             <if test="finishedGoodsInventory.remark != null and finishedGoodsInventory.remark != ''">
                 and fgi.remark regexp #{finishedGoodsInventory.remark}
             </if>
+            <if test="finishedGoodsInventory.boxNo != null and finishedGoodsInventory.boxNo != ''">
+                and fgi.box_no regexp #{finishedGoodsInventory.boxNo}
+            </if>
 
         </where>
 
diff --git a/north-glass-erp/src/main/resources/mapper/mm/FinishedOperateLog.xml b/north-glass-erp/src/main/resources/mapper/mm/FinishedOperateLog.xml
index 598871b..3b36b31 100644
--- a/north-glass-erp/src/main/resources/mapper/mm/FinishedOperateLog.xml
+++ b/north-glass-erp/src/main/resources/mapper/mm/FinishedOperateLog.xml
@@ -21,15 +21,20 @@
         <result column="remarks" property="remarks"/>
         <result column="is_state" property="isState"/>
         <result column="process_id" property="processId"/>
+        <result column="money" property="money"/>
+        <result column="area" property="area"/>
 
         <result column="width" property="orderDetail.width"/>
         <result column="height" property="orderDetail.height"/>
         <result column="product_id" property="orderDetail.productId"/>
         <result column="product_name" property="orderDetail.productName"/>
+        <result column="price" property="orderDetail.price"/>
 
         <result column="project" property="order.project"/>
         <result column="customer_name" property="order.customerName"/>
         <result column="delivery_address" property="order.deliveryAddress"/>
+        <result column="project" property="order.project"/>
+        <result column="customer_name" property="order.customerName"/>
 
     </resultMap>
 
@@ -52,7 +57,12 @@
         fol.reviewed,
         fol.reviewed_time,
         fol.type,
-        fol.remarks
+        fol.remarks,
+        fol.area,
+        fol.money,
+        o.customer_name,
+        o.project,
+        od.price
         from (select *
         from mm.finished_operate_log aa where aa.operate_type = #{type}  and aa.status!='宸蹭綔搴�') fol
         left join sd.order_detail od on fol.order_id = od.order_id and fol.operation_number = od.order_number
@@ -83,6 +93,9 @@
             <if test="finishedOperateLog.orderDetail.productName != null and finishedOperateLog.orderDetail.productName != ''">
                 and  od.product_name regexp #{finishedOperateLog.orderDetail.productName}
             </if>
+            <if test="finishedOperateLog.orderDetail.price != null and finishedOperateLog.orderDetail.price != ''">
+                and  od.price regexp #{finishedOperateLog.orderDetail.price}
+            </if>
             <if test="finishedOperateLog.orderDetail.width != null and finishedOperateLog.orderDetail.width != ''">
                 and  od.width regexp  REGEXP_REPLACE(#{finishedOperateLog.orderDetail.width},'\\.0+$','')
             </if>
@@ -105,7 +118,19 @@
                 and fol.type regexp #{finishedOperateLog.type}
             </if>
             <if test="finishedOperateLog.remarks != null and finishedOperateLog.remarks != ''">
-                and fol.remarks regexp #{finishedOperateLog.remarksr}
+                and fol.remarks regexp #{finishedOperateLog.remarks}
+            </if>
+            <if test="finishedOperateLog.area != null and finishedOperateLog.area != ''">
+                and fol.area regexp #{finishedOperateLog.area}
+            </if>
+            <if test="finishedOperateLog.money != null and finishedOperateLog.money != ''">
+                and fol.money regexp #{finishedOperateLog.money}
+            </if>
+            <if test="finishedOperateLog.order !=null and (finishedOperateLog.order.customerName != null and finishedOperateLog.order.customerName != '')">
+                and o.customer_name regexp #{finishedOperateLog.order.customerName}
+            </if>
+            <if test="finishedOperateLog.order !=null and (finishedOperateLog.order.project != null and finishedOperateLog.order.project != '')">
+                and o.project regexp #{finishedOperateLog.order.project}
             </if>
         </where>
         order by fol.operate_time desc
@@ -118,6 +143,7 @@
         from (select *
         from mm.finished_operate_log aa where aa.operate_type = #{type}  and aa.status!='宸蹭綔搴�') fol
         left join sd.order_detail od on fol.order_id = od.order_id and fol.operation_number = od.order_number
+        left join sd.`order` o on o.order_id=fol.order_id
         <where>
             date(fol.operate_time)>=#{startDate} and date(fol.operate_time) &lt;= #{endDate}
             <if test="finishedOperateLog.operationOrderNumber != null and finishedOperateLog.operationOrderNumber != ''">
@@ -141,6 +167,9 @@
             <if test="finishedOperateLog.orderDetail.productName != null and finishedOperateLog.orderDetail.productName != ''">
                 and  od.product_name regexp #{finishedOperateLog.orderDetail.productName}
             </if>
+            <if test="finishedOperateLog.orderDetail.price != null and finishedOperateLog.orderDetail.price != ''">
+                and  od.price regexp #{finishedOperateLog.orderDetail.price}
+            </if>
             <if test="finishedOperateLog.orderDetail.width != null and finishedOperateLog.orderDetail.width != ''">
                 and  od.width regexp  REGEXP_REPLACE(#{finishedOperateLog.orderDetail.width},'\\.0+$','')
             </if>
@@ -163,7 +192,19 @@
                 and fol.type regexp #{finishedOperateLog.type}
             </if>
             <if test="finishedOperateLog.remarks != null and finishedOperateLog.remarks != ''">
-                and fol.remarks regexp #{finishedOperateLog.remarksr}
+                and fol.remarks regexp #{finishedOperateLog.remarks}
+            </if>
+            <if test="finishedOperateLog.area != null and finishedOperateLog.area != ''">
+                and fol.area regexp #{finishedOperateLog.area}
+            </if>
+            <if test="finishedOperateLog.money != null and finishedOperateLog.money != ''">
+                and fol.money regexp #{finishedOperateLog.money}
+            </if>
+            <if test="finishedOperateLog.order !=null and (finishedOperateLog.order.customerName != null and finishedOperateLog.order.customerName != '')">
+                and o.customer_name regexp #{finishedOperateLog.order.customerName}
+            </if>
+            <if test="finishedOperateLog.order !=null and (finishedOperateLog.order.project != null and finishedOperateLog.order.project != '')">
+                and o.project regexp #{finishedOperateLog.order.project}
             </if>
         </where>
         order by fol.`status` desc
@@ -574,10 +615,13 @@
                                             quantity,
                                             operate_time,
                                             status,
-                                            remarks
+                                            remarks,
+                                            money,
+                                            area
         )
         values (
-                   #{oddNumber} ,#{flowCard.order.orderId},#{flowCard.processId},#{flowCard.orderNumber},"鍏ュ簱",#{userName},#{flowCard.inventoryQuantity},now(),"鏈鏍�",#{container}
+                   #{oddNumber} ,#{flowCard.order.orderId},#{flowCard.processId},#{flowCard.orderNumber},"鍏ュ簱",#{userName},
+                #{flowCard.inventoryQuantity},now(),"鏈鏍�",#{container},#{deliveryDetailMoney},#{deliveryDetailArea}
                )
     </insert>
 
@@ -757,10 +801,11 @@
                 and  o.delivery_address regexp #{finishedOperateLog.order.deliveryAddress}
             </if>
             <if test="finishedOperateLog.remarks != null and finishedOperateLog.remarks != ''">
-                and fol.remarks regexp #{finishedOperateLog.remarksr}
+                and fol.remarks regexp #{finishedOperateLog.remarks}
             </if>
         </where>
-        group by fol.remarks,od.order_id,fol.process_id
+        group by fol.remarks,od.order_id
+        -- ,fol.process_id
         order by fol.operate_time desc
         limit #{offset},#{pageSize};
     </select>
@@ -773,6 +818,7 @@
         from (select *
         from mm.finished_operate_log aa where aa.operate_type = '鍏ュ簱'  and aa.status!='宸蹭綔搴�') fol
         left join sd.order_detail od on fol.order_id = od.order_id and fol.operation_number = od.order_number
+        left join sd.`order` o on o.order_id=fol.order_id
         <where>
             date(fol.operate_time)>=#{startDate} and date(fol.operate_time) &lt;= #{endDate}
             and (fol.remarks is not null and fol.remarks !="") and (fol.process_id !="" and fol.process_id is not null)
@@ -804,7 +850,7 @@
                 and  o.delivery_address regexp #{finishedOperateLog.order.deliveryAddress}
             </if>
             <if test="finishedOperateLog.remarks != null and finishedOperateLog.remarks != ''">
-                and fol.remarks regexp #{finishedOperateLog.remarksr}
+                and fol.remarks regexp #{finishedOperateLog.remarks}
             </if>
         </where>
         group by fol.remarks,od.order_id,fol.process_id) as zu
@@ -830,6 +876,41 @@
     order by fol.operate_time desc
 </select>
 
+    <select id="getPrimaryListLimts">
+
+
+
+        select kkk.*,rw.teams_groups_name as teams_groups_name2 from(select  o.order_id,
+                                                                             o.customer_name,
+                                                                             o.project,
+                                                                             fol.remarks,
+                                                                             SUM(fol.quantity) as quantity,
+                                                                             ROUND( sum(od.width * od.height * fol.quantity) / 1000000, 2 ) as area,
+                                                                             ROUND( sum(od.width * od.height * fol.quantity*p.total_thickness*2.5) / 1000000, 2 ) as weight,
+                                                                             fol.process_id,
+                                                                             aaa.teams_groups_name,
+                                                                             aaa.previous_process,
+                                                                             date( aaa.reporting_work_time) as reporting_work_time
+                                                                     from (select *
+                                                                           from mm.finished_operate_log aa where aa.operate_type = '鍏ュ簱'  and aa.status!='宸蹭綔搴�') fol
+                                                                              left join sd.order_detail od on fol.order_id = od.order_id and fol.operation_number = od.order_number
+                                                                              left join sd.`order` o on o.order_id=fol.order_id
+                                                                              left join sd.product p on od.product_id=p.id
+                                                                              left join (select teams_groups_name,process_id,previous_process,reporting_work_time from pp.reporting_work  where this_process='鍖呰' group by process_id) aaa on  aaa.process_id=fol.process_id
+
+
+
+                                                                     where
+                                                                         o.customer_name=#{customerName}  and fol.remarks=#{remarks} and o.project=#{project}
+                                                                       and (fol.remarks is not null and fol.remarks !="") and (fol.process_id !="" and fol.process_id is not null)
+
+                                                                     group by fol.remarks,o.customer_name,o.project
+                                                                    ) as kkk
+                                                                        left join  pp.reporting_work rw on  rw.process_id=kkk.process_id and rw.this_process=kkk.previous_process
+        group by kkk.remarks,kkk.customer_name,kkk.project
+
+    </select>
+
 <select id="getDetailList">
     SELECT
         od.building_number,
@@ -849,6 +930,47 @@
 
 </select>
 
+    <select id="getDetailLists">
+        SELECT
+            ifnull(od.building_number,ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'')) as building_number,
+            od.width,
+            od.height,
+            fol.quantity,
+            od.product_name,
+            od.product_id,
+            ROUND( od.width * od.height * fol.quantity / 1000000, 2 ) as area,
+            ROUND( od.width * od.height * fol.quantity / 1000000, 2 )*#{thickness}*2.5 as weight
+        FROM
+            ( SELECT * FROM mm.finished_operate_log aa WHERE aa.operate_type = '鍏ュ簱' AND aa.STATUS != '宸蹭綔搴�' ) fol
+                LEFT JOIN sd.order_detail od ON fol.order_id = od.order_id
+                AND fol.operation_number = od.order_number
+                LEFT JOIN sd.`order` o ON o.order_id = fol.order_id
+        WHERE
+            o.order_id=#{orderId} and fol.remarks=#{remarks} and od.product_id=#{productId}
+        ORDER BY
+            fol.operate_time DESC
+
+    </select>
+
+    <select id="getDetailList2">
+        SELECT
+            od.product_id,
+            od.product_name,
+            pro.thickness
+        FROM
+            ( SELECT * FROM mm.finished_operate_log aa WHERE aa.operate_type = '鍏ュ簱' AND aa.STATUS != '宸蹭綔搴�' ) fol
+                LEFT JOIN sd.order_detail od ON fol.order_id = od.order_id
+                AND fol.operation_number = od.order_number
+                left join sd.product as pro
+                on pro.id = od.product_id
+                LEFT JOIN sd.`order` o ON o.order_id = fol.order_id
+        WHERE
+            o.order_id=#{orderId} and fol.remarks=#{remarks}
+        group by
+            od.product_id
+
+    </select>
+
     <select id="getSelectStorageRecordDeliveryId" resultMap="selectFinishedGoodsInventory">
         select fol.id,
         fol.operation_order_number,
diff --git a/north-glass-erp/src/main/resources/mapper/mm/MaterialInventory.xml b/north-glass-erp/src/main/resources/mapper/mm/MaterialInventory.xml
index 0a1965e..21934e4 100644
--- a/north-glass-erp/src/main/resources/mapper/mm/MaterialInventory.xml
+++ b/north-glass-erp/src/main/resources/mapper/mm/MaterialInventory.xml
@@ -35,6 +35,32 @@
 
     </resultMap>
 
+    <resultMap id="selectMaterialOutboundLog" type="com.example.erp.entity.mm.MaterialLog" >
+        <id column="id" property="id"/>
+        <result column="operation_order_number" property="operationOrderNumber"/>
+        <result column="operate_type" property="operateType"/>
+        <result column="operation_number" property="operationNumber"/>
+        <result column="inventory_id" property="inventoryId"/>
+        <result column="material_code" property="materialCode"/>
+        <result column="material_name" property="materialName"/>
+        <result column="producer" property="producer"/>
+        <result column="unit" property="unit"/>
+        <result column="width" property="width"/>
+        <result column="height" property="height"/>
+        <result column="thickness" property="thickness"/>
+        <result column="quantity" property="quantity"/>
+        <result column="single_piece_area" property="singlePieceArea"/>
+        <result column="inventory_area" property="inventoryArea"/>
+        <result column="operator" property="operator"/>
+        <result column="remarks" property="remarks"/>
+        <result column="operate_time" property="operateTime"/>
+        <result column="use_count" property="useCount"/>
+
+        <result column="order_id" property="materialOutbound.orderId"/>
+        <result column="project" property="materialOutbound.project"/>
+        <result column="batch" property="materialOutbound.batch"/>
+    </resultMap>
+
 
 
     <select id="getSelectMaterialInventoryDate">
@@ -247,6 +273,12 @@
             <if test="materialOutbound.reviewed != null and materialOutbound.reviewed != ''">
                 and mo.reviewed regexp #{materialOutbound.reviewed}
             </if>
+            <if test="materialOutbound.project != null and materialOutbound.project != ''">
+                and mo.project regexp #{materialOutbound.project}
+            </if>
+            <if test="materialOutbound.batch != null and materialOutbound.batch != ''">
+                and mo.batch regexp #{materialOutbound.batch}
+            </if>
         </where>
         order by mo.create_time desc
         limit #{offset},#{pageSize};
@@ -280,6 +312,12 @@
             </if>
             <if test="materialOutbound.reviewed != null and materialOutbound.reviewed != ''">
                 and mo.reviewed regexp #{materialOutbound.reviewed}
+            </if>
+            <if test="materialOutbound.project != null and materialOutbound.project != ''">
+                and mo.project regexp #{materialOutbound.project}
+            </if>
+            <if test="materialOutbound.batch != null and materialOutbound.batch != ''">
+                and mo.batch regexp #{materialOutbound.batch}
             </if>
         </where>
     </select>
@@ -612,11 +650,11 @@
 
     <insert id="insertMaterialOutbound"  useGeneratedKeys="true" >
         insert into mm.material_outbound(material_outbound_id,material_requisition_personnel,material_requisition_team,order_id,outbound_type,
-                                         warehouse_manager,material_requisition_date,reviewed_state,create_time)
+                                         warehouse_manager,material_requisition_date,reviewed_state,create_time,project,batch)
         values (
                   #{number} ,#{materialOutbound.materialRequisitionPersonnel},#{materialOutbound.materialRequisitionTeam},
                 #{materialOutbound.orderId},#{materialOutbound.outboundType},#{materialOutbound.warehouseManager},#{materialOutbound.materialRequisitionDate},
-                   0,now()
+                   0,now(),#{materialOutbound.project},#{materialOutbound.batch}
                )
     </insert>
 
@@ -627,7 +665,9 @@
             order_id=#{materialOutbound.orderId},
             outbound_type=#{materialOutbound.outboundType},
             warehouse_manager=#{materialOutbound.warehouseManager},
-            material_requisition_date=#{materialOutbound.materialRequisitionDate}
+            material_requisition_date=#{materialOutbound.materialRequisitionDate},
+            project=#{materialOutbound.project},
+            batch=#{materialOutbound.batch}
         where material_outbound_id = #{number}
     </insert>
 
@@ -960,9 +1000,9 @@
         where mi.id = #{id}
     </select>
 
-    <select id="getMaterialLogReport" >
+    <select id="getMaterialLogReport" resultMap="selectMaterialOutboundLog">
         select *
-        from mm.material_log ml
+        from mm.material_log ml left join mm.material_outbound mo on mo.material_outbound_id=ml.operation_order_number
         <where>
             date(ml.operate_time)>=#{startDate} and date(ml.operate_time) &lt;= #{endDate} and ml.operate_type=#{type}
             <if test="materialLog.operateType != null and materialLog.operateType != ''">
@@ -1012,10 +1052,19 @@
                 and  ml.operator regexp  #{materialLog.operator}
             </if>
             <if test="materialLog.remarks != null and materialLog.remarks != ''">
-                and ml.remarks regexp #{materialLog.remarksr}
+                and ml.remarks regexp #{materialLog.remarks}
             </if>
             <if test="materialLog.projectNo != null and materialLog.projectNo != ''">
                 and ml.project_no regexp #{materialLog.projectNo}
+            </if>
+            <if test="materialLog.materialOutbound!=null and (materialLog.materialOutbound.orderId != null and materialLog.materialOutbound.orderId != '')">
+                and  mo.order_id regexp  #{materialLog.materialOutbound.orderId}
+            </if>
+            <if test=" materialLog.materialOutbound!=null and materialLog.materialOutbound.project != null and materialLog.materialOutbound.project != ''">
+                and mo.project regexp #{materialLog.materialOutbound.project}
+            </if>
+            <if test=" materialLog.materialOutbound!=null and materialLog.materialOutbound.batch != null and materialLog.materialOutbound.batch != ''">
+                and mo.batch regexp #{materialLog.materialOutbound.batch}
             </if>
         </where>
         order by ml.id desc
@@ -1026,7 +1075,7 @@
     <select id="getMaterialLogReportTotal">
         select CEILING(count(ml.id)/#{pageSize}) as 'pageTotal',
         count(ml.id) as 'total'
-        from mm.material_log ml
+        from mm.material_log ml left join mm.material_outbound mo on mo.material_outbound_id=ml.operation_order_number
         <where>
             date(ml.operate_time)>=#{startDate} and date(ml.operate_time) &lt;= #{endDate} and ml.operate_type=#{type}
             <if test="materialLog.operateType != null and materialLog.operateType != ''">
@@ -1076,7 +1125,19 @@
                 and  ml.operator regexp  #{materialLog.operator}
             </if>
             <if test="materialLog.remarks != null and materialLog.remarks != ''">
-                and ml.remarks regexp #{materialLog.remarksr}
+                and ml.remarks regexp #{materialLog.remarks}
+            </if>
+            <if test="materialLog.projectNo != null and materialLog.projectNo != ''">
+                and ml.project_no regexp #{materialLog.projectNo}
+            </if>
+            <if test="materialLog.materialOutbound!=null and (materialLog.materialOutbound.orderId != null and materialLog.materialOutbound.orderId != '')">
+                and  mo.order_id regexp  #{materialLog.materialOutbound.orderId}
+            </if>
+            <if test=" materialLog.materialOutbound!=null and materialLog.materialOutbound.project != null and materialLog.materialOutbound.project != ''">
+                and mo.project regexp #{materialLog.materialOutbound.project}
+            </if>
+            <if test=" materialLog.materialOutbound!=null and materialLog.materialOutbound.batch != null and materialLog.materialOutbound.batch != ''">
+                and mo.batch regexp #{materialLog.materialOutbound.batch}
             </if>
         </where>
     </select>
@@ -1231,4 +1292,23 @@
           AND date( ml.operate_time )>= #{startDate} and date(ml.operate_time) &lt;= #{endDate}
           and ml.operate_type=#{type}
     </select>
+
+
+    <select id="getSelectMaterialInventoryMes">
+        select
+            mi.id,
+            mi.material_code AS materialCode,
+            mi.producer,
+            sum(mi.available_quantity) AS availableQuantity,
+            JSON_UNQUOTE(JSON_EXTRACT(ms.json, '$.width')) AS width,
+            JSON_UNQUOTE(JSON_EXTRACT(ms.json, '$.height')) AS height,
+            JSON_UNQUOTE(JSON_EXTRACT(ms.json, '$.thickness')) AS thickness,
+            JSON_UNQUOTE(JSON_EXTRACT(ms.json, '$.name')) AS name,
+            JSON_UNQUOTE(JSON_EXTRACT(ms.json, '$.model')) AS model,
+            JSON_UNQUOTE(JSON_EXTRACT(ms.json, '$.unit')) AS unit
+        from mm.material_inventory mi left join mm.material_store ms on mi.material_code=ms.id
+        where mi.available_quantity>0
+        group by mi.material_code
+        order by mi.id desc
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml b/north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml
index 5002799..4ebb66f 100644
--- a/north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml
+++ b/north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml
@@ -619,7 +619,7 @@
                                    left join sd.basic_data as bd on bd.nickname='stepC'
                                    where ogds.order_id = #{orderId}
                                      and LOCATE(bd.basic_name, ogds.process) > 0
-                                   GROUP BY order_id, order_number, ogds.group) as ogdss
+                                   GROUP BY order_id, order_number, ogds.group,bd.basic_name) as ogdss
                                   on fc.order_id = ogdss.order_id and ogdss.order_number = fc.order_number
                where fc.order_id = #{orderId}
                GROUP BY fc.process_id, ogdss.technology_number
@@ -662,7 +662,7 @@
                                                                                   ogds.technology_number
                                             left join sd.basic_data as bd on bd.nickname='stepD'
                                    where ogds.order_id = #{orderId}
-                                   GROUP BY order_id, order_number) as ogdss
+                                   GROUP BY order_id, order_number,bd.basic_name) as ogdss
                                   on fc.order_id = ogdss.order_id and ogdss.order_number = fc.order_number
                where fc.order_id = #{orderId}
                GROUP BY fc.process_id
@@ -670,7 +670,7 @@
         where process is not null
           and process != ""
         GROUP BY order_id, process_id, technology_number, process
-        order by order_id, process_id, length(technology_number)) as result
+        order by order_id, process_id, length(technology_number),technology_number) as result
         LEFT JOIN (SELECT * from flow_card GROUP BY process_id,technology_number) as fcc
         on result.process_id = fcc.process_id and result.technology_number = fcc.technology_number
     </select>
@@ -678,6 +678,7 @@
     <select id="getPrimaryList">
         select o.customer_name,
                o.project,
+               if(o.batch!="",CONCAT(o.project,'(',o.batch,')'),o.project) as projectBatch,
                #{process}                                         process,
                od.edging_type,
                #{glassChild}                                   as glass_child,
@@ -718,6 +719,7 @@
     <select id="getPrimaryLists">
         select o.customer_name,
                o.project,
+               if(o.batch!="",CONCAT(o.project,'(',o.batch,')'),o.project) as projectBatch,
                #{process}                                         process,
                od.edging_type,
                #{glassChild}                                   as glass_child,
@@ -760,7 +762,7 @@
                fc.quantity,
                round(ogd.total_area, 2)                                       as total_area,
                od.perimeter,
-               if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,if(od.shape=2,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')),'')) as bend_radius,
+        if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04'))) as bend_radius,
                concat(IFNULL(od.processing_note, ''), IFNULL(od.remarks, '')) as remarks,
                od.other_columns,
                round(ogd.child_width)                                         as width,
@@ -783,7 +785,32 @@
         where fc.process_id = #{processId}
           and position(fc.technology_number in #{technologyNumber})
         group by fc.process_id, fc.order_number
-        order by IF(fcs.sort != NULL or fcs.sort != '', fcs.sort, fc.order_number)
+        <choose>
+            <!-- 褰� landingSequence != 1 涓� flashback != 1 鏃讹紝鎸� landing_sequence 鍊掑簭 -->
+            <when test="landingSequence != 1 and flashback != 1">
+                ORDER BY landing_sequence,fc.id desc
+            </when>
+            <!-- landingSequence != 1 鏃讹紝浼樺厛鎸� landing_sequence 鍊掑簭 -->
+            <when test="landingSequence != 1">
+                ORDER BY landing_sequence DESC
+            </when>
+            <!-- flashback = 1 鏃舵搴� -->
+            <when test="flashback == 1">
+                ORDER BY
+                CASE
+                WHEN fcs.sort IS NOT NULL AND fcs.sort &lt;&gt;  '' THEN fcs.sort
+                ELSE fc.order_number
+                END ASC
+            </when>
+            <!-- flashback != 1 鏃跺�掑簭 -->
+            <otherwise>
+                ORDER BY
+                CASE
+                WHEN fcs.sort IS NOT NULL AND fcs.sort &lt;&gt;  '' THEN fcs.sort
+                ELSE fc.order_number
+                END DESC
+            </otherwise>
+        </choose>
     </select>
 
     <select id="getDetailLists">
@@ -792,7 +819,7 @@
                fc.quantity,
                round(ogd.total_area, 2)                                       as total_area,
                od.perimeter,
-               if(od.shape=2,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')),od.bend_radius) as bend_radius,
+               if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04'))) as bend_radius,
                concat(IFNULL(od.processing_note, ''), IFNULL(od.remarks, '')) as remarks,
                od.other_columns,
                round(ogd.child_width)                                         as width,
@@ -996,13 +1023,13 @@
                ogd.glass_address,
                ogd.child_width,
                ogd.child_height,
-               fc.quantity,
+               sum(fc.quantity) as quantity,
                ROUND(ogd.child_width * ogd.child_height * fc.quantity / 1000000, 2) as area,
                ifnull(fcs.sort, '')                                                 as sort,
                ogd.glass_child,
                #{process}                                                           as process,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01'))                AS glassNumber,
-               if(od.shape=2,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')),od.bend_radius) as bend_radius
+               if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04'))) as bend_radius
         FROM flow_card AS fc
                  LEFT JOIN sd.order_glass_detail AS ogd ON fc.order_id = ogd.order_id
             AND fc.order_number = ogd.order_number
@@ -1088,7 +1115,24 @@
                od.processing_note                                    as processingNote,
                width,
                height,
-               fc.quantity,
+               #{printQuantity}  as quantity,
+               CONCAT(
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height AS CHAR))),
+                       ' = ',#{printQuantity} )      as size,
+
+               CONCAT(
+                   od.order_number,')      ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height AS CHAR))),
+                       ' = ',#{printQuantity} )      as numberSize,
+            CONCAT(
+            od.order_number,')','   ',
+            TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width AS CHAR))),
+            ' X ',
+            TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height AS CHAR))))      as numberSizeQuantity,
                od.order_number                                       as orderNumber,
                fc.technology_number                                  as technologyNumber,
                od.building_number                                    as buildingNumber,
@@ -1098,6 +1142,7 @@
                c.customer_abbreviation                               as customerAbbreviation,
                p.product_abbreviation                                as productAbbreviation,
                fc.process_id                                         as processId,
+               SUBSTRING(fc.process_id,12  )                                        as processIdAD ,/*-娴佺▼鍗$畝鍐�-*/
                o.create_time                                         as createTime,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS glassNumber,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS figureNumber,
@@ -1112,7 +1157,12 @@
                od.other_columns,
                ogd.glass_child                                       as glassChild,
                ogd.glass_address                                     as glassAddress,
-               JSON_UNQUOTE(JSON_EXTRACT(pd.separation, '$.color'))  AS color
+               JSON_UNQUOTE(JSON_EXTRACT(pd.separation, '$.color'))  AS color,
+                '鏂囨湰' as custom1,
+                '鏂囨湰' as custom2,
+                '鏂囨湰' as custom3,
+                '鏂囨湰' as custom4,
+                '鏂囨湰' as custom5
         from sd.order as o
                  left join sd.order_detail as od on o.order_id = od.order_id
                  left join flow_card as fc on o.order_id = fc.order_id and
@@ -1160,6 +1210,7 @@
                c.customer_abbreviation                               as customerAbbreviation,
                p.product_abbreviation                                as productAbbreviation,
                fc.process_id                                         as processId,
+               SUBSTRING(fc.process_id,12  )                                        as processIdAD ,/*-娴佺▼鍗$畝鍐�-*/
                o.create_time                                         as createTime,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS glassNumber,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS figureNumber,
@@ -1197,6 +1248,7 @@
                fc.process_id,
                o.customer_name,
                o.project,
+               o.batch,
                fc.order_number,
                ogd.technology_number,
                ogd.glass_address,
@@ -1260,6 +1312,7 @@
                c.customer_abbreviation                               as customerAbbreviation,
                p.product_abbreviation                                as productAbbreviation,
                fc.process_id                                         as processId,
+               SUBSTRING(fc.process_id,12  )                                        as processIdAD ,/*-娴佺▼鍗$畝鍐�-*/
                o.create_time                                         as createTime,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS glassNumber,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS figureNumber,
@@ -1275,14 +1328,23 @@
                        TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width AS CHAR))),
                        ' X ',
                        TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height AS CHAR))),
-                       ' = ',pl.patch_num   )      as size,
-
+                       ' = ',pl.patch_num )      as size,
                CONCAT(
-                       od.order_number,')  ',
-                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width AS CHAR))),
+                       od.order_number,')      ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width   AS CHAR))),
                        ' X ',
-                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height AS CHAR))),
-                       ' = ',pl.patch_num   )      as numberSize
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height    AS CHAR))),
+                       ' = ',pl.patch_num )      as numberSize,
+               CONCAT(
+                       od.order_number,')','   ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width   AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height    AS CHAR))))      as numberSizeQuantity,
+               '鏂囨湰' as custom1,
+               '鏂囨湰' as custom2,
+               '鏂囨湰' as custom3,
+               '鏂囨湰' as custom4,
+               '鏂囨湰' as custom5
         from sd.order as o
                  left join sd.order_detail as od on o.order_id = od.order_id
                  left join flow_card as fc on o.order_id = fc.order_id and
@@ -1349,6 +1411,7 @@
     <select id="getPrimaryListMerge">
         select o.customer_name,
                o.project,
+               if(o.batch!="",CONCAT(o.project,'(',o.batch,')'),o.project) as projectBatch,
                ogd.process,
                od.edging_type,
                ogdc.concatenated_glass_child                   as glass_child,
@@ -1422,7 +1485,8 @@
                                            pl.order_sort = fc.order_number and
                                            pl.technology_number = fc.technology_number
         where  date(pl.create_time)>=#{selectTime1} and date(pl.create_time) &lt;= #{selectTime2}
-        GROUP BY fc.process_id,fc.order_number, ogd.technology_number, pl.reporting_work_id
+        GROUP BY fc.process_id,fc.order_number, ogd.technology_number, pl.reporting_work_id,pl.rework_type,
+            pl.rework_reason
         order by pl.id desc, fc.process_id, ogd.technology_number
     </select>
 
@@ -1432,7 +1496,7 @@
                fc.quantity,
                round(ogd.total_area, 2)                                       as total_area,
                od.perimeter,
-               if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,if(od.shape=2,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')),'')) as bend_radius,
+        if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04'))) as bend_radius,
                concat(IFNULL(od.processing_note, ''), IFNULL(od.remarks, '')) as remarks,
                od.other_columns,
                round(ogd.child_width)                                         as width,
@@ -1455,7 +1519,31 @@
         where fc.process_id = #{processId}
           and position(fc.technology_number in #{technologyNumber})
         group by fc.process_id, fc.order_number, fc.technology_number
-        order by IF(fcs.sort != NULL or fcs.sort != '', fcs.sort, fc.order_number)
+        <choose>
+            <when test="landingSequence != 1 and flashback != 1">
+                ORDER BY landing_sequence,fc.id desc
+            </when>
+            <!-- landingSequence != 1 鏃讹紝浼樺厛鎸� landing_sequence 鍊掑簭 -->
+            <when test="landingSequence != 1">
+                ORDER BY landing_sequence DESC
+            </when>
+            <!-- flashback = 1 鏃舵搴� -->
+            <when test="flashback == 1">
+                ORDER BY
+                CASE
+                WHEN fcs.sort IS NOT NULL AND fcs.sort &lt;&gt;  '' THEN fcs.sort
+                ELSE fc.order_number
+                END ASC
+            </when>
+            <!-- flashback != 1 鏃跺�掑簭 -->
+            <otherwise>
+                ORDER BY
+                CASE
+                WHEN fcs.sort IS NOT NULL AND fcs.sort &lt;&gt;  '' THEN fcs.sort
+                ELSE fc.order_number
+                END DESC
+            </otherwise>
+        </choose>
     </select>
 
     <select id="getDetailListMerge">
@@ -1464,7 +1552,7 @@
                sum(fc.quantity) as quantity,
                round(ogd.total_area, 2)                                       as total_area,
                od.perimeter,
-               if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,if(od.shape=2,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')),'')) as bend_radius,
+        if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04'))) as bend_radius,
                concat(IFNULL(od.processing_note, ''), IFNULL(od.remarks, '')) as remarks,
                od.other_columns,
                round(ogd.child_width)                                         as width,
@@ -1487,7 +1575,31 @@
                                and fcs.process = #{process}
         where fc.process_id = #{processId} and fc.`merge`=1
         group by fc.process_id, fc.order_number
-        order by IF(fcs.sort != NULL or fcs.sort != '', fcs.sort, fc.order_number)
+        <choose>
+            <when test="landingSequence != 1 and flashback != 1">
+                ORDER BY landing_sequence,fc.id desc
+            </when>
+            <!-- landingSequence != 1 鏃讹紝浼樺厛鎸� landing_sequence 鍊掑簭 -->
+            <when test="landingSequence != 1">
+                ORDER BY landing_sequence DESC
+            </when>
+            <!-- flashback = 1 鏃舵搴� -->
+            <when test="flashback == 1">
+                ORDER BY
+                CASE
+                WHEN fcs.sort IS NOT NULL AND fcs.sort &lt;&gt;  '' THEN fcs.sort
+                ELSE fc.order_number
+                END ASC
+            </when>
+            <!-- flashback != 1 鏃跺�掑簭 -->
+            <otherwise>
+                ORDER BY
+                CASE
+                WHEN fcs.sort IS NOT NULL AND fcs.sort &lt;&gt;  '' THEN fcs.sort
+                ELSE fc.order_number
+                END DESC
+            </otherwise>
+        </choose>
     </select>
 
     <select id="getDetailListLikes">
@@ -1496,7 +1608,7 @@
                count(*) as quantity,
                round(ogd.child_width*ogd.child_height*count(*)/1000000, 2)                                       as total_area,
                round((ogd.child_width+ogd.child_height)*2*count(*)/1000, 2)    as perimeter,
-               if(od.shape=2,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')),od.bend_radius) as bend_radius,
+               if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04'))) as bend_radius,
                concat(IFNULL(od.processing_note, ''), IFNULL(od.remarks, '')) as remarks,
                od.other_columns,
                round(ogd.child_width)                                         as width,
@@ -1571,7 +1683,7 @@
                sum(pl.patch_num)                                                 as quantity,
                round(ogd.total_area, 2)                                       as total_area,
                od.perimeter,
-               if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,if(od.shape=2,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')),'')) as bend_radius,
+               if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04'))) as bend_radius,
                concat(IFNULL(od.processing_note, ''), IFNULL(od.remarks, '')) as remarks,
                od.other_columns,
                round(ogd.child_width)                                         as width,
@@ -1604,6 +1716,7 @@
     <select id="getPrimaryListRefund">
         select o.customer_name,
                o.project,
+               if(o.batch!="",CONCAT(o.project,'(',o.batch,')'),o.project) as projectBatch,
                ogd.process,
                od.edging_type,
                ogd.glass_child,
@@ -1689,6 +1802,7 @@
     <select id="getPrimaryListRework">
         select o.customer_name,
                o.project,
+               if(o.batch!="",CONCAT(o.project,'(',o.batch,')'),o.project) as projectBatch,
                ogd.process,
                od.edging_type,
                ogd.glass_child,
@@ -1745,7 +1859,7 @@
                (pl.rework_num)                                              as quantity,
                round(ogd.total_area, 2)                                     as total_area,
                od.perimeter,
-               if(od.shape=2,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')),od.bend_radius) as bend_radius,
+               if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04'))) as bend_radius,
                concat(od.processing_note, od.remarks)                       as remarks,
                od.other_columns,
                round(ogd.child_width)                                       as width,
@@ -1865,10 +1979,10 @@
                contacts,
                delivery_address                                      as deliveryAddress,
                od.processing_note                                    as processingNote,
-               round(ogd.child_width)                                as width,
-               round(ogd.child_height)                               as height,
+              ogd.child_width                                as width,
+               ogd.child_height                              as height,
                fc.quantity,
-               CONCAT(round(ogd.child_width)  , ' X ', round(ogd.child_height)   ,' = ',fc.quantity )           as size,
+               CONCAT(ogd.child_width  , ' X ', ogd.child_height   ,' = ',fc.quantity )           as size,
                od.order_number                                       as orderNumber,
                fc.technology_number                                  as technologyNumber,
                od.building_number                                    as buildingNumber,
@@ -1878,6 +1992,7 @@
                c.customer_abbreviation                               as customerAbbreviation,
                p.product_abbreviation                                as productAbbreviation,
                CONCAT(fc.process_id, '/', fc.technology_number)      as processId,
+               SUBSTRING(fc.process_id,12  )                                        as processIdAD ,/*-娴佺▼鍗$畝鍐�-*/
                o.create_time                                         as createTime,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS glassNumber,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS figureNumber,
@@ -1891,7 +2006,28 @@
                od.bend_radius                                        as bendRadius,
                ogd.glass_child                                       as glassChild,
                ogd.glass_address                                     as glassAddress,
-               JSON_UNQUOTE(JSON_EXTRACT(pd.separation, '$.color'))  AS color
+               JSON_UNQUOTE(JSON_EXTRACT(pd.separation, '$.color'))  AS color,
+               CONCAT(
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_width AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_height AS CHAR))),
+                       ' = ',fc.quantity )      as size,
+               CONCAT(
+                       od.order_number,')      ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_width   AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_height    AS CHAR))),
+                       ' = ',fc.quantity )      as numberSize,
+               CONCAT(
+                       od.order_number,')','   ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_width   AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_height    AS CHAR))))      as numberSizeQuantity,
+        '鏂囨湰' as custom1,
+               '鏂囨湰' as custom2,
+               '鏂囨湰' as custom3,
+               '鏂囨湰' as custom4,
+               '鏂囨湰' as custom5
         from sd.order as o
                  left join sd.order_detail as od on o.order_id = od.order_id
                  left join flow_card as fc on o.order_id = fc.order_id and
@@ -1907,6 +2043,7 @@
                               fcs.technology_number = fc.technology_number
                                and fcs.process = #{process}
         where fc.process_id = #{processId}
+          and fc.order_number = #{orderNumber}
           and position(fc.technology_number in #{technologyNumber})
         group by fc.process_id,od.order_number, ogd.technology_number, ogd.child_width, ogd.child_height
         order by IF(fcs.sort != NULL or fcs.sort != '', fcs.sort, fc.order_number)
@@ -2076,8 +2213,8 @@
                contacts,
                o.delivery_address                                    as deliveryAddress,
                od.processing_note                                    as processingNote,
-               round(ogd.child_width)                                as width,
-               round(ogd.child_height)                               as height,
+               ogd.child_width                                as width,
+               ogd.child_height                              as height,
                pl.patch_num                                          as quantity,
                pl.order_sort                                         as orderNumber,
                pl.technology_number                                  as technologyNumber,
@@ -2088,6 +2225,7 @@
                c.customer_abbreviation                               as customerAbbreviation,
                p.product_abbreviation                                as productAbbreviation,
                CONCAT(fc.process_id, '/', fc.technology_number)      as processId,
+               SUBSTRING(fc.process_id,12  )                                        as processIdAD ,/*-娴佺▼鍗$畝鍐�-*/
                o.create_time                                         as createTime,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS glassNumber,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS figureNumber,
@@ -2106,14 +2244,23 @@
                        TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_width AS CHAR))),
                        ' X ',
                        TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_height AS CHAR))),
-                       ' = ',pl.patch_num   )      as size,
-
+                       ' = ',pl.patch_num )      as size,
                CONCAT(
-                       od.order_number,')  ',
-                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_width AS CHAR))),
+                       od.order_number,')      ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_width   AS CHAR))),
                        ' X ',
-                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_height AS CHAR))),
-                       ' = ',pl.patch_num   )      as numberSize
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_height    AS CHAR))),
+                       ' = ',pl.patch_num )      as numberSize,
+               CONCAT(
+                       od.order_number,')','   ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_width   AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_height    AS CHAR))))      as numberSizeQuantity,
+               '鏂囨湰' as custom1,
+               '鏂囨湰' as custom2,
+               '鏂囨湰' as custom3,
+               '鏂囨湰' as custom4,
+               '鏂囨湰' as custom5
         from sd.order as o
                  left join sd.order_detail as od on o.order_id = od.order_id
                  left join flow_card as fc on o.order_id = fc.order_id and
@@ -2279,6 +2426,7 @@
 
     <select id="getPrimaryListLimt">
         select o.customer_name,
+               if(o.batch!="",CONCAT(o.project,'(',o.batch,')'),o.project) as projectBatch,
                o.project,
                #{process}                                         process,
                od.edging_type,
@@ -2371,7 +2519,13 @@
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01'))                  AS glassNumber,
                od.order_number,
                ogd.child_width as width,
-               ogd.child_height as height
+               ogd.child_height as height,
+                ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') AS glassNumber,
+                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS S01,
+                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS S02,
+                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S03')) AS S03,
+                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')) AS S04,
+                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S05')) AS S05
         from flow_card as fc
                  left join sd.order_glass_detail as ogd
                            on ogd.order_id = fc.order_id and ogd.order_number = fc.order_number and
@@ -2411,11 +2565,16 @@
                    ' = ',#{printQuantity} )      as size,
 
                CONCAT(
-                   od.order_number,')  ',
+                   od.order_number,')      ',
                        TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width AS CHAR))),
                        ' X ',
                        TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height AS CHAR))),
                        ' = ',#{printQuantity} )      as numberSize,
+               CONCAT(
+                       od.order_number,')','   ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height AS CHAR))))      as numberSizeQuantity,
                od.order_number                                       as orderNumber,
                fc.technology_number                                  as technologyNumber,
                od.building_number                                    as buildingNumber,
@@ -2425,6 +2584,7 @@
                c.customer_abbreviation                               as customerAbbreviation,
                p.product_abbreviation                                as productAbbreviation,
                fc.process_id                                         as processId,
+               SUBSTRING(fc.process_id,12  )                                        as processIdAD ,/*-娴佺▼鍗$畝鍐�-*/
                o.create_time                                         as createTime,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS glassNumber,
                JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS figureNumber,
@@ -2494,6 +2654,7 @@
             c.customer_abbreviation                               as customerAbbreviation,
             p.product_abbreviation                                as productAbbreviation,
             fc.process_id                                 as processId,
+            SUBSTRING(fc.process_id,12  )                                        as processIdAD ,/*-娴佺▼鍗$畝鍐�-*/
             o.create_time                                         as createTime,
             JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS glassNumber,
             JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS figureNumber,
@@ -2654,6 +2815,7 @@
             c.customer_abbreviation                               as customerAbbreviation,
             p.product_abbreviation                                as productAbbreviation,
             fc.process_id                                 as processId,
+            SUBSTRING(fc.process_id,12  )                                        as processIdAD ,/*-娴佺▼鍗$畝鍐�-*/
             o.create_time                                         as createTime,
             JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS glassNumber,
             JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS figureNumber,
@@ -2716,6 +2878,7 @@
             c.customer_abbreviation                               as customerAbbreviation,
             p.product_abbreviation                                as productAbbreviation,
             fc.process_id                                 as processId,
+            SUBSTRING(fc.process_id,12  )                                        as processIdAD ,/*-娴佺▼鍗$畝鍐�-*/
             o.create_time                                         as createTime,
             JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS glassNumber,
             JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS figureNumber,
@@ -3007,11 +3170,16 @@
                        ' = ',#{printQuantity} )      as size,
 
                CONCAT(
-                   od.order_number,')  ',
-                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width AS CHAR))),
+                       od.order_number,')      ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width   AS CHAR))),
                        ' X ',
-                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height AS CHAR))),
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height    AS CHAR))),
                        ' = ',#{printQuantity} )      as numberSize,
+               CONCAT(
+                       od.order_number,')','   ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width   AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height    AS CHAR))))      as numberSizeQuantity,
             od.order_number                                       as orderNumber,
             ogd.technology_number                                  as technologyNumber,
             od.building_number                                    as buildingNumber,
@@ -3021,6 +3189,7 @@
             c.customer_abbreviation                               as customerAbbreviation,
             p.product_abbreviation                                as productAbbreviation,
             ''                                         as processId,
+            SUBSTRING(fc.process_id,12  )                                        as processIdAD ,/*-娴佺▼鍗$畝鍐�-*/
             o.create_time                                         as createTime,
             JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS glassNumber,
             JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS figureNumber,
@@ -3084,4 +3253,295 @@
     <select id="getProcessNameList">
         SELECT id,basic_name,IFNULL(nickname,"") as nickname FROM sd.`basic_data` where basic_category='process'
     </select>
+
+    <select id="exportDateProcessMp">
+        select
+        a.order_Id,
+        a.process_Id,
+        c.product_id,
+        c.product_name,
+        b.project,
+        sum(a.quantity) as quantity,
+        sum(a.quantity) * c.area as compute_gross_area,
+        a.founder,
+        c.processing_note,
+        b.customer_name,
+        layout_status as layout_status,
+        a.merge,
+        a.rack,
+        b.batch
+        from (select id,order_id,process_id,order_number, quantity,founder,max(layout_status) as layout_status,create_time,max(merge) as merge,rack from flow_card
+        group by process_Id,order_number) as a
+        left join sd.`order` as b on a.order_Id=b.order_id
+        left join sd.order_detail as c on a.order_Id=c.order_id and a.order_Number=c.order_number
+        where date(a.create_time) >= #{date[0]}
+          and date(a.create_time) &lt;= #{date[1]}
+        and b.create_order>0
+        group by a.process_Id
+        ORDER BY a.id desc
+    </select>
+
+    <select id="getSumQuantity">
+        select quantity from  sd.`order` where order_id=#{orderId}
+    </select>
+
+    <select id="getDetailCompoundList">
+        select fc.order_number,
+        concat(IF(ROUND(ogd.child_width, 1) = FLOOR(ogd.child_width), FLOOR(ogd.child_width), ROUND(ogd.child_width, 1)), "*", IF(ROUND(child_height, 1) = FLOOR(child_height), FLOOR(child_height), ROUND(child_height, 1)))   as child_width,
+        SUM(fc.quantity) as quantity,
+        round(SUM(ogd.total_area), 2)                                       as total_area,
+        SUM(od.perimeter) as perimeter,
+        if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04'))) as bend_radius,
+        concat(IFNULL(od.processing_note, ''), IFNULL(od.remarks, '')) as remarks,
+        od.other_columns,
+        round(ogd.child_width)                                         as width,
+        round(ogd.child_height)                                        as height,
+        pd.separation,
+        #{compound} as technology_number,
+        IFNULL(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')),'') as mapNumber,
+        od.building_number
+        from flow_card as fc
+        left join sd.order_glass_detail as ogd
+        on fc.order_id = ogd.order_id and fc.order_number = ogd.order_number and
+        fc.technology_number = ogd.technology_number
+        left join sd.order_detail as od on od.order_id = fc.order_id and od.order_number = fc.order_number
+        left join sd.product_detail as pd
+        on pd.prod_id = od.product_id and pd.glass_sort = ogd.technology_number
+        left join flow_card_sort as fcs
+        on fcs.process_id = fc.process_id and fcs.order_number = fc.order_number and
+        fcs.technology_number = fc.technology_number
+        and fcs.process = #{process}
+        where fc.process_id = #{processId}
+        and position(fc.technology_number in #{compound})
+        group by fc.process_id, fc.order_number
+        <choose>
+            <when test="landingSequence != 1 and flashback != 1">
+                ORDER BY landing_sequence,fc.id desc
+            </when>
+            <!-- landingSequence != 1 鏃讹紝浼樺厛鎸� landing_sequence 鍊掑簭 -->
+            <when test="landingSequence != 1">
+                ORDER BY landing_sequence DESC
+            </when>
+            <!-- flashback = 1 鏃舵搴� -->
+            <when test="flashback == 1">
+                ORDER BY
+                CASE
+                WHEN fcs.sort IS NOT NULL AND fcs.sort &lt;&gt;  '' THEN fcs.sort
+                ELSE fc.order_number
+                END ASC
+            </when>
+            <!-- flashback != 1 鏃跺�掑簭 -->
+            <otherwise>
+                ORDER BY
+                CASE
+                WHEN fcs.sort IS NOT NULL AND fcs.sort &lt;&gt;  '' THEN fcs.sort
+                ELSE fc.order_number
+                END DESC
+            </otherwise>
+        </choose>
+    </select>
+
+    <select id="getDetailListLikeCompound">
+        select fc.order_number,
+        concat(IF(ROUND(ogd.child_width, 1) = FLOOR(ogd.child_width), FLOOR(ogd.child_width), ROUND(ogd.child_width, 1)), "*", IF(ROUND(child_height, 1) = FLOOR(child_height), FLOOR(child_height), ROUND(child_height, 1)))   as child_width,
+        sum(fc.quantity) as quantity,
+        round(sum(ogd.total_area), 2)                                       as total_area,
+        sum(od.perimeter) as perimeter,
+        if(od.bend_radius!=null || od.bend_radius!='',od.bend_radius,if(od.shape=2,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')),'')) as bend_radius,
+        concat(IFNULL(od.processing_note, ''), IFNULL(od.remarks, '')) as remarks,
+        od.other_columns,
+        round(ogd.child_width)                                         as width,
+        round(ogd.child_height)                                        as height,
+        pd.separation,
+        #{compound} as technology_number,
+        IFNULL(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')),'') as mapNumber,
+        od.building_number
+        from flow_card as fc
+        left join sd.order_glass_detail as ogd
+        on fc.order_id = ogd.order_id and fc.order_number = ogd.order_number and
+        fc.technology_number = ogd.technology_number
+        left join sd.order_detail as od on od.order_id = fc.order_id and od.order_number = fc.order_number
+        left join sd.product_detail as pd
+        on pd.prod_id = od.product_id and pd.glass_sort = ogd.technology_number
+        left join flow_card_sort as fcs
+        on fcs.process_id = fc.process_id and fcs.order_number = fc.order_number and
+        fcs.technology_number = fc.technology_number
+        and fcs.process = #{process}
+        where fc.process_id = #{processId}
+        and position(fc.technology_number in #{compound})
+        group by fc.process_id, fc.order_number
+        <choose>
+            <when test="landingSequence != 1 and flashback != 1">
+                ORDER BY landing_sequence,fc.id desc
+            </when>
+            <!-- landingSequence != 1 鏃讹紝浼樺厛鎸� landing_sequence 鍊掑簭 -->
+            <when test="landingSequence != 1">
+                ORDER BY landing_sequence DESC
+            </when>
+            <!-- flashback = 1 鏃舵搴� -->
+            <when test="flashback == 1">
+                ORDER BY
+                CASE
+                WHEN fcs.sort IS NOT NULL AND fcs.sort &lt;&gt;  '' THEN fcs.sort
+                ELSE fc.order_number
+                END ASC
+            </when>
+            <!-- flashback != 1 鏃跺�掑簭 -->
+            <otherwise>
+                ORDER BY
+                CASE
+                WHEN fcs.sort IS NOT NULL AND fcs.sort &lt;&gt;  '' THEN fcs.sort
+                ELSE fc.order_number
+                END DESC
+            </otherwise>
+        </choose>
+    </select>
+
+    <select id="getPrintCustomDataSemiTj">
+        select o.order_id                                            as orderId,
+               project,
+               customer_id                                           as customerId,
+               o.customer_name                                       as customerName,
+               order_type                                            as orderType,
+               order_classify                                        as orderClassify,
+               batch,
+               o.icon,
+               pack_type                                             as packType,
+               delivery_date                                         as deliveryDate,
+               al_type                                               as alType,
+               money,
+               contract_id                                           as contractId,
+               customer_batch                                           customerBatch,
+               contacts,
+               delivery_address                                      as deliveryAddress,
+               od.processing_note                                    as processingNote,
+               ogd.child_width                                as width,
+               ogd.child_height                              as height,
+               fc.quantity,
+               CONCAT(ogd.child_width  , ' X ', ogd.child_height   ,' = ',fc.quantity )           as size,
+               od.order_number                                       as orderNumber,
+               fc.technology_number                                  as technologyNumber,
+               od.building_number                                    as buildingNumber,
+               od.product_name                                       as productName,
+               od.edging_type                                        as edgingType,
+               od.remarks,
+               c.customer_abbreviation                               as customerAbbreviation,
+               p.product_abbreviation                                as productAbbreviation,
+               CONCAT(fc.process_id, '/', fc.technology_number)      as processId,
+               SUBSTRING(fc.process_id,12  )                                        as processIdAD ,/*-娴佺▼鍗$畝鍐�-*/
+               o.create_time                                         as createTime,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS glassNumber,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS figureNumber,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S03')) AS colourCeramicGlaze,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')) AS remarks1,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S05')) AS remarks2,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S06')) AS remarks3,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S07')) AS remarks4,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S08')) AS remarks5,
+               p.remarks                                             as filmNumber,
+               od.bend_radius                                        as bendRadius,
+               ogd.glass_child                                       as glassChild,
+               ogd.glass_address                                     as glassAddress,
+               JSON_UNQUOTE(JSON_EXTRACT(pd.separation, '$.color'))  AS color,
+               CONCAT(
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(width AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height AS CHAR))),
+                       ' = ',fc.quantity )      as size,
+               CONCAT(
+                       od.order_number,')      ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_width   AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_height    AS CHAR))),
+                       ' = ',fc.quantity )      as numberSize,
+               CONCAT(
+                       od.order_number,')','   ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_width   AS CHAR))),
+                       ' X ',
+                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_height    AS CHAR))))      as numberSizeQuantity,
+                       '鏂囨湰' as custom1,
+                       '鏂囨湰' as custom2,
+                       '鏂囨湰' as custom3,
+                       '鏂囨湰' as custom4,
+                       '鏂囨湰' as custom5
+        from sd.order as o
+            left join sd.order_detail as od on o.order_id = od.order_id
+            left join flow_card as fc on o.order_id = fc.order_id and
+            od.order_number = fc.order_number
+            left join sd.product as p on p.id = od.product_id
+            left join sd.customer as c on c.id = o.customer_id
+            left join sd.product_detail as pd on pd.prod_id = p.id and pd.sort_num = od.order_number
+            left join sd.order_glass_detail ogd
+            on ogd.order_id = o.order_id and ogd.order_number = od.order_number and
+            ogd.technology_number = fc.technology_number
+            left join flow_card_sort as fcs
+            on fcs.process_id = fc.process_id and fcs.order_number = fc.order_number and
+            fcs.technology_number = fc.technology_number
+            and fcs.process = #{process}
+        where fc.process_id = #{processId}
+          and position(fc.technology_number in #{technologyNumber})
+        group by fc.process_id,od.order_number, ogd.technology_number, ogd.child_width, ogd.child_height
+        order by IF(fcs.sort != NULL or fcs.sort != '', fcs.sort, fc.order_number)
+    </select>
+
+    <select id="getLayoutStatus">
+        select max(layout_status) from flow_card where process_id= #{processId}
+    </select>
+
+    <select id="selectSortingCardMp">
+        select od.order_number,
+               od.order_number       AS 'orderNumber',
+                od.width,
+               od.height,
+               od.shape,
+               od.quantity,
+               od.compute_gross_area,
+               p.total_thickness,
+               ROUND(od.quantity-IFNULL(sum(fc.quantity)/fc.layers_number,0))           as baiscQuantity,
+               od.compute_gross_area as 'computeGrossArea',
+                p.total_thickness     AS 'totalThickness',
+                ifnull(p.thickness,'') as thickness,
+               od.weight,
+               od.remarks,
+               od.processing_note,
+               ifnull(od.bend_radius,'') as bend_radius,
+               ods.S01,
+               ods.S02,
+               ods.S03,
+               ods.S04,
+               ods.S05,
+               od.building_number
+        from sd.order_detail as od
+                 left join sd.order_glass_detail as ogd
+                           on od.order_id = ogd.order_id and od.order_number = ogd.order_number
+                 left join sd.product as p on od.product_id = p.id
+                 left join (SELECT order_id,
+                                   order_number,
+                                   JSON_UNQUOTE(JSON_EXTRACT(other_columns, '$.S01')) AS S01,
+                                   JSON_UNQUOTE(JSON_EXTRACT(other_columns, '$.S02')) AS S02,
+                                   JSON_UNQUOTE(JSON_EXTRACT(other_columns, '$.S03')) AS S03,
+                                   JSON_UNQUOTE(JSON_EXTRACT(other_columns, '$.S04')) AS S04,
+                                   JSON_UNQUOTE(JSON_EXTRACT(other_columns, '$.S05')) AS S05
+                            FROM sd.order_detail
+                            WHERE order_id = #{orderId}) as ods
+                           on ods.order_id = od.order_id and ods.order_number = od.order_number
+                 left join flow_card as fc on fc.order_id = od.order_id and fc.order_number = od.order_number
+            and fc.technology_number=ogd.technology_number
+        where od.order_id = #{orderId}
+          and ogd.production_id = #{productionId}
+          and ogd.splitting_status = 0
+        GROUP BY od.order_number
+        <if test="optionVal == 0 and flashback == 1">
+            ORDER BY od.width ASC, od.height ASC
+        </if>
+        <if test="optionVal == 0 and flashback == 0">
+            ORDER BY od.width DESC, od.height DESC
+        </if>
+        <if test="optionVal == 1 and flashback == 1">
+            ORDER BY od.height ASC, od.width ASC
+        </if>
+        <if test="optionVal == 1 and flashback == 0">
+            ORDER BY od.height DESC, od.width DESC
+        </if>
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml b/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
index aefcab9..70f2b4a 100644
--- a/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
+++ b/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
@@ -545,7 +545,7 @@
                鏁伴噺 as quantity,
                褰㈢姸 as shape,
                椤圭洰 as project,
-               鍗曠墖鍚嶇О as glass_child,
+               浜у搧鍚嶇О as glass_child,
                闈㈢Н as area,
                GlassType as glassType,
                patch_state
@@ -561,7 +561,7 @@
                鏁伴噺 as quantity,
                褰㈢姸 as shape,
                椤圭洰 as project,
-               鍗曠墖鍚嶇О as glass_child,
+               浜у搧鍚嶇О as glass_child,
                闈㈢Н as area,
                GlassType as glassType,
                patch_state
@@ -577,7 +577,7 @@
                鏁伴噺 as quantity,
                褰㈢姸 as shape,
                椤圭洰 as project,
-               鍗曠墖鍚嶇О as glass_child,
+               浜у搧鍚嶇О as glass_child,
                闈㈢Н as area,
                GlassType as glassType,
                patch_state
@@ -727,7 +727,8 @@
             p.remark,
             a.name,
             p.create_time,
-            p.update_time
+            p.update_time,
+            p.optimize_state
         FROM
             (
                 pp.optimize_project p
@@ -1360,7 +1361,7 @@
                鏁伴噺 as quantity,
                褰㈢姸 as shape,
                椤圭洰 as project,
-               鍗曠墖鍚嶇О as glass_child,
+               浜у搧鍚嶇О as glass_child,
                闈㈢Н as area,
                GlassType as glassType,
                patch_state
@@ -1468,6 +1469,37 @@
             fc.layer,
             fc.order_number
     </select>
+    <select id="getProjectByProjectNoSv" resultType="java.util.Map">
+        SELECT
+            p.id,
+            p.project_no as projectNumber,
+            p.project_name,
+            p.glass_type,
+            p.glass_thickness,
+            p.type,
+            p.state,
+            p.glass_total as quantity,
+            p.glass_total_area,
+            p.process_qty,
+            p.process_cards,
+            p.remark,
+            a.name,
+            p.create_time,
+            p.update_time,
+            p.optimize_state
+        FROM
+            (
+                pp.optimize_project p
+                    LEFT JOIN pp.optimize_admin a ON ((
+                    p.creater = a.Id
+                    )))
+        WHERE
+            ( p.state = 1 ) and p.tempering_state=0 and optimize_state=0 and p.project_no = #{projectNo}
+        ORDER BY
+            p.create_time DESC,
+            p.project_no
+
+    </select>
 
     <delete id="deleteOptimizeDetailThirdParty">
         delete from pp.other_flow_card
diff --git a/north-glass-erp/src/main/resources/mapper/pp/Report.xml b/north-glass-erp/src/main/resources/mapper/pp/Report.xml
index ebcc5bf..18bccd0 100644
--- a/north-glass-erp/src/main/resources/mapper/pp/Report.xml
+++ b/north-glass-erp/src/main/resources/mapper/pp/Report.xml
@@ -92,6 +92,7 @@
         <result column="area" property="area"/>
         <result column="breakage_quantity" property="breakageQuantity"/>
         <result column="project" property="project"/>
+        <result column="batch" property="batch"/>
         <result column="process_id" property="processId"/>
         <result column="order_number" property="orderNumber"/>
         <result column="technology_number" property="technologyNumber"/>
@@ -127,6 +128,7 @@
         <result column="examine_time" property="examineTime"/>
         <result column="workProcessName" property="workProcessName"/>
         <result column="device_name" property="deviceName"/>
+        <result column="order_type" property="orderType"/>
     </resultMap>
 
     <resultMap id="scheduleProductionScheduleMap" type="com.example.erp.dto.pp.ScheduleProductionScheduleDTO">
@@ -167,19 +169,36 @@
                b.glass_child,
                d.order_type,
                concat(c.process_id, '/', c.technology_number) as process_id,
+               c.order_id,
                c.order_number,
                c.technology_number,
-               c.quantity,
+               b.child_width,
+               b.child_height,
+              if(c.technology_number=1,c.quantity,0) as quantity,
+#                c.quantity,
+               c.quantity as thisQuantity,/*鐢ㄤ簬鍒ゆ柇鏄惁鏀瑰彉棰滆壊*/
                e.reportWorkQuantity,
+               e.reportWorkQuantityShow,
                e.reportWorkQuantityCount,
                e.reportWorkTime,
                e.broken_num,
-               c.quantity*a.area as gross_area,
-               ifnull(f.inventory, 0)                         as inventory,
-               round(ifnull(f.inventory, 0) * a.area, 2)      as inventoryArea,
-               ifnull(dd.quantity, 0)                         as shippedQuantity,
-               ifnull(JSON_UNQUOTE(JSON_EXTRACT(a.other_columns, '$.S01')),'') AS glassNumber
-        from flow_card as c
+               c.quantity as glassQuantity,
+
+#                c.quantity*a.area as gross_area,
+#                ifnull(f.inventory, 0) as inventory,
+#                round(ifnull(f.inventory, 0) * a.area, 2) as inventoryArea,
+#                ifnull(dd.quantity, 0) as shippedQuantity,
+
+               if(c.technology_number=1,c.quantity*a.area,0) as gross_area,
+               if(c.technology_number=1,ifnull(f.inventory, 0) ,0)                        as inventory,
+               if(c.technology_number=1,round(ifnull(f.inventory, 0) * a.area, 2),0)      as inventoryArea,
+               if(c.technology_number=1,ifnull(dd.quantity, 0) ,0)                          as shippedQuantity,
+
+
+               ifnull(JSON_UNQUOTE(JSON_EXTRACT(a.other_columns, '$.S01')),'') AS glassNumber,
+               b.`group`
+
+        from pp.flow_card as c
                  left join
              sd.order_detail as a
              on c.order_id = a.order_id
@@ -198,9 +217,13 @@
                                    technology_number,
                                    sum(a.broken_num) as broken_num,
                                    concat('{',
-                                          GROUP_CONCAT(concat("\"", process, "\":\"", reporting_work_num, "\"")),
+                                          GROUP_CONCAT(concat("\"", process, "\":\"", if(technology_number!=1 and (bd.nickname='stepD' || bd.nickname='stepB' ) ,0,reporting_work_num), "\"")),
                                           '}'
                                        )             as reportWorkQuantity,
+                                   concat('{',
+                                          GROUP_CONCAT(concat("\"", process, "\":\"", if(technology_number!=1 and (bd.nickname='stepD' || bd.nickname='stepB' ) ,0,reporting_work_num), "\"")),
+                                          '}'
+                                       )             as reportWorkQuantityShow,
                                    concat('{',
                                           GROUP_CONCAT(concat("\"", process, "\":\"", reporting_work_num_count, "\"")),
                                           '}'
@@ -210,8 +233,13 @@
                                           '}'
                                        )             as reportWorkTime
                             FROM sd.order_process_detail as a
+                            left join (SELECT DISTINCT basic_name,nickname from sd.basic_data as bd where  bd.basic_category = 'process') as bd
+                            on a.process = bd.basic_name
                             where a.order_id = #{orderId}
-                            GROUP BY process_id, a.order_number, a.technology_number) as e
+                            GROUP BY process_id, a.order_number, a.technology_number
+
+
+                            ) as e
                            on e.process_id = c.process_id
                                and e.technology_number = c.technology_number
                                and e.order_number = c.order_number
@@ -564,6 +592,7 @@
         SELECT
         o.order_id,
         o.project,
+        o.batch,
         rw.process_id,
         dd.order_number,
         dd.technology_number,
@@ -592,7 +621,7 @@
         rw.reporting_work_time >= #{selectTime1}
         AND rw.reporting_work_time &lt;  #{selectTime2}
 
-        AND dd.available = 0
+        AND dd.available = 0 and rw.reviewed_state>=0
         <if test="damageReportDTO.orderId != null and damageReportDTO.orderId != ''">
             and o.order_id regexp #{damageReportDTO.orderId}
         </if>
@@ -696,16 +725,20 @@
                fc.quantity,
                round(ogd.child_width * ogd.child_height * fc.quantity / 1000000, 2) as area,
                if(od.shape='' || ISNULL(od.shape),'鏅舰',if(od.shape = 1, '鏅舰', if(od.shape = 2, '寮傚舰', ''))) as shape,
-               od.remarks
-        FROM sd.ORDER AS o
-                 LEFT JOIN sd.order_detail AS od ON od.order_id = od.order_id
-                 LEFT JOIN sd.order_glass_detail AS ogd ON o.order_id = ogd.order_id
-            AND ogd.order_number = od.order_number
-                 LEFT JOIN flow_card AS fc ON fc.order_id = ogd.order_id
-            AND fc.order_number = od.order_number
-            AND fc.technology_number = ogd.technology_number
+               od.remarks,
+               ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') AS glassNumber,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS S01,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')) AS S02,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S03')) AS S03,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')) AS S04,
+               JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S05')) AS S05
+        FROM
+            flow_card as fc left join sd.order_glass_detail as ogd on ogd.order_id=fc.order_id and ogd.order_number=ogd.order_number and ogd.technology_number=fc.technology_number
+                            left join sd.order_detail as od on od.order_id=fc.order_id and od.order_number=fc.order_number
+                            left join sd.`order` as o on o.order_id=fc.order_id
         WHERE fc.order_id = #{orderId}
         GROUP BY fc.id
+        order by fc.order_number,fc.technology_number
     </select>
 
     <select id="qualityReportMp">
@@ -871,12 +904,14 @@
                                      left join sd.`order` as o on o.order_id = a.order_id
                             where    o.create_time >= #{selectTime1}
                               AND o.create_time &lt;  #{selectTime2}
+                              and position(#{orderId} in o.order_id)
                             GROUP BY process_id, a.technology_number) as e
                            on e.process_id = c.process_id
                                and e.technology_number = c.technology_number
                  left join sd.delivery_detail as dd on dd.order_id = a.order_id and dd.order_number = a.order_number
         where   d.create_time >= #{selectTime1}
           AND d.create_time &lt;  #{selectTime2}
+          and position(#{orderId} in a.order_id)
           and d.create_order>0
           and reportWorkQuantity is not null
         GROUP BY a.order_id
@@ -989,6 +1024,7 @@
     <select id="exportDamageReportMp">
         SELECT o.order_id,
                o.project,
+               o.batch,
                rw.process_id,
                dd.order_number,
                dd.technology_number,
@@ -1001,7 +1037,9 @@
                dd.breakage_quantity,
                round(ogd.child_width * ogd.child_height * dd.breakage_quantity / 1000000, 2) as area,
                IFNULL(dd.responsible_personnel, '')                                          as personnel,
-               ogd.glass_child
+               ogd.glass_child,
+               ogd.child_width,
+               ogd.child_height
         FROM sd.ORDER AS o
                  LEFT JOIN sd.order_glass_detail AS ogd ON ogd.order_id = o.order_id
                  LEFT JOIN reporting_work AS rw ON rw.order_id = o.order_id
@@ -1010,7 +1048,7 @@
             AND dd.technology_number = ogd.technology_number
         WHERE rw.reporting_work_time >= #{dates[0]}
           and rw.reporting_work_time &lt;= #{dates[1]}
-          AND dd.available = 0
+          AND dd.available = 0 and rw.reviewed_state>=0
         GROUP BY dd.id
     </select>
 
@@ -1111,7 +1149,7 @@
     </select>
 
     <select id="exportWorkInProgressMp">
-        select #{process}                                             as thisProcess,
+        select if(#{process}='',odpd.process,#{process}) as thisProcess,
                fc.process_id,
                o.customer_name,
                o.project,
@@ -1131,8 +1169,7 @@
                       odpd.broken_num) / 1000000, 2) as stockArea,
                od.product_name,
                od.bend_radius,
-               ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') AS glassNumber,
-               rws.teams_groups_name
+               ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') AS glassNumber
 
         from sd.order_detail AS od
                  LEFT JOIN sd.order_glass_detail AS ogd
@@ -1160,7 +1197,7 @@
                        LEFT JOIN
                    reporting_work as rwk
                    on rw.reporting_work_id = rwk.reporting_work_id
-              where rwk.this_process = #{process}
+              where position(#{process} in rwk.this_process)
                 and rw.review_status >= 0
               GROUP BY rw.process_id, rw.order_sort, rw.technology_number) as c
              on c.process_id = fc.process_id
@@ -1168,22 +1205,14 @@
                  and c.technology_number = fc.technology_number
                  left join sd.`order` as o
                            on o.order_id = od.order_id
-                 left join
-             (
-                 select a.process_id,a.teams_groups_name,a.next_process,b.technology_number,b.order_number
-                 from reporting_work  as a
-                          left join reporting_work_detail as b on a.reporting_work_id=b.reporting_work_id
-                 GROUP BY a.process_id,a.teams_groups_name,a.next_process,b.order_number,b.technology_number
-             ) as rws on rws.process_id=fc.process_id and rws.order_number=fc.order_number
-                 and  rws.technology_number=fc.technology_number and rws.next_process=#{process}
         where  o.create_order>0
           and odpds.reporting_work_num_count + ifnull(c.patchNumSum, 0) - odpd.reporting_work_num_count -
-              odpd.broken_num != 0
-          and odpd.process = #{process}
+              odpd.broken_num != 0 and odpd.process!=SUBSTRING_INDEX(ogd.process, '->', 1)
+          and position(#{process} in odpd.process)
           and position(ifnull(#{inputVal}, '') in od.order_id)
           and position(ifnull(#{project}, '') in o.project)
 
-        group by fc.process_id, fc.order_number, fc.technology_number
+        group by fc.process_id, fc.order_number, fc.technology_number,odpd.process
         order by fc.process_id, fc.order_number, fc.technology_number
     </select>
 
@@ -1349,11 +1378,13 @@
         rw.reviewed,
         rw.examine_time,
         rw.device_name,
+        o.order_type,
 --         GROUP_CONCAT(ogd.glass_child SEPARATOR '+') as workProcessName
         CASE
         WHEN LOCATE('step',#{laminating})>0 THEN GROUP_CONCAT(ogd.glass_child SEPARATOR '+')
         ELSE MAX( ogd.glass_child )
-        END AS workProcessName
+        END AS workProcessName,
+            o.batch
         FROM
         reporting_work as rw left join reporting_work_detail as rwd on rwd.reporting_work_id=rw.reporting_work_id
         left join flow_card as fc on fc.order_id=rw.order_id and fc.process_id=rw.process_id  and fc.order_number=rwd.order_number and fc.technology_number=rwd.technology_number
@@ -1433,19 +1464,21 @@
         rw.reviewed,
         rw.examine_time,
         rw.device_name,
+        --         GROUP_CONCAT(ogd.glass_child SEPARATOR '+') as workProcessName
         CASE
         WHEN LOCATE('step',#{laminating})>0 THEN GROUP_CONCAT(ogd.glass_child SEPARATOR '+')
         ELSE MAX( ogd.glass_child )
-        END AS workProcessName
+        END AS workProcessName,
+        o.batch
         FROM
         reporting_work as rw left join reporting_work_detail as rwd on rwd.reporting_work_id=rw.reporting_work_id
         left join flow_card as fc on fc.order_id=rw.order_id and fc.process_id=rw.process_id  and fc.order_number=rwd.order_number and fc.technology_number=rwd.technology_number
         left join sd.order_glass_detail as ogd on ogd.order_id=fc.order_id and ogd.order_number=fc.order_number and ogd.technology_number=fc.technology_number
         left join sd.order_detail as od  on od.order_id=ogd.order_id and od.order_number=ogd.order_number
         left join sd.`order` as o on o.order_id=od.order_id
-        where o.create_order>0 and rw.reviewed_state>=0 and rwd.completed_quantity>0
-        and date(rw.reporting_work_time) >= #{date[0]}
-        and date(rw.reporting_work_time) &lt;= #{date[1]}
+        where o.create_order>0 and rw.reviewed_state>=0 and rwd.completed_quantity>0 and
+        rw.reporting_work_time >= #{date[0]}
+        AND rw.reporting_work_time &lt;  #{date[1]}
         and position(#{process} in rw.this_process)
         <choose>
             <when test="laminating == ''">
@@ -1931,67 +1964,77 @@
     </select>
 
     <select id="workInProgressOrderFootSum">
-        SELECT
-        SUM(od.quantity) AS quantity,
-        SUM(odpds.reporting_work_num_count + IFNULL(c.patchNumSum, 0) - odpd.reporting_work_num_count - odpd.broken_num) AS stockNum,
-        SUM(ROUND(ogd.child_width * ogd.child_height *
-        (odpds.reporting_work_num_count + IFNULL(c.patchNumSum, 0) - odpd.reporting_work_num_count - odpd.broken_num) / 1000000, 2)) AS stockArea,
-        CEILING(count(fc.id)/#{pageSize}) as 'pageTotal',
-        count(distinct fc.id) as 'total'
-        FROM sd.order_detail AS od
+        SELECT SUM(aa.quantity) AS quantity,
+        sum(aa.stockNum) AS stockNum,
+        SUM(aa.stockArea) AS stockArea,
+        count(* ) AS 'total',
+        CEILING( count(* )/#{pageSize} ) AS 'pageTotal'
+        from
+        (
+        SELECT (od.quantity) AS quantity,
+        d.numCounts + d.patchNumSum - d.numCount -d.broken_num as stockNum,
+        ROUND(ogd.child_width * ogd.child_height *
+        (d.numCounts + d.patchNumSum - d.numCount -
+        d.broken_num) / 1000000, 2) as stockArea
+        FROM
+        sd.order_detail AS od
         LEFT JOIN sd.order_glass_detail AS ogd
         ON od.order_id = ogd.order_id
         AND od.order_number = ogd.order_number
-        LEFT JOIN flow_card AS fc
+        LEFT JOIN pp.flow_card AS fc
         ON fc.order_id = ogd.order_id
-        AND fc.production_id = ogd.production_id
+        and fc.production_id = ogd.production_id
         AND fc.order_number = ogd.order_number
         AND fc.technology_number = ogd.technology_number
-        LEFT JOIN sd.order_process_detail AS odpd
-        ON odpd.order_id = fc.order_id
-        AND odpd.order_number = fc.order_number
-        AND odpd.technology_number = fc.technology_number
-        AND odpd.process_id = fc.process_id
-        LEFT JOIN sd.order_process_detail AS odpds
-        ON odpds.id = odpd.id - 1
+        left join (
+        SELECT
+        odpd.process,
+        odpd.process_id,
+        odpd.order_number,
+        odpd.technology_number,
+        odpds.reporting_work_num_count as numCounts,
+        ifnull( c.patchNumSum, 0 ) as patchNumSum,
+        odpd.reporting_work_num_count as numCount,
+        odpd.broken_num
+        FROM
+        sd.order_process_detail AS odpd
+        LEFT JOIN sd.order_process_detail AS odpds ON odpds.id = odpd.id - 1
         LEFT JOIN (
         SELECT
-        SUM(rw.rework_num) AS patchNumSum,
+        sum( rw.rework_num ) AS 'patchNumSum',
         rw.process_id,
         rw.order_sort,
         rw.technology_number,
         rwk.this_process
-        FROM rework AS rw
-        LEFT JOIN reporting_work AS rwk
-        ON rw.reporting_work_id = rwk.reporting_work_id
-        WHERE rwk.this_process = #{selectProcesses}
+        FROM
+        pp.rework AS rw
+        LEFT JOIN pp.reporting_work AS rwk ON rw.reporting_work_id = rwk.reporting_work_id
+        WHERE
+        position( #{selectProcesses} IN rwk.this_process )
         AND rw.review_status >= 0
-        GROUP BY rw.process_id, rw.order_sort, rw.technology_number
-        ) AS c
-        ON c.process_id = fc.process_id
-        AND c.order_sort = fc.order_number
-        AND c.technology_number = fc.technology_number
-        LEFT JOIN sd.`order` AS o
-        ON o.order_id = od.order_id
-        LEFT JOIN (
-        SELECT
-        a.process_id,
-        a.teams_groups_name,
-        a.next_process,
-        b.technology_number,
-        b.order_number
-        FROM reporting_work AS a
-        LEFT JOIN reporting_work_detail AS b
-        ON a.reporting_work_id = b.reporting_work_id
-        GROUP BY a.process_id, a.teams_groups_name, a.next_process, b.order_number, b.technology_number
-        ) AS rws
-        ON rws.process_id = fc.process_id
-        AND rws.order_number = fc.order_number
-        AND rws.technology_number = fc.technology_number
-        AND rws.next_process = #{selectProcesses}
-        WHERE o.create_order > 0
-        AND odpds.reporting_work_num_count + IFNULL(c.patchNumSum, 0) - odpd.reporting_work_num_count - odpd.broken_num != 0
-        and odpd.process = #{selectProcesses}
+        GROUP BY
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number
+        ) AS c ON c.process_id = odpd.process_id
+        AND c.order_sort = odpd.order_number
+        AND c.technology_number = odpd.technology_number
+        WHERE
+        position(#{selectProcesses} IN odpd.process )  and odpds.reporting_work_num_count is not null
+        GROUP BY
+        odpd.process_id,
+        odpd.order_number,
+        odpd.technology_number,
+        odpd.process
+
+        ) as d
+        on d.process_id=fc.process_id and d.order_number=fc.order_number and d.technology_number=fc.technology_number
+        and position(#{selectProcesses} in d.process)
+        left join sd.`order` as o on o.order_id=od.order_id
+        where  o.create_order>0
+        and d.numCounts +d.patchNumSum - d.numCount - d.broken_num != 0
+        and d.process!=SUBSTRING_INDEX(ogd.process, '->', 1)
+        and position(#{selectProcesses} in d.process)
         and position(#{orderId} in od.order_id)
         and position(#{inputProject} in o.project)
         <if test="workInProgressDTO.customerName != null and workInProgressDTO.customerName != ''">
@@ -2009,6 +2052,19 @@
         <if test="workInProgressDTO.processId != null and workInProgressDTO.processId != ''">
             and fc.process_id regexp #{workInProgressDTO.processId}
         </if>
+        <if test="workInProgressDTO.orderNumber != null and workInProgressDTO.orderNumber != ''">
+            and ogd.order_number regexp #{workInProgressDTO.orderNumber}
+        </if>
+        <if test="workInProgressDTO.technologyNumber != null and workInProgressDTO.technologyNumber != ''">
+            and ogd.technology_number regexp #{workInProgressDTO.technologyNumber}
+        </if>
+        <if test="workInProgressDTO.glassNumber != null and workInProgressDTO.glassNumber != ''">
+            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') regexp #{workInProgressDTO.glassNumber}
+        </if>
+
+        group by fc.process_id, fc.order_number, fc.technology_number,d.process
+        ) as aa
+
     </select>
 
     <select id="processToBeCompletedFootSum">
@@ -2040,8 +2096,8 @@
           and odpd.process = #{selectProcesses}
           and  o.create_time >= #{selectTime1}
           AND o.create_time &lt;  #{selectTime2}
-          AND POSITION('' IN od.order_id)
-          AND POSITION('' IN o.project)
+          and position(#{orderId} in od.order_id)
+          and position(#{inputProject} in o.project)
           AND fc.quantity - odpd.reporting_work_num > 0;
 
     </select>
@@ -2062,7 +2118,7 @@
         WHERE
             rw.reporting_work_time >= #{selectTime1}
           AND rw.reporting_work_time &lt;  #{selectTime2}
-          AND dd.available = 0
+          AND dd.available = 0 and rw.reviewed_state>=0
         <if test="damageReportDTO.orderId != null and damageReportDTO.orderId != ''">
             and o.order_id regexp #{damageReportDTO.orderId}
         </if>
@@ -2170,4 +2226,738 @@
     <select id="getLaminating">
         select IFNULL(nickname,'') from sd.basic_data where basic_category='process' and basic_name=#{selectProcesses}
     </select>
+
+    <select id="workInProgressMpdataList1" resultMap="workInProgressMap">
+        select d.process as thisProcess,
+        fc.process_id,
+        o.customer_name,
+        o.project,
+        o.order_id,
+        o.batch,
+        od.shape,
+        if(od.shape=2,JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S04')),od.bend_radius) as bend_radius,
+        ogd.order_number,
+        ogd.technology_number,
+        ogd.process,
+        od.quantity,
+        ogd.child_width,
+        ogd.child_height,
+        d.numCounts + d.patchNumSum - d.numCount -d.broken_num as stockNum,
+        ROUND(ogd.child_width * ogd.child_height *
+        (d.numCounts + d.patchNumSum - d.numCount -
+        d.broken_num) / 1000000, 2) as stockArea,
+        od.product_name,
+        od.bend_radius,
+        ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') AS glassNumber
+        from sd.order_detail AS od
+        LEFT JOIN sd.order_glass_detail AS ogd
+        ON od.order_id = ogd.order_id
+        AND od.order_number = ogd.order_number
+        LEFT JOIN pp.flow_card AS fc
+        ON fc.order_id = ogd.order_id
+        and fc.production_id = ogd.production_id
+        AND fc.order_number = ogd.order_number
+        AND fc.technology_number = ogd.technology_number
+        left join (
+        SELECT
+        odpd.process,
+        odpd.process_id,
+        odpd.order_number,
+        odpd.technology_number,
+        odpds.reporting_work_num_count as numCounts,
+        ifnull( c.patchNumSum, 0 ) as patchNumSum,
+        odpd.reporting_work_num_count as numCount,
+        odpd.broken_num
+        FROM
+        sd.order_process_detail AS odpd
+        LEFT JOIN sd.order_process_detail AS odpds ON odpds.id = odpd.id - 1
+        LEFT JOIN (
+        SELECT
+        sum( rw.rework_num ) AS 'patchNumSum',
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number,
+        rwk.this_process
+        FROM
+        pp.rework AS rw
+        LEFT JOIN pp.reporting_work AS rwk ON rw.reporting_work_id = rwk.reporting_work_id
+        WHERE
+        position( #{selectProcesses} IN rwk.this_process )
+        AND rw.review_status >= 0
+        GROUP BY
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number
+        ) AS c ON c.process_id = odpd.process_id
+        AND c.order_sort = odpd.order_number
+        AND c.technology_number = odpd.technology_number
+        WHERE
+        position(#{selectProcesses} IN odpd.process )  and odpds.reporting_work_num_count is not null
+        GROUP BY
+        odpd.process_id,
+        odpd.order_number,
+        odpd.technology_number,
+        odpd.process
+
+        ) as d
+        on d.process_id=fc.process_id and d.order_number=fc.order_number and d.technology_number=fc.technology_number
+        left join sd.`order` as o on o.order_id=od.order_id
+        LEFT JOIN sd.basic_data AS bd ON bd.basic_name = d.process
+        where  o.create_order>0
+        and d.numCounts +d.patchNumSum - d.numCount - d.broken_num != 0
+        and d.process!=SUBSTRING_INDEX(ogd.process, '->', 1)
+        and position(#{orderId} in od.order_id)
+        and position(#{inputProject} in o.project)
+        <if test="workInProgressDTO.thisProcess != null and workInProgressDTO.thisProcess != ''">
+            and d.process regexp #{workInProgressDTO.thisProcess}
+        </if>
+        <if test="workInProgressDTO.customerName != null and workInProgressDTO.customerName != ''">
+            and o.customer_name regexp #{workInProgressDTO.customerName}
+        </if>
+        <if test="workInProgressDTO.project != null and workInProgressDTO.project != ''">
+            and o.project regexp #{workInProgressDTO.project}
+        </if>
+        <if test="workInProgressDTO.orderId != null and workInProgressDTO.orderId != ''">
+            and o.order_id regexp #{workInProgressDTO.orderId}
+        </if>
+        <if test="workInProgressDTO.batch != null and workInProgressDTO.batch != ''">
+            and o.batch regexp #{workInProgressDTO.batch}
+        </if>
+        <if test="workInProgressDTO.processId != null and workInProgressDTO.processId != ''">
+            and fc.process_id regexp #{workInProgressDTO.processId}
+        </if>
+        <if test="workInProgressDTO.orderNumber != null and workInProgressDTO.orderNumber != ''">
+            and ogd.order_number regexp #{workInProgressDTO.orderNumber}
+        </if>
+        <if test="workInProgressDTO.technologyNumber != null and workInProgressDTO.technologyNumber != ''">
+            and ogd.technology_number regexp #{workInProgressDTO.technologyNumber}
+        </if>
+        <if test="workInProgressDTO.glassNumber != null and workInProgressDTO.glassNumber != ''">
+            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') regexp #{workInProgressDTO.glassNumber}
+        </if>
+        <choose>
+            <when test="laminating != null and laminating == 'stepC'">
+                GROUP BY fc.process_id, fc.order_number, ogd.`group`, d.process
+            </when>
+            <when test="laminating != null and laminating == 'stepD'">
+                GROUP BY fc.process_id, fc.order_number, d.process
+            </when>
+            <when test="laminating != null and laminating == 'stepB'">
+                GROUP BY fc.process_id, fc.order_number, d.process
+            </when>
+            <otherwise>
+                GROUP BY fc.process_id, fc.order_number, fc.technology_number, d.process
+            </otherwise>
+        </choose>
+        order by d.process,fc.process_id, fc.order_number, fc.technology_number
+        limit #{offset},#{pageSize};
+    </select>
+
+    <select id="workInProgressMpdataList2" resultMap="workInProgressMap">
+        select
+            a.process_id,a.teams_groups_name,a.next_process,b.technology_number,b.order_number
+        from pp.reporting_work  as a
+                 left join pp.reporting_work_detail as b on a.reporting_work_id=b.reporting_work_id
+        where position(#{selectProcesses} in a.next_process) and a.next_process!='鍒囧壊'
+        GROUP BY a.reporting_work_id
+    </select>
+
+    <select id="workInProgressOrderMpList1" resultMap="workInProgressMap">
+        select if(#{selectProcesses}='',odpd.process,#{selectProcesses}) as thisProcess,
+        o.customer_name,
+        o.project,
+        o.order_id,
+        o.batch,
+        od.shape,
+        sum(od.quantity) as quantity,
+        sum(odpds.reporting_work_num_count + ifnull(c.patchNumSum, 0) - odpd.reporting_work_num_count -
+        odpd.broken_num) as stockNum,
+        sum(ROUND(ogd.child_width * ogd.child_height *
+        (odpds.reporting_work_num_count + ifnull(c.patchNumSum, 0) - odpd.reporting_work_num_count -
+        odpd.broken_num) / 1000000, 2)) as stockArea,
+        od.product_name
+
+        from sd.order_detail AS od
+        LEFT JOIN sd.order_glass_detail AS ogd
+        ON od.order_id = ogd.order_id
+        AND od.order_number = ogd.order_number
+        LEFT JOIN flow_card AS fc
+        ON fc.order_id = ogd.order_id
+        and fc.production_id = ogd.production_id
+        AND fc.order_number = ogd.order_number
+        AND fc.technology_number = ogd.technology_number
+        left join sd.order_process_detail as odpd
+        ON odpd.order_id = fc.order_id
+        AND odpd.order_number = fc.order_number
+        AND odpd.technology_number = fc.technology_number
+        and odpd.process_id = fc.process_id
+        left join sd.order_process_detail as odpds
+        ON odpds.id = odpd.id - 1
+        left join
+        (SELECT sum(rw.rework_num) as 'patchNumSum',
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number,
+        rwk.this_process
+        from rework as rw
+        LEFT JOIN
+        reporting_work as rwk
+        on rw.reporting_work_id = rwk.reporting_work_id
+        where position(#{selectProcesses} in rwk.this_process)
+        and rw.review_status >= 0
+        GROUP BY rw.process_id, rw.order_sort, rw.technology_number) as c
+        on c.process_id = fc.process_id
+        and c.order_sort = fc.order_number
+        and c.technology_number = fc.technology_number
+        left join sd.`order` as o
+        on o.order_id = od.order_id
+        where  o.create_order>0
+        and odpds.reporting_work_num_count + ifnull(c.patchNumSum, 0) - odpd.reporting_work_num_count -
+        odpd.broken_num != 0 and odpd.process!=SUBSTRING_INDEX(ogd.process, '->', 1)
+        and position(#{selectProcesses} in odpd.process)
+        and position(#{orderId} in od.order_id)
+        and position(#{inputProject} in o.project)
+        <if test="workInProgressDTO.customerName != null and workInProgressDTO.customerName != ''">
+            and o.customer_name regexp #{workInProgressDTO.customerName}
+        </if>
+        <if test="workInProgressDTO.project != null and workInProgressDTO.project != ''">
+            and o.project regexp #{workInProgressDTO.project}
+        </if>
+        <if test="workInProgressDTO.orderId != null and workInProgressDTO.orderId != ''">
+            and o.order_id regexp #{workInProgressDTO.orderId}
+        </if>
+        <if test="workInProgressDTO.batch != null and workInProgressDTO.batch != ''">
+            and o.batch regexp #{workInProgressDTO.batch}
+        </if>
+        group by o.order_id
+        order by o.order_id
+        limit #{offset},#{pageSize};
+    </select>
+
+    <select id="workInProgressProcessMpList1" resultMap="workInProgressMap">
+        select if(#{selectProcesses}='',odpd.process,#{selectProcesses}) as thisProcess,
+        o.customer_name,
+        o.project,
+        o.order_id,
+        fc.process_id,
+        o.batch,
+        od.shape,
+        sum(od.quantity) as quantity,
+        sum(odpds.reporting_work_num_count + ifnull(c.patchNumSum, 0) - odpd.reporting_work_num_count -
+        odpd.broken_num) as stockNum,
+        sum(ROUND(ogd.child_width * ogd.child_height *
+        (odpds.reporting_work_num_count + ifnull(c.patchNumSum, 0) - odpd.reporting_work_num_count -
+        odpd.broken_num) / 1000000, 2)) as stockArea,
+        od.product_name
+
+        from sd.order_detail AS od
+        LEFT JOIN sd.order_glass_detail AS ogd
+        ON od.order_id = ogd.order_id
+        AND od.order_number = ogd.order_number
+        LEFT JOIN flow_card AS fc
+        ON fc.order_id = ogd.order_id
+        and fc.production_id = ogd.production_id
+        AND fc.order_number = ogd.order_number
+        AND fc.technology_number = ogd.technology_number
+        left join sd.order_process_detail as odpd
+        ON odpd.order_id = fc.order_id
+        AND odpd.order_number = fc.order_number
+        AND odpd.technology_number = fc.technology_number
+        and odpd.process_id = fc.process_id
+        left join sd.order_process_detail as odpds
+        ON odpds.id = odpd.id - 1
+        left join
+        (SELECT sum(rw.rework_num) as 'patchNumSum',
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number,
+        rwk.this_process
+        from rework as rw
+        LEFT JOIN
+        reporting_work as rwk
+        on rw.reporting_work_id = rwk.reporting_work_id
+        where position(#{selectProcesses} in rwk.this_process)
+        and rw.review_status >= 0
+        GROUP BY rw.process_id, rw.order_sort, rw.technology_number) as c
+        on c.process_id = fc.process_id
+        and c.order_sort = fc.order_number
+        and c.technology_number = fc.technology_number
+        left join sd.`order` as o
+        on o.order_id = od.order_id
+        where  o.create_order>0
+        and odpds.reporting_work_num_count + ifnull(c.patchNumSum, 0) - odpd.reporting_work_num_count -
+        odpd.broken_num != 0 and odpd.process!=SUBSTRING_INDEX(ogd.process, '->', 1)
+        and position(#{selectProcesses} in odpd.process)
+        and position(#{orderId} in od.order_id)
+        and position(#{inputProject} in o.project)
+        <if test="workInProgressDTO.customerName != null and workInProgressDTO.customerName != ''">
+            and o.customer_name regexp #{workInProgressDTO.customerName}
+        </if>
+        <if test="workInProgressDTO.project != null and workInProgressDTO.project != ''">
+            and o.project regexp #{workInProgressDTO.project}
+        </if>
+        <if test="workInProgressDTO.orderId != null and workInProgressDTO.orderId != ''">
+            and o.order_id regexp #{workInProgressDTO.orderId}
+        </if>
+        <if test="workInProgressDTO.batch != null and workInProgressDTO.batch != ''">
+            and o.batch regexp #{workInProgressDTO.batch}
+        </if>
+        <if test="workInProgressDTO.processId != null and workInProgressDTO.processId != ''">
+            and fc.process_id regexp #{workInProgressDTO.processId}
+        </if>
+        group by o.order_id, fc.process_id
+        order by o.order_id, fc.process_id
+        limit #{offset},#{pageSize};
+    </select>
+
+    <select id="exportWorkInProgressMpdataList2">
+        select
+            a.process_id,a.teams_groups_name,a.next_process,b.technology_number,b.order_number
+        from pp.reporting_work  as a
+                 left join pp.reporting_work_detail as b on a.reporting_work_id=b.reporting_work_id
+        where position(#{process} in a.next_process) and a.next_process!='鍒囧壊'
+        GROUP BY a.reporting_work_id
+    </select>
+
+    <select id="workInProgressCombinationMpdataList2">
+        select
+            a.process_id,a.teams_groups_name,a.next_process,b.technology_number,b.order_number
+        from pp.reporting_work  as a
+                 left join pp.reporting_work_detail as b on a.reporting_work_id=b.reporting_work_id
+        where position(#{selectProcesses} in a.next_process) and a.next_process!='鍒囧壊'
+        GROUP BY a.reporting_work_id
+    </select>
+
+    <select id="workInProgressCombinationMpdataList1">
+        select if(#{selectProcesses}='',d.process,#{selectProcesses}) as thisProcess,
+        o.project,
+        SUM(d.numCounts + d.patchNumSum - d.numCount -d.broken_num) as stockNum,
+        SUM(ROUND(ogd.child_width * ogd.child_height *
+        (d.numCounts + d.patchNumSum - d.numCount -
+        d.broken_num) / 1000000, 2)) as stockArea
+        from sd.order_detail AS od
+        LEFT JOIN sd.order_glass_detail AS ogd
+        ON od.order_id = ogd.order_id
+        AND od.order_number = ogd.order_number
+        LEFT JOIN pp.flow_card AS fc
+        ON fc.order_id = ogd.order_id
+        and fc.production_id = ogd.production_id
+        AND fc.order_number = ogd.order_number
+        AND fc.technology_number = ogd.technology_number
+        left join (
+        SELECT
+        odpd.process,
+        odpd.process_id,
+        odpd.order_number,
+        odpd.technology_number,
+        odpds.reporting_work_num_count as numCounts,
+        ifnull( c.patchNumSum, 0 ) as patchNumSum,
+        odpd.reporting_work_num_count as numCount,
+        odpd.broken_num
+        FROM
+        sd.order_process_detail AS odpd
+        LEFT JOIN sd.order_process_detail AS odpds ON odpds.id = odpd.id - 1
+        LEFT JOIN (
+        SELECT
+        sum( rw.rework_num ) AS 'patchNumSum',
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number,
+        rwk.this_process
+        FROM
+        pp.rework AS rw
+        LEFT JOIN pp.reporting_work AS rwk ON rw.reporting_work_id = rwk.reporting_work_id
+        WHERE
+        position( #{selectProcesses} IN rwk.this_process )
+        AND rw.review_status >= 0
+        GROUP BY
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number
+        ) AS c ON c.process_id = odpd.process_id
+        AND c.order_sort = odpd.order_number
+        AND c.technology_number = odpd.technology_number
+        WHERE
+        position(#{selectProcesses} IN odpd.process )  and odpds.reporting_work_num_count is not null
+        GROUP BY
+        odpd.process_id,
+        odpd.order_number,
+        odpd.technology_number,
+        odpd.process
+
+        ) as d
+        on d.process_id=fc.process_id and d.order_number=fc.order_number and d.technology_number=fc.technology_number
+        and position(#{selectProcesses} in d.process)
+        left join sd.`order` as o on o.order_id=od.order_id
+        where  o.create_order>0
+        and d.numCounts +d.patchNumSum - d.numCount - d.broken_num != 0
+        and d.process!=SUBSTRING_INDEX(ogd.process, '->', 1)
+        and position(#{selectProcesses} in d.process)
+
+        <if test="workInProgressDTO.project != null and workInProgressDTO.project != ''">
+            and o.project regexp #{workInProgressDTO.project}
+        </if>
+
+        group by d.process
+        order by d.process
+        limit #{offset},#{pageSize};
+    </select>
+
+    <select id="workInProgressCombinationOrderFootSum">
+        SELECT SUM(aa.quantity) AS quantity,
+        sum(aa.stockNum) AS stockNum,
+        SUM(aa.stockArea) AS stockArea,
+        count(* ) AS 'total',
+        CEILING( count(* )/#{pageSize} ) AS 'pageTotal'
+        from
+        (
+        SELECT (od.quantity) AS quantity,
+        d.numCounts + d.patchNumSum - d.numCount -d.broken_num as stockNum,
+        ROUND(ogd.child_width * ogd.child_height *
+        (d.numCounts + d.patchNumSum - d.numCount -
+        d.broken_num) / 1000000, 2) as stockArea
+        FROM
+        sd.order_detail AS od
+        LEFT JOIN sd.order_glass_detail AS ogd
+        ON od.order_id = ogd.order_id
+        AND od.order_number = ogd.order_number
+        LEFT JOIN pp.flow_card AS fc
+        ON fc.order_id = ogd.order_id
+        and fc.production_id = ogd.production_id
+        AND fc.order_number = ogd.order_number
+        AND fc.technology_number = ogd.technology_number
+        left join (
+        SELECT
+        odpd.process,
+        odpd.process_id,
+        odpd.order_number,
+        odpd.technology_number,
+        odpds.reporting_work_num_count as numCounts,
+        ifnull( c.patchNumSum, 0 ) as patchNumSum,
+        odpd.reporting_work_num_count as numCount,
+        odpd.broken_num
+        FROM
+        sd.order_process_detail AS odpd
+        LEFT JOIN sd.order_process_detail AS odpds ON odpds.id = odpd.id - 1
+        LEFT JOIN (
+        SELECT
+        sum( rw.rework_num ) AS 'patchNumSum',
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number,
+        rwk.this_process
+        FROM
+        pp.rework AS rw
+        LEFT JOIN pp.reporting_work AS rwk ON rw.reporting_work_id = rwk.reporting_work_id
+        WHERE
+        position( #{selectProcesses} IN rwk.this_process )
+        AND rw.review_status >= 0
+        GROUP BY
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number
+        ) AS c ON c.process_id = odpd.process_id
+        AND c.order_sort = odpd.order_number
+        AND c.technology_number = odpd.technology_number
+        WHERE
+        position(#{selectProcesses} IN odpd.process )  and odpds.reporting_work_num_count is not null
+        GROUP BY
+        odpd.process_id,
+        odpd.order_number,
+        odpd.technology_number,
+        odpd.process
+
+        ) as d
+        on d.process_id=fc.process_id and d.order_number=fc.order_number and d.technology_number=fc.technology_number
+        and position(#{selectProcesses} in d.process)
+        left join sd.`order` as o on o.order_id=od.order_id
+        where  o.create_order>0
+        and d.numCounts +d.patchNumSum - d.numCount - d.broken_num != 0
+        and d.process!=SUBSTRING_INDEX(ogd.process, '->', 1)
+        and position(#{selectProcesses} in d.process)
+
+        <if test="workInProgressDTO.project != null and workInProgressDTO.project != ''">
+            and o.project regexp #{workInProgressDTO.project}
+        </if>
+        group by d.process
+        ) as aa
+    </select>
+
+    <select id="selectProcess">
+        SELECT basic_name
+        FROM sd.basic_data as bd
+        where bd.basic_category = 'process'
+          and bd.basic_type = 'product'
+        and basic_name!='鍒囧壊'
+    </select>
+
+    <select id="getWorkInProgressCombination">
+        select
+            #{process} as thisProcess,
+            if(#{optionVal} = 1,'',h.project) as project,
+            SUM(h.quantity) as stockNum,
+            SUM(h.glassArea) as stockArea,
+            if(#{optionVal} = 1,'',h.childName) as glassName
+
+        from (
+
+                 SELECT g.*
+                      ,GROUP_CONCAT(g.glass_child SEPARATOR '+')  as childName
+                 from( SELECT f.*,
+        e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num as quantity,
+        (e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num)*f.area as glassArea
+                       from (SELECT a.order_id,
+                                   if(a.batch!="",CONCAT(a.project,'(',a.batch,')'),a.project) as project,
+                                    C.product_id,
+                                    b.order_number,
+                                    b.process_id,
+                                    b.technology_number,
+                                    b.reporting_work_num_count,
+                                    d.`group` ,
+                                    b.broken_num,
+                                    b.id,
+                                    c.area,
+                                    d.glass_child,
+                                    ifnull(cb.patchNumSum,0) as patchNumSum
+
+                             FROM sd.`order` as a
+                                      LEFT JOIN sd.order_process_detail as b
+                                                on b.process = #{process} and a.order_id =b.order_id
+                                      LEFT JOIN sd.order_detail as c
+                                                on a.order_id = c.order_id and b.order_number =c.order_number
+                                      left join sd.order_glass_detail as d
+                                                on  d.order_id =a.order_id and d.order_number = b.order_number and d.technology_number = b.technology_number
+                                      LEFT JOIN (
+                                        SELECT
+                                        IFNULL(sum( rw.rework_num ),0) AS 'patchNumSum',
+                                        rw.process_id,
+                                        rw.order_sort,
+                                        rw.technology_number,
+                                        rwk.this_process
+                                        FROM
+                                        pp.rework AS rw
+                                        LEFT JOIN pp.reporting_work AS rwk ON rw.reporting_work_id = rwk.reporting_work_id
+                                        WHERE
+                                        position( #{process} IN rwk.this_process )
+                                        AND rw.review_status >= 0
+                                        GROUP BY
+                                        rw.process_id,
+                                        rw.order_sort,
+                                        rw.technology_number
+                                        ) AS cb ON cb.process_id = b.process_id
+                                        AND cb.order_sort = b.order_number
+                                        AND cb.technology_number = b.technology_number
+                             where a.processing_card>0
+                               and a.warehousing!=2
+                                and (c.quantity-b.reporting_work_num_count)>0
+                             GROUP BY  b.process_id, b.order_number,
+                                 b.technology_number) as f
+                                LEFT JOIN sd.order_process_detail as e
+                                          on e.id=(f.id-1) and e.process_id = f.process_id and e.order_number = f.order_number and e.technology_number =f.technology_number
+                       where
+                           e.id is not null
+                         and (e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num)>0 group by f.process_id, f.order_number,
+        f.technology_number) as g
+                            <choose>
+                                <when test="laminating == 'stepC' and process == '棰勫帇'">
+                                    GROUP BY g.process_id, g.order_number, g.technology_number
+                                </when>
+                                <when test="laminating == 'stepC'">
+                                    GROUP BY g.process_id, g.order_number, g.`group`
+                                </when>
+                                <when test="laminating == 'stepD'">
+                                    GROUP BY g.process_id, g.order_number
+                                </when>
+                                <otherwise>
+                                    GROUP BY g.process_id, g.order_number, g.technology_number
+                                </otherwise>
+                            </choose>
+
+
+             ) as h
+        <choose>
+            <when test="optionVal == 1">
+                GROUP BY thisProcess
+            </when>
+            <otherwise>
+                GROUP BY h.project,h.childName
+            </otherwise>
+        </choose>
+
+    </select>
+
+    <select id="getWorkInProgressCombinationFootSum">
+        select
+        SUM(h.quantity) as stockNum,
+        SUM(h.glassArea) as stockArea
+        from (
+        SELECT g.*
+        ,GROUP_CONCAT(g.glass_child SEPARATOR '+')  as childName
+        from( SELECT f.*,
+        e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num as quantity,
+        (e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num)*f.area as glassArea
+        from (SELECT a.order_id,
+        a.project,
+        C.product_id,
+        b.order_number,
+        b.process_id,
+        b.technology_number,
+        b.reporting_work_num_count,
+        d.`group` ,
+        b.broken_num,
+        b.id,
+        c.area,
+        d.glass_child,
+        ifnull(cb.patchNumSum,0) as patchNumSum
+
+        FROM sd.`order` as a
+        LEFT JOIN sd.order_process_detail as b
+        on b.process = #{process} and a.order_id =b.order_id
+        LEFT JOIN sd.order_detail as c
+        on a.order_id = c.order_id and b.order_number =c.order_number
+        left join sd.order_glass_detail as d
+        on  d.order_id =a.order_id and d.order_number = b.order_number and d.technology_number = b.technology_number
+        LEFT JOIN (
+        SELECT
+        IFNULL(sum( rw.rework_num ),0) AS 'patchNumSum',
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number,
+        rwk.this_process
+        FROM
+        pp.rework AS rw
+        LEFT JOIN pp.reporting_work AS rwk ON rw.reporting_work_id = rwk.reporting_work_id
+        WHERE
+        position( #{process} IN rwk.this_process )
+        AND rw.review_status >= 0
+        GROUP BY
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number
+        ) AS cb ON cb.process_id = b.process_id
+        AND cb.order_sort = b.order_number
+        AND cb.technology_number = b.technology_number
+        where a.processing_card>0
+        and a.warehousing!=2
+        and (c.quantity-b.reporting_work_num_count)>0
+        GROUP BY  b.process_id, b.order_number,
+        b.technology_number) as f
+        LEFT JOIN sd.order_process_detail as e
+        on e.id=(f.id-1) and e.process_id = f.process_id and e.order_number = f.order_number and e.technology_number =f.technology_number
+        where
+        e.id is not null
+        and e.reporting_work_num_count-f.reporting_work_num_count>0 group by f.process_id, f.order_number,
+        f.technology_number) as g
+        <choose>
+            <when test="laminating == 'stepC' and process == '棰勫帇'">
+                GROUP BY g.process_id, g.order_number, g.technology_number
+            </when>
+            <when test="laminating == 'stepC'">
+                GROUP BY g.process_id, g.order_number, g.`group`
+            </when>
+            <when test="laminating == 'stepD'">
+                GROUP BY g.process_id, g.order_number
+            </when>
+            <otherwise>
+                GROUP BY g.process_id, g.order_number, g.technology_number
+            </otherwise>
+        </choose>
+
+
+        ) as h
+
+    </select>
+
+    <select id="exportWorkInProgressCombination">
+        select
+        #{process} as thisProcess,
+        if(#{inputVal} = 1,'',h.project) as project,
+        SUM(h.quantity) as stockNum,
+        SUM(h.glassArea) as stockArea,
+        if(#{inputVal} = 1,'',h.childName) as glassName
+
+        from (
+
+        SELECT g.*
+        ,GROUP_CONCAT(g.glass_child SEPARATOR '+')  as childName
+        from( SELECT f.*,
+        e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num as quantity,
+        (e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num)*f.area as glassArea
+        from (SELECT a.order_id,
+        a.project,
+        C.product_id,
+        b.order_number,
+        b.process_id,
+        b.technology_number,
+        b.reporting_work_num_count,
+        d.`group` ,
+        b.broken_num,
+        b.id,
+        c.area,
+        d.glass_child,
+        ifnull(cb.patchNumSum,0) as patchNumSum
+
+        FROM sd.`order` as a
+        LEFT JOIN sd.order_process_detail as b
+        on b.process = #{process} and a.order_id =b.order_id
+        LEFT JOIN sd.order_detail as c
+        on a.order_id = c.order_id and b.order_number =c.order_number
+        left join sd.order_glass_detail as d
+        on  d.order_id =a.order_id and d.order_number = b.order_number and d.technology_number = b.technology_number
+        LEFT JOIN (
+        SELECT
+        IFNULL(sum( rw.rework_num ),0) AS 'patchNumSum',
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number,
+        rwk.this_process
+        FROM
+        pp.rework AS rw
+        LEFT JOIN pp.reporting_work AS rwk ON rw.reporting_work_id = rwk.reporting_work_id
+        WHERE
+        position( #{process} IN rwk.this_process )
+        AND rw.review_status >= 0
+        GROUP BY
+        rw.process_id,
+        rw.order_sort,
+        rw.technology_number
+        ) AS cb ON cb.process_id = b.process_id
+        AND cb.order_sort = b.order_number
+        AND cb.technology_number = b.technology_number
+        where a.processing_card>0
+        and a.warehousing!=2
+        and (c.quantity-b.reporting_work_num_count)>0
+        GROUP BY  b.process_id, b.order_number,
+        b.technology_number) as f
+        LEFT JOIN sd.order_process_detail as e
+        on e.id=(f.id-1) and e.process_id = f.process_id and e.order_number = f.order_number and e.technology_number =f.technology_number
+        where
+        e.id is not null
+        and (e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num)>0 ) as g
+        <choose>
+            <when test="laminating == 'stepC' and process == '棰勫帇'">
+                GROUP BY g.process_id, g.order_number, g.technology_number
+            </when>
+            <when test="laminating == 'stepC'">
+                GROUP BY g.process_id, g.order_number, g.`group`
+            </when>
+            <when test="laminating == 'stepD'">
+                GROUP BY g.process_id, g.order_number
+            </when>
+            <otherwise>
+                GROUP BY g.process_id, g.order_number, g.technology_number
+            </otherwise>
+        </choose>
+
+
+        ) as h
+        <choose>
+            <when test="inputVal == 1">
+                GROUP BY thisProcess
+            </when>
+            <otherwise>
+                GROUP BY h.project,h.childName
+            </otherwise>
+        </choose>
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/north-glass-erp/src/main/resources/mapper/pp/ReportingWork.xml b/north-glass-erp/src/main/resources/mapper/pp/ReportingWork.xml
index d529328..41be40c 100644
--- a/north-glass-erp/src/main/resources/mapper/pp/ReportingWork.xml
+++ b/north-glass-erp/src/main/resources/mapper/pp/ReportingWork.xml
@@ -102,9 +102,7 @@
     </select>
 
     <select id="SelectWorkBasicTeamsMp">
-        SELECT bdp.id,bdp.basic_type,bdp.basic_name, bd.basic_name as basic_category FROM  sd.basic_data as bd left join  `basic_data_produce` as bdp
-                                                                                                                          on bd.id=bdp.basic_category
-        where bd.basic_category="process" and bdp.basic_type="teamsgroups" and bd.basic_name = #{process}
+        select id,login_name,user_name,address from erp_user_info.`user` WHERE address=#{process}
     </select>
 
     <!--    鏌ヨ娴佺▼鍗″伐鑹烘祦绋�-->
@@ -300,15 +298,13 @@
 
     <select id="historyTeamsMp">
         SELECT
-            bdp.id,
-            bdp.basic_type,
+            bd.id,
+            bd.basic_type,
             rw.teams  as basic_name,
             bd.basic_name,bd.id AS basic_category,
             rw.process
         FROM
             sd.basic_data AS bd
-                LEFT JOIN `basic_data_produce` AS bdp
-                          ON bd.id = bdp.basic_category
                 right join (
                 select distinct process,teams from
                     (   select distinct rw.this_process as  process,rw.teams_groups_name as teams
@@ -317,8 +313,6 @@
                     ) as t
             ) as  rw
                            on rw.process=bd.basic_name
-        WHERE
-            bdp.basic_type = 'teamsgroups'
         GROUP BY rw.process,rw.teams
     </select>
 
@@ -328,10 +322,9 @@
             bd.basic_name AS basic_category
         FROM
             sd.basic_data AS bd
-                LEFT JOIN `basic_data_produce` AS bdp ON bd.id = bdp.basic_category
+
         WHERE
             bd.basic_category = 'process'
-          AND bdp.basic_type = 'teamsgroups'
           AND POSITION(bd.basic_name in CONCAT(#{historyProcess},#{process}))
     </select>
 
@@ -444,7 +437,7 @@
                     -ifnull(g.completed_quantity,0))
                     >
                    a.completed_quantity,
-                    0,
+                a.completed_quantity,
                    (f.completed_quantity
                        -ifnull(g.completed_quantity,0))
                     )  as minQuantity -- 淇敼鏈�灏忔暟
@@ -521,13 +514,10 @@
         GROUP BY c.order_number,c.technology_number
     </select>
 <select id="selectReportingWorkMp" resultMap="reportingWorkMap">
-    SELECT a.*,
-     round(ogd.child_width*ogd.child_height * a.this_completed_quantity/1000000,2) as completedArea,
-    round(ogd.child_width*ogd.child_height * a.this_worn_quantity/1000000,2)      as wornArea
-           from (select rw.reporting_work_id,
+    select rw.reporting_work_id,
                (rw.reporting_work_time) as reporting_work_time,
                o.order_id,
-               CONCAT(rw.process_id,'/',GROUP_CONCAT(distinct rwd.technology_number SEPARATOR '')) as process_id,
+               CONCAT(rw.process_id,'/',rwd.goup) as process_id,
                o.project,
                o.batch,
                rw.this_process,
@@ -538,11 +528,15 @@
                rw.reviewed_state,
                rw.notes,
                rw.reviewed,
-                rwd.order_number,
-                rwd.technology_number
+                round(rwd.completedArea/LENGTH(rwd.goup),2) as completedArea,
+                rwd.wornArea
         # (IF(rw.reviewed_state = 0, '鏈鏍�', IF(rw.reviewed_state = 1, '瀹℃牳閫氳繃', '瀹℃牳涓嶉�氳繃'))) as reviewed_state
         from
-            reporting_work as rw left join reporting_work_detail as rwd on rw.reporting_work_id=rwd.reporting_work_id
+            reporting_work as rw
+    left join (
+    SELECT cc.reporting_work_id,cc.goup,round(sum(cc.completedArea),2)  as completedArea ,round(sum(cc.wornArea),2)  as wornArea from  (SELECT rwds.reporting_work_id, GROUP_CONCAT(distinct rwds.technology_number SEPARATOR '') as goup,
+    sum(rwds.child_width*rwds.child_height*completed_quantity/1000000)as completedArea,
+    sum(rwds.child_width*rwds.child_height*rwds.breakage_quantity/1000000) as wornArea  from reporting_work_detail as rwds GROUP BY rwds.reporting_work_id,order_number ) as cc GROUP BY cc.reporting_work_id)as rwd on rw.reporting_work_id=rwd.reporting_work_id
 
             left join sd.`order` as o on o.order_id=rw.order_id
         where rw.reviewed_state != 2
@@ -577,9 +571,7 @@
         </if>
         GROUP BY rw.reporting_work_id
         ORDER BY rw.reporting_work_id desc
-        limit #{offset},#{pageSize} ) as a
-    left join sd.order_glass_detail as ogd on ogd.order_id=a.order_id and ogd.order_number=a.order_number and ogd.technology_number=a.technology_number
-    GROUP BY a.reporting_work_id
+        limit #{offset},#{pageSize}
     </select>
 
     <select id="getPageTotal">
@@ -1025,14 +1017,19 @@
 
     <select id="getFootSum">
         SELECT
-        SUM(rwd.completed_quantity) AS thisCompletedQuantity,
-        ROUND(SUM(rwd.child_width * rwd.child_height * rwd.completed_quantity / 1000000), 2) AS completedArea,
-        SUM(rwd.breakage_quantity) AS thisWornQuantity,
-        ROUND(SUM(rwd.child_width * rwd.child_height * rwd.breakage_quantity / 1000000), 2) AS wornArea,
+        SUM(rw.this_completed_quantity) AS thisCompletedQuantity,
+        ROUND(SUM(rwd.completedArea/length(goup)), 2) AS completedArea,
+        SUM(rw.this_worn_quantity) AS thisWornQuantity,
+        ROUND(SUM(rwd.wornArea), 2) AS wornArea,
         CEILING(count(rw.reporting_work_id)/#{pageSize}) as 'pageTotal',
         count(distinct rw.reporting_work_id) as 'total'
         FROM reporting_work AS rw
-        LEFT JOIN reporting_work_detail AS rwd ON rw.reporting_work_id = rwd.reporting_work_id
+        LEFT JOIN
+        (SELECT cc.reporting_work_id,cc.goup,round(sum(cc.completedArea),2)  as completedArea ,round(sum(cc.wornArea),2)  as wornArea from  (SELECT rwds.reporting_work_id, GROUP_CONCAT(distinct rwds.technology_number SEPARATOR '') as goup,
+        sum(rwds.child_width*rwds.child_height*completed_quantity/1000000)as completedArea,
+        sum(rwds.child_width*rwds.child_height*rwds.breakage_quantity/1000000) as wornArea  from reporting_work_detail as rwds GROUP BY rwds.reporting_work_id,order_number ) as cc GROUP BY cc.reporting_work_id)
+            AS rwd
+                ON rw.reporting_work_id = rwd.reporting_work_id
         /*LEFT JOIN sd.order_glass_detail AS ogd ON ogd.order_id = rw.order_id
         AND ogd.order_number = rwd.order_number
         AND ogd.technology_number = rwd.technology_number*/
diff --git a/north-glass-erp/src/main/resources/mapper/pp/ReworkMapper.xml b/north-glass-erp/src/main/resources/mapper/pp/ReworkMapper.xml
index 93ef507..97a9760 100644
--- a/north-glass-erp/src/main/resources/mapper/pp/ReworkMapper.xml
+++ b/north-glass-erp/src/main/resources/mapper/pp/ReworkMapper.xml
@@ -296,6 +296,7 @@
     <update id="updateReworkDdMp">
         update pp.damage_details set patch_status=0,quantity=quantity-#{reworkNum}
         where reporting_work_id=#{reportingWorkId} and order_number=#{orderSort} and technology_number=#{technologyNumber}
+              and breakage_type=#{reworkType} and breakage_reason=#{reworkReason}
     </update>
 
     <update id="updateReworkBgMp">
diff --git a/north-glass-erp/src/main/resources/mapper/sd/BasicDataMapper.xml b/north-glass-erp/src/main/resources/mapper/sd/BasicDataMapper.xml
index 18bc20d..22c22c8 100644
--- a/north-glass-erp/src/main/resources/mapper/sd/BasicDataMapper.xml
+++ b/north-glass-erp/src/main/resources/mapper/sd/BasicDataMapper.xml
@@ -2,7 +2,7 @@
 <!DOCTYPE mapper
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.example.erp.mapper.sd.BasicDateMapper">
+<mapper namespace="com.example.erp.mapper.sd.BasicDataMapper">
     <select id="getOrderBasicData">
         select
             id,basic_type,if(basic_category='icon',null,nickname) as 'nickname',basic_name,basic_category,create_time,update_time
diff --git a/north-glass-erp/src/main/resources/mapper/sd/DeliveryDetailMapper.xml b/north-glass-erp/src/main/resources/mapper/sd/DeliveryDetailMapper.xml
index 1a28bca..9712158 100644
--- a/north-glass-erp/src/main/resources/mapper/sd/DeliveryDetailMapper.xml
+++ b/north-glass-erp/src/main/resources/mapper/sd/DeliveryDetailMapper.xml
@@ -53,6 +53,7 @@
         <result column="quantity_available" property="finishedGoodsInventory.quantityAvailable"/>
         <result column="storage_region" property="finishedGoodsInventory.storageRegion"/>
         <result column="actual_signal_area" property="finishedGoodsInventory.actualSignalArea"/>
+        <result column="box_no" property="finishedGoodsInventory.boxNo"/>
 
 
     </resultMap>
@@ -105,6 +106,7 @@
         <result column="delivery_number" property="deliveryNumber"/>
         <result column="quantity" property="quantity"/>
         <result column="area" property="area"/>
+        <result column="price" property="price"/>
         <result column="money" property="money"/>
         <result column="delivery_detail_remakes" property="deliveryDetailRemakes"/>
         <result column="delivery_detail_state" property="deliveryDetailState"/>
@@ -113,6 +115,8 @@
         <result column="product_id" property="orderDetail.productId"/>
         <result column="product_name" property="orderDetail.productName"/>
         <result column="order_id" property="orderDetail.orderId"/>
+        <result column="width" property="orderDetail.edgingType"/>
+        <result column="height" property="orderDetail.shape"/>
 
         <result column="contract_id" property="order.contractId"/>
 
@@ -160,11 +164,11 @@
 
     <insert id="insertDeliveryDetail"  useGeneratedKeys="true" >
         insert into sd.delivery_detail (delivery_id,delivery_number,order_number,
-                                        area,order_id,quantity,money,delivery_detail_remakes,delivery_detail_state,other_columns,create_time,price,other_money)
+                                        area,order_id,quantity,money,delivery_detail_remakes,delivery_detail_state,other_columns,create_time,price,other_money,box_no)
         values (
                    #{number} ,#{deliveryNumber},#{orderDetail.orderNumber},#{deliveryDetailArea},
                 #{orderDetail.orderId},#{orderDetail.deliveryDetail.quantity},
-                #{deliveryDetailMoney},'',1,#{orderDetail.otherColumns},now(),#{orderDetail.price},#{otherMoneys}
+                #{deliveryDetailMoney},'',1,#{orderDetail.otherColumns},now(),#{orderDetail.price},#{otherMoneys},#{orderDetail.finishedGoodsInventory.boxNo}
                )
     </insert>
 
@@ -189,6 +193,7 @@
                od.height,
                od.shape,
                fgi.actual_signal_area,
+               dd.box_no,
                od.area,
                dd.area as gross_area,
                od.compute_area,
@@ -236,6 +241,9 @@
             </if>
             <if test="orderDetail.finishedGoodsInventory.storageRegion != null and orderDetail.finishedGoodsInventory.storageRegion != ''">
                 and fgi.storage_region regexp #{orderDetail.finishedGoodsInventory.storageRegion}
+            </if>
+            <if test="orderDetail.deliveryDetail.boxNo != null and orderDetail.deliveryDetail.boxNo != ''">
+                and dd.box_no regexp  #{orderDetail.deliveryDetail.boxNo}
             </if>
             <if test="orderDetail.deliveryDetail.money != null and orderDetail.deliveryDetail.money != ''">
                 and dd.money regexp  REGEXP_REPLACE(#{orderDetail.deliveryDetail.money},'\\.0+$','')
@@ -320,6 +328,9 @@
             <if test="orderDetail.finishedGoodsInventory.storageRegion != null and orderDetail.finishedGoodsInventory.storageRegion != ''">
                 and fgi.storage_region regexp #{orderDetail.finishedGoodsInventory.storageRegion}
             </if>
+            <if test="orderDetail.deliveryDetail.boxNo != null and orderDetail.deliveryDetail.boxNo != ''">
+                and dd.box_no regexp  #{orderDetail.deliveryDetail.boxNo}
+            </if>
             <if test="orderDetail.deliveryDetail.money != null and orderDetail.deliveryDetail.money != ''">
                 and dd.money regexp  REGEXP_REPLACE(#{orderDetail.deliveryDetail.money},'\\.0+$','')
             </if>
@@ -377,6 +388,7 @@
                od.height,
                od.shape,
                fgi.actual_signal_area,
+               fgi.box_no,
                od.area,
                od.gross_area,
                od.compute_area,
@@ -420,6 +432,9 @@
             </if>
             <if test="orderDetail.finishedGoodsInventory.storageRegion != null and orderDetail.finishedGoodsInventory.storageRegion != ''">
                 and fgi.storage_region regexp #{orderDetail.finishedGoodsInventory.storageRegion}
+            </if>
+            <if test="orderDetail.finishedGoodsInventory.boxNo != null and orderDetail.finishedGoodsInventory.boxNo != ''">
+                and fgi.box_no regexp #{orderDetail.finishedGoodsInventory.boxNo}
             </if>
             <if test="orderDetail.width != null and orderDetail.width != ''">
                 and od.width regexp REGEXP_REPLACE(#{orderDetail.width},'\\.0+$','')
@@ -492,6 +507,9 @@
             </if>
             <if test="orderDetail.finishedGoodsInventory.storageRegion != null and orderDetail.finishedGoodsInventory.storageRegion != ''">
                 and fgi.storage_region regexp #{orderDetail.finishedGoodsInventory.storageRegion}
+            </if>
+            <if test="orderDetail.finishedGoodsInventory.boxNo != null and orderDetail.finishedGoodsInventory.boxNo != ''">
+                and fgi.box_no regexp #{orderDetail.finishedGoodsInventory.boxNo}
             </if>
             <if test="orderDetail.width != null and orderDetail.width != ''">
                 and od.width regexp REGEXP_REPLACE(#{orderDetail.width},'\\.0+$','')
@@ -976,7 +994,7 @@
     </select>
 
     <select id="getSelectDeliveryPrinting" resultMap="selectDeliveryDetailOrderDetail" >
-        select dd.delivery_id,od.order_id,od.product_id,IF(#{type}='product_abbreviation',pt.remarks,od.product_name) as product_name,sum(dd.area) as area,
+        select dd.delivery_id,od.order_id,od.product_id,IF(#{type}='product_abbreviation',pt.remarks,od.product_name) as product_name,dd.price,sum(dd.area) as area,
                sum(dd.money) as money,sum(dd.quantity) as quantity,o.contract_id from
         delivery_detail dd left join order_detail od on dd.order_id=od.order_id and dd.order_number=od.order_number
                                                             left join product pt on pt.id=od.product_id
@@ -986,6 +1004,181 @@
                 where dd.delivery_id like concat('%',#{deliveryId},'%')
 
         group by od.order_id,od.product_name,od.product_id
+    </select>
+
+    <select id="getSelectDeliveryPrintingMoney" resultMap="selectDeliveryDetailOrderDetail" >
+        select dd.delivery_id,
+               od.order_id,
+               IF(#{type} = 'product_abbreviation', pt.remarks, od.product_name) as product_name,
+               dd.price,
+               sum(dd.area)                                                      as area,
+               sum(dd.money)                                                     as money,
+               sum(dd.quantity)                                                  as quantity,
+               o.contract_id,
+               od.width,
+               od.height
+        from delivery_detail dd
+                 left join (select product_name,
+                                   order_id,
+                                   product_id,
+                                   order_number,
+                                   CASE
+                                       WHEN height &lt; 4000 AND height >= 3660 and height>width THEN
+                                           '3660&lt;H&lt;4000'
+                                       WHEN height &lt; 5000 AND height >= 4000 and height>width THEN
+                                           '4000&lt;H&lt;5000'
+                                       WHEN height &lt; 6000 AND height >= 5000 and height>width THEN
+                                           '5000&lt;H&lt;6000'
+                                       WHEN height &lt; 7000 AND height >= 6000 and height>width THEN
+                                           '6000&lt;H&lt;7000'
+                                       WHEN height &lt; 8000 AND height >= 7000 and height>width THEN
+                                           '7000&lt;H&lt;8000'
+                                       WHEN height &lt; 9000 AND height >= 8000 and height>width THEN
+                                           '8000&lt;H&lt;9000'
+                                       WHEN height &lt; 10000 AND height >= 9000 and height>width THEN
+                                           '9000&lt;H&lt;10000'
+                                       WHEN height &lt; 11000 AND height >= 10000 and height>width THEN
+                                           '10000&lt;H&lt;11000'
+                                       WHEN height &lt; 12000 AND height >= 11000 and height>width THEN
+                                           '11000&lt;H&lt;12000'
+                                       ELSE
+                                           ''
+                                       END height,
+                                   CASE
+
+                                       WHEN width &lt; 4000 AND width >= 3660 and width>height THEN
+                                           '3660&lt;H&lt;4000'
+                                       WHEN width &lt; 5000 AND width >= 4000 and width>height THEN
+                                           '4000&lt;H&lt;5000'
+                                       WHEN width &lt; 6000 AND width >= 5000 and width>height THEN
+                                           '5000&lt;H&lt;6000'
+                                       WHEN width &lt; 7000 AND width >= 6000 and width>height THEN
+                                           '6000&lt;H&lt;7000'
+                                       WHEN width &lt; 8000 AND width >= 7000 and width>height THEN
+                                           '7000&lt;H&lt;8000'
+                                       WHEN width &lt; 9000 AND width >= 8000 and width>height THEN
+                                           '8000&lt;H&lt;9000'
+                                       WHEN width &lt; 10000 AND width >= 9000 and width>height THEN
+                                           '9000&lt;H&lt;10000'
+                                       WHEN width &lt; 11000 AND width >= 10000 and width>height THEN
+                                           '10000&lt;H&lt;11000'
+                                       WHEN width &lt; 12000 AND width >= 11000 and width>height THEN
+                                           '11000&lt;H&lt;12000'
+                                       ELSE
+                                           ''
+                                       END width
+                            from order_detail) as od on dd.order_id = od.order_id and dd.order_number = od.order_number
+                 left join product pt on pt.id = od.product_id
+                 left join sd.`order` o on o.order_id = dd.order_id
+
+
+        where dd.delivery_id like concat('%', #{deliveryId}, '%')
+
+        group by od.order_id, od.product_name,od.width,od.height, dd.price
+    </select>
+
+    <select id="getSelectDeliveryPrintingNoMoney" resultMap="selectDeliveryDetailOrderDetail" >
+        select dd.delivery_id,
+               od.order_id,
+               IF(#{type} = 'product_abbreviation', pt.remarks, od.product_name) as product_name,
+               sum(dd.area)                                                      as area,
+               sum(dd.quantity)                                                  as quantity,
+               o.contract_id,
+               od.width,
+               od.height
+        from delivery_detail dd
+                 left join (select product_name,
+                                   order_id,
+                                   product_id,
+                                   order_number,
+                                   CASE
+                                       WHEN height &lt; 4000 AND height >= 3660 and height>width THEN
+                                           '3660&lt;H&lt;4000'
+                                       WHEN height &lt; 5000 AND height >= 4000 and height>width THEN
+                                           '4000&lt;H&lt;5000'
+                                       WHEN height &lt; 6000 AND height >= 5000 and height>width THEN
+                                           '5000&lt;H&lt;6000'
+                                       WHEN height &lt; 7000 AND height >= 6000 and height>width THEN
+                                           '6000&lt;H&lt;7000'
+                                       WHEN height &lt; 8000 AND height >= 7000 and height>width THEN
+                                           '7000&lt;H&lt;8000'
+                                       WHEN height &lt; 9000 AND height >= 8000 and height>width THEN
+                                           '8000&lt;H&lt;9000'
+                                       WHEN height &lt; 10000 AND height >= 9000 and height>width THEN
+                                           '9000&lt;H&lt;10000'
+                                       WHEN height &lt; 11000 AND height >= 10000 and height>width THEN
+                                           '10000&lt;H&lt;11000'
+                                       WHEN height &lt; 12000 AND height >= 11000 and height>width THEN
+                                           '11000&lt;H&lt;12000'
+                                       ELSE
+                                           ''
+                                       END height,
+                                   CASE
+
+                                       WHEN width &lt; 4000 AND width >= 3660 and width>height THEN
+                                           '3660&lt;H&lt;4000'
+                                       WHEN width &lt; 5000 AND width >= 4000 and width>height THEN
+                                           '4000&lt;H&lt;5000'
+                                       WHEN width &lt; 6000 AND width >= 5000 and width>height THEN
+                                           '5000&lt;H&lt;6000'
+                                       WHEN width &lt; 7000 AND width >= 6000 and width>height THEN
+                                           '6000&lt;H&lt;7000'
+                                       WHEN width &lt; 8000 AND width >= 7000 and width>height THEN
+                                           '7000&lt;H&lt;8000'
+                                       WHEN width &lt; 9000 AND width >= 8000 and width>height THEN
+                                           '8000&lt;H&lt;9000'
+                                       WHEN width &lt; 10000 AND width >= 9000 and width>height THEN
+                                           '9000&lt;H&lt;10000'
+                                       WHEN width &lt; 11000 AND width >= 10000 and width>height THEN
+                                           '10000&lt;H&lt;11000'
+                                       WHEN width &lt; 12000 AND width >= 11000 and width>height THEN
+                                           '11000&lt;H&lt;12000'
+                                       ELSE
+                                           ''
+                                       END width
+                            from order_detail) as od on dd.order_id = od.order_id and dd.order_number = od.order_number
+                 left join product pt on pt.id = od.product_id
+                 left join sd.`order` o on o.order_id = dd.order_id
+
+
+        where dd.delivery_id like concat('%', #{deliveryId}, '%')
+
+        group by od.order_id, od.product_name, width, height
+    </select>
+
+
+    <select id="getSelectDeliveryPrintingMoneySpecifications" >
+        select od.order_id,
+               od.width,
+               od.height,
+               od.product_name,
+               sum(dd.area)                                                      as area,
+               sum(dd.money)                                                     as money,
+               sum(dd.quantity)                                                  as quantity,
+               dd.price
+        from delivery_detail dd
+                 left join order_detail od on dd.order_id = od.order_id and dd.order_number = od.order_number
+                 left join product p on od.product_id = p.id
+        where delivery_id = #{deliveryId}
+          and od.order_id = #{orderId}
+          and od.product_id = #{productId}
+        group by od.width,od.height, dd.price
+    </select>
+
+    <select id="getSelectDeliveryPrintingNoMoneySpecifications"  >
+        select od.order_id,
+               od.width,
+               od.height,
+               od.product_name,
+               sum(dd.area)                                                     as area,
+               sum(dd.quantity)                                                  as quantity
+        from delivery_detail dd
+                 left join order_detail od on dd.order_id = od.order_id and dd.order_number = od.order_number
+                 left join product p on od.product_id = p.id
+        where delivery_id = #{deliveryId}
+          and od.order_id = #{orderId}
+          and od.product_id = #{productId}
+        group by od.width,od.height
     </select>
 
     <select id="getSelectOrderPrinting"  >
@@ -1007,6 +1200,7 @@
                dd.area,
                ifnull(od.processing_note,"") as processingNote,
                ifnull(od.building_number,"") as buildingNumber,
+               dd.box_no,
                dd.price,
                od.other_columns,
                od.remarks
diff --git a/north-glass-erp/src/main/resources/mapper/sd/DeliveryMapper.xml b/north-glass-erp/src/main/resources/mapper/sd/DeliveryMapper.xml
index 7fbb747..d173157 100644
--- a/north-glass-erp/src/main/resources/mapper/sd/DeliveryMapper.xml
+++ b/north-glass-erp/src/main/resources/mapper/sd/DeliveryMapper.xml
@@ -79,7 +79,7 @@
         update  sd.delivery set payment_terms=#{delivery.paymentTerms},
                                 delivery_date=#{delivery.deliveryDate},
                                 pay_method=#{delivery.payMethod},
-                                pay_date=#{delivery.payDate},contacts=#{delivery.creator},contact_number=#{delivery.contactNumber},
+                                pay_date=#{delivery.payDate},contacts=#{delivery.contacts},contact_number=#{delivery.contactNumber},
                                 delivery_address=#{delivery.deliveryAddress},
                                 freight=#{delivery.freightPrice}*#{delivery.freightQuantity},
                                 freight_price=#{delivery.freightPrice},
@@ -250,7 +250,7 @@
         select
         d.order_id,d.quantity,round(d.money,0) as money ,d.area,d.project,
         d.customer_id,d.customer_name,d.creator,d.salesman,d.salesman_id,
-        d.processing_note,d.contract_id
+        d.processing_note,d.contract_id,d.delivery_date
         from sd.`order` d
         <where>
             <if test="orderDetail.orderId != null and orderDetail.orderId != ''">
diff --git a/north-glass-erp/src/main/resources/mapper/sd/OrderDetailMapper.xml b/north-glass-erp/src/main/resources/mapper/sd/OrderDetailMapper.xml
index d08023b..9d88fdc 100644
--- a/north-glass-erp/src/main/resources/mapper/sd/OrderDetailMapper.xml
+++ b/north-glass-erp/src/main/resources/mapper/sd/OrderDetailMapper.xml
@@ -28,7 +28,8 @@
                             weight,
                             perimeter,
                             monolithic_perimeter,
-                            other_columns
+                            other_columns,
+                            file_name
                           )
         values
         <foreach collection ="orderDetails" item="orderDetail" separator =",">
@@ -55,7 +56,8 @@
             #{orderDetail.weight},
             #{orderDetail.perimeter},
             #{orderDetail.monolithicPerimeter},
-            #{orderDetail.otherColumns}
+            #{orderDetail.otherColumns},
+            #{orderDetail.fileName}
              )
         </foreach>
     </insert>
@@ -1066,7 +1068,9 @@
         group by od.product_id,pd.detail
     </select>
 
-
+    <delete id="deleteOrderFile" >
+        delete from sd.order_file where order_id = #{orderId}
+    </delete>
 
 
 
diff --git a/north-glass-erp/src/main/resources/mapper/sd/OrderGlassDetailMapper.xml b/north-glass-erp/src/main/resources/mapper/sd/OrderGlassDetailMapper.xml
index 89b7247..2af4985 100644
--- a/north-glass-erp/src/main/resources/mapper/sd/OrderGlassDetailMapper.xml
+++ b/north-glass-erp/src/main/resources/mapper/sd/OrderGlassDetailMapper.xml
@@ -93,6 +93,7 @@
         <result column="child_width" property="childWidth"/>
         <result column="child_height" property="childHeight"/>
         <result column="arc" property="arc"/>
+        <result column="arch_rise" property="archRise"/>
         <result column="icon" property="icon"/>
         <result column="process" property="process"/>
         <result column="area" property="area"/>
@@ -133,6 +134,7 @@
            a.child_width,
            a.child_height,a.arc,
            a.icon,
+           a.arch_rise,
            a.area,
            b.quantity,
            a.process,
@@ -156,7 +158,8 @@
                 a.total_area = #{item.area}*b.quantity,
                 a.icon = #{item.icon},
                 a.process = #{item.process},
-                a.arc = #{item.arc}
+                a.arc = #{item.arc},
+                a.arch_rise = #{item.archRise}
             where
                 a.order_id = b.order_id
                 and a.order_id = #{item.orderId}
@@ -202,4 +205,29 @@
 
     </select>
 
+    <select id="getMaxIdByGroup" >
+        select max(id) from sd.order_glass_detail as a
+        where a.order_id = #{orderId}
+          and a.order_number = #{orderNumber}
+          and a.`group` = #{group}
+
+    </select>
+
+
+    <select id="getMinTechnologyNumberByGroup" >
+        select min(technology_number) from sd.order_glass_detail as a
+        where a.order_id = #{orderId}
+          and a.order_number = #{orderNumber}
+          and a.`group` = #{group}
+
+    </select>
+
+    <select id="getMaxTechnologyNumberByGroup" >
+        select max(technology_number) from sd.order_glass_detail as a
+        where a.order_id = #{orderId}
+          and a.order_number = #{orderNumber}
+          and a.`group` = #{group}
+
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/north-glass-erp/src/main/resources/mapper/sd/OrderMapper.xml b/north-glass-erp/src/main/resources/mapper/sd/OrderMapper.xml
index 4322a81..ee11ca0 100644
--- a/north-glass-erp/src/main/resources/mapper/sd/OrderMapper.xml
+++ b/north-glass-erp/src/main/resources/mapper/sd/OrderMapper.xml
@@ -110,7 +110,7 @@
             sd.`order` as o
         left join mm.finished_goods_inventory as  fgi
         on o.order_id = fgi.order_id
-        where  date(o.create_time)>=#{startDate} and date(o.create_time) &lt;= #{endDate}
+        where  date(o.create_time) between #{startDate} and  #{endDate}
 
           <if test="orderType!= null and orderType != ''">
                and o.create_order = #{orderType}
@@ -415,4 +415,25 @@
         and a.layout_id = #{layoutId}
         and a.sort = #{sort}
     </select>
+
+
+    <insert id="saveOrderFile">
+        insert into sd.order_file (order_id,order_number,file_name,file_data,create_time) values(#{orderId},#{orderNumber},#{fileName},#{dxfData},now())
+    </insert>
+
+    <select id="selectOrderFile">
+        select  * from sd.order_file
+        where order_id = #{orderId} and order_number = #{orderNumber}
+
+    </select>
+
+    <select id="selectOrderFileList">
+        select  * from sd.order_file
+        where order_id = #{orderId}
+
+    </select>
+
+    <update id="updateOrderFile">
+        update sd.order_file set file_name=#{fileName},file_data=#{dxfData},create_time=now() where order_id=#{orderId} and order_number=#{orderNumber}
+    </update>
 </mapper>
\ No newline at end of file
diff --git a/north-glass-erp/src/main/resources/mapper/sd/OrderProcessDetailMapper.xml b/north-glass-erp/src/main/resources/mapper/sd/OrderProcessDetailMapper.xml
index 1122a2f..02be7dc 100644
--- a/north-glass-erp/src/main/resources/mapper/sd/OrderProcessDetailMapper.xml
+++ b/north-glass-erp/src/main/resources/mapper/sd/OrderProcessDetailMapper.xml
@@ -129,6 +129,7 @@
         from order_process_detail as a
         left join `order` as b on a.order_id=b.order_id
         where b.create_time BETWEEN #{selectTime1} and #{selectTime2}
+          and position(#{orderId} in b.order_id)
         group by process
 
     </select>
@@ -144,11 +145,12 @@
                    left join sd.`order` o2 on c.order_id = o2.order_id,
                    (SELECT @i:=-1) as d
               where o2.create_time BETWEEN #{selectTime1} and #{selectTime2}
+                and position(#{orderId} in o2.order_id)
               GROUP BY order_number
              ) as b
              on b.order_number = a.order_number
         left join sd.`order` o on a.order_id = o.order_id
-        where o.create_time BETWEEN #{selectTime1} and #{selectTime2}
+        where o.create_time BETWEEN #{selectTime1} and #{selectTime2} and position(#{orderId} in o.order_id)
         group by a.order_number
     </select>
     
@@ -156,12 +158,14 @@
         select a.process from sd.order_process_detail as a,
                               (select id,process from sd.order_process_detail
                                   where process_id=#{processId}
-                                    and technology_number=#{technologyNumber}
+                                    and position(technology_number in #{technologyNumber})
+                                    and order_number=#{orderNumber}
                                     and process=#{thisProcess}
                                 group by process) as b
         where a.id = b.id + 1
         and a.process_id=#{processId}
-        and a.technology_number=#{technologyNumber}
+        and a.order_number=#{orderNumber}
+        and position(a.technology_number in #{technologyNumber})
 
     </select>
 
diff --git a/north-glass-erp/src/main/resources/mapper/sd/ProductDetailMapper.xml b/north-glass-erp/src/main/resources/mapper/sd/ProductDetailMapper.xml
index 042d336..c141a7f 100644
--- a/north-glass-erp/src/main/resources/mapper/sd/ProductDetailMapper.xml
+++ b/north-glass-erp/src/main/resources/mapper/sd/ProductDetailMapper.xml
@@ -25,4 +25,12 @@
                 )
         </foreach>
     </insert>
+
+    <select id="getGlassNameByGroup">
+    SELECT GROUP_CONCAT(detail SEPARATOR '+')
+    from sd.product_detail
+    where prod_id = #{productId}
+      and glass_sort >= #{minTechnologyNumberByGroup}
+      and glass_sort &gt;= #{minTechnologyNumberByGroup}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/north-glass-erp/src/main/resources/mapper/sd/ProductMapper.xml b/north-glass-erp/src/main/resources/mapper/sd/ProductMapper.xml
index 2edce48..4976f9c 100644
--- a/north-glass-erp/src/main/resources/mapper/sd/ProductMapper.xml
+++ b/north-glass-erp/src/main/resources/mapper/sd/ProductMapper.xml
@@ -133,4 +133,14 @@
     <update id="updateProductStateById">
         update product set state = #{state} where id = #{id}
     </update>
+
+    <select id="getGlassThickness">
+        select sum(REPLACE(JSON_UNQUOTE(JSON_EXTRACT(separation, '$.thickness')),'mm',''))
+        from product_detail as a
+        where a.prod_id = #{productId}
+        and a.id &lt;= (select b.id
+                        from product_detail as b
+                        where b.prod_id = #{productId} and b.glass_sort = #{technologyNumber})
+
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/north-glass-erp/src/test/java/com/example/erp/service/sd/BasicDateServiceTest.java b/north-glass-erp/src/test/java/com/example/erp/service/sd/BasicDataServiceTest.java
similarity index 61%
rename from north-glass-erp/src/test/java/com/example/erp/service/sd/BasicDateServiceTest.java
rename to north-glass-erp/src/test/java/com/example/erp/service/sd/BasicDataServiceTest.java
index 5af50a6..6efa571 100644
--- a/north-glass-erp/src/test/java/com/example/erp/service/sd/BasicDateServiceTest.java
+++ b/north-glass-erp/src/test/java/com/example/erp/service/sd/BasicDataServiceTest.java
@@ -4,13 +4,12 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
-import static org.junit.jupiter.api.Assertions.*;
 @SpringBootTest
-class BasicDateServiceTest {
+class BasicDataServiceTest {
     @Autowired
-    private BasicDateService basicDateService;
+    private BasicDataService basicDataService;
     @Test
     void  getOrderBasicData() {
-        basicDateService.getOrderBasicData();
+        basicDataService.getOrderBasicData();
     }
 }
\ No newline at end of file

--
Gitblit v1.8.0