chenlu
2025-07-30 e9f8d23f55f64903d834308f9f167aaf3195c20d
Merge branch 'master' of http://10.153.19.25:10105/r/ERP_override

# Conflicts:
# north-glass-erp/northglass-erp/config.js
12个文件已添加
3 文件已重命名
134个文件已修改
11999 ■■■■■ 已修改文件
north-glass-erp/northglass-erp/config.js 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/package-lock.json 1512 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/package.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/mm/PrintPackingList.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/mm/PrintPackingListLuoyang.vue 373 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/mm/materialOutbound/PrintSheet1.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelDetails.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/pp/PrintProcess.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/pp/PrintProcessReplenish.vue 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/pp/TagStyleDesigner.vue 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet1.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet2.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyang.vue 405 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyangDetails.vue 486 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/order/OrderProcess.vue 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet2.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet3.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/order/UpdateAlienEditor.vue 577 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/order/UploadPicture.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/ar.js 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/en.js 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/kr.js 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/ru.js 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/zh.js 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/router/index.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/天津北玻.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/常州吉利.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/新疆恒鑫.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/洛阳北玻.js 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/金华天成.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/utils/decimal.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/utils/request.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/utils/requestTemp.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/basicData/WarehouseBasicData.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/basicData/canvas.vue 696 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/ingredientStock/CreateOutBound.vue 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/ingredientStock/MaterialOutbound.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/ingredientStock/SelectIngredientsStock.vue 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/productStock/CreateProductStock.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/productStock/FinishedProductOut.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/productStock/ProductStockList.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecord.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecordPint.vue 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/stockReport/MaterialOutboundReport.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/GlassComputed.vue 190 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/Compute.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ComputeCard.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCardDetail.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue 231 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCard.vue 152 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/processCard/PrintFlowCardDetails.vue 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/processCard/PrintLabel.vue 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintFlowCard.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/processCard/SelectPrintProject.vue 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/processCard/SelectProcessCard.vue 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/replenish/PrintReplenishFlowCard.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/DamageReport.vue 144 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/OrderReportingWorks.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/ProcessToBeCompleted.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/Report.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/SplittingDetailsOutside.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/TaskCompletionStatus.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/TeamOutput.vue 135 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgress.vue 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgressCombination.vue 467 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/delivery/CreateDelivery.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/delivery/SelectDelivery.vue 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/order/CreateOrder.vue 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/order/UpdateOrderCraft.vue 807 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/product/CreateProduct.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/package-lock.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/mm/BasicWarehouseTypeController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/mm/FinishedGoodsInventoryController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/mm/MaterialInventoryController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/pp/GlassOptimizeController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/pp/ProcessCardController.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportingWorkController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/sd/BasicDataController.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/sd/OrderController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/dto/pp/DamageReportDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/dto/pp/FlowCardDTO.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/dto/pp/TeamOutputDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressCombinationDTO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedGoodsInventory.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedOperateLog.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialLog.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialOutbound.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/entity/sd/DeliveryDetail.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderDetail.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/entity/sd/OrderGlassDetail.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/mm/BasicWarehouseTypeMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedGoodsInventoryMapper.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedOperateLogMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/mm/MaterialInventoryMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/pp/FlowCardMapper.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportMapper.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportingWorkMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReworkMapper.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/sd/BasicDataMapper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/sd/DeliveryDetailMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderDetailMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderGlassDetailMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderProcessDetailMapper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductDetailMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/sd/ProductMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/mm/BasicWarehouseTypeService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/mm/FinishedGoodsInventoryService.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/mm/MaterialInventoryService.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/FlowCardService.java 163 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/ProductionSchedulingService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/ReportService.java 392 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/ReworkService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/sd/BasicDataService.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/sd/DeliveryService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/sd/OrderService.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/application-prod.yml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/mm/BasicWarehouseType.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/mm/FinishedGoodsInventory.xml 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/mm/FinishedOperateLog.xml 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/mm/MaterialInventory.xml 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml 518 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/Report.xml 972 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/ReportingWork.xml 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/ReworkMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/BasicDataMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/DeliveryDetailMapper.xml 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/DeliveryMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/OrderDetailMapper.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/OrderGlassDetailMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/OrderMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/OrderProcessDetailMapper.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/ProductDetailMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/ProductMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/test/java/com/example/erp/service/sd/BasicDataServiceTest.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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"
}
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",
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",
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 {
north-glass-erp/northglass-erp/src/components/mm/PrintPackingListLuoyang.vue
New file
@@ -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>
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)
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) {
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({
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,13 +104,14 @@
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
    if (compound == null  ){
    const processId = produceList.value[i].detail[0].process_id;
    const url = `${processId}/${technologyNumber}`
    // ç”Ÿæˆ QR Code å¹¶å­˜å‚¨åˆ°æ•°ç»„中
@@ -107,18 +120,24 @@
      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]
        });
     }
    }
    // 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>
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 å¹¶å­˜å‚¨åˆ°æ•°ç»„中
    detail.qrcodeList = []; // åˆå§‹åŒ–
    for (let j = 0; j < mergeStr.length; j++) {
      const singleTech = mergeStr[j]; // å–出每一位字符
      const url = `${processId}/${singleTech}`;
    const qrcodeData = await QRCode.toDataURL(url);
    produceList.value[i].detail[0]["qrcodeList"].push({
      detail.qrcodeList.push({
      qrcode: qrcodeData,
      technologyNumber: technologyNumber
        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>
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>
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">宽X高</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>
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">宽X高</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>
north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyang.vue
New file
@@ -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>
north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheetLuoyangDetails.vue
New file
@@ -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>
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"
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>
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>
north-glass-erp/northglass-erp/src/components/sd/order/UpdateAlienEditor.vue
New file
@@ -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('解析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('解析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>
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()
}
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:'تقرير Ø§Ù„عملية Ø§Ù„معلقة',
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',
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:'완료해야 í•  í”„로세스 ë³´ê³ ì„œ',
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:'Отчет Ð¾ Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ð¾Ð¹ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸',
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:'流程卡进度报表',
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'),
    }
    
  ]
north-glass-erp/northglass-erp/src/stores/sd/companySet/Ìì½ò±±²£.js
@@ -3,6 +3,7 @@
export default defineStore('companyInfo', {
    state: () => ({
        hollow:'*',
        notChangeProduct:true,//天津true,其他false,是否开启非本人创建的产品不能修改
        timeOut:false,//金华true,其他false,是否开启超时改变复选框状态
        connectMes:false,//常州,义乌true,其他false,显示订单报工转移是否启用
@@ -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})?)$/,//正则0.00-99999.99
            //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//正则0.00-9999.99
            msg:'basicData.msg.range99999Dec2'
        },
        orderIdType:'year',//后端生成订单号类型,day:每天生成,month:每月生成,year:每年生成
        deliveryIdType:'day',
        deliveryIdType:'day',//后端生成发货单号类型,day:每天生成,month:每月生成
        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,//发货默认出库,默认出库为true
        flowCardMerge: 0,//流程卡合片打印,1合并,其他不合并
        printBtn:0,//打印界面三个按钮中是否显示标签打印相关按钮,0显示,1其它不显示
        printNumber:true,//多选订单打印流程卡是否显示右上角序号义乌false,其它true
        materialOutboundColor:false,//库存查询入库超过一定时间改变颜色,洛阳true,其他false
        storageBtn:false,//是否显示报工入库相关内容,洛阳true,其他false
        teamsType:false,//是否开启班组下拉框,洛阳true,其他false
        alienFunction:false,//是否开启异形功能,暂时都是false
        //天津
        printLabel: {
            custom: (item1) => {
north-glass-erp/northglass-erp/src/stores/sd/companySet/³£ÖݼªÀû.js
@@ -3,6 +3,7 @@
export default defineStore('companyInfo', {
    state: () => ({
        hollow:'*',
        notChangeProduct:false,//天津true,其他false,是否开启非本人创建的产品不能修改
        timeOut:false,//金华true,其他false,是否开启超时改变复选框状态
        connectMes:true,//常州,义乌true,其他false,显示订单报工转移是否启用
@@ -10,7 +11,7 @@
        address:'常州市天宁区郑陆镇大明南路8号',
        telephone:'022-59280088',
        fax:'022-59280066',
        errorArea:0.4,
        errorArea:0.4,//结算面积误差
        widHeiLength:{//订单宽高长度
            regexp:/^(\d{1,4})$/,//正则四位整数
            //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//正则0.00-9999.99
@@ -19,23 +20,28 @@
        orderIdType:'month',//后端生成订单号类型,day:每天生成,month:每月生成
        deliveryIdType:'month',//后端生成发货单号类型,day:每天生成,month:每月生成
        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,//发货默认出库,默认出库为true
        flowCardMerge: 1,//流程卡合片打印,1合并,其他不合并
        printBtn:0,//打印界面三个按钮中是否显示标签打印相关按钮,0显示常州,1天津其它不显示
        printNumber:true,//多选订单打印流程卡是否显示右上角序号义乌false,其它true
        materialOutboundColor:false,//库存查询入库超过一定时间改变颜色,洛阳true,其他false
        storageBtn:false,//是否显示报工入库相关内容,洛阳true,其他false
        teamsType:false,//是否开启班组下拉框,洛阳true,其他false
        alienFunction:false,//是否开启异形功能,暂时都是false
        //天津
        printLabel: {
            custom: (item1) => {
north-glass-erp/northglass-erp/src/stores/sd/companySet/н®ºãöÎ.js
@@ -3,6 +3,7 @@
export default defineStore('companyInfo', {
    state: () => ({
        hollow:'*',
        notChangeProduct:false,//天津true,其他false,是否开启非本人创建的产品不能修改
        timeOut:false,//金华true,其他false,是否开启超时改变复选框状态
        connectMes:false,//常州,义乌true,其他false,显示订单报工转移是否启用
@@ -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})?)$/,//正则0.00-99999.99
            //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//正则0.00-9999.99
@@ -19,24 +20,28 @@
        orderIdType:'year',//后端生成订单号类型,day:每天生成,month:每月生成,year:按年生成
        deliveryIdType:'day',//后端生成发货单号类型,day:每天生成,month:每月生成
        deliveryDate:15,//订单创建送货日期 å¤©æ´¥7天,常州7天,义乌15天,新疆15天
        columnName:'图号',
        columnName:'图号',//打印生产单时需要显示的列名,没有为空
        selectOrderReviewShow:true, //订单首页加工单审核按钮是否显示
        productName:"product_name",//产品创建时重复验证,‘product_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,//发货默认出库,默认出库为true
        flowCardMerge: 0,//流程卡合片打印,1合并,其他不合并
        printBtn:1,//打印界面三个按钮中是否显示标签打印相关按钮,0显示常州,1天津其它不显示
        printNumber:true,//多选订单打印流程卡是否显示右上角序号义乌false,其它true
        materialOutboundColor:false,//库存查询入库超过一定时间改变颜色,洛阳true,其他false
        storageBtn:false,//是否显示报工入库相关内容,洛阳true,其他false
        teamsType:false,//是否开启班组下拉框,洛阳true,其他false
        alienFunction:false,//是否开启异形功能,暂时都是false
        //天津
        printLabel: {
            custom: (item1) => {
north-glass-erp/northglass-erp/src/stores/sd/companySet/ÂåÑô±±²£.js
New file
@@ -0,0 +1,138 @@
import {defineStore} from "pinia";
export default defineStore('companyInfo', {
    state: () => ({
        hollow:'+',
        notChangeProduct:false,//天津true,其他false,是否开启非本人创建的产品不能修改
        timeOut:false,//金华true,其他false,是否开启发货超时改变复选框状态颜色
        connectMes:false,//常州,义乌true,其他false,显示订单报工转移是否启用
        companyName: '洛阳北方玻璃技术股份有限公司',
        address:'洛阳国家高新技术开发区',
        telephone:'0379-64312861',
        fax:'0379-64332066',
        errorArea:0.5,
        widHeiLength:{//订单宽高长度
            regexp:/^(0|[1-9][0-9]{0,4}([.][0-9]{1,2})?)$/,//正则0.00-99999.99
            //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//正则0.00-9999.99
            msg:'basicData.msg.range99999Dec2'
        },
        orderIdType:'day',//后端生成订单号类型,day:每天生成,month:每月生成,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: ['温馨提示:我司负责只送不卸。货到工地或工厂后,请于五天内安装完毕,如未能及时安装完毕,请放置于阴凉干燥处,并做好防晒防淋的措施,防止玻璃发霉;所有单片镀膜玻璃请勿用带酸性或碱性的液体清洗膜面。',
            '声明:货到工地或工厂后,如若贵司不及时的安装或未做防晒防淋措施导致的玻璃发霉,我司概不负责。',
            '收货时需验收产品数量、规格及有无破损,如发现问题需于收货三日内,以书面通知并附上现场证明材料(如破损照片等),相关证明资料不足,或在上述日期内未提出质量异议的,逾期视为产品合格,我司将不予承担任何责任。敬请留意!'],
        deliveryOutbound: false,//发货默认出库
        flowCardMerge: 0,//流程卡合片打印
        printBtn:1,//打印界面三个按钮中是否显示标签打印相关按钮,0显示常州,1天津其它不显示
        materialOutboundColor:true,//库存查询入库超过一定时间改变颜色,洛阳true,其他false
        storageBtn:true,//是否显示报工入库相关内容,洛阳true,其他false
        teamsType:true,//是否开启班组下拉框,洛阳true,其他false
        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:'正品',
                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:'正品',
                lackOf:'次品',
                processingNote: (itemtextarea) => {
                    return  `${itemtextarea.processing_note}`
                },
            },
            hideButton:'false',
        },
    }),
    actions: {
        //
    }
})
north-glass-erp/northglass-erp/src/stores/sd/companySet/½ð»ªÌì³É.js
@@ -3,6 +3,7 @@
export default defineStore('companyInfo', {
    state: () => ({
        hollow:'*',
        notChangeProduct:false,//天津true,其他false,是否开启非本人创建的产品不能修改
        timeOut:true,//金华true,其他false,是否开启发货超时改变复选框状态颜色
        connectMes:true,//常州,义乌true,其他false,显示订单报工转移是否启用
@@ -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})?)$/,//正则0.00-99999.99
            //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//正则0.00-9999.99
            msg:'basicData.msg.range99999Dec2'
        },
        orderIdType:'year',//后端生成订单号类型,day:每天生成,month:每月生成,year:每年生成
        deliveryIdType:'day',
        deliveryIdType:'day',//后端生成发货单号类型,day:每天生成,month:每月生成
        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: ['温馨提示:我司负责只送不卸。货到工地或工厂后,请于五天内安装完毕,如未能及时安装完毕,请放置于阴凉干燥处,并做好防晒防淋的措施,防止玻璃发霉;所有单片镀膜玻璃请勿用带酸性或碱性的液体清洗膜面。',
            '声明:货到工地或工厂后,如若贵司不及时的安装或未做防晒防淋措施导致的玻璃发霉,我司概不负责。',
            '收货时需验收产品数量、规格及有无破损,如发现问题需于收货三日内,以书面通知并附上现场证明材料(如破损照片等),相关证明资料不足,或在上述日期内未提出质量异议的,逾期视为产品合格,我司将不予承担任何责任。敬请留意!'],
        deliveryOutbound: false,//发货默认出库
        flowCardMerge: 0,//流程卡合片打印
            '收货时需验收产品数量、规格及有无破损,如发现问题需于收货三日内,以书面通知并附上现场证明材料(如破损照片等),相关证明资料不足,或在上述日期内未提出质量异议的,逾期视为产品合格,我司将不予承担任何责任。敬请留意!'],//打印发货单的备注
        deliveryOutbound: false,//发货默认出库,默认出库为true
        flowCardMerge: 0,//流程卡合片打印,1合并,其他不合并
        printBtn:1,//打印界面三个按钮中是否显示标签打印相关按钮,0显示常州,1天津其它不显示
        printNumber:true,//多选订单打印流程卡是否显示右上角序号义乌false,其它true
        materialOutboundColor:false,//库存查询入库超过一定时间改变颜色,洛阳true,其他false
        storageBtn:false,//是否显示报工入库相关内容,洛阳true,其他false
        teamsType:false,//是否开启班组下拉框,洛阳true,其他false
        alienFunction:false,//是否开启异形功能,暂时都是false
        //天津
        printLabel: {
            custom: (item1) => {
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
}
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
})
//
north-glass-erp/northglass-erp/src/utils/requestTemp.js
New file
@@ -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 æ‹¦æˆªå™¨
// å¯ä»¥è‡ªè¯·æ±‚发送前对请求做一些处理
// æ¯”如统一加token,对请求参数统一加密
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 æ‹¦æˆªå™¨
// å¯ä»¥åœ¨æŽ¥å£å“åº”后统一处理结果
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
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>
north-glass-erp/northglass-erp/src/views/mm/basicData/canvas.vue
New file
@@ -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('解析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>
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>
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},
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,8 +104,10 @@
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)
@@ -122,6 +127,9 @@
    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>
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,
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"
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,6 +76,9 @@
onMounted(() => {
  addListener(xGrid.value,gridOptions)
//第一次调用
request.post(`/finishedGoodsInventory/getSelect/1/${total.pageSize}`,filterData.value).then((res) => {
@@ -90,6 +94,9 @@
    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>
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) {
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
            }
            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>
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' }},
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) {
      // æ­£ç¡®è®¿é—®åµŒå¥—的数据结构
      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: '正在计算中,请稍候...',
      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);
    // æ£€æŸ¥å“åº”结构并正确处理
    if (response && (response.code === 200 || response.status === 200)) {
      // ElMessage.success('模拟计算成功!');
      // å¤„理返回的数据
      let resultData = response.data;
      // å¦‚æžœdata是字符串,需要解析JSON
      if (typeof resultData === 'string') {
        try {
          resultData = JSON.parse(resultData);
        } catch (parseError) {
          console.error('解析返回数据失败:', parseError);
          ElMessage.warning('返回数据格式异常,使用原始数据');
          // å³ä½¿è§£æžå¤±è´¥ä¹Ÿç»§ç»­ä½¿ç”¨åŽŸå§‹æ•°æ®
        }
      }
      // æ›´æ–°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;
@@ -101,12 +192,22 @@
  }else{
    state.value=2
  }
  if(props.project!=null){
    computed.value.glass_thickness=props.project.glass_thickness
    computed.value.glass_type=props.project.glass_type
  }
  // è®¡ç®—钢化流程卡的数量总和
  let maxQty = 0;
  if(data.length>0){
    // éåŽ†æ‰€æœ‰å‹¾é€‰äº†é’¢åŒ–çš„æµç¨‹å¡ï¼Œç´¯åŠ å®ƒä»¬çš„æ•°é‡
    arry.forEach(item => {
      if (item.tempering) {
        maxQty += item.total_num || 0;
      }
    });
    // å°†è®¡ç®—出的钢化数量总和添加到 computed.value ä¸­
    computed.value.max_qty = maxQty;
    if (data.length > 0) {
      // åˆ›å»ºæ‰€æœ‰å¼‚步请求的Promise数组
      const detailPromises = [];
    data.forEach(item=>{
      const processCard = {
        process_no: item.processId,
@@ -124,49 +225,70 @@
        glass_details: []
      };
      request.post(`/glassOptimize/selectComputeDetail/${item.processId}/${item.technologyNumber}/${item.patch_state}`).then((res) => {
        // åˆ›å»ºå¼‚步请求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: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
                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
            }
            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
            processCard.glass_details.push(detail)
          })
            return processCard;
        }else{
          ElMessage.warning(res.msg)
            return processCard;
        }
      })
      computed.value.process_cards.push(processCard)
    })
    console.log(computed.value)
        }).catch(error => {
          console.error('获取详情失败:', error);
          return processCard;
        });
        detailPromises.push(detailPromise);
      });
      // ç­‰å¾…所有异步请求完成
      try {
        const completedProcessCards = await Promise.all(detailPromises);
        // å°†å®Œæˆçš„æµç¨‹å¡æ·»åŠ åˆ°computed.value中
        if (!computed.value.process_cards) {
          computed.value.process_cards = [];
        }
        computed.value.process_cards = completedProcessCards;
        console.log('完整的computed.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: '正在计算中,请稍候...',
      background: 'rgba(0, 0, 0, 0.7)'
    });
   console.log('发送到后端的数据',computedCard.value)
   // console.log('发送到后端的数据',computedCard.value)
  const mockData = {
      code: 200,
      data: [
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 @@
}
// å…¬å…±å¤„理函数,处理相同数据时的操作,并返回targetRoute对象(右键菜单和双击打开)
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;
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
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        // æ·»åŠ çŽ»ç’ƒç±»åž‹å±žæ€§
});
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%',
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>
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))
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')
  }
  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')
    index = Math.max(...leftData.map(d => d.landingSequence || 0)) + 1
      }
    }
    else {
  // æµç¨‹å¡å·
  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
  }
  //判断正整数
  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
  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)
      }
      $gridLeft.insertAt(item)
      //重新赋值key
        const currentLeft = $gridLeft.getTableData().fullData
        $gridLeft.clearSort()
        $gridLeft.loadData([...currentLeft, item])
      item._X_ROW_KEY = key
    })
    //清除两边复选框
    $gridLeft.clearCheckboxRow()
    $grid.clearCheckboxRow()
  } else if (checkedNum.value === '') {//判断数量输入框无输入数字
    } else if (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)
    //清除两边复选框
      const currentLeft = $gridLeft.getTableData().fullData
      $gridLeft.clearSort()
      $gridLeft.loadData([...currentLeft, ...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 }">
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>
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>
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;
}
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;
        }
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>
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')) { // éžIE下载
      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>
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'),
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')) { // éžIE下载
      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>
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')
      }
    }
  ],//表头按钮
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 ''
      })
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>
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')},
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>
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>
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>
north-glass-erp/northglass-erp/src/views/pp/report/WorkInProgressCombination.vue
New file
@@ -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 = /\./; // å®šä¹‰æ­£åˆ™è¡¨è¾¾å¼ï¼ŒæŸ¥æ‰¾å°æ•°ç‚¹
  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')) { // éžIE下载
      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>
north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue
@@ -55,6 +55,8 @@
  classes: '',
  //责任工序
  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>
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>
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},
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>
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.fileName = name
  row.fileData = fileData
  row.shape=2
  ElMessage.success("保存成功")
  alienEditorVisible.value=false
  }
  row.otherColumns.S02 = name
}
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>
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>
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()
@@ -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},
@@ -239,12 +245,21 @@
              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'){
@@ -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文件解析及其导出*/
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('解析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
      <div style="width: 404px;height: 254px;border: 2px solid #000;float: left;
      position: relative;display: flex;justify-content: center;align-content: center;">
          <div id="mains" ref="parent"  >
            <div id="iocn" ref="draggable"
            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>
                :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
            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 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
            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 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 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>
      <div v-if="enlargementFlag" style="width: 400px;height: 250px;float: left;position: relative;">
      <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>
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
      }
    }
north-glass-erp/package-lock.json
New file
@@ -0,0 +1,6 @@
{
  "name": "north-glass-erp",
  "lockfileVersion": 2,
  "requires": true,
  "packages": {}
}
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));
    }
}
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));
    }
}
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));
    }
}
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}")
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");
    }
}
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));
    }
}
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));
    }}
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));
    }
}
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));
    }
}
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("订单序号")
north-glass-erp/src/main/java/com/example/erp/dto/pp/FlowCardDTO.java
New file
@@ -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;
}
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;
}
north-glass-erp/src/main/java/com/example/erp/dto/pp/WorkInProgressCombinationDTO.java
New file
@@ -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;
}
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("编号")
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;
}
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;
north-glass-erp/src/main/java/com/example/erp/entity/mm/MaterialLog.java
@@ -53,5 +53,7 @@
    @ExcelProperty("优化使用数量")
    private Integer useCount;
    private MaterialOutbound materialOutbound;
}
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;
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;
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)
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;
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);
}
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,
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);
}
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();
}
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);
}
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);
}
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,
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);
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);
}
north-glass-erp/src/main/java/com/example/erp/mapper/sd/BasicDataMapper.java
File was renamed from north-glass-erp/src/main/java/com/example/erp/mapper/sd/BasicDateMapper.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);
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,
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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;
    }
}
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) {
north-glass-erp/src/main/java/com/example/erp/service/mm/MaterialInventoryService.java
@@ -978,7 +978,7 @@
            List<MaterialOutbound> materialOutboundList=materialInventoryMapper.getSelectMaterialOutboundProjectNo(projectNo);
            OptimizeUse optimizeUses=materialInventoryMapper.getSelectOptimizeUses(projectNo,width,height);
            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());
@@ -1000,6 +1000,7 @@
            }
            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;
    }
}
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()//正常层
                                        : compound ),//同架层
                                flowCard.getGlassChild(), flowCard.getProcess(), flowCard.getOrderId()));
                        List<Map<String, Object>> detailList = flowCardMapper.getDetailList(flowCard.getProcessId(), flowCard.getTechnologyNumber(), flowCard.getProcess());
                        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("detail", flowCardMapper.getPrimaryListLimt(flowCard.getProcessId(),
                                    String.valueOf("null".equals(compound)
                                            ? flowCard.getTechnologyNumber()//正常层
                                            : 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) {
                //先获取排版状态
                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传过来的值,如果不存在 èµ‹å€¼false
        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;  // ç”¨ç‰¹æ®Šå­—符连接防止冲突
                    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;
    }
}
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;
    }
}
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;
        }
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,16 +295,26 @@
        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("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("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));
@@ -155,7 +322,10 @@
        } 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;
    }
}
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;
            }}
north-glass-erp/src/main/java/com/example/erp/service/pp/ReworkService.java
@@ -208,7 +208,7 @@
                    //删除返工表对应补片id数据
                    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());
north-glass-erp/src/main/java/com/example/erp/service/sd/BasicDataService.java
File was renamed from north-glass-erp/src/main/java/com/example/erp/service/sd/BasicDateService.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);
    }
}
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(),
                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){
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,6 +419,7 @@
    }
    //删除订单
    public Integer deleteOrder(String id) {
        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;
    }
}
north-glass-erp/src/main/resources/application-prod.yml
New file
@@ -0,0 +1,49 @@
server:
  port: 8086
ip: localhost
port: 3309
#sa-token:
#  timeout: 86400
spring:
  profiles:
    active: prod
  datasource:
    dynamic:
      primary: user_info #设置默认的数据源或者数据源组,默认值即为master
      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
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 #设置默认的数据源或者数据源组,默认值即为master
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>
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>
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,
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>
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,
@@ -1276,13 +1329,22 @@
                       ' X ',
                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(height AS CHAR))),
                       ' = ',pl.patch_num   )      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))),
                       ' = ',pl.patch_num   )      as numberSize
                       ' = ',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,
@@ -2107,13 +2245,22 @@
                       ' X ',
                       TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM CAST(ogd.child_height AS CHAR))),
                       ' = ',pl.patch_num   )      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))),
                       ' = ',pl.patch_num   )      as numberSize
                       ' = ',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
@@ -2416,6 +2570,11 @@
                       ' 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,
@@ -3012,6 +3175,11 @@
                       ' 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,
            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>
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
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>
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*/
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">
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
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
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 != ''">
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>
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>
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>
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>
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>
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>
north-glass-erp/src/test/java/com/example/erp/service/sd/BasicDataServiceTest.java
File was renamed from north-glass-erp/src/test/java/com/example/erp/service/sd/BasicDateServiceTest.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();
    }
}