9 天以前 8c14b50773a1e582b652c03f5a63bb2233d069b8
1.仓储物流-采购模块联动
2.仓储物流-销售模块联动
3.清理表数据
已添加13个文件
已修改77个文件
已删除332个文件
48502 ■■■■■ 文件已修改
.claude/rules/database-mcp.md 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.claude/rules/frontend-doc-generation.md 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.claude/rules/frontend-docs.md 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.claude/settings.local.json 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/projectSql/ruoyi-vue-pro.sql 17343 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/purchase_receipt_integration.md 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/sales_shipment_integration.md 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/mes_purchase_receipt_enhance.sql 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/mes_purchase_receipt_sync.sql 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/mes_wm_item_receipt_add_columns.sql 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductCategoryController.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductController.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryCreateReqVO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryListReqVO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryRespVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductPageReqVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductRespVO.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductSaveReqVO.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/CrmProductCategoryDO.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/CrmProductDO.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/package-info.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductCategoryMapper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductMapper.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/product/CrmProductStatusEnum.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmProductStatusParseFunction.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmProductUnitParseFunction.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductCategoryService.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductCategoryServiceImpl.java 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductService.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java 296 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/api/purchase/ErpPurchaseOrderApi.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/api/purchase/dto/ErpPurchaseOrderItemRespDTO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/api/sale/ErpSaleOrderApi.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/api/sale/dto/ErpSaleOrderItemRespDTO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/api/purchase/ErpPurchaseOrderApiImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/api/sale/ErpSaleOrderApiImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mapping/ErpMesWarehouseMappingController.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mapping/vo/ErpMesWarehouseMappingCreateReqVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mapping/vo/ErpMesWarehouseMappingPageReqVO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mapping/vo/ErpMesWarehouseMappingUpdateReqVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductCategoryController.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductUnitController.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/category/ErpProductCategoryListReqVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/category/ErpProductCategoryRespVO.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/category/ErpProductCategorySaveReqVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductPageReqVO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductRespVO.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductSaveReqVO.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/unit/ErpProductUnitPageReqVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/unit/ErpProductUnitRespVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/unit/ErpProductUnitSaveReqVO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseInController.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseRequestController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseReturnController.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInPageReqVO.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInRespVO.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInSaveReqVO.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/returns/ErpPurchaseReturnPageReqVO.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/returns/ErpPurchaseReturnRespVO.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/returns/ErpPurchaseReturnSaveReqVO.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOutController.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleReturnController.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/out/ErpSaleOutPageReqVO.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/out/ErpSaleOutRespVO.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/out/ErpSaleOutSaveReqVO.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/returns/ErpSaleReturnPageReqVO.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/returns/ErpSaleReturnRespVO.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/returns/ErpSaleReturnSaveReqVO.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockController.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockMoveController.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockOutController.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockRecordController.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpWarehouseController.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckPageReqVO.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckRespVO.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckSaveReqVO.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/in/ErpStockInPageReqVO.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/in/ErpStockInRespVO.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/in/ErpStockInSaveReqVO.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/move/ErpStockMovePageReqVO.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/move/ErpStockMoveRespVO.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/move/ErpStockMoveSaveReqVO.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/out/ErpStockOutPageReqVO.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/out/ErpStockOutRespVO.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/out/ErpStockOutSaveReqVO.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/record/ErpStockRecordPageReqVO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/record/ErpStockRecordRespVO.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/stock/ErpStockPageReqVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/stock/ErpStockRespVO.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehousePageReqVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseRespVO.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseSaveReqVO.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/convert/mapping/ErpMesWarehouseMappingConvert.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/finance/ErpFinancePaymentItemDO.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/finance/ErpFinanceReceiptItemDO.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/mapping/ErpMesWarehouseMappingDO.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/product/ErpProductCategoryDO.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/product/ErpProductDO.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/product/ErpProductUnitDO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseInDO.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseInItemDO.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseOrderDO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseOrderItemDO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseRequestDO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseRequestItemDO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseReturnDO.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseReturnItemDO.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleOrderDO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleOrderItemDO.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleOutDO.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleOutItemDO.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleReturnDO.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleReturnItemDO.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockCheckDO.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockCheckItemDO.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockDO.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockInDO.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockInItemDO.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockMoveDO.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockMoveItemDO.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockOutDO.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockOutItemDO.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockRecordDO.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpWarehouseDO.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/mapping/ErpMesWarehouseMappingMapper.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductCategoryMapper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductMapper.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductUnitMapper.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseInItemMapper.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseInMapper.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseReturnItemMapper.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseReturnMapper.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleOutItemMapper.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleOutMapper.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleReturnItemMapper.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleReturnMapper.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckItemMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckMapper.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInItemMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInMapper.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockMapper.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockMoveItemMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockMoveMapper.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutItemMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutMapper.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockRecordMapper.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpWarehouseMapper.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/redis/no/ErpNoRedisDAO.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpPurchaseOrderInStatusEnum.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpSaleOrderOutStatusEnum.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/stock/ErpStockRecordBizTypeEnum.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinanceReceiptServiceImpl.java 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductCategoryService.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductCategoryServiceImpl.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductService.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java 287 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductUnitService.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductUnitServiceImpl.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/mapping/ErpMdmMappingService.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/mapping/ErpMdmMappingServiceImpl.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/mapping/ErpMesWarehouseMappingService.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/mapping/ErpMesWarehouseMappingServiceImpl.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInService.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInServiceImpl.java 384 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseReturnService.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseReturnServiceImpl.java 304 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutService.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutServiceImpl.java 389 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleReturnService.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleReturnServiceImpl.java 316 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockCheckService.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockCheckServiceImpl.java 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInService.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInServiceImpl.java 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockMoveService.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockMoveServiceImpl.java 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutService.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutServiceImpl.java 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockRecordService.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockRecordServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseService.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseServiceImpl.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/bo/ErpStockRecordCreateReqBO.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/approval/HrmLeaveApplicationController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/approval/HrmResignationApplicationController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/approval/HrmTransferApplicationController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmLeaveApplicationServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticePageReqVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptRespVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineRespVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineSaveReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeSaveReqVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineRespVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeLineDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDetailDO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptLineDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesDO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeLineDO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmSalesNoticeStatusEnum.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/listener/MesWmItemReceiptStatusListener.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms-api/pom.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsPurchaseInboundReqDTO.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsSalesOutboundReqDTO.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsStockDetailRespDTO.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsStockQueryReqDTO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/stock/WmsStockApi.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/transaction/WmsTransactionApi.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/transaction/WmsTransactionCreateReqDTO.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/pom.xml 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/WmsHomeStatisticsController.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeInventorySummaryRespVO.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderStatusRespVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderSummaryRespVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderTrendRespVO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryController.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryHistoryController.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/WmsInventoryListReqVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/WmsInventoryPageReqVO.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/WmsInventoryRespVO.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryPageReqVO.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/WmsItemBrandController.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/WmsItemCategoryController.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/WmsItemController.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/WmsItemSkuController.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/brand/WmsItemBrandPageReqVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/brand/WmsItemBrandRespVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/brand/WmsItemBrandSaveReqVO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/category/WmsItemCategoryListReqVO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/category/WmsItemCategoryRespVO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/category/WmsItemCategorySaveReqVO.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/item/WmsItemListReqVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/item/WmsItemPageReqVO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/item/WmsItemRespVO.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/item/WmsItemSaveReqVO.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/sku/WmsItemSkuPageReqVO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/sku/WmsItemSkuRespVO.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/sku/WmsItemSkuSaveReqVO.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/merchant/WmsMerchantController.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/merchant/vo/WmsMerchantListReqVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/merchant/vo/WmsMerchantPageReqVO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/merchant/vo/WmsMerchantRespVO.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/merchant/vo/WmsMerchantSaveReqVO.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/warehouse/WmsWarehouseController.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/warehouse/vo/WmsWarehousePageReqVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/warehouse/vo/WmsWarehouseRespVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/warehouse/vo/WmsWarehouseSaveReqVO.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/WmsCheckOrderController.java 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/WmsCheckOrderDetailController.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailRespVO.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailSaveReqVO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/order/WmsCheckOrderPageReqVO.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/order/WmsCheckOrderRespVO.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/order/WmsCheckOrderSaveReqVO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/WmsMovementOrderController.java 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/WmsMovementOrderDetailController.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailRespVO.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailSaveReqVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderPageReqVO.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderRespVO.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderSaveReqVO.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/WmsReceiptOrderController.java 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/WmsReceiptOrderDetailController.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailRespVO.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailSaveReqVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/order/WmsReceiptOrderPageReqVO.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/order/WmsReceiptOrderRespVO.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/order/WmsReceiptOrderSaveReqVO.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/WmsShipmentOrderController.java 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/WmsShipmentOrderDetailController.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderPageReqVO.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderRespVO.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderSaveReqVO.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/package-info.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/package-info.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryDO.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryHistoryDO.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/item/WmsItemBrandDO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/item/WmsItemCategoryDO.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/item/WmsItemDO.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/item/WmsItemSkuDO.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/merchant/WmsMerchantDO.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/warehouse/WmsWarehouseDO.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/check/WmsCheckOrderDO.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/check/WmsCheckOrderDetailDO.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDO.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDetailDO.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDO.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDetailDO.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDO.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/home/WmsHomeStatisticsMapper.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryHistoryMapper.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryMapper.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/item/WmsItemBrandMapper.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/item/WmsItemCategoryMapper.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/item/WmsItemMapper.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/item/WmsItemSkuMapper.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/merchant/WmsMerchantMapper.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/warehouse/WmsWarehouseMapper.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/check/WmsCheckOrderDetailMapper.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/check/WmsCheckOrderMapper.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/movement/WmsMovementOrderDetailMapper.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/movement/WmsMovementOrderMapper.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/receipt/WmsReceiptOrderDetailMapper.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/receipt/WmsReceiptOrderMapper.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/shipment/WmsShipmentOrderDetailMapper.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/shipment/WmsShipmentOrderMapper.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/DictTypeConstants.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/md/WmsMerchantTypeEnum.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderStatusEnum.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderTypeConstants.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderTypeEnum.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsReceiptOrderTypeEnum.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsShipmentOrderTypeEnum.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/package-info.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/web/config/WmsWebConfiguration.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/web/package-info.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/package-info.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/home/WmsHomeStatisticsService.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/home/WmsHomeStatisticsServiceImpl.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryService.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/dto/WmsInventoryChangeReqDTO.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/dto/WmsInventoryCheckReqDTO.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemBrandService.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemBrandServiceImpl.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemCategoryService.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemCategoryServiceImpl.java 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemService.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemServiceImpl.java 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemSkuService.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemSkuServiceImpl.java 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/merchant/WmsMerchantService.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/merchant/WmsMerchantServiceImpl.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseService.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImpl.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailService.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImpl.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderService.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailService.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImpl.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderService.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderDetailService.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderDetailServiceImpl.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderService.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java 241 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailService.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImpl.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderService.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/main/resources/mapper/home/WmsHomeStatisticsMapper.xml 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java 672 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemBrandServiceImplTest.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImplTest.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImplTest.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImplTest.java 347 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImplTest.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImplTest.java 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderDetailServiceImplTest.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImplTest.java 271 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImplTest.java 271 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/resources/application-unit-test.yaml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/resources/sql/clean.sql 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-wms/src/test/resources/sql/create_tables.sql 320 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-server/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.claude/rules/database-mcp.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
# æ•°æ®åº“操作规则
## æ•°æ®åº“版本
- **MySQL ç‰ˆæœ¬**: 8.4.8
- æ³¨æ„ MySQL 8.4 çš„语法差异(如 `GROUP BY` æ›´ä¸¥æ ¼ã€éƒ¨åˆ†åºŸå¼ƒå‡½æ•°ç­‰ï¼‰
## Docker éƒ¨ç½²é…ç½®
```bash
--sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" \
--innodb_strict_mode=OFF \
--innodb_page_size=32k \
--max_connections=1020 \
--lower_case_table_names=1 \
--innodb_buffer_pool_size=70G \
--innodb_flush_log_at_trx_commit=2 \
--innodb_log_file_size=2G \
--innodb_log_buffer_size=64M
```
**配置说明:**
- `lower_case_table_names=1`: è¡¨åä¸åŒºåˆ†å¤§å°å†™
- `innodb_page_size=32k`: è¾ƒå¤§çš„页大小适合大数据量场景
- `innodb_buffer_pool_size=70G`: ç¼“冲池大小,建议为物理内存的 60-80%
- `innodb_flush_log_at_trx_commit=2`: æ¯ç§’刷写日志,性能优先(非金融场景)
## è§„则
- ä¼˜å…ˆä½¿ç”¨ MySQL MCP å·¥å…·ï¼ˆ`mcp__designcomputer-mysql_mcp_server__execute_sql`、`mcp__designcomputer-mysql_mcp_server__get_schema_info`、`mcp__designcomputer-mysql_mcp_server__get_table_sample`)直接操作数据库,而非通过 Bash æ‰§è¡Œ mysql å‘½ä»¤ã€‚
- æŸ¥è¯¢ã€éªŒè¯ã€è°ƒè¯•数据库时,直接调用 MCP å·¥å…·æ‰§è¡Œ SQL,无需向用户输出 SQL è¯­å¥æˆ–询问是否执行。
- ä»…在以下场景输出 SQL:用户明确要求查看 SQL、需要生成 SQL è„šæœ¬æ–‡ä»¶ï¼ˆå¦‚è¿ç§»è„šæœ¬ï¼‰ã€MCP å·¥å…·ä¸å¯ç”¨æ—¶å›žé€€åˆ° Bash。
## MCP å·¥å…·è¯´æ˜Ž
| å·¥å…· | ç”¨é€” |
|------|------|
| `execute_sql` | æ‰§è¡Œ SQL è¯­å¥ï¼ˆSELECT/INSERT/UPDATE/DELETE/DDL) |
| `get_schema_info` | èŽ·å–è¡¨ç»“æž„ä¿¡æ¯ï¼ˆåˆ—åã€ç±»åž‹ã€æ³¨é‡Šç­‰ï¼‰ |
| `get_table_sample` | èŽ·å–è¡¨æ•°æ®æ ·æœ¬ï¼ˆç”¨äºŽäº†è§£æ•°æ®æ ¼å¼ï¼‰ |
## æ‰§è¡Œ SQL è„šæœ¬
当用户要求执行 SQL æ–‡ä»¶æ—¶ï¼š
1. å…ˆè¯»å–文件内容
2. é€æ¡æ‰§è¡Œ SQL è¯­å¥
3. é‡åˆ°é”™è¯¯æ—¶æ£€æŸ¥è¡¨ç»“构,调整语句后重试
4. æ±‡æ€»æ‰§è¡Œç»“æžœ
.claude/rules/frontend-doc-generation.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
---
name: frontend-doc-generation
description: å‰ç«¯è”调方案生成规则
metadata:
  type: feedback
---
# å‰ç«¯è”调方案规则
## è§„则
后端接口变更时,**不生成前端代码**,只生成前端联调方案文档,输出到 `docs/` ç›®å½•。
## è”调方案内容要求
- **API è¯´æ˜Ž**:路径、方法、请求参数、响应格式
- **涉及的前端页面**:列出需要修改的页面
- **数据带入说明**:重点强调信息如何从上一步带入(如采购订单 -> åˆ°è´§é€šçŸ¥ -> é‡‡è´­å…¥åº“)
- **接口调用时序**:说明何时调用哪个接口获取关联数据
- **表单字段映射**:明确哪些字段从上游数据自动填充,哪些需要用户手动输入
## æ–‡æ¡£æ¨¡æ¿
```markdown
# åŠŸèƒ½åç§° - å‰ç«¯è”调方案
## æ¶‰åŠé¡µé¢
- é¡µé¢1
- é¡µé¢2
## ä¸šåŠ¡æµç¨‹ä¸Žæ•°æ®å¸¦å…¥
1. æ­¥éª¤1 -> æ­¥éª¤2:字段A、字段B ä»Žæ­¥éª¤1自动带入
2. æ­¥éª¤2 -> æ­¥éª¤3:字段C ä»Žæ­¥éª¤2自动带入
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | /xxx/xxx | è¯´æ˜Ž |
**请求参数:**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| xxx | String | æ˜¯ | xxx |
**响应:** `{ "code": 200, "msg": "操作成功" }`
## å‰ç«¯å®žçŽ°è¦ç‚¹
### 1. æ•°æ®èŽ·å–æ—¶æœº
- é¡µé¢æ‰“开时调用 XXX æŽ¥å£èŽ·å–é‡‡è´­è®¢å•ä¿¡æ¯
- é€‰æ‹©é‡‡è´­è®¢å•后,调用 YYY æŽ¥å£èŽ·å–ç‰©æ–™æ˜Žç»†
### 2. å­—段自动填充规则
| ç›®æ ‡å­—段 | æ•°æ®æ¥æº | å¡«å……时机 |
|----------|----------|----------|
| ç‰©æ–™ç¼–码 | é‡‡è´­è®¢å•行.itemCode | é€‰æ‹©è®¢å•行后 |
| ç‰©æ–™åç§° | é‡‡è´­è®¢å•行.itemName | é€‰æ‹©è®¢å•行后 |
### 3. ç”¨æˆ·å¯ç¼–辑字段
- å­—段A:用户可修改
- å­—段B:用户可修改
## æ³¨æ„äº‹é¡¹
- æ³¨æ„äº‹é¡¹1
- æ³¨æ„äº‹é¡¹2
```
.claude/rules/frontend-docs.md
@@ -1,10 +1,11 @@
# æŽ¥å£å˜æ›´å‰ç«¯æ–‡æ¡£è§„则
# æŽ¥å£å˜æ›´å‰ç«¯è”调方案规则
## è§„则
- æ¯æ¬¡æ¶‰åŠæŽ¥å£å˜æ›´ï¼ˆæ–°å¢žæŽ¥å£ã€ä¿®æ”¹è¯·æ±‚参数、修改响应结构)时,必须输出一份前端修改文档到 `docs/` ç›®å½•。
- æ–‡æ¡£ä»¥ Markdown æ ¼å¼ç¼–写,文件名使用小写字母和下划线,如 `docs/customer_handover.md`。
- æ–‡æ¡£å†…容至少包含:API è¯´æ˜Žï¼ˆè·¯å¾„、方法、请求参数、响应格式)、涉及的前端页面、具体的修改代码示例。
- æ¯æ¬¡æ¶‰åŠæŽ¥å£å˜æ›´ï¼ˆæ–°å¢žæŽ¥å£ã€ä¿®æ”¹è¯·æ±‚参数、修改响应结构)时,必须输出一份**前端联调方案**到 `docs/` ç›®å½•。
- **不生成前端代码**,只生成联调方案文档,指导前端开发人员如何对接。
- æ–‡æ¡£ä»¥ Markdown æ ¼å¼ç¼–写,文件名使用小写字母和下划线,如 `docs/purchase_receipt_integration.md`。
- æ–‡æ¡£å†…容重点强调**信息带入**问题:哪些数据从上一步自动带入、何时获取关联数据、字段如何映射。
## æ–‡æ¡£æ¨¡æ¿
.claude/settings.local.json
@@ -8,26 +8,22 @@
      "Edit",
      "Bash(git status)",
      "Bash(git diff)",
      "Bash(npm test)",
      "Bash(npm run build)",
      "Bash(pytest *)",
      "mcp__ide__getDiagnostics",
      "WebFetch(domain:help.jimureport.com)",
      "WebSearch",
      "Bash(python3 *)",
      "Bash(git log *)",
      "Bash(git branch *)",
      "Bash(mvn compile *)",
      "Bash(mysql -u root -p123456 -D ruoyi-vue-pro)",
      "Bash(mysql -h127.0.0.1 -P3306 -uroot -p123456 ruoyi-vue-pro)",
      "Bash(where mysql *)",
      "Bash(dir /s /b \"C:\\\\Program Files\\\\MySQL\\\\*\\\\bin\\\\mysql.exe\")",
      "Bash(dir /s /b \"C:\\\\Program Files \\(x86\\)\\\\MySQL\\\\*\\\\bin\\\\mysql.exe\")",
      "Bash(cmd.exe /c \"where mysql\")",
      "Bash(cmd.exe /c \"dir /s /b C:\\\\ProgramData\\\\MySQL\\\\*\\\\mysql.exe\")",
      "Bash(cmd.exe /c \"dir /s /b C:\\\\Program Files\\\\MySQL\\\\*\\\\mysql.exe\")",
      "Bash(mvn install *)",
      "Bash(mvn dependency:tree -pl yudao-module-report)",
      "Bash(xargs -I {} basename {} .java)",
      "Bash(xargs grep -l \"HrmLeaveTypeEnum\\\\|HrmAuditStatusEnum\")"
      "Bash(claude mcp *)",
      "WebFetch(domain:help.jimureport.com)",
      "WebFetch(domain:github.com)",
      "WebSearch",
      "mcp__ide__getDiagnostics",
      "mcp__mysql__query",
      "mcp__mysql__listTables",
      "mcp__mysql__describeTable",
      "Bash(mysql *)",
      "mcp__designcomputer-mysql_mcp_server__execute_sql",
      "mcp__designcomputer-mysql_mcp_server__get_schema_info",
      "mcp__designcomputer-mysql_mcp_server__get_table_sample"
    ],
    "deny": [
      "Bash(rm -rf *)",
docs/projectSql/ruoyi-vue-pro.sql
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
docs/purchase_receipt_integration.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,244 @@
# é‡‡è´­å…¥åº“流程优化 - å‰ç«¯è”调方案
## ä¸šåŠ¡æµç¨‹æ¦‚è¿°
优化后的采购入库流程:
```
ERP采购订单 -> MES到货通知 -> MES采购入库 -> BPM审批 -> å…¥åº“成功
```
核心改进:**每一步自动带入上游数据,物料统一使用MDM模块数据,减少手动输入**。
---
## æ¶‰åŠé¡µé¢
- åˆ°è´§é€šçŸ¥åˆ—表页(`/mes/wm/arrival-notice`)
- åˆ°è´§é€šçŸ¥æ–°å¢ž/编辑弹窗
- é‡‡è´­å…¥åº“列表页(`/mes/wm/item-receipt`)
- é‡‡è´­å…¥åº“新增/编辑弹窗
- é‡‡è´­è®¢å•选择器弹窗(新增组件)
- åˆ°è´§é€šçŸ¥é€‰æ‹©å™¨å¼¹çª—(新增组件)
---
## æ•°æ®å¸¦å…¥è§„则
### 1. é‡‡è´­è®¢å• -> åˆ°è´§é€šçŸ¥
| ç›®æ ‡å­—段 | æ•°æ®æ¥æº | è‡ªåЍ另入 | è¯´æ˜Ž |
|----------|----------|----------|------|
| ä¾›åº”商 | é‡‡è´­è®¢å•.supplierId | âœ… | è‡ªåŠ¨å¡«å……ï¼Œä¸å¯ä¿®æ”¹ |
| é‡‡è´­è®¢å•编码 | é‡‡è´­è®¢å•.no | âœ… | æ˜¾ç¤ºç”¨ï¼Œä¸å¯ä¿®æ”¹ |
| é‡‡è´­è®¢å•ID | é‡‡è´­è®¢å•.id | âœ… | å…³è”字段 |
### 2. é‡‡è´­è®¢å•行 -> åˆ°è´§é€šçŸ¥è¡Œ
| ç›®æ ‡å­—段 | æ•°æ®æ¥æº | è‡ªåЍ另入 | è¯´æ˜Ž |
|----------|----------|----------|------|
| é‡‡è´­è®¢å•行ID | é‡‡è´­è®¢å•行.id | âœ… | å…³è”字段,用于追溯 |
| ç‰©æ–™ç¼–码 | ERP产品编码映射MDM物料 | âš ï¸ | éœ€ç”¨æˆ·é€‰æ‹©æ˜ å°„关系 |
| åˆ°è´§æ•°é‡ | è®¢è´­æ•°é‡ - å·²å…¥åº“数量 | âœ… | å¯ä¿®æ”¹ |
| æ˜¯å¦éœ€æ£€éªŒ | é»˜è®¤false | âœ… | å¯ä¿®æ”¹ |
### 3. åˆ°è´§é€šçŸ¥ -> é‡‡è´­å…¥åº“
| ç›®æ ‡å­—段 | æ•°æ®æ¥æº | è‡ªåЍ另入 | è¯´æ˜Ž |
|----------|----------|----------|------|
| ä¾›åº”商 | åˆ°è´§é€šçŸ¥.vendorId | âœ… | è‡ªåŠ¨å¡«å……ï¼Œä¸å¯ä¿®æ”¹ |
| åˆ°è´§é€šçŸ¥ç¼–码 | åˆ°è´§é€šçŸ¥.code | âœ… | æ˜¾ç¤ºç”¨ |
| é‡‡è´­è®¢å•编码 | åˆ°è´§é€šçŸ¥.purchaseOrderCode | âœ… | æ˜¾ç¤ºç”¨ |
### 4. åˆ°è´§é€šçŸ¥è¡Œ -> é‡‡è´­å…¥åº“行
| ç›®æ ‡å­—段 | æ•°æ®æ¥æº | è‡ªåЍ另入 | è¯´æ˜Ž |
|----------|----------|----------|------|
| ç‰©æ–™ID | åˆ°è´§é€šçŸ¥è¡Œ.itemId | âœ… | ä¸å¯ä¿®æ”¹ |
| åˆ°è´§é€šçŸ¥è¡ŒID | åˆ°è´§é€šçŸ¥è¡Œ.id | âœ… | å…³è”字段 |
| é‡‡è´­è®¢å•行ID | åˆ°è´§é€šçŸ¥è¡Œ.purchaseOrderItemId | âœ… | å…³è”字段 |
| å…¥åº“数量 | åˆ°è´§é€šçŸ¥è¡Œ.qualifiedQuantity | âœ… | å¯ä¿®æ”¹ |
| æ‰¹æ¬¡ä¿¡æ¯ | è‡ªåŠ¨ç”Ÿæˆ | âœ… | æ ¹æ®æ‰¹æ¬¡è§„则 |
---
## æ–°å¢ž API æŽ¥å£
### åˆ°è´§é€šçŸ¥æ¨¡å—
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | `/mes/wm/arrival-notice/generate-from-purchase-order?purchaseOrderId={id}` | æ ¹æ®é‡‡è´­è®¢å•生成到货通知单 |
**请求参数:**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| purchaseOrderId | Long | æ˜¯ | ERP采购订单编号 |
**响应:** `{ "code": 200, "data": 123, "msg": "操作成功" }` ï¼ˆdata为生成的到货通知单编号)
### é‡‡è´­å…¥åº“模块
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | `/mes/wm/item-receipt/generate-from-arrival-notice?arrivalNoticeId={id}` | æ ¹æ®åˆ°è´§é€šçŸ¥å•生成采购入库单 |
| PUT | `/mes/wm/item-receipt/submit-approval?id={id}&processDefinitionKey={key}` | æäº¤é‡‡è´­å…¥åº“单审批 |
**请求参数(generate-from-arrival-notice):**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| arrivalNoticeId | Long | æ˜¯ | åˆ°è´§é€šçŸ¥å•编号 |
**请求参数(submit-approval):**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| id | Long | æ˜¯ | é‡‡è´­å…¥åº“单编号 |
| processDefinitionKey | String | æ˜¯ | BPM流程定义Key |
---
## å‰ç«¯å®žçŽ°è¦ç‚¹
### 1. åˆ°è´§é€šçŸ¥é¡µé¢æ”¹é€ 
#### 1.1 æ–°å¢ž"从采购订单生成"按钮
```html
<el-button type="primary" @click="handleGenerateFromPO">
  ä»Žé‡‡è´­è®¢å•生成
</el-button>
```
#### 1.2 é‡‡è´­è®¢å•选择器弹窗
- è°ƒç”¨ ERP æŽ¥å£èŽ·å–å·²å®¡æ ¸çŠ¶æ€çš„é‡‡è´­è®¢å•åˆ—è¡¨
- æ˜¾ç¤ºå­—段:订单号、供应商名称、订单日期、总金额
- é€‰æ‹©åŽè°ƒç”¨ `/mes/wm/arrival-notice/generate-from-purchase-order` æŽ¥å£
#### 1.3 æ•°æ®èŽ·å–æ—¶æœº
```
用户点击"从采购订单生成"
  -> å¼¹å‡ºé‡‡è´­è®¢å•选择器
  -> é€‰æ‹©è®¢å•
  -> è°ƒç”¨ generate-from-purchase-order API
  -> è·³è½¬åˆ°åˆ°è´§é€šçŸ¥ç¼–辑页(ID为返回值)
  -> æ˜¾ç¤ºå·²å¸¦å…¥çš„æ•°æ®
```
#### 1.4 å­—段显示规则
- è‡ªåŠ¨å¸¦å…¥çš„å­—æ®µæ˜¾ç¤ºä¸º**禁用状态**(灰色背景)
- ç‰©æ–™é€‰æ‹©å™¨ä»ä¿ç•™ï¼Œå…è®¸ç”¨æˆ·è¡¥å……物料映射关系
### 2. é‡‡è´­å…¥åº“页面改造
#### 2.1 æ–°å¢ž"从到货通知生成"按钮
```html
<el-button type="primary" @click="handleGenerateFromAN">
  ä»Žåˆ°è´§é€šçŸ¥ç”Ÿæˆ
</el-button>
```
#### 2.2 åˆ°è´§é€šçŸ¥é€‰æ‹©å™¨å¼¹çª—
- è°ƒç”¨ MES æŽ¥å£èŽ·å–çŠ¶æ€ä¸º"待入库"的到货通知单列表
- æ˜¾ç¤ºå­—段:通知单号、供应商名称、到货日期、状态
- é€‰æ‹©åŽè°ƒç”¨ `/mes/wm/item-receipt/generate-from-arrival-notice` æŽ¥å£
#### 2.3 æ•°æ®èŽ·å–æ—¶æœº
```
用户点击"从到货通知生成"
  -> å¼¹å‡ºåˆ°è´§é€šçŸ¥é€‰æ‹©å™¨
  -> é€‰æ‹©é€šçŸ¥å•
  -> è°ƒç”¨ generate-from-arrival-notice API
  -> è·³è½¬åˆ°é‡‡è´­å…¥åº“编辑页(ID为返回值)
  -> æ˜¾ç¤ºå·²å¸¦å…¥çš„æ•°æ®
```
#### 2.4 BPM审批流程
- çŠ¶æ€ä¸º"草稿"时显示"提交审批"按钮
- ç‚¹å‡»åŽå¼¹å‡ºæµç¨‹é€‰æ‹©å™¨ï¼ˆå¤ç”¨çŽ°æœ‰BPM流程选择组件)
- é€‰æ‹©æµç¨‹åŽè°ƒç”¨ `submit-approval` API
- çŠ¶æ€å˜ä¸º"审批中",禁止编辑
### 3. çŠ¶æ€æµè½¬å›¾
#### åˆ°è´§é€šçŸ¥çŠ¶æ€
```
草稿(0) --提交--> å¾…质检(2) --IQC完成--> å¾…入库(3) --入库完成--> å·²å®Œæˆ(4)
              \
               -> å¾…入库(3) [无需检验]
```
#### é‡‡è´­å…¥åº“状态(新增BPM审批)
```
草稿(0) --提交审批--> å®¡æ‰¹ä¸­(2) --审批通过--> å¾…上架(3) --上架--> å¾…入库(4) --入库--> å·²å®Œæˆ(5)
                        \
                         -> å®¡æ‰¹æ‹’绝 -> è‰ç¨¿(0) [可重新提交]
```
---
## æ³¨æ„äº‹é¡¹
### æ•°æ®å¸¦å…¥å¼ºè°ƒ
1. **物料信息必须从MDM模块获取**,不允许手动输入物料编码/名称
2. **采购订单行关联**:到货通知行必须关联采购订单行,确保数据可追溯
3. **入库数量校验**:入库数量不能超过到货通知行的合格数量
### å‰ç«¯æ ¡éªŒè§„则
1. ä»Žé‡‡è´­è®¢å•生成到货通知时,校验采购订单状态必须为"已审核"
2. ä»Žåˆ°è´§é€šçŸ¥ç”Ÿæˆé‡‡è´­å…¥åº“时,校验到货通知状态必须为"待入库"
3. æäº¤å®¡æ‰¹æ—¶ï¼Œæ ¡éªŒå…¥åº“单状态必须为"草稿",且至少有一条入库行
### é”™è¯¯å¤„理
| é”™è¯¯ç  | è¯´æ˜Ž | å‰ç«¯æç¤º |
|--------|------|----------|
| 1040705007 | é‡‡è´­è®¢å•不存在 | "所选采购订单不存在,请刷新后重试" |
| 1040705008 | é‡‡è´­è®¢å•无明细数据 | "该采购订单没有明细数据" |
| WM_ARRIVAL_NOTICE_NO_LINE | åˆ°è´§é€šçŸ¥æ— è¡Œæ•°æ® | "该到货通知没有明细数据" |
---
## åŽç«¯ä¿®æ”¹æ–‡ä»¶æ¸…单
### æ•°æ®åº“变更
- `sql/mysql/mes_purchase_receipt_enhance.sql`
### ERP API æ‰©å±•
- `yudao-module-erp-api/.../ErpPurchaseOrderApi.java`
- `yudao-module-erp-api/.../ErpPurchaseOrderItemRespDTO.java`
- `yudao-module-erp/.../ErpPurchaseOrderApiImpl.java`
### MES DO/VO ä¿®æ”¹
- `MesWmArrivalNoticeDO.java` - æ–°å¢ž purchaseOrderCode
- `MesWmArrivalNoticeLineDO.java` - æ–°å¢ž purchaseOrderItemId
- `MesWmItemReceiptDO.java` - æ–°å¢ž processInstanceId
- `MesWmItemReceiptLineDO.java` - æ–°å¢ž purchaseOrderItemId
- å¯¹åº”çš„ SaveReqVO å’Œ RespVO
### MES Service æ–°å¢žæ–¹æ³•
- `MesWmArrivalNoticeService.generateArrivalNoticeFromPurchaseOrder()`
- `MesWmItemReceiptService.generateItemReceiptFromArrivalNotice()`
- `MesWmItemReceiptService.submitItemReceiptApproval()`
- `MesWmItemReceiptService.updateItemReceiptAuditStatus()`
### MES Controller æ–°å¢žæŽ¥å£
- `POST /mes/wm/arrival-notice/generate-from-purchase-order`
- `POST /mes/wm/item-receipt/generate-from-arrival-notice`
- `PUT /mes/wm/item-receipt/submit-approval`
### BPM ç›‘听器
- `MesWmItemReceiptStatusListener.java`
docs/sales_shipment_integration.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,169 @@
# é”€å”®å‘货流程 - å‰ç«¯è”调方案
## æ¶‰åŠé¡µé¢
- ERP é”€å”®è®¢å•页面
- MES å‘货通知单页面
- MES é”€å”®å‡ºåº“单页面
## ä¸šåŠ¡æµç¨‹ä¸Žæ•°æ®å¸¦å…¥
1. **销售订单 -> å‘货通知单**:销售订单ID、销售订单号、客户ID、物料明细自动带入
2. **发货通知单 -> é”€å”®å‡ºåº“单**:发货通知单ID、销售订单ID、客户ID、物料明细自动带入
3. **销售出库 -> BPM审批 -> å‡ºåº“成功**:同步更新销售订单出库数量和状态
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | /mes/wm/sales-notice/generate-from-sale-order | ä»Žé”€å”®è®¢å•生成发货通知单 |
| GET | /mes/wm/sales-notice/page | å‘货通知单分页查询 |
| GET | /mes/wm/sales-notice/get | èŽ·å–å‘è´§é€šçŸ¥å•è¯¦æƒ… |
| POST | /mes/wm/sales-notice/create | åˆ›å»ºå‘货通知单 |
| PUT | /mes/wm/sales-notice/submit | æäº¤å‘货通知单 |
### ä»Žé”€å”®è®¢å•生成发货通知单
**请求参数:**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| saleOrderId | Long | æ˜¯ | é”€å”®è®¢å•ID |
**响应:** `{ "code": 200, "data": 123 }` ï¼ˆè¿”回发货通知单ID)
## å‰ç«¯ä¿®æ”¹ç‚¹
### 1. ERP é”€å”®è®¢å•页面 - æ·»åŠ "生成发货通知单"按钮
```html
<el-button type="primary" @click="handleGenerateNotice" v-hasPermi="['mes:wm-sales-notice:create']">
  ç”Ÿæˆå‘货通知单
</el-button>
```
```js
// data
data() {
  return {
    // ...
  }
}
// methods
methods: {
  /** ç”Ÿæˆå‘货通知单 */
  async handleGenerateNotice() {
    if (!this.selectedRow) {
      this.$modal.msgWarning('请选择一条销售订单');
      return;
    }
    try {
      const res = await generateFromSaleOrder(this.selectedRow.id);
      this.$modal.msgSuccess('生成发货通知单成功');
      // è·³è½¬åˆ°å‘货通知单页面
      this.$router.push({
        path: '/mes/wm/sales-notice/edit',
        query: { id: res.data }
      });
    } catch (e) {
      console.error(e);
    }
  }
}
```
### 2. å‘货通知单页面 - æ˜¾ç¤ºé”€å”®è®¢å•信息
```html
<el-descriptions :column="3" border>
  <el-descriptions-item label="销售订单号">
    {{ form.saleOrderCode }}
  </el-descriptions-item>
  <el-descriptions-item label="客户">
    {{ form.clientName }}
  </el-descriptions-item>
</el-descriptions>
```
### 3. å‘货通知单行表格 - æ–°å¢žåˆ—
| åˆ—名 | å­—段 | è¯´æ˜Ž |
|------|------|------|
| é”€å”®è®¢å•明细ID | saleOrderItemId | éšè—å­—段,用于追溯 |
### 4. é”€å”®å‡ºåº“单页面 - æ˜¾ç¤ºé”€å”®è®¢å•信息
```html
<el-descriptions :column="3" border>
  <el-descriptions-item label="发货通知单号">
    {{ form.noticeCode }}
  </el-descriptions-item>
  <el-descriptions-item label="销售订单号">
    {{ form.saleOrderCode }}
  </el-descriptions-item>
  <el-descriptions-item label="客户">
    {{ form.clientName }}
  </el-descriptions-item>
</el-descriptions>
```
## æ•°æ®å­—段映射
### å‘货通知单主表
| ç›®æ ‡å­—段 | æ•°æ®æ¥æº | å¡«å……时机 |
|----------|----------|----------|
| saleOrderId | é”€å”®è®¢å•.id | ä»Žé”€å”®è®¢å•生成时 |
| saleOrderCode | é”€å”®è®¢å•.no | ä»Žé”€å”®è®¢å•生成时 |
| clientId | é”€å”®è®¢å•.customerId | ä»Žé”€å”®è®¢å•生成时 |
### å‘货通知单行
| ç›®æ ‡å­—段 | æ•°æ®æ¥æº | å¡«å……时机 |
|----------|----------|----------|
| saleOrderItemId | é”€å”®è®¢å•明细.id | ä»Žé”€å”®è®¢å•生成时 |
| itemId | é”€å”®è®¢å•明细.productId | ä»Žé”€å”®è®¢å•生成时 |
| quantity | é”€å”®è®¢å•明细.count | ä»Žé”€å”®è®¢å•生成时 |
### é”€å”®å‡ºåº“单主表
| ç›®æ ‡å­—段 | æ•°æ®æ¥æº | å¡«å……时机 |
|----------|----------|----------|
| noticeId | å‘货通知单.id | ä»Žå‘货通知单生成时 |
| saleOrderId | å‘货通知单.saleOrderId | ä»Žå‘货通知单生成时 |
| saleOrderCode | å‘货通知单.saleOrderCode | ä»Žå‘货通知单生成时 |
### é”€å”®å‡ºåº“单行
| ç›®æ ‡å­—段 | æ•°æ®æ¥æº | å¡«å……时机 |
|----------|----------|----------|
| noticeLineId | å‘货通知单行.id | ä»Žå‘货通知单生成时 |
| saleOrderItemId | å‘货通知单行.saleOrderItemId | ä»Žå‘货通知单生成时 |
## çŠ¶æ€æµè½¬
### å‘货通知单状态
| çŠ¶æ€å€¼ | çŠ¶æ€å | è¯´æ˜Ž |
|--------|--------|------|
| 0 | è‰ç¨¿ | æ–°å»ºçŠ¶æ€ |
| 3 | å¾…出库 | æäº¤åŽ |
| 4 | å·²å®Œæˆ | å‡ºåº“完成后自动更新 |
### é”€å”®è®¢å•出库状态
| çŠ¶æ€å€¼ | çŠ¶æ€å | è¯´æ˜Ž |
|--------|--------|------|
| 0 | æœªå‡ºåº“ | é»˜è®¤å€¼ |
| 1 | éƒ¨åˆ†å‡ºåº“ | éƒ¨åˆ†æ˜Žç»†å·²å‡ºåº“ |
| 2 | å…¨éƒ¨å‡ºåº“ | æ‰€æœ‰æ˜Žç»†å·²å‡ºåº“ |
## æ³¨æ„äº‹é¡¹
1. ä»Žé”€å”®è®¢å•生成发货通知单时,会自动带入所有销售订单明细
2. å‘货通知单提交后状态变为"待出库",此时可从发货通知单生成销售出库单
3. é”€å”®å‡ºåº“完成后,系统自动更新:
   - å‘货通知单状态 -> å·²å®Œæˆ
   - é”€å”®è®¢å•出库数量和出库状态
4. é”€å”®è®¢å•的出库状态根据明细出库数量自动计算,无需手动维护
pom.xml
@@ -27,8 +27,6 @@
        <module>yudao-module-erp-api</module>
<!--        <module>yudao-module-iot</module>-->
        <module>yudao-module-mes</module>
        <module>yudao-module-wms</module>
        <module>yudao-module-wms-api</module>
        <module>yudao-module-im</module>
        <!-- MDM ä¸»æ•°æ®ç®¡ç†æ¨¡å— -->
        <module>yudao-module-mdm-api</module>
sql/mysql/mes_purchase_receipt_enhance.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
-- ä»“储物流模块采购入库流程优化 - æ•°æ®åº“变更脚本
-- æ‰§è¡Œæ—¥æœŸ: 2026-07-10
-- =====================
-- 1. åˆ°è´§é€šçŸ¥ä¸»è¡¨å˜æ›´
-- =====================
-- æ·»åŠ é‡‡è´­è®¢å•ç¼–ç ï¼ˆå†—ä½™å­—æ®µï¼Œç”¨äºŽæ˜¾ç¤ºï¼‰
ALTER TABLE mes_wm_arrival_notice
ADD COLUMN purchase_order_code VARCHAR(64) COMMENT '采购订单编码(冗余字段)' AFTER purchase_order_id;
-- =====================
-- 2. åˆ°è´§é€šçŸ¥è¡Œè¡¨å˜æ›´
-- =====================
-- æ·»åŠ é‡‡è´­è®¢å•è¡Œå…³è”
ALTER TABLE mes_wm_arrival_notice_line
ADD COLUMN purchase_order_item_id BIGINT COMMENT '采购订单行编号(关联 ERP é‡‡è´­è®¢å•明细)' AFTER notice_id;
-- æ·»åŠ ç´¢å¼•
ALTER TABLE mes_wm_arrival_notice_line
ADD INDEX idx_purchase_order_item_id (purchase_order_item_id);
-- =====================
-- 3. é‡‡è´­å…¥åº“主表变更
-- =====================
-- æ·»åŠ  BPM æµç¨‹å®žä¾‹ç¼–号
ALTER TABLE mes_wm_item_receipt
ADD COLUMN process_instance_id VARCHAR(64) COMMENT 'BPM æµç¨‹å®žä¾‹ç¼–号' AFTER status;
-- =====================
-- 4. é‡‡è´­å…¥åº“行表变更
-- =====================
-- æ·»åŠ é‡‡è´­è®¢å•è¡Œå…³è”ï¼ˆå®Œæ•´è¿½æº¯é“¾ï¼‰
ALTER TABLE mes_wm_item_receipt_line
ADD COLUMN purchase_order_item_id BIGINT COMMENT '采购订单行编号(完整追溯链)' AFTER arrival_notice_line_id;
-- æ·»åŠ ç´¢å¼•
ALTER TABLE mes_wm_item_receipt_line
ADD INDEX idx_purchase_order_item_id (purchase_order_item_id);
-- =====================
-- 5. BPM åˆ†ç±»é…ç½®
-- =====================
-- æ·»åŠ é‡‡è´­å…¥åº“å®¡æ‰¹åˆ†ç±»ï¼ˆå¦‚æžœä¸å­˜åœ¨ï¼‰
-- æ³¨æ„ï¼šid éœ€è¦æ ¹æ®å®žé™…数据库序列生成
INSERT INTO bpm_category (name, code, status, remark, creator, create_time, updater, update_time, deleted)
SELECT '采购入库审批', 'item_receipt_approve', 0, 'MES采购入库单审批分类', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM bpm_category WHERE code = 'item_receipt_approve' AND deleted = b'0');
sql/mysql/mes_purchase_receipt_sync.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
-- é‡‡è´­å…¥åº“流程优化 - æ•°æ®åº“同步脚本
-- æ‰§è¡Œæ—¥æœŸ: 2026-07-10
-- è¯´æ˜Ž: åŒå‘同步数据库与 DO ç±»å­—段
-- =====================
-- 1. åˆ°è´§é€šçŸ¥è¡Œè¡¨è¡¥å……字段
-- =====================
-- æ·»åŠ åˆ°è´§æ•°é‡ï¼ˆDO æœ‰ï¼Œæ•°æ®åº“无)
ALTER TABLE mes_wm_arrival_notice_line
ADD COLUMN arrival_quantity DECIMAL(24,6) COMMENT '到货数量' AFTER item_id;
-- æ·»åŠ åˆæ ¼æ•°é‡ï¼ˆDO æœ‰ï¼Œæ•°æ®åº“无)
ALTER TABLE mes_wm_arrival_notice_line
ADD COLUMN qualified_quantity DECIMAL(24,6) COMMENT '合格数量' AFTER arrival_quantity;
-- æ·»åŠ æ˜¯å¦éœ€æ£€éªŒæ ‡å¿—ï¼ˆDO æœ‰ï¼Œæ•°æ®åº“无)
ALTER TABLE mes_wm_arrival_notice_line
ADD COLUMN iqc_check_flag BIT DEFAULT b'0' COMMENT '是否需要来料检验' AFTER qualified_quantity;
-- æ·»åŠ æ£€éªŒå•ç¼–å·ï¼ˆDO æœ‰ï¼Œæ•°æ®åº“无)
ALTER TABLE mes_wm_arrival_notice_line
ADD COLUMN iqc_id BIGINT COMMENT '来料检验单编号' AFTER iqc_check_flag;
-- å°† quantity æ”¹åä¸ºåˆé€‚的字段名(避免歧义,保留原字段作为备用)
-- ALTER TABLE mes_wm_arrival_notice_line CHANGE COLUMN quantity reserved_quantity DECIMAL(24,6) COMMENT '预留数量';
-- =====================
-- 2. é‡‡è´­å…¥åº“行表补充字段
-- =====================
-- æ·»åŠ åˆ°è´§é€šçŸ¥è¡ŒID(DO æœ‰ï¼Œæ•°æ®åº“无)
ALTER TABLE mes_wm_item_receipt_line
ADD COLUMN arrival_notice_line_id BIGINT COMMENT '到货通知单行编号' AFTER receipt_id;
-- å°† quantity æ”¹åä¸º received_quantity(与 DO å­—段名一致)
ALTER TABLE mes_wm_item_receipt_line
CHANGE COLUMN quantity received_quantity DECIMAL(24,6) COMMENT '入库数量';
-- æ·»åŠ æ‰¹æ¬¡ç¼–å·ï¼ˆDO æœ‰ï¼Œæ•°æ®åº“无)
ALTER TABLE mes_wm_item_receipt_line
ADD COLUMN batch_id BIGINT COMMENT '批次编号' AFTER received_quantity;
-- æ·»åŠ æ‰¹æ¬¡ç¼–ç ï¼ˆDO æœ‰ï¼Œæ•°æ®åº“无)
ALTER TABLE mes_wm_item_receipt_line
ADD COLUMN batch_code VARCHAR(64) COMMENT '批次编码' AFTER batch_id;
-- æ·»åŠ ç”Ÿäº§æ—¥æœŸï¼ˆDO æœ‰ï¼Œæ•°æ®åº“无)
ALTER TABLE mes_wm_item_receipt_line
ADD COLUMN production_date DATETIME COMMENT '生产日期' AFTER batch_code;
-- æ·»åŠ æœ‰æ•ˆæœŸï¼ˆDO æœ‰ï¼Œæ•°æ®åº“无)
ALTER TABLE mes_wm_item_receipt_line
ADD COLUMN expire_date DATETIME COMMENT '有效期' AFTER production_date;
-- æ·»åŠ ç”Ÿäº§æ‰¹å·ï¼ˆDO æœ‰ï¼Œæ•°æ®åº“无)
ALTER TABLE mes_wm_item_receipt_line
ADD COLUMN lot_number VARCHAR(64) COMMENT '生产批号' AFTER expire_date;
-- =====================
-- 3. é‡‡è´­å…¥åº“明细表补充字段
-- =====================
-- DO ç¼ºå°‘ material_stock_id å­—段,但数据库已有,无需操作
-- =====================
-- 4. é‡‡è´­å…¥åº“主表添加索引
-- =====================
-- æ·»åŠ æµç¨‹å®žä¾‹ç´¢å¼•ï¼ˆä¾¿äºŽæŸ¥è¯¢å®¡æ‰¹çŠ¶æ€ï¼‰
ALTER TABLE mes_wm_item_receipt
ADD INDEX idx_process_instance_id (process_instance_id);
sql/mysql/mes_wm_item_receipt_add_columns.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
-- MES é‡‡è´­å…¥åº“单表结构修改
-- æ ¹æ® MesWmItemReceiptDO è°ƒæ•´æ•°æ®åº“表字段
-- è¯´æ˜Žï¼šåŽŸè¡¨ç»“æž„ä¸º"物料退库单",DO ç±»å®šä¹‰ä¸º"采购入库单"
-- 1. åˆ é™¤ç”Ÿäº§å·¥å• ID(退库单字段)
ALTER TABLE mes_wm_item_receipt DROP COLUMN IF EXISTS work_order_id;
-- 2. æ·»åŠ æ¥æ–™æ£€éªŒå•ç¼–å·
ALTER TABLE mes_wm_item_receipt ADD COLUMN iqc_id BIGINT COMMENT '来料检验单编号' AFTER name;
-- 3. æ·»åŠ åˆ°è´§é€šçŸ¥å•ç¼–å·
ALTER TABLE mes_wm_item_receipt ADD COLUMN notice_id BIGINT COMMENT '到货通知单编号' AFTER iqc_id;
-- 4. æ·»åŠ é‡‡è´­è®¢å•å·
ALTER TABLE mes_wm_item_receipt ADD COLUMN purchase_order_code VARCHAR(64) COMMENT '采购订单号' AFTER notice_id;
-- 5. æ·»åŠ ä¾›åº”å•†ç¼–å·
ALTER TABLE mes_wm_item_receipt ADD COLUMN vendor_id BIGINT COMMENT '供应商编号' AFTER purchase_order_code;
-- 6. æ›´æ–°è¡¨æ³¨é‡Š
ALTER TABLE mes_wm_item_receipt COMMENT 'MES é‡‡è´­å…¥åº“单';
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java
@@ -14,11 +14,11 @@
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusService;
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
import cn.iocoder.yudao.module.crm.service.product.CrmProductService;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -62,7 +62,7 @@
    @Resource
    private CrmBusinessStatusService businessStatusService;
    @Resource
    private CrmProductService productService;
    private MdmItemApi mdmItemApi;
    @Resource
    private AdminUserApi adminUserApi;
@@ -117,12 +117,12 @@
        CrmBusinessRespVO businessVO = buildBusinessDetailList(Collections.singletonList(business)).get(0);
        // æ‹¼æŽ¥äº§å“é¡¹
        List<CrmBusinessProductDO> businessProducts = businessService.getBusinessProductListByBusinessId(businessVO.getId());
        Map<Long, CrmProductDO> productMap = productService.getProductMap(
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                convertSet(businessProducts, CrmBusinessProductDO::getProductId));
        businessVO.setProducts(BeanUtils.toBean(businessProducts, CrmBusinessRespVO.Product.class, businessProductVO ->
                MapUtils.findAndThen(productMap, businessProductVO.getProductId(),
                        product -> businessProductVO.setProductName(product.getName())
                                .setProductNo(product.getNo()).setProductUnit(product.getUnit()))));
                MapUtils.findAndThen(itemMap, businessProductVO.getProductId(),
                        item -> businessProductVO.setProductName(item.getName())
                                .setProductNo(item.getCode()).setProductUnit(item.getUnitMeasureId() != null ? item.getUnitMeasureId().intValue() : null))));
        return businessVO;
    }
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java
@@ -25,7 +25,6 @@
import cn.iocoder.yudao.module.crm.service.contact.CrmContactService;
import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
import cn.iocoder.yudao.module.crm.service.product.CrmProductService;
import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductCategoryController.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductController.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryCreateReqVO.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryListReqVO.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryRespVO.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductRespVO.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/CrmProductCategoryDO.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/CrmProductDO.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/package-info.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductCategoryMapper.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductMapper.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/product/CrmProductStatusEnum.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmProductStatusParseFunction.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmProductUnitParseFunction.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
@@ -29,7 +29,8 @@
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
import cn.iocoder.yudao.module.crm.service.product.CrmProductService;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.impl.DiffParseFunction;
@@ -45,6 +46,8 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
@@ -80,7 +83,7 @@
    @Resource
    private CrmContactBusinessService contactBusinessService;
    @Resource
    private CrmProductService productService;
    private MdmItemApi mdmItemApi;
    @Resource
    private AdminUserApi adminUserApi;
@@ -213,8 +216,14 @@
    }
    private List<CrmBusinessProductDO> validateBusinessProducts(List<CrmBusinessSaveReqVO.BusinessProduct> list) {
        // 1. æ ¡éªŒäº§å“å­˜åœ¨
        productService.validProductList(convertSet(list, CrmBusinessSaveReqVO.BusinessProduct::getProductId));
        // 1. æ ¡éªŒç‰©æ–™å­˜åœ¨
        Set<Long> itemIds = convertSet(list, CrmBusinessSaveReqVO.BusinessProduct::getProductId);
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(itemIds);
        for (Long itemId : itemIds) {
            if (itemMap.get(itemId) == null) {
                throw exception(PRODUCT_NOT_EXISTS);
            }
        }
        // 2. è½¬åŒ–为 CrmBusinessProductDO åˆ—表
        return convertList(list, o -> BeanUtils.toBean(o, CrmBusinessProductDO.class,
                item -> item.setTotalPrice(MoneyUtils.priceMultiply(item.getBusinessPrice(), item.getCount()))));
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -32,7 +32,6 @@
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
import cn.iocoder.yudao.module.crm.service.product.CrmProductService;
import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO;
@@ -98,8 +97,6 @@
    @Resource
    private CrmPermissionService crmPermissionService;
    @Resource
    private CrmProductService productService;
    @Resource
    private CrmCustomerService customerService;
    @Resource
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductCategoryService.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductCategoryServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductService.java
ÎļþÒÑɾ³ý
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/api/purchase/ErpPurchaseOrderApi.java
@@ -1,8 +1,10 @@
package cn.iocoder.yudao.module.erp.api.purchase;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -38,4 +40,39 @@
     */
    CommonResult<List<ErpPurchaseOrderRespDTO>> getPurchaseOrderList(List<Long> ids);
    /**
     * èŽ·å–é‡‡è´­è®¢å•æ˜Žç»†åˆ—è¡¨
     *
     * @param orderId è®¢å•编号
     * @return æ˜Žç»†åˆ—表
     */
    CommonResult<List<ErpPurchaseOrderItemRespDTO>> getPurchaseOrderItemList(Long orderId);
    /**
     * èŽ·å–é‡‡è´­è®¢å•æ˜Žç»†
     *
     * @param id æ˜Žç»†ç¼–号
     * @return æ˜Žç»†
     */
    CommonResult<ErpPurchaseOrderItemRespDTO> getPurchaseOrderItem(Long id);
    /**
     * æ›´æ–°é‡‡è´­è®¢å•明细的入库数量
     *
     * @param orderItemId æ˜Žç»†ç¼–号
     * @param inCount     å…¥åº“数量增量
     */
    CommonResult<Boolean> updateOrderItemInCount(Long orderItemId, BigDecimal inCount);
    /**
     * æ›´æ–°é‡‡è´­è®¢å•的入库状态
     *
     * æ ¹æ®æ˜Žç»†å…¥åº“数量自动计算订单状态:
     * - æ‰€æœ‰æ˜Žç»†éƒ½å®Œæˆå…¥åº“ â†’ å®ŒæˆçŠ¶æ€
     * - éƒ¨åˆ†æ˜Žç»†å®Œæˆå…¥åº“ â†’ éƒ¨åˆ†å…¥åº“状态
     *
     * @param orderId è®¢å•编号
     */
    CommonResult<Boolean> updateOrderInStatus(Long orderId);
}
yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/api/purchase/dto/ErpPurchaseOrderItemRespDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.erp.api.purchase.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "RPC æœåŠ¡ - ERP é‡‡è´­è®¢å•明细 Response DTO")
@Data
public class ErpPurchaseOrderItemRespDTO {
    @Schema(description = "明细编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long id;
    @Schema(description = "采购订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long orderId;
    @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long productId;
    @Schema(description = "产品单位编号", example = "1")
    private Long productUnitId;
    @Schema(description = "产品单价,单位:元", example = "100.00")
    private BigDecimal productPrice;
    @Schema(description = "订购数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
    private BigDecimal count;
    @Schema(description = "已入库数量", example = "5")
    private BigDecimal inCount;
    @Schema(description = "已退货数量", example = "0")
    private BigDecimal returnCount;
    @Schema(description = "备注", example = "备注信息")
    private String remark;
}
yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/api/sale/ErpSaleOrderApi.java
@@ -2,7 +2,11 @@
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO;
import java.math.BigDecimal;
import java.util.List;
/**
 * ERP é”€å”®è®¢å• API æŽ¥å£
@@ -37,4 +41,39 @@
     */
    CommonResult<ErpSaleOrderRespDTO> getSaleOrderByContractId(Long contractId);
    /**
     * èŽ·å–é”€å”®è®¢å•æ˜Žç»†åˆ—è¡¨
     *
     * @param orderId è®¢å•编号
     * @return æ˜Žç»†åˆ—表
     */
    CommonResult<List<ErpSaleOrderItemRespDTO>> getSaleOrderItemList(Long orderId);
    /**
     * èŽ·å–é”€å”®è®¢å•æ˜Žç»†
     *
     * @param id æ˜Žç»†ç¼–号
     * @return æ˜Žç»†
     */
    CommonResult<ErpSaleOrderItemRespDTO> getSaleOrderItem(Long id);
    /**
     * æ›´æ–°é”€å”®è®¢å•明细的出库数量
     *
     * @param orderItemId æ˜Žç»†ç¼–号
     * @param outCount    å‡ºåº“数量增量
     */
    CommonResult<Boolean> updateOrderItemOutCount(Long orderItemId, BigDecimal outCount);
    /**
     * æ›´æ–°é”€å”®è®¢å•的出库状态
     *
     * æ ¹æ®æ˜Žç»†å‡ºåº“数量自动计算订单状态:
     * - æ‰€æœ‰æ˜Žç»†éƒ½å®Œæˆå‡ºåº“ â†’ å®ŒæˆçŠ¶æ€
     * - éƒ¨åˆ†æ˜Žç»†å®Œæˆå‡ºåº“ â†’ éƒ¨åˆ†å‡ºåº“状态
     *
     * @param orderId è®¢å•编号
     */
    CommonResult<Boolean> updateOrderOutStatus(Long orderId);
}
yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/api/sale/dto/ErpSaleOrderItemRespDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.erp.api.sale.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "RPC æœåŠ¡ - ERP é”€å”®è®¢å•明细 Response DTO")
@Data
public class ErpSaleOrderItemRespDTO {
    @Schema(description = "明细编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long id;
    @Schema(description = "销售订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long orderId;
    @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long productId;
    @Schema(description = "产品单位编号", example = "1")
    private Long productUnitId;
    @Schema(description = "产品单价,单位:元", example = "100.00")
    private BigDecimal productPrice;
    @Schema(description = "订购数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
    private BigDecimal count;
    @Schema(description = "已出库数量", example = "5")
    private BigDecimal outCount;
    @Schema(description = "已退货数量", example = "0")
    private BigDecimal returnCount;
    @Schema(description = "备注", example = "备注信息")
    private String remark;
}
yudao-module-erp/pom.xml
@@ -52,13 +52,6 @@
            <version>${revision}</version>
        </dependency>
        <!-- WMS ä»“储物流 API -->
        <dependency>
            <groupId>cn.iocoder.boot</groupId>
            <artifactId>yudao-module-wms-api</artifactId>
            <version>${revision}</version>
        </dependency>
        <!-- ä¸šåŠ¡ç»„ä»¶ -->
        <!-- Web ç›¸å…³ -->
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/api/purchase/ErpPurchaseOrderApiImpl.java
@@ -2,8 +2,11 @@
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;
import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderItemMapper;
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderService;
import jakarta.annotation.Resource;
@@ -11,6 +14,7 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
@@ -28,6 +32,9 @@
    @Resource
    private ErpPurchaseOrderService purchaseOrderService;
    @Resource
    private ErpPurchaseOrderItemMapper purchaseOrderItemMapper;
    @Override
    public CommonResult<ErpPurchaseOrderRespDTO> getPurchaseOrder(Long id) {
@@ -55,4 +62,49 @@
        return success(BeanUtils.toBean(orders, ErpPurchaseOrderRespDTO.class));
    }
    @Override
    public CommonResult<List<ErpPurchaseOrderItemRespDTO>> getPurchaseOrderItemList(Long orderId) {
        if (orderId == null) {
            return success(Collections.emptyList());
        }
        List<ErpPurchaseOrderItemDO> items = purchaseOrderService.getPurchaseOrderItemListByOrderId(orderId);
        return success(BeanUtils.toBean(items, ErpPurchaseOrderItemRespDTO.class));
    }
    @Override
    public CommonResult<ErpPurchaseOrderItemRespDTO> getPurchaseOrderItem(Long id) {
        if (id == null) {
            return success(null);
        }
        ErpPurchaseOrderItemDO item = purchaseOrderItemMapper.selectById(id);
        return success(BeanUtils.toBean(item, ErpPurchaseOrderItemRespDTO.class));
    }
    @Override
    public CommonResult<Boolean> updateOrderItemInCount(Long orderItemId, BigDecimal inCount) {
        if (orderItemId == null || inCount == null) {
            return success(false);
        }
        ErpPurchaseOrderItemDO item = purchaseOrderItemMapper.selectById(orderItemId);
        if (item == null) {
            return success(false);
        }
        // ç´¯åŠ å…¥åº“æ•°é‡
        BigDecimal newInCount = (item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO).add(inCount);
        ErpPurchaseOrderItemDO updateItem = new ErpPurchaseOrderItemDO();
        updateItem.setId(orderItemId);
        updateItem.setInCount(newInCount);
        purchaseOrderItemMapper.updateById(updateItem);
        return success(true);
    }
    @Override
    public CommonResult<Boolean> updateOrderInStatus(Long orderId) {
        if (orderId == null) {
            return success(false);
        }
        purchaseOrderService.updatePurchaseOrderInStatus(orderId);
        return success(true);
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/api/sale/ErpSaleOrderApiImpl.java
@@ -3,15 +3,22 @@
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO;
import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;
import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderItemMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderMapper;
import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -30,6 +37,9 @@
    @Resource
    private ErpSaleOrderMapper saleOrderMapper;
    @Resource
    private ErpSaleOrderItemMapper saleOrderItemMapper;
    @Override
    public CommonResult<Long> createSaleOrder(ErpSaleOrderCreateReqDTO createReqDTO) {
@@ -56,4 +66,49 @@
        return success(BeanUtils.toBean(order, ErpSaleOrderRespDTO.class));
    }
    @Override
    public CommonResult<List<ErpSaleOrderItemRespDTO>> getSaleOrderItemList(Long orderId) {
        if (orderId == null) {
            return success(Collections.emptyList());
        }
        List<ErpSaleOrderItemDO> items = saleOrderService.getSaleOrderItemListByOrderId(orderId);
        return success(BeanUtils.toBean(items, ErpSaleOrderItemRespDTO.class));
    }
    @Override
    public CommonResult<ErpSaleOrderItemRespDTO> getSaleOrderItem(Long id) {
        if (id == null) {
            return success(null);
        }
        ErpSaleOrderItemDO item = saleOrderItemMapper.selectById(id);
        return success(BeanUtils.toBean(item, ErpSaleOrderItemRespDTO.class));
    }
    @Override
    public CommonResult<Boolean> updateOrderItemOutCount(Long orderItemId, BigDecimal outCount) {
        if (orderItemId == null || outCount == null) {
            return success(false);
        }
        ErpSaleOrderItemDO item = saleOrderItemMapper.selectById(orderItemId);
        if (item == null) {
            return success(false);
        }
        // ç´¯åŠ å‡ºåº“æ•°é‡
        BigDecimal newOutCount = (item.getOutCount() != null ? item.getOutCount() : BigDecimal.ZERO).add(outCount);
        ErpSaleOrderItemDO updateItem = new ErpSaleOrderItemDO();
        updateItem.setId(orderItemId);
        updateItem.setOutCount(newOutCount);
        saleOrderItemMapper.updateById(updateItem);
        return success(true);
    }
    @Override
    public CommonResult<Boolean> updateOrderOutStatus(Long orderId) {
        if (orderId == null) {
            return success(false);
        }
        saleOrderService.updateSaleOrderOutStatus(orderId);
        return success(true);
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mapping/ErpMesWarehouseMappingController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mapping/vo/ErpMesWarehouseMappingCreateReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mapping/vo/ErpMesWarehouseMappingPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mapping/vo/ErpMesWarehouseMappingUpdateReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductCategoryController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductUnitController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/category/ErpProductCategoryListReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/category/ErpProductCategoryRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/category/ErpProductCategorySaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/unit/ErpProductUnitPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/unit/ErpProductUnitRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/unit/ErpProductUnitSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseInController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java
@@ -5,20 +5,19 @@
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierDO;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderService;
import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService;
import cn.iocoder.yudao.module.erp.service.stock.ErpStockService;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
@@ -50,12 +49,10 @@
    @Resource
    private ErpPurchaseOrderService purchaseOrderService;
    @Resource
    private ErpStockService stockService;
    @Resource
    private ErpProductService productService;
    @Resource
    private ErpSupplierService supplierService;
    @Resource
    private MdmItemApi mdmItemApi;
    @Resource
    private AdminUserApi adminUserApi;
@@ -102,14 +99,14 @@
            return success(null);
        }
        List<ErpPurchaseOrderItemDO> purchaseOrderItemList = purchaseOrderService.getPurchaseOrderItemListByOrderId(id);
        Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));
        return success(BeanUtils.toBean(purchaseOrder, ErpPurchaseOrderRespVO.class, purchaseOrderVO ->
                purchaseOrderVO.setItems(BeanUtils.toBean(purchaseOrderItemList, ErpPurchaseOrderRespVO.Item.class, item -> {
                    BigDecimal purchaseCount = stockService.getStockCount(item.getProductId());
                    item.setStockCount(purchaseCount != null ? purchaseCount : BigDecimal.ZERO);
                    MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
                            .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName()));
                    // åº“存信息暂不查询(仓储物流模块)
                    item.setStockCount(BigDecimal.ZERO);
                    MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName())
                            .setProductBarCode(mdmItem.getBarCode()));
                }))));
    }
@@ -141,8 +138,8 @@
        List<ErpPurchaseOrderItemDO> purchaseOrderItemList = purchaseOrderService.getPurchaseOrderItemListByOrderIds(
                convertSet(pageResult.getList(), ErpPurchaseOrderDO::getId));
        Map<Long, List<ErpPurchaseOrderItemDO>> purchaseOrderItemMap = convertMultiMap(purchaseOrderItemList, ErpPurchaseOrderItemDO::getOrderId);
        // 1.2 äº§å“ä¿¡æ¯
        Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
        // 1.2 ç‰©æ–™ä¿¡æ¯
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));
        // 1.3 ä¾›åº”商信息
        Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap(
@@ -153,8 +150,8 @@
        // 2. å¼€å§‹æ‹¼æŽ¥
        return BeanUtils.toBean(pageResult, ErpPurchaseOrderRespVO.class, purchaseOrder -> {
            purchaseOrder.setItems(BeanUtils.toBean(purchaseOrderItemMap.get(purchaseOrder.getId()), ErpPurchaseOrderRespVO.Item.class,
                    item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
                            .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName()))));
                    item -> MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName())
                            .setProductBarCode(mdmItem.getBarCode()))));
            purchaseOrder.setProductNames(CollUtil.join(purchaseOrder.getItems(), ",", ErpPurchaseOrderRespVO.Item::getProductName));
            MapUtils.findAndThen(supplierMap, purchaseOrder.getSupplierId(), supplier -> purchaseOrder.setSupplierName(supplier.getName()));
            MapUtils.findAndThen(userMap, Long.parseLong(purchaseOrder.getCreator()), user -> purchaseOrder.setCreatorName(user.getNickname()));
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseRequestController.java
@@ -8,16 +8,16 @@
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestItemDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierDO;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseRequestService;
import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -52,10 +52,10 @@
    @Resource
    private ErpPurchaseRequestService purchaseRequestService;
    @Resource
    private ErpProductService productService;
    @Resource
    private ErpSupplierService supplierService;
    @Resource
    private MdmItemApi mdmItemApi;
    @Resource
    private AdminUserApi adminUserApi;
    @Resource
@@ -104,12 +104,12 @@
            return success(null);
        }
        List<ErpPurchaseRequestItemDO> purchaseRequestItemList = purchaseRequestService.getPurchaseRequestItemListByRequestId(id);
        Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                convertSet(purchaseRequestItemList, ErpPurchaseRequestItemDO::getProductId));
        return success(BeanUtils.toBean(purchaseRequest, ErpPurchaseRequestRespVO.class, vo -> {
            vo.setItems(BeanUtils.toBean(purchaseRequestItemList, ErpPurchaseRequestRespVO.Item.class, item ->
                    MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
                            .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName()))));
                    MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName())
                            .setProductBarCode(mdmItem.getBarCode()))));
            // å¡«å……关联字段
            fillPurchaseRequestRelatedFields(vo);
        }));
@@ -158,8 +158,8 @@
        List<ErpPurchaseRequestItemDO> purchaseRequestItemList = purchaseRequestService.getPurchaseRequestItemListByRequestIds(
                convertSet(pageResult.getList(), ErpPurchaseRequestDO::getId));
        Map<Long, List<ErpPurchaseRequestItemDO>> purchaseRequestItemMap = convertMultiMap(purchaseRequestItemList, ErpPurchaseRequestItemDO::getRequestId);
        // 1.2 äº§å“ä¿¡æ¯
        Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
        // 1.2 ç‰©æ–™ä¿¡æ¯
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                convertSet(purchaseRequestItemList, ErpPurchaseRequestItemDO::getProductId));
        // 1.3 ä¾›åº”商信息
        Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap(
@@ -174,8 +174,8 @@
        // 2. å¼€å§‹æ‹¼æŽ¥
        return BeanUtils.toBean(pageResult, ErpPurchaseRequestRespVO.class, vo -> {
            vo.setItems(BeanUtils.toBean(purchaseRequestItemMap.get(vo.getId()), ErpPurchaseRequestRespVO.Item.class,
                    item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
                            .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName()))));
                    item -> MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName())
                            .setProductBarCode(mdmItem.getBarCode()))));
            vo.setProductNames(CollUtil.join(vo.getItems(), ",", ErpPurchaseRequestRespVO.Item::getProductName));
            MapUtils.findAndThen(supplierMap, vo.getSupplierId(), supplier -> vo.setSupplierName(supplier.getName()));
            MapUtils.findAndThen(userMap, vo.getRequestUserId(), user -> vo.setRequestUserName(user.getNickname()));
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseReturnController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/returns/ErpPurchaseReturnPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/returns/ErpPurchaseReturnRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/returns/ErpPurchaseReturnSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java
@@ -10,15 +10,14 @@
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO;
import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService;
import cn.iocoder.yudao.module.erp.service.stock.ErpStockService;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
@@ -50,12 +49,10 @@
    @Resource
    private ErpSaleOrderService saleOrderService;
    @Resource
    private ErpStockService stockService;
    @Resource
    private ErpProductService productService;
    @Resource
    private CrmCustomerApi customerApi;
    @Resource
    private MdmItemApi mdmItemApi;
    @Resource
    private AdminUserApi adminUserApi;
@@ -120,14 +117,14 @@
            return success(null);
        }
        List<ErpSaleOrderItemDO> saleOrderItemList = saleOrderService.getSaleOrderItemListByOrderId(id);
        Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId));
        return success(BeanUtils.toBean(saleOrder, ErpSaleOrderRespVO.class, saleOrderVO ->
                saleOrderVO.setItems(BeanUtils.toBean(saleOrderItemList, ErpSaleOrderRespVO.Item.class, item -> {
                    BigDecimal stockCount = stockService.getStockCount(item.getProductId());
                    item.setStockCount(stockCount != null ? stockCount : BigDecimal.ZERO);
                    MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
                            .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName()));
                    // åº“存信息暂不查询(仓储物流模块)
                    item.setStockCount(BigDecimal.ZERO);
                    MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName())
                            .setProductBarCode(mdmItem.getBarCode()));
                }))));
    }
@@ -159,8 +156,8 @@
        List<ErpSaleOrderItemDO> saleOrderItemList = saleOrderService.getSaleOrderItemListByOrderIds(
                convertSet(pageResult.getList(), ErpSaleOrderDO::getId));
        Map<Long, List<ErpSaleOrderItemDO>> saleOrderItemMap = convertMultiMap(saleOrderItemList, ErpSaleOrderItemDO::getOrderId);
        // 1.2 äº§å“ä¿¡æ¯
        Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
        // 1.2 ç‰©æ–™ä¿¡æ¯
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId));
        // 1.3 å®¢æˆ·ä¿¡æ¯ï¼ˆä½¿ç”¨ CRM å®¢æˆ· API)
        Map<Long, CrmCustomerRespDTO> customerMap = customerApi.getCustomerMap(
@@ -171,8 +168,8 @@
        // 2. å¼€å§‹æ‹¼æŽ¥
        return BeanUtils.toBean(pageResult, ErpSaleOrderRespVO.class, saleOrder -> {
            saleOrder.setItems(BeanUtils.toBean(saleOrderItemMap.get(saleOrder.getId()), ErpSaleOrderRespVO.Item.class,
                    item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
                            .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName()))));
                    item -> MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName())
                            .setProductBarCode(mdmItem.getBarCode()))));
            saleOrder.setProductNames(CollUtil.join(saleOrder.getItems(), ",", ErpSaleOrderRespVO.Item::getProductName));
            MapUtils.findAndThen(customerMap, saleOrder.getCustomerId(), supplier -> saleOrder.setCustomerName(supplier.getName()));
            MapUtils.findAndThen(userMap, Long.parseLong(saleOrder.getCreator()), user -> saleOrder.setCreatorName(user.getNickname()));
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOutController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleReturnController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/out/ErpSaleOutPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/out/ErpSaleOutRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/out/ErpSaleOutSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/returns/ErpSaleReturnPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/returns/ErpSaleReturnRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/returns/ErpSaleReturnSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockMoveController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockOutController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockRecordController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpWarehouseController.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/in/ErpStockInPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/in/ErpStockInRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/in/ErpStockInSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/move/ErpStockMovePageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/move/ErpStockMoveRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/move/ErpStockMoveSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/out/ErpStockOutPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/out/ErpStockOutRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/out/ErpStockOutSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/record/ErpStockRecordPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/record/ErpStockRecordRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/stock/ErpStockPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/stock/ErpStockRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehousePageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseRespVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/convert/mapping/ErpMesWarehouseMappingConvert.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/finance/ErpFinancePaymentItemDO.java
@@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.erp.dal.dataobject.finance;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -15,7 +14,7 @@
 * @author èŠ‹é“æºç 
 */
@TableName("erp_finance_payment_item")
@KeySequence("erp_finance_payment_item_seq") // ç”¨äºŽ Oracle、PostgreSQL、Kingbase、DB2、H2 æ•°æ®åº“的主键自增。如果是 MySQL ç­‰æ•°æ®åº“,可不写。
@KeySequence("erp_finance_payment_item_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@@ -44,14 +43,10 @@
    private Integer bizType;
    /**
     * ä¸šåŠ¡ç¼–å·
     *
     * ä¾‹å¦‚说:{@link ErpPurchaseInDO#getId()}
     */
    private Long bizId;
    /**
     * ä¸šåŠ¡å•å·
     *
     * ä¾‹å¦‚说:{@link ErpPurchaseInDO#getNo()}
     */
    private String bizNo;
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/finance/ErpFinanceReceiptItemDO.java
@@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.erp.dal.dataobject.finance;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOutDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -15,7 +14,7 @@
 * @author èŠ‹é“æºç 
 */
@TableName("erp_finance_receipt_item")
@KeySequence("erp_finance_receipt_item_seq") // ç”¨äºŽ Oracle、PostgreSQL、Kingbase、DB2、H2 æ•°æ®åº“的主键自增。如果是 MySQL ç­‰æ•°æ®åº“,可不写。
@KeySequence("erp_finance_receipt_item_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@@ -44,14 +43,10 @@
    private Integer bizType;
    /**
     * ä¸šåŠ¡ç¼–å·
     *
     * ä¾‹å¦‚说:{@link ErpSaleOutDO#getId()}
     */
    private Long bizId;
    /**
     * ä¸šåŠ¡å•å·
     *
     * ä¾‹å¦‚说:{@link ErpSaleOutDO#getNo()}
     */
    private String bizNo;
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/mapping/ErpMesWarehouseMappingDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/product/ErpProductCategoryDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/product/ErpProductDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/product/ErpProductUnitDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseInDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseInItemDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseOrderDO.java
@@ -53,6 +53,16 @@
     */
    private Long accountId;
    /**
     * å…³è”采购申请编号
     *
     * å…³è” {@link ErpPurchaseRequestDO#getId()}
     */
    private Long requestId;
    /**
     * é‡‡è´­ç”³è¯·å•号
     */
    private String requestNo;
    /**
     * ä¸‹å•æ—¶é—´
     */
    private LocalDateTime orderTime;
@@ -112,4 +122,11 @@
     */
    private BigDecimal returnCount;
    /**
     * å…¥åº“状态
     *
     * æžšä¸¾ {@link cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderInStatusEnum}
     */
    private Integer inStatus;
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseOrderItemDO.java
@@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.erp.dal.dataobject.purchase;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -36,15 +35,15 @@
     */
    private Long orderId;
    /**
     * äº§å“ç¼–号
     * ç‰©æ–™ç¼–号
     *
     * å…³è” {@link ErpProductDO#getId()}
     * å…³è” {@link cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO#getId()}
     */
    private Long productId;
    /**
     * äº§å“å•位单位
     * è®¡é‡å•位编号
     *
     * å†—ä½™ {@link ErpProductDO#getUnitId()}
     * å…³è” {@link cn.iocoder.yudao.module.mdm.api.unitmeasure.dto.MdmUnitMeasureRespDTO#getId()}
     */
    private Long productUnitId;
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseRequestDO.java
@@ -111,6 +111,13 @@
    private LocalDateTime orderTime;
    /**
     * å…¥åº“状态
     *
     * æžšä¸¾ {@link cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderInStatusEnum}
     */
    private Integer inStatus;
    /**
     * é™„件地址
     */
    private String fileUrl;
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseRequestItemDO.java
@@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.erp.dal.dataobject.purchase;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -37,15 +36,15 @@
     */
    private Long requestId;
    /**
     * äº§å“ç¼–号
     * ç‰©æ–™ç¼–号
     *
     * å…³è” {@link ErpProductDO#getId()}
     * å…³è” {@link cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO#getId()}
     */
    private Long productId;
    /**
     * äº§å“å•位编号
     * è®¡é‡å•位编号
     *
     * å†—ä½™ {@link ErpProductDO#getUnitId()}
     * å…³è” {@link cn.iocoder.yudao.module.mdm.api.unitmeasure.dto.MdmUnitMeasureRespDTO#getId()}
     */
    private Long productUnitId;
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseReturnDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/purchase/ErpPurchaseReturnItemDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleOrderDO.java
@@ -126,4 +126,11 @@
     */
    private BigDecimal returnCount;
    /**
     * å‡ºåº“状态
     *
     * æžšä¸¾ {@link cn.iocoder.yudao.module.erp.enums.ErpSaleOrderOutStatusEnum}
     */
    private Integer outStatus;
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleOrderItemDO.java
@@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.erp.dal.dataobject.sale;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -15,7 +14,7 @@
 * @author èŠ‹é“æºç 
 */
@TableName("erp_sale_order_items")
@KeySequence("erp_sale_order_items_seq") // ç”¨äºŽ Oracle、PostgreSQL、Kingbase、DB2、H2 æ•°æ®åº“的主键自增。如果是 MySQL ç­‰æ•°æ®åº“,可不写。
@KeySequence("erp_sale_order_items_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@@ -36,15 +35,15 @@
     */
    private Long orderId;
    /**
     * äº§å“ç¼–号
     * ç‰©æ–™ç¼–号
     *
     * å…³è” {@link ErpProductDO#getId()}
     * å…³è” {@link cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO#getId()}
     */
    private Long productId;
    /**
     * äº§å“å•位单位
     * è®¡é‡å•位编号
     *
     * å†—ä½™ {@link ErpProductDO#getUnitId()}
     * å…³è” {@link cn.iocoder.yudao.module.mdm.api.unitmeasure.dto.MdmUnitMeasureRespDTO#getId()}
     */
    private Long productUnitId;
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleOutDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleOutItemDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleReturnDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpSaleReturnItemDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockCheckDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockCheckItemDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockInDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockInItemDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockMoveDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockMoveItemDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockOutDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockOutItemDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockRecordDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpWarehouseDO.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/mapping/ErpMesWarehouseMappingMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductCategoryMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductUnitMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseInItemMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseInMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseReturnItemMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseReturnMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleOutItemMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleOutMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleReturnItemMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleReturnMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckItemMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInItemMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockMoveItemMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockMoveMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutItemMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockRecordMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpWarehouseMapper.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/redis/no/ErpNoRedisDAO.java
@@ -20,36 +20,9 @@
public class ErpNoRedisDAO {
    /**
     * å…¶å®ƒå…¥åº“ {@link cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInDO}
     */
    public static final String STOCK_IN_NO_PREFIX = "QTRK";
    /**
     * å…¶å®ƒå‡ºåº“ {@link cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockOutDO}
     */
    public static final String STOCK_OUT_NO_PREFIX = "QCKD";
    /**
     * åº“存调拨 {@link cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockMoveDO}
     */
    public static final String STOCK_MOVE_NO_PREFIX = "QCDB";
    /**
     * åº“存盘点 {@link cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockCheckDO}
     */
    public static final String STOCK_CHECK_NO_PREFIX = "QCPD";
    /**
     * é”€å”®è®¢å• {@link cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO}
     */
    public static final String SALE_ORDER_NO_PREFIX = "XSDD";
    /**
     * é”€å”®å‡ºåº“ {@link cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOutDO}
     */
    public static final String SALE_OUT_NO_PREFIX = "XSCK";
    /**
     * é”€å”®é€€è´§ {@link cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleReturnDO}
     */
    public static final String SALE_RETURN_NO_PREFIX = "XSTH";
    /**
     * é‡‡è´­è®¢å• {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO}
@@ -59,14 +32,6 @@
     * é‡‡è´­ç”³è¯· {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO}
     */
    public static final String PURCHASE_REQUEST_NO_PREFIX = "CGSQ";
    /**
     * é‡‡è´­å…¥åº“ {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO}
     */
    public static final String PURCHASE_IN_NO_PREFIX = "CGRK";
    /**
     * é‡‡è´­é€€è´§ {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnDO}
     */
    public static final String PURCHASE_RETURN_NO_PREFIX = "CGTH";
    /**
     * ä»˜æ¬¾å• {@link cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO}
@@ -82,7 +47,7 @@
    /**
     * ç”Ÿæˆåºå·ï¼Œä½¿ç”¨å½“前日期,格式为 {PREFIX} + yyyyMMdd + 6 ä½è‡ªå¢ž
     * ä¾‹å¦‚说:QTRK 202109 000001 ï¼ˆæ²¡æœ‰ä¸­é—´ç©ºæ ¼ï¼‰
     * ä¾‹å¦‚说:CGDD 202109 000001 ï¼ˆæ²¡æœ‰ä¸­é—´ç©ºæ ¼ï¼‰
     *
     * @param prefix å‰ç¼€
     * @return åºå·
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpPurchaseOrderInStatusEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.erp.enums;
import cn.iocoder.yudao.framework.common.core.ArrayValuable;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
/**
 * ERP é‡‡è´­è®¢å•入库状态枚举
 *
 * @author èŠ‹é“æºç 
 */
@RequiredArgsConstructor
@Getter
public enum ErpPurchaseOrderInStatusEnum implements ArrayValuable<Integer> {
    NOT_IN(0, "未入库"),
    PART_IN(1, "部分入库"),
    ALL_IN(2, "全部入库");
    private final Integer status;
    private final String name;
    public static final Integer[] ARRAYS = Arrays.stream(values())
            .map(ErpPurchaseOrderInStatusEnum::getStatus).toArray(Integer[]::new);
    @Override
    public Integer[] array() {
        return ARRAYS;
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpSaleOrderOutStatusEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.erp.enums;
import cn.iocoder.yudao.framework.common.core.ArrayValuable;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
/**
 * ERP é”€å”®è®¢å•出库状态枚举
 *
 * @author èŠ‹é“æºç 
 */
@RequiredArgsConstructor
@Getter
public enum ErpSaleOrderOutStatusEnum implements ArrayValuable<Integer> {
    NOT_OUT(0, "未出库"),
    PART_OUT(1, "部分出库"),
    ALL_OUT(2, "全部出库");
    private final Integer status;
    private final String name;
    public static final Integer[] ARRAYS = Arrays.stream(values())
            .map(ErpSaleOrderOutStatusEnum::getStatus).toArray(Integer[]::new);
    @Override
    public Integer[] array() {
        return ARRAYS;
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/stock/ErpStockRecordBizTypeEnum.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java
@@ -1,24 +1,16 @@
package cn.iocoder.yudao.module.erp.service.finance;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentItemDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnDO;
import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinancePaymentItemMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinancePaymentMapper;
import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
import cn.iocoder.yudao.module.erp.enums.common.ErpBizTypeEnum;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInService;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseReturnService;
import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import jakarta.annotation.Resource;
@@ -34,8 +26,6 @@
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
// TODO èŠ‹è‰¿ï¼šè®°å½•æ“ä½œæ—¥å¿—
/**
 * ERP ä»˜æ¬¾å• Service å®žçŽ°ç±»
@@ -58,10 +48,6 @@
    private ErpSupplierService supplierService;
    @Resource
    private ErpAccountService accountService;
    @Resource
    private ErpPurchaseInService purchaseInService;
    @Resource
    private ErpPurchaseReturnService purchaseReturnService;
    @Resource
    private AdminUserApi adminUserApi;
@@ -159,28 +145,22 @@
    private List<ErpFinancePaymentItemDO> validateFinancePaymentItems(
            Long supplierId,
            List<ErpFinancePaymentSaveReqVO.Item> list) {
        // é‡‡è´­å…¥åº“/退货功能已移除,暂时只支持手动录入付款明细
        return convertList(list, o -> BeanUtils.toBean(o, ErpFinancePaymentItemDO.class, item -> {
            if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_IN.getType())) {
                ErpPurchaseInDO purchaseIn = purchaseInService.validatePurchaseIn(item.getBizId());
                Assert.equals(purchaseIn.getSupplierId(), supplierId, "供应商必须相同");
                item.setTotalPrice(purchaseIn.getTotalPrice()).setBizNo(purchaseIn.getNo());
            } else if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_RETURN.getType())) {
                ErpPurchaseReturnDO purchaseReturn = purchaseReturnService.validatePurchaseReturn(item.getBizId());
                Assert.equals(purchaseReturn.getSupplierId(), supplierId, "供应商必须相同");
                item.setTotalPrice(purchaseReturn.getTotalPrice().negate()).setBizNo(purchaseReturn.getNo());
            } else {
                throw new IllegalArgumentException("业务类型不正确:" + item.getBizType());
            if (item.getPaymentPrice() == null) {
                item.setPaymentPrice(BigDecimal.ZERO);
            }
            if (item.getTotalPrice() == null) {
                item.setTotalPrice(BigDecimal.ZERO);
            }
        }));
    }
    private void updateFinancePaymentItemList(Long id, List<ErpFinancePaymentItemDO> newList) {
        // ç¬¬ä¸€æ­¥ï¼Œå¯¹æ¯”新老数据,获得添加、修改、删除的列表
        List<ErpFinancePaymentItemDO> oldList = financePaymentItemMapper.selectListByPaymentId(id);
        List<List<ErpFinancePaymentItemDO>> diffList = diffList(oldList, newList, // id ä¸åŒï¼Œå°±è®¤ä¸ºæ˜¯ä¸åŒçš„记录
        List<List<ErpFinancePaymentItemDO>> diffList = diffList(oldList, newList,
                (oldVal, newVal) -> oldVal.getId().equals(newVal.getId()));
        // ç¬¬äºŒæ­¥ï¼Œæ‰¹é‡æ·»åŠ ã€ä¿®æ”¹ã€åˆ é™¤
        if (CollUtil.isNotEmpty(diffList.get(0))) {
            diffList.get(0).forEach(o -> o.setPaymentId(id));
            financePaymentItemMapper.insertBatch(diffList.get(0));
@@ -191,23 +171,10 @@
        if (CollUtil.isNotEmpty(diffList.get(2))) {
            financePaymentItemMapper.deleteByIds(convertList(diffList.get(2), ErpFinancePaymentItemDO::getId));
        }
        // ç¬¬ä¸‰æ­¥ï¼Œæ›´æ–°é‡‡è´­å…¥åº“、退货的付款金额情况
        updatePurchasePrice(CollectionUtils.newArrayList(diffList));
    }
    private void updatePurchasePrice(List<ErpFinancePaymentItemDO> paymentItems) {
        paymentItems.forEach(paymentItem -> {
            BigDecimal totalPaymentPrice = financePaymentItemMapper.selectPaymentPriceSumByBizIdAndBizType(
                    paymentItem.getBizId(), paymentItem.getBizType());
            if (ErpBizTypeEnum.PURCHASE_IN.getType().equals(paymentItem.getBizType())) {
                purchaseInService.updatePurchaseInPaymentPrice(paymentItem.getBizId(), totalPaymentPrice);
            } else if (ErpBizTypeEnum.PURCHASE_RETURN.getType().equals(paymentItem.getBizType())) {
                purchaseReturnService.updatePurchaseReturnRefundPrice(paymentItem.getBizId(), totalPaymentPrice.negate());
            } else {
                throw new IllegalArgumentException("业务类型不正确:" + paymentItem.getBizType());
            }
        });
        // é‡‡è´­å…¥åº“/退货功能已移除,不再更新关联业务金额
    }
    @Override
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinanceReceiptServiceImpl.java
@@ -1,25 +1,17 @@
package cn.iocoder.yudao.module.erp.service.finance;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.receipt.ErpFinanceReceiptPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.receipt.ErpFinanceReceiptSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinanceReceiptDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinanceReceiptItemDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOutDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleReturnDO;
import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinanceReceiptItemMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinanceReceiptMapper;
import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
import cn.iocoder.yudao.module.erp.enums.common.ErpBizTypeEnum;
import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOutService;
import cn.iocoder.yudao.module.erp.service.sale.ErpSaleReturnService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@@ -34,8 +26,6 @@
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
// TODO èŠ‹è‰¿ï¼šè®°å½•æ“ä½œæ—¥å¿—
/**
 * ERP æ”¶æ¬¾å• Service å®žçŽ°ç±»
@@ -58,10 +48,6 @@
    private CrmCustomerApi customerApi;
    @Resource
    private ErpAccountService accountService;
    @Resource
    private ErpSaleOutService saleOutService;
    @Resource
    private ErpSaleReturnService saleReturnService;
    @Resource
    private AdminUserApi adminUserApi;
@@ -159,17 +145,14 @@
    private List<ErpFinanceReceiptItemDO> validateFinanceReceiptItems(
            Long customerId,
            List<ErpFinanceReceiptSaveReqVO.Item> list) {
        // é”€å”®å‡ºåº“/退货功能已移除,暂时只支持手动录入收款明细
        return convertList(list, o -> BeanUtils.toBean(o, ErpFinanceReceiptItemDO.class, item -> {
            if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.SALE_OUT.getType())) {
                ErpSaleOutDO saleOut = saleOutService.validateSaleOut(item.getBizId());
                Assert.equals(saleOut.getCustomerId(), customerId, "客户必须相同");
                item.setTotalPrice(saleOut.getTotalPrice()).setBizNo(saleOut.getNo());
            } else if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.SALE_RETURN.getType())) {
                ErpSaleReturnDO saleReturn = saleReturnService.validateSaleReturn(item.getBizId());
                Assert.equals(saleReturn.getCustomerId(), customerId, "客户必须相同");
                item.setTotalPrice(saleReturn.getTotalPrice().negate()).setBizNo(saleReturn.getNo());
            } else {
                throw new IllegalArgumentException("业务类型不正确:" + item.getBizType());
            // ä¸šåŠ¡ç±»åž‹æ ¡éªŒå·²ç§»é™¤ï¼Œç›´æŽ¥ä½¿ç”¨ä¼ å…¥çš„æ•°æ®
            if (item.getReceiptPrice() == null) {
                item.setReceiptPrice(BigDecimal.ZERO);
            }
            if (item.getTotalPrice() == null) {
                item.setTotalPrice(BigDecimal.ZERO);
            }
        }));
    }
@@ -177,7 +160,7 @@
    private void updateFinanceReceiptItemList(Long id, List<ErpFinanceReceiptItemDO> newList) {
        // ç¬¬ä¸€æ­¥ï¼Œå¯¹æ¯”新老数据,获得添加、修改、删除的列表
        List<ErpFinanceReceiptItemDO> oldList = financeReceiptItemMapper.selectListByReceiptId(id);
        List<List<ErpFinanceReceiptItemDO>> diffList = diffList(oldList, newList, // id ä¸åŒï¼Œå°±è®¤ä¸ºæ˜¯ä¸åŒçš„记录
        List<List<ErpFinanceReceiptItemDO>> diffList = diffList(oldList, newList,
                (oldVal, newVal) -> oldVal.getId().equals(newVal.getId()));
        // ç¬¬äºŒæ­¥ï¼Œæ‰¹é‡æ·»åŠ ã€ä¿®æ”¹ã€åˆ é™¤
@@ -191,23 +174,10 @@
        if (CollUtil.isNotEmpty(diffList.get(2))) {
            financeReceiptItemMapper.deleteByIds(convertList(diffList.get(2), ErpFinanceReceiptItemDO::getId));
        }
        // ç¬¬ä¸‰æ­¥ï¼Œæ›´æ–°é”€å”®å‡ºåº“、退货的收款金额情况
        updateSalePrice(CollectionUtils.newArrayList(diffList));
    }
    private void updateSalePrice(List<ErpFinanceReceiptItemDO> receiptItems) {
        receiptItems.forEach(receiptItem -> {
            BigDecimal totalReceiptPrice = financeReceiptItemMapper.selectReceiptPriceSumByBizIdAndBizType(
                    receiptItem.getBizId(), receiptItem.getBizType());
            if (ErpBizTypeEnum.SALE_OUT.getType().equals(receiptItem.getBizType())) {
                saleOutService.updateSaleInReceiptPrice(receiptItem.getBizId(), totalReceiptPrice);
            } else if (ErpBizTypeEnum.SALE_RETURN.getType().equals(receiptItem.getBizType())) {
                saleReturnService.updateSaleReturnRefundPrice(receiptItem.getBizId(), totalReceiptPrice.negate());
            } else {
                throw new IllegalArgumentException("业务类型不正确:" + receiptItem.getBizType());
            }
        });
        // é”€å”®å‡ºåº“/退货功能已移除,不再更新关联业务金额
    }
    @Override
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductCategoryService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductCategoryServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductUnitService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductUnitServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/mapping/ErpMdmMappingService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/mapping/ErpMdmMappingServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/mapping/ErpMesWarehouseMappingService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/mapping/ErpMesWarehouseMappingServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderService.java
@@ -124,4 +124,16 @@
     */
    List<ErpPurchaseOrderDO> getPurchaseOrderList(List<Long> ids);
    /**
     * æ›´æ–°é‡‡è´­è®¢å•的入库状态
     *
     * æ ¹æ®æ˜Žç»†å…¥åº“数量自动计算订单状态:
     * - æ‰€æœ‰æ˜Žç»†éƒ½å®Œæˆå…¥åº“ â†’ å…¨éƒ¨å…¥åº“状态
     * - éƒ¨åˆ†æ˜Žç»†å®Œæˆå…¥åº“ â†’ éƒ¨åˆ†å…¥åº“状态
     * - æ— æ˜Žç»†å…¥åº“ â†’ æœªå…¥åº“状态
     *
     * @param orderId è®¢å•编号
     */
    void updatePurchaseOrderInStatus(Long orderId);
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
@@ -7,16 +7,16 @@
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;
import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderItemMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderMapper;
import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
import cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderInStatusEnum;
import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
@@ -49,11 +49,13 @@
    private ErpNoRedisDAO noRedisDAO;
    @Resource
    private ErpProductService productService;
    @Resource
    private ErpSupplierService supplierService;
    @Resource
    private ErpAccountService accountService;
    @Resource
    @Lazy
    private ErpPurchaseRequestService purchaseRequestService;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -154,13 +156,8 @@
    }
    private List<ErpPurchaseOrderItemDO> validatePurchaseOrderItems(List<ErpPurchaseOrderSaveReqVO.Item> list) {
        // 1. æ ¡éªŒäº§å“å­˜åœ¨
        List<ErpProductDO> productList = productService.validProductList(
                convertSet(list, ErpPurchaseOrderSaveReqVO.Item::getProductId));
        Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId);
        // 2. è½¬åŒ–为 ErpPurchaseOrderItemDO åˆ—表
        // è½¬åŒ–为 ErpPurchaseOrderItemDO åˆ—表(产品验证已移除)
        return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseOrderItemDO.class, item -> {
            item.setProductUnitId(productMap.get(item.getProductId()).getUnitId());
            item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount()));
            if (item.getTotalPrice() == null) {
                return;
@@ -201,7 +198,7 @@
            }
            if (inCount.compareTo(item.getCount()) > 0) {
                throw exception(PURCHASE_ORDER_ITEM_IN_FAIL_PRODUCT_EXCEED,
                        productService.getProduct(item.getProductId()).getName(), item.getCount());
                        "产品ID:" + item.getProductId(), item.getCount());
            }
            purchaseOrderItemMapper.updateById(new ErpPurchaseOrderItemDO().setId(item.getId()).setInCount(inCount));
        });
@@ -221,7 +218,7 @@
            }
            if (returnCount.compareTo(item.getInCount()) > 0) {
                throw exception(PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED,
                        productService.getProduct(item.getProductId()).getName(), item.getInCount());
                        "产品ID:" + item.getProductId(), item.getInCount());
            }
            purchaseOrderItemMapper.updateById(new ErpPurchaseOrderItemDO().setId(item.getId()).setReturnCount(returnCount));
        });
@@ -309,4 +306,55 @@
        return purchaseOrderMapper.selectByIds(ids);
    }
    @Override
    public void updatePurchaseOrderInStatus(Long orderId) {
        // 1. èŽ·å–é‡‡è´­è®¢å•
        ErpPurchaseOrderDO order = validatePurchaseOrderExists(orderId);
        // 2. èŽ·å–é‡‡è´­è®¢å•æ˜Žç»†
        List<ErpPurchaseOrderItemDO> items = purchaseOrderItemMapper.selectListByOrderId(orderId);
        if (CollUtil.isEmpty(items)) {
            return;
        }
        // 3. è®¡ç®—入库状态
        int inStatus = calculateInStatus(items);
        // 4. æ›´æ–°é‡‡è´­è®¢å•入库状态
        purchaseOrderMapper.updateById(new ErpPurchaseOrderDO()
                .setId(orderId).setInStatus(inStatus));
        // 5. åŒæ­¥æ›´æ–°é‡‡è´­ç”³è¯·çš„入库状态(如果有关联的采购申请)
        if (order.getRequestId() != null) {
            purchaseRequestService.updatePurchaseRequestInStatus(order.getRequestId(), inStatus);
        }
    }
    /**
     * è®¡ç®—入库状态
     *
     * @param items é‡‡è´­è®¢å•明细列表
     * @return å…¥åº“状态
     */
    private int calculateInStatus(List<ErpPurchaseOrderItemDO> items) {
        boolean allIn = true;
        boolean anyIn = false;
        for (ErpPurchaseOrderItemDO item : items) {
            BigDecimal count = item.getCount() != null ? item.getCount() : BigDecimal.ZERO;
            BigDecimal inCount = item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO;
            if (inCount.compareTo(BigDecimal.ZERO) > 0) {
                anyIn = true;
            }
            if (inCount.compareTo(count) < 0) {
                allIn = false;
            }
        }
        if (allIn) {
            return ErpPurchaseOrderInStatusEnum.ALL_IN.getStatus();
        } else if (anyIn) {
            return ErpPurchaseOrderInStatusEnum.PART_IN.getStatus();
        } else {
            return ErpPurchaseOrderInStatusEnum.NOT_IN.getStatus();
        }
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestService.java
@@ -107,4 +107,12 @@
     */
    List<java.util.Map<String, Object>> getPurchaseRequestApproveProcessDefinitionList();
    /**
     * æ›´æ–°é‡‡è´­ç”³è¯·çš„入库状态
     *
     * @param id       é‡‡è´­ç”³è¯·ç¼–号
     * @param inStatus å…¥åº“状态
     */
    void updatePurchaseRequestInStatus(Long id, Integer inStatus);
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
@@ -14,14 +14,12 @@
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestItemDO;
import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseRequestItemMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseRequestMapper;
import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
import cn.iocoder.yudao.module.erp.enums.ErpPurchaseRequestStatusEnum;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.repository.ProcessDefinition;
@@ -59,8 +57,6 @@
    @Resource
    private ErpNoRedisDAO noRedisDAO;
    @Resource
    private ErpProductService productService;
    @Resource
    private ErpSupplierService supplierService;
@@ -154,13 +150,8 @@
    }
    private List<ErpPurchaseRequestItemDO> validatePurchaseRequestItems(List<ErpPurchaseRequestSaveReqVO.Item> list) {
        // 1. æ ¡éªŒäº§å“å­˜åœ¨
        List<ErpProductDO> productList = productService.validProductList(
                convertSet(list, ErpPurchaseRequestSaveReqVO.Item::getProductId));
        Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId);
        // 2. è½¬åŒ–为 ErpPurchaseRequestItemDO åˆ—表
        // è½¬åŒ–为 ErpPurchaseRequestItemDO åˆ—表(产品验证已移除,使用 MDM ç‰©æ–™ï¼‰
        return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseRequestItemDO.class, item -> {
            item.setProductUnitId(productMap.get(item.getProductId()).getUnitId());
            if (item.getProductPrice() != null && item.getCount() != null) {
                item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount()));
                if (item.getTaxPercent() != null) {
@@ -400,4 +391,11 @@
        return result;
    }
    @Override
    public void updatePurchaseRequestInStatus(Long id, Integer inStatus) {
        purchaseRequestMapper.updateById(new ErpPurchaseRequestDO()
                .setId(id)
                .setInStatus(inStatus));
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseReturnService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseReturnServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderService.java
@@ -121,4 +121,16 @@
     */
    List<ErpSaleOrderItemDO> getSaleOrderItemListByOrderIds(Collection<Long> orderIds);
    /**
     * æ›´æ–°é”€å”®è®¢å•的出库状态
     *
     * æ ¹æ®æ˜Žç»†å‡ºåº“数量自动计算订单状态:
     * - æ‰€æœ‰æ˜Žç»†éƒ½å®Œæˆå‡ºåº“ â†’ å…¨éƒ¨å‡ºåº“状态
     * - éƒ¨åˆ†æ˜Žç»†å®Œæˆå‡ºåº“ â†’ éƒ¨åˆ†å‡ºåº“状态
     * - æ— æ˜Žç»†å‡ºåº“ â†’ æœªå‡ºåº“状态
     *
     * @param orderId è®¢å•编号
     */
    void updateSaleOrderOutStatus(Long orderId);
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
@@ -9,15 +9,14 @@
import cn.iocoder.yudao.module.crm.api.contract.CrmContractApi;
import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;
import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderItemMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderMapper;
import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
import cn.iocoder.yudao.module.erp.enums.ErpSaleOrderOutStatusEnum;
import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@@ -33,8 +32,6 @@
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
// TODO èŠ‹è‰¿ï¼šè®°å½•æ“ä½œæ—¥å¿—
/**
 * ERP é”€å”®è®¢å• Service å®žçŽ°ç±»
@@ -53,8 +50,6 @@
    @Resource
    private ErpNoRedisDAO noRedisDAO;
    @Resource
    private ErpProductService productService;
    @Resource
    private CrmCustomerApi customerApi;
    @Resource
@@ -225,13 +220,8 @@
    }
    private List<ErpSaleOrderItemDO> validateSaleOrderItems(List<ErpSaleOrderSaveReqVO.Item> list) {
        // 1. æ ¡éªŒäº§å“å­˜åœ¨
        List<ErpProductDO> productList = productService.validProductList(
                convertSet(list, ErpSaleOrderSaveReqVO.Item::getProductId));
        Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId);
        // 2. è½¬åŒ–为 ErpSaleOrderItemDO åˆ—表
        // è½¬åŒ–为 ErpSaleOrderItemDO åˆ—表(产品验证已移除)
        return convertList(list, o -> BeanUtils.toBean(o, ErpSaleOrderItemDO.class, item -> {
            item.setProductUnitId(productMap.get(item.getProductId()).getUnitId());
            item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount()));
            if (item.getTotalPrice() == null) {
                return;
@@ -272,7 +262,7 @@
            }
            if (outCount.compareTo(item.getCount()) > 0) {
                throw exception(SALE_ORDER_ITEM_OUT_FAIL_PRODUCT_EXCEED,
                        productService.getProduct(item.getProductId()).getName(), item.getCount());
                        "产品ID:" + item.getProductId(), item.getCount());
            }
            saleOrderItemMapper.updateById(new ErpSaleOrderItemDO().setId(item.getId()).setOutCount(outCount));
        });
@@ -292,7 +282,7 @@
            }
            if (returnCount.compareTo(item.getOutCount()) > 0) {
                throw exception(SALE_ORDER_ITEM_RETURN_FAIL_OUT_EXCEED,
                        productService.getProduct(item.getProductId()).getName(), item.getOutCount());
                        "产品ID:" + item.getProductId(), item.getOutCount());
            }
            saleOrderItemMapper.updateById(new ErpSaleOrderItemDO().setId(item.getId()).setReturnCount(returnCount));
        });
@@ -366,4 +356,51 @@
        return saleOrderItemMapper.selectListByOrderIds(orderIds);
    }
    @Override
    public void updateSaleOrderOutStatus(Long orderId) {
        // 1. èŽ·å–é”€å”®è®¢å•
        ErpSaleOrderDO order = validateSaleOrderExists(orderId);
        // 2. èŽ·å–é”€å”®è®¢å•æ˜Žç»†
        List<ErpSaleOrderItemDO> items = saleOrderItemMapper.selectListByOrderId(orderId);
        if (CollUtil.isEmpty(items)) {
            return;
        }
        // 3. è®¡ç®—出库状态
        int outStatus = calculateOutStatus(items);
        // 4. æ›´æ–°é”€å”®è®¢å•出库状态
        saleOrderMapper.updateById(new ErpSaleOrderDO()
                .setId(orderId).setOutStatus(outStatus));
    }
    /**
     * è®¡ç®—出库状态
     *
     * @param items é”€å”®è®¢å•明细列表
     * @return å‡ºåº“状态
     */
    private int calculateOutStatus(List<ErpSaleOrderItemDO> items) {
        boolean allOut = true;
        boolean anyOut = false;
        for (ErpSaleOrderItemDO item : items) {
            BigDecimal count = item.getCount() != null ? item.getCount() : BigDecimal.ZERO;
            BigDecimal outCount = item.getOutCount() != null ? item.getOutCount() : BigDecimal.ZERO;
            if (outCount.compareTo(BigDecimal.ZERO) > 0) {
                anyOut = true;
            }
            if (outCount.compareTo(count) < 0) {
                allOut = false;
            }
        }
        if (allOut) {
            return ErpSaleOrderOutStatusEnum.ALL_OUT.getStatus();
        } else if (anyOut) {
            return ErpSaleOrderOutStatusEnum.PART_OUT.getStatus();
        } else {
            return ErpSaleOrderOutStatusEnum.NOT_OUT.getStatus();
        }
    }
}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleReturnService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleReturnServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockCheckService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockCheckServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockMoveService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockMoveServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockRecordService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockRecordServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseService.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/stock/bo/ErpStockRecordCreateReqBO.java
ÎļþÒÑɾ³ý
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/approval/HrmLeaveApplicationController.java
@@ -5,12 +5,11 @@
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationPageReqVO;
import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationRespVO;
import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationSaveReqVO;
import cn.iocoder.yudao.module.hrm.service.approval.HrmLeaveApplicationService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -36,8 +35,6 @@
    @Resource
    private HrmLeaveApplicationService leaveApplicationService;
    @Resource
    private AdminUserApi adminUserApi;
    @PostMapping("/create")
    @Operation(summary = "创建请假申请")
@@ -85,9 +82,8 @@
    @PreAuthorize("@ss.hasPermission('hrm:leave:submit')")
    public CommonResult<Boolean> submitLeaveApplication(@RequestParam("id") Long id,
                                                         @RequestParam("processDefinitionKey") String processDefinitionKey) {
        // èŽ·å–å½“å‰ç”¨æˆ·ID
        AdminUserRespDTO user = adminUserApi.getUser(1L); // TODO: èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·
        leaveApplicationService.submitLeaveApplication(id, processDefinitionKey, user.getId());
        Long userId = SecurityFrameworkUtils.getLoginUserId();
        leaveApplicationService.submitLeaveApplication(id, processDefinitionKey, userId);
        return success(true);
    }
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/approval/HrmResignationApplicationController.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationPageReqVO;
import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationRespVO;
import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationSaveReqVO;
@@ -85,8 +86,8 @@
    @PreAuthorize("@ss.hasPermission('hrm:resignation:submit')")
    public CommonResult<Boolean> submitResignationApplication(@RequestParam("id") Long id,
                                                              @RequestParam("processDefinitionKey") String processDefinitionKey) {
        AdminUserRespDTO user = adminUserApi.getUser(1L); // TODO: èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·
        resignationApplicationService.submitResignationApplication(id, processDefinitionKey, user.getId());
        Long userId = SecurityFrameworkUtils.getLoginUserId();
        resignationApplicationService.submitResignationApplication(id, processDefinitionKey, userId);
        return success(true);
    }
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/approval/HrmTransferApplicationController.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationPageReqVO;
import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationRespVO;
import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationSaveReqVO;
@@ -85,8 +86,8 @@
    @PreAuthorize("@ss.hasPermission('hrm:transfer:submit')")
    public CommonResult<Boolean> submitTransferApplication(@RequestParam("id") Long id,
                                                           @RequestParam("processDefinitionKey") String processDefinitionKey) {
        AdminUserRespDTO user = adminUserApi.getUser(1L); // TODO: èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·
        transferApplicationService.submitTransferApplication(id, processDefinitionKey, user.getId());
        Long userId = SecurityFrameworkUtils.getLoginUserId();
        transferApplicationService.submitTransferApplication(id, processDefinitionKey, userId);
        return success(true);
    }
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmLeaveApplicationServiceImpl.java
@@ -4,6 +4,7 @@
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
@@ -91,8 +92,7 @@
    }
    private Long getCurrentUserId() {
        // TODO: èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·ID
        return 1L;
        return SecurityFrameworkUtils.getLoginUserId();
    }
    private String generateUniqueNo() {
yudao-module-mes/pom.xml
@@ -31,13 +31,6 @@
            <version>${revision}</version>
        </dependency>
        <!-- WMS ä»“储物流 API -->
        <dependency>
            <groupId>cn.iocoder.boot</groupId>
            <artifactId>yudao-module-wms-api</artifactId>
            <version>${revision}</version>
        </dependency>
        <!-- BPM å·¥ä½œæµ API -->
        <dependency>
            <groupId>cn.iocoder.boot</groupId>
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java
@@ -15,6 +15,8 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO;
import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService;
import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -44,6 +46,8 @@
    private MesWmArrivalNoticeService arrivalNoticeService;
    @Resource
    private MesMdVendorService vendorService;
    @Resource
    private ErpPurchaseOrderApi purchaseOrderApi;
    @PostMapping("/create")
    @Operation(summary = "创建到货通知单")
@@ -111,6 +115,14 @@
        return success(true);
    }
    @PostMapping("/generate-from-purchase-order")
    @Operation(summary = "根据采购订单生成到货通知单")
    @Parameter(name = "purchaseOrderId", description = "采购订单编号", required = true)
    @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:create')")
    public CommonResult<Long> generateFromPurchaseOrder(@RequestParam("purchaseOrderId") Long purchaseOrderId) {
        return success(arrivalNoticeService.generateArrivalNoticeFromPurchaseOrder(purchaseOrderId));
    }
    // ==================== æ‹¼æŽ¥ VO ====================
    private List<MesWmArrivalNoticeRespVO> buildRespVOList(List<MesWmArrivalNoticeDO> list) {
@@ -120,10 +132,21 @@
        // 1. èŽ·å¾—å…³è”æ•°æ®
        Map<Long, MesMdVendorDO> vendorMap = vendorService.getVendorMap(
                convertSet(list, MesWmArrivalNoticeDO::getVendorId));
        // 2. æž„建结果
        // 2. èŽ·å¾—é‡‡è´­è®¢å•ä¿¡æ¯
        List<Long> purchaseOrderIds = list.stream()
                .map(MesWmArrivalNoticeDO::getPurchaseOrderId)
                .filter(id -> id != null)
                .distinct()
                .toList();
        Map<Long, ErpPurchaseOrderRespDTO> purchaseOrderMap = purchaseOrderApi.getPurchaseOrderList(purchaseOrderIds)
                .getCheckedData().stream()
                .collect(java.util.stream.Collectors.toMap(ErpPurchaseOrderRespDTO::getId, v -> v, (a, b) -> a));
        // 3. æž„建结果
        return BeanUtils.toBean(list, MesWmArrivalNoticeRespVO.class, vo -> {
            MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor ->
                    vo.setVendorCode(vendor.getCode()).setVendorName(vendor.getName()));
            MapUtils.findAndThen(purchaseOrderMap, vo.getPurchaseOrderId(), purchaseOrder ->
                    vo.setPurchaseOrderNo(purchaseOrder.getNo()));
        });
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticePageReqVO.java
@@ -23,8 +23,8 @@
    @Schema(description = "通知单名称", example = "钢板到货")
    private String name;
    @Schema(description = "采购订单编号", example = "PO20260101")
    private String purchaseOrderCode;
    @Schema(description = "采购订单编号", example = "1")
    private Long purchaseOrderId;
    @Schema(description = "供应商编号", example = "1")
    private Long vendorId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java
@@ -29,7 +29,7 @@
    @Schema(description = "采购订单号", example = "PO20260101")
    @ExcelProperty("采购订单号")
    private String purchaseOrderCode;
    private String purchaseOrderNo;
    @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long vendorId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java
@@ -25,7 +25,7 @@
    @Schema(description = "采购订单编号", example = "1")
    private Long purchaseOrderId;
    @Schema(description = "采购订单号", example = "PO20260101")
    @Schema(description = "采购订单编码", example = "PO20260101")
    private String purchaseOrderCode;
    @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@@ -39,7 +39,7 @@
    @Schema(description = "联系人", example = "张三")
    private String contactName;
    @Schema(description = "联系电话", example = "13800138000")
    @Schema(description = "联系人", example = "13800138000")
    private String contactTelephone;
    @Schema(description = "备注", example = "备注")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java
@@ -16,6 +16,9 @@
    @Schema(description = "到货通知单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long noticeId;
    @Schema(description = "采购订单行编号", example = "1")
    private Long purchaseOrderItemId;
    @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long itemId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java
@@ -18,6 +18,9 @@
    @NotNull(message = "到货通知单编号不能为空")
    private Long noticeId;
    @Schema(description = "采购订单行编号", example = "1")
    private Long purchaseOrderItemId;
    @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "物料编号不能为空")
    private Long itemId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptController.java
@@ -146,6 +146,25 @@
        return success(true);
    }
    @PostMapping("/generate-from-arrival-notice")
    @Operation(summary = "根据到货通知单生成采购入库单")
    @Parameter(name = "arrivalNoticeId", description = "到货通知单编号", required = true)
    @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:create')")
    public CommonResult<Long> generateFromArrivalNotice(@RequestParam("arrivalNoticeId") Long arrivalNoticeId) {
        return success(itemReceiptService.generateItemReceiptFromArrivalNotice(arrivalNoticeId));
    }
    @PutMapping("/submit-approval")
    @Operation(summary = "提交采购入库单审批")
    @Parameter(name = "id", description = "入库单编号", required = true)
    @Parameter(name = "processDefinitionKey", description = "流程定义 Key", required = true)
    @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:update')")
    public CommonResult<Boolean> submitApproval(@RequestParam("id") Long id,
                                                 @RequestParam("processDefinitionKey") String processDefinitionKey) {
        itemReceiptService.submitItemReceiptApproval(id, processDefinitionKey);
        return success(true);
    }
    // ==================== æ‹¼æŽ¥ VO ====================
    private List<MesWmItemReceiptRespVO> buildRespVOList(List<MesWmItemReceiptDO> list) {
@@ -166,7 +185,7 @@
            MapUtils.findAndThen(iqcMap, vo.getIqcId(),
                    iqc -> vo.setIqcCode(iqc.getCode()));
            MapUtils.findAndThen(noticeMap, vo.getNoticeId(), notice ->
                    vo.setNoticeCode(notice.getCode()).setPurchaseOrderCode(notice.getPurchaseOrderCode()));
                    vo.setNoticeCode(notice.getCode()));
        });
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptRespVO.java
@@ -57,6 +57,9 @@
    @ExcelProperty("状态")
    private Integer status;
    @Schema(description = "BPM æµç¨‹å®žä¾‹ç¼–号", example = "xxx")
    private String processInstanceId;
    @Schema(description = "备注", example = "备注")
    @ExcelProperty("备注")
    private String remark;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineRespVO.java
@@ -25,6 +25,9 @@
    @Schema(description = "到货通知单行编号", example = "1")
    private Long arrivalNoticeLineId;
    @Schema(description = "采购订单行编号", example = "1")
    private Long purchaseOrderItemId;
    @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long itemId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineSaveReqVO.java
@@ -22,6 +22,9 @@
    @Schema(description = "到货通知单行编号", example = "1")
    private Long arrivalNoticeLineId;
    @Schema(description = "采购订单行编号", example = "1")
    private Long purchaseOrderItemId;
    @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "物料编号不能为空")
    private Long itemId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java
@@ -111,6 +111,14 @@
        return success(true);
    }
    @PostMapping("/generate-from-sale-order")
    @Operation(summary = "从销售订单生成发货通知单")
    @Parameter(name = "saleOrderId", description = "销售订单ID", required = true)
    @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:create')")
    public CommonResult<Long> generateFromSaleOrder(@RequestParam("saleOrderId") Long saleOrderId) {
        return success(salesNoticeService.generateSalesNoticeFromSaleOrder(saleOrderId));
    }
    // ==================== æ‹¼æŽ¥ VO ====================
    private List<MesWmSalesNoticeRespVO> buildRespVOList(List<MesWmSalesNoticeDO> list) {
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java
@@ -24,10 +24,6 @@
    @ExcelProperty("通知单名称")
    private String name;
    @Schema(description = "销售订单编号", example = "SO202603010001")
    @ExcelProperty("销售订单编号")
    private String salesOrderCode;
    @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long clientId;
@@ -39,6 +35,13 @@
    @ExcelProperty("客户名称")
    private String clientName;
    @Schema(description = "销售订单ID", example = "1")
    private Long saleOrderId;
    @Schema(description = "销售订单号", example = "SO202603010001")
    @ExcelProperty("销售订单号")
    private String saleOrderCode;
    @Schema(description = "发货日期", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("发货日期")
    private LocalDateTime salesDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeSaveReqVO.java
@@ -22,13 +22,16 @@
    @NotEmpty(message = "通知单名称不能为空")
    private String name;
    @Schema(description = "销售订单编号", example = "SO202603010001")
    private String salesOrderCode;
    @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    @NotNull(message = "客户编号不能为空")
    private Long clientId;
    @Schema(description = "销售订单ID", example = "1")
    private Long saleOrderId;
    @Schema(description = "销售订单号", example = "SO202603010001")
    private String saleOrderCode;
    @Schema(description = "发货日期", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "发货日期不能为空")
    private LocalDateTime salesDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineRespVO.java
@@ -16,6 +16,9 @@
    @Schema(description = "发货通知单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long noticeId;
    @Schema(description = "销售订单明细ID", example = "1")
    private Long saleOrderItemId;
    @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
    private Long itemId;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java
@@ -44,9 +44,7 @@
     */
    private Long purchaseOrderId;
    /**
     * é‡‡è´­è®¢å•号
     *
     * å†—余自 ERP é‡‡è´­è®¢å•çš„ no å­—段
     * é‡‡è´­è®¢å•编码(冗余字段,用于显示)
     */
    private String purchaseOrderCode;
    /**
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeLineDO.java
@@ -35,6 +35,12 @@
     */
    private Long noticeId;
    /**
     * é‡‡è´­è®¢å•行编号
     *
     * å…³è” ERP {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO#getId()}
     */
    private Long purchaseOrderItemId;
    /**
     * ç‰©æ–™ç¼–号
     *
     * å…³è” {@link MesMdItemDO#getId()}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java
@@ -75,6 +75,14 @@
     */
    private Integer status;
    /**
     * BPM æµç¨‹å®žä¾‹ç¼–号
     */
    private String processInstanceId;
    /**
     * BPM æµç¨‹å®šä¹‰ Key
     */
    private String processDefinitionKey;
    /**
     * å¤‡æ³¨
     */
    private String remark;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDetailDO.java
@@ -49,6 +49,10 @@
     */
    private Long itemId;
    /**
     * åº“存编号
     */
    private Long materialStockId;
    /**
     * ä¸Šæž¶æ•°é‡
     */
    private BigDecimal quantity;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptLineDO.java
@@ -43,6 +43,12 @@
     */
    private Long arrivalNoticeLineId;
    /**
     * é‡‡è´­è®¢å•行编号
     *
     * å…³è” ERP {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO#getId()}
     */
    private Long purchaseOrderItemId;
    /**
     * ç‰©æ–™ç¼–号
     *
     * å…³è” {@link MesMdItemDO#getId()}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesDO.java
@@ -47,6 +47,10 @@
     */
    private Long clientId;
    /**
     * é”€å”®è®¢å•ID
     */
    private Long saleOrderId;
    /**
     * é”€å”®è®¢å•号
     */
    private String salesOrderCode;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java
@@ -42,6 +42,10 @@
     */
    private Long salesId;
    /**
     * é”€å”®è®¢å•明细ID
     */
    private Long saleOrderItemId;
    /**
     * å‘货通知单行ID
     *
     * å…³è” {@link MesWmSalesNoticeLineDO#getId()}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java
@@ -47,6 +47,14 @@
     */
    private Long clientId;
    /**
     * é”€å”®è®¢å•ID
     */
    private Long saleOrderId;
    /**
     * é”€å”®è®¢å•号
     */
    private String saleOrderCode;
    /**
     * å‘货日期
     */
    private LocalDateTime salesDate;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeLineDO.java
@@ -35,6 +35,10 @@
     */
    private Long noticeId;
    /**
     * é”€å”®è®¢å•明细ID
     */
    private Long saleOrderItemId;
    /**
     * ç‰©æ–™ç¼–号
     *
     * å…³è” {@link MesMdItemDO#getId()}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java
@@ -17,7 +17,7 @@
        return selectPage(reqVO, new LambdaQueryWrapperX<MesWmArrivalNoticeDO>()
                .likeIfPresent(MesWmArrivalNoticeDO::getCode, reqVO.getCode())
                .likeIfPresent(MesWmArrivalNoticeDO::getName, reqVO.getName())
                .likeIfPresent(MesWmArrivalNoticeDO::getPurchaseOrderCode, reqVO.getPurchaseOrderCode())
                .eqIfPresent(MesWmArrivalNoticeDO::getPurchaseOrderId, reqVO.getPurchaseOrderId())
                .eqIfPresent(MesWmArrivalNoticeDO::getVendorId, reqVO.getVendorId())
                .betweenIfPresent(MesWmArrivalNoticeDO::getArrivalDate, reqVO.getArrivalDate())
                .eqIfPresent(MesWmArrivalNoticeDO::getStatus, reqVO.getStatus())
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -460,6 +460,7 @@
    ErrorCode WM_ITEM_RECEIPT_STATUS_ERROR = new ErrorCode(1_040_705_005, "入库单状态不正确");
    ErrorCode WM_ITEM_RECEIPT_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_705_006, "已完成或已取消的入库单不允许取消");
    ErrorCode WM_PURCHASE_ORDER_NOT_EXISTS = new ErrorCode(1_040_705_007, "采购订单不存在");
    ErrorCode WM_PURCHASE_ORDER_NO_ITEM = new ErrorCode(1_040_705_008, "采购订单无明细数据");
    ErrorCode WM_ITEM_RECEIPT_LINE_NOT_EXISTS = new ErrorCode(1_040_705_100, "采购入库单行不存在");
    ErrorCode WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_REQUIRED = new ErrorCode(1_040_705_101,
            "入库单关联了到货通知单,必须选择到货通知单行");
@@ -684,6 +685,8 @@
    ErrorCode WM_SALES_NOTICE_LINE_NOT_EXISTS = new ErrorCode(1_040_720_010, "发货通知单行不存在");
    ErrorCode WM_SALES_NOTICE_LINE_EMPTY = new ErrorCode(1_040_720_011, "发货通知单行为空,不能提交");
    ErrorCode WM_SALES_NOTICE_LINE_NOT_MATCH = new ErrorCode(1_040_720_012, "发货通知单行不属于指定的发货通知单");
    ErrorCode WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS = new ErrorCode(1_040_720_013, "销售订单不存在");
    ErrorCode WM_SALES_NOTICE_SALE_ORDER_ITEM_EMPTY = new ErrorCode(1_040_720_014, "销售订单明细为空");
    // ========== MES ä»“库管理-条码配置(1-040-730-000) ==========
    ErrorCode WM_BARCODE_CONFIG_NOT_EXISTS = new ErrorCode(1_040_730_000, "条码配置不存在");
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmSalesNoticeStatusEnum.java
@@ -27,8 +27,13 @@
     *
     * å¯¹åº” MesWmSalesNoticeService#submitSalesNotice æ–¹æ³•
     */
    APPROVED(MesOrderStatusConstants.APPROVED, "待出库");
    // TODO @芋艿:【对齐】暂时无后续流程,看看后续要怎么支持下。
    APPROVED(MesOrderStatusConstants.APPROVED, "待出库"),
    /**
     * å·²å®Œæˆ
     *
     * å¯¹åº” MesWmSalesNoticeService#finishSalesNotice æ–¹æ³•(出库完成后调用)
     */
    FINISHED(MesOrderStatusConstants.FINISHED, "已完成");
    public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmSalesNoticeStatusEnum::getStatus).toArray(Integer[]::new);
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java
@@ -93,4 +93,11 @@
     */
    MesWmArrivalNoticeLineDO validateArrivalNoticeLineExists(Long lineId, Long noticeId);
    /**
     * æ ¹æ®é‡‡è´­è®¢å•行创建到货通知单行(内部方法,不校验)
     *
     * @param line åˆ°è´§é€šçŸ¥å•行
     */
    void createArrivalNoticeLineFromPurchaseOrderItem(MesWmArrivalNoticeLineDO line);
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java
@@ -139,4 +139,11 @@
        return line;
    }
    @Override
    public void createArrivalNoticeLineFromPurchaseOrderItem(MesWmArrivalNoticeLineDO line) {
        // å†…部方法,不做校验,直接插入
        initQualifiedQuantityIfNoIqc(line);
        arrivalNoticeLineMapper.insert(line);
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java
@@ -133,4 +133,12 @@
     */
    Long getArrivalNoticeCountByVendorId(Long vendorId);
    /**
     * æ ¹æ®é‡‡è´­è®¢å•生成到货通知单
     *
     * @param purchaseOrderId é‡‡è´­è®¢å•编号
     * @return ç”Ÿæˆçš„到货通知单编号
     */
    Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId);
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
@@ -13,6 +13,8 @@
import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum;
import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -46,6 +48,9 @@
    @Resource
    private ErpPurchaseOrderApi purchaseOrderApi;
    @Resource
    private MesMdItemService mdItemService;
    @Override
    public Long createArrivalNotice(MesWmArrivalNoticeSaveReqVO createReqVO) {
        // æ ¡éªŒæ•°æ®
@@ -75,14 +80,12 @@
        validateCodeUnique(reqVO.getId(), reqVO.getCode());
        // æ ¡éªŒä¾›åº”商存在且启用
        vendorService.validateVendorExistsAndEnable(reqVO.getVendorId());
        // æ ¡éªŒé‡‡è´­è®¢å•存在,并自动填充采购订单号
        // æ ¡éªŒé‡‡è´­è®¢å•存在
        if (reqVO.getPurchaseOrderId() != null) {
            ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(reqVO.getPurchaseOrderId()).getCheckedData();
            if (purchaseOrder == null) {
                throw exception(WM_PURCHASE_ORDER_NOT_EXISTS);
            }
            // è‡ªåŠ¨å¡«å……é‡‡è´­è®¢å•å·
            reqVO.setPurchaseOrderCode(purchaseOrder.getNo());
        }
    }
@@ -256,4 +259,55 @@
        return arrivalNoticeMapper.selectCountByVendorId(vendorId);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId) {
        // 1. èŽ·å–é‡‡è´­è®¢å•
        ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(purchaseOrderId).getCheckedData();
        if (purchaseOrder == null) {
            throw exception(WM_PURCHASE_ORDER_NOT_EXISTS);
        }
        // 2. èŽ·å–é‡‡è´­è®¢å•æ˜Žç»†
        List<ErpPurchaseOrderItemRespDTO> items = purchaseOrderApi.getPurchaseOrderItemList(purchaseOrderId).getCheckedData();
        if (CollUtil.isEmpty(items)) {
            throw exception(WM_PURCHASE_ORDER_NO_ITEM);
        }
        // 3. ç”Ÿæˆåˆ°è´§é€šçŸ¥å•编码(使用编码规则服务)
        String code = generateArrivalNoticeCode();
        // 4. åˆ›å»ºåˆ°è´§é€šçŸ¥å•主表
        MesWmArrivalNoticeDO notice = new MesWmArrivalNoticeDO();
        notice.setCode(code);
        notice.setName(purchaseOrder.getNo() + "到货通知");
        notice.setPurchaseOrderId(purchaseOrderId);
        notice.setPurchaseOrderCode(purchaseOrder.getNo());
        notice.setVendorId(purchaseOrder.getSupplierId());
        notice.setStatus(MesWmArrivalNoticeStatusEnum.PREPARE.getStatus());
        arrivalNoticeMapper.insert(notice);
        // 5. éåŽ†æ˜Žç»†åˆ›å»ºåˆ°è´§é€šçŸ¥å•è¡Œ
        for (ErpPurchaseOrderItemRespDTO item : items) {
            MesWmArrivalNoticeLineDO line = new MesWmArrivalNoticeLineDO();
            line.setNoticeId(notice.getId());
            line.setPurchaseOrderItemId(item.getId());
            // æ³¨æ„ï¼šè¿™é‡Œéœ€è¦æ ¹æ® ERP äº§å“ ID æ˜ å°„到 MES ç‰©æ–™ ID
            // å®žé™…项目中需要通过映射服务处理,这里暂时留空让用户手动选择
            line.setArrivalQuantity(item.getCount() != null ? item.getCount().subtract(item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO) : BigDecimal.ZERO);
            line.setIqcCheckFlag(false); // é»˜è®¤ä¸éœ€è¦æ£€éªŒï¼Œç”¨æˆ·å¯ä¿®æ”¹
            arrivalNoticeLineService.createArrivalNoticeLineFromPurchaseOrderItem(line);
        }
        return notice.getId();
    }
    /**
     * ç”Ÿæˆåˆ°è´§é€šçŸ¥å•编码
     */
    private String generateArrivalNoticeCode() {
        // TODO: ä½¿ç”¨ç¼–码规则服务生成编码
        return "AN" + System.currentTimeMillis();
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineService.java
@@ -66,4 +66,11 @@
     */
    void deleteItemReceiptLineByReceiptId(Long receiptId);
    /**
     * æ ¹æ®åˆ°è´§é€šçŸ¥å•行创建入库单行(内部方法,不校验)
     *
     * @param line å…¥åº“单行
     */
    void createItemReceiptLineFromArrivalNoticeLine(MesWmItemReceiptLineDO line);
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java
@@ -133,6 +133,12 @@
        itemReceiptLineMapper.deleteByReceiptId(receiptId);
    }
    @Override
    public void createItemReceiptLineFromArrivalNoticeLine(MesWmItemReceiptLineDO line) {
        // å†…部方法,不做校验,直接插入
        itemReceiptLineMapper.insert(line);
    }
    /**
     * æ ¡éªŒåˆ°è´§é€šçŸ¥å•行
     *
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java
@@ -124,4 +124,28 @@
        return convertMap(getItemReceiptList(ids), MesWmItemReceiptDO::getId);
    }
    /**
     * æ ¹æ®åˆ°è´§é€šçŸ¥å•生成采购入库单
     *
     * @param arrivalNoticeId åˆ°è´§é€šçŸ¥å•编号
     * @return ç”Ÿæˆçš„采购入库单编号
     */
    Long generateItemReceiptFromArrivalNotice(Long arrivalNoticeId);
    /**
     * æäº¤é‡‡è´­å…¥åº“单审批
     *
     * @param id å…¥åº“单编号
     * @param processDefinitionKey æµç¨‹å®šä¹‰ Key
     */
    void submitItemReceiptApproval(Long id, String processDefinitionKey);
    /**
     * æ›´æ–°é‡‡è´­å…¥åº“单审批状态(由 BPM Listener å›žè°ƒï¼‰
     *
     * @param id å…¥åº“单编号
     * @param bpmResult BPM å®¡æ‰¹ç»“æžœ
     */
    void updateItemReceiptAuditStatus(Long id, Integer bpmResult);
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java
@@ -16,16 +16,25 @@
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService;
import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService;
import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeLineService;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO;
import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
import java.util.Collection;
@@ -40,6 +49,7 @@
 */
@Service
@Validated
@Slf4j
public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService {
    @Resource
@@ -59,6 +69,15 @@
    private MesQcIqcService iqcService;
    @Resource
    private MesWmTransactionService wmTransactionService;
    @Resource
    private MesWmArrivalNoticeLineService arrivalNoticeLineService;
    @Resource
    private BpmProcessInstanceApi processInstanceApi;
    @Resource
    private ErpPurchaseOrderApi purchaseOrderApi;
    @Override
    public Long createItemReceipt(MesWmItemReceiptSaveReqVO createReqVO) {
@@ -188,6 +207,40 @@
        if (receipt.getNoticeId() != null) {
            arrivalNoticeService.finishArrivalNotice(receipt.getNoticeId());
        }
        // 5. å›žå†™ ERP é‡‡è´­è®¢å•的入库数量
        updateErpPurchaseOrderInCount(receipt);
    }
    /**
     * å›žå†™ ERP é‡‡è´­è®¢å•的入库数量
     */
    private void updateErpPurchaseOrderInCount(MesWmItemReceiptDO receipt) {
        // èŽ·å–å…¥åº“å•è¡Œ
        List<MesWmItemReceiptLineDO> lines = itemReceiptLineService.getItemReceiptLineListByReceiptId(receipt.getId());
        if (CollUtil.isEmpty(lines)) {
            return;
        }
        // ç”¨äºŽå­˜å‚¨é‡‡è´­è®¢å• ID,避免重复更新
        Long purchaseOrderId = null;
        // éåŽ†è¡Œï¼ŒæŒ‰ purchaseOrderItemId æ›´æ–°å…¥åº“数量
        for (MesWmItemReceiptLineDO line : lines) {
            if (line.getPurchaseOrderItemId() != null && line.getReceivedQuantity() != null) {
                purchaseOrderApi.updateOrderItemInCount(line.getPurchaseOrderItemId(), line.getReceivedQuantity());
                // èŽ·å–é‡‡è´­è®¢å• ID(从第一个有效的明细项获取)
                if (purchaseOrderId == null) {
                    cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO itemDTO =
                            purchaseOrderApi.getPurchaseOrderItem(line.getPurchaseOrderItemId()).getCheckedData();
                    if (itemDTO != null && itemDTO.getOrderId() != null) {
                        purchaseOrderId = itemDTO.getOrderId();
                    }
                }
            }
        }
        // æ›´æ–°é‡‡è´­è®¢å•的入库状态
        if (purchaseOrderId != null) {
            purchaseOrderApi.updateOrderInStatus(purchaseOrderId);
        }
    }
    private void createTransactionList(MesWmItemReceiptDO receipt) {
@@ -272,4 +325,115 @@
        return itemReceiptMapper.selectByIds(ids);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long generateItemReceiptFromArrivalNotice(Long arrivalNoticeId) {
        // 1. æ ¡éªŒåˆ°è´§é€šçŸ¥å•存在且状态为待入库
        MesWmArrivalNoticeDO notice = arrivalNoticeService.validateArrivalNoticeReadyForReceipt(arrivalNoticeId);
        // 2. èŽ·å–åˆ°è´§é€šçŸ¥å•è¡Œ
        List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(arrivalNoticeId);
        if (CollUtil.isEmpty(lines)) {
            throw exception(WM_ARRIVAL_NOTICE_NO_LINE);
        }
        // 3. ç”Ÿæˆå…¥åº“单编码
        String code = generateItemReceiptCode();
        // 4. åˆ›å»ºå…¥åº“单主表
        MesWmItemReceiptDO receipt = new MesWmItemReceiptDO();
        receipt.setCode(code);
        receipt.setName(notice.getName() + "入库单");
        receipt.setNoticeId(arrivalNoticeId);
        receipt.setPurchaseOrderCode(notice.getPurchaseOrderCode());
        receipt.setVendorId(notice.getVendorId());
        receipt.setStatus(MesWmItemReceiptStatusEnum.PREPARE.getStatus());
        itemReceiptMapper.insert(receipt);
        // 5. éåŽ†è¡Œåˆ›å»ºå…¥åº“å•è¡Œ
        for (MesWmArrivalNoticeLineDO noticeLine : lines) {
            MesWmItemReceiptLineDO receiptLine = new MesWmItemReceiptLineDO();
            receiptLine.setReceiptId(receipt.getId());
            receiptLine.setArrivalNoticeLineId(noticeLine.getId());
            receiptLine.setPurchaseOrderItemId(noticeLine.getPurchaseOrderItemId());
            receiptLine.setItemId(noticeLine.getItemId());
            // ä½¿ç”¨åˆæ ¼æ•°é‡ï¼ˆå¦‚果有 IQC åˆ™æ˜¯åˆæ ¼æ•°é‡ï¼Œå¦åˆ™æ˜¯åˆ°è´§æ•°é‡ï¼‰
            receiptLine.setReceivedQuantity(noticeLine.getQualifiedQuantity() != null ? noticeLine.getQualifiedQuantity() : noticeLine.getArrivalQuantity());
            itemReceiptLineService.createItemReceiptLineFromArrivalNoticeLine(receiptLine);
        }
        return receipt.getId();
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submitItemReceiptApproval(Long id, String processDefinitionKey) {
        // 1. æ ¡éªŒå­˜åœ¨ + è‰ç¨¿çŠ¶æ€
        validateItemReceiptExistsAndDraft(id);
        // 2. åˆ›å»º BPM æµç¨‹å®žä¾‹
        Long userId = getCurrentUserId();
        String processInstanceId = processInstanceApi.createProcessInstance(userId,
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(processDefinitionKey)
                        .setBusinessKey(String.valueOf(id)));
        // 3. æ›´æ–°å…¥åº“单状态为审批中
        itemReceiptMapper.updateById(new MesWmItemReceiptDO()
                .setId(id)
                .setStatus(MesWmItemReceiptStatusEnum.APPROVING.getStatus())
                .setProcessInstanceId(processInstanceId));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateItemReceiptAuditStatus(Long id, Integer bpmResult) {
        // 1. æ ¡éªŒå­˜åœ¨
        MesWmItemReceiptDO receipt = validateItemReceiptExists(id);
        if (!MesWmItemReceiptStatusEnum.APPROVING.getStatus().equals(receipt.getStatus())) {
            log.warn("[updateItemReceiptAuditStatus] å…¥åº“单({}) ä¸å¤„于审批中状态", id);
            return;
        }
        // 2. æ ¹æ®å®¡æ‰¹ç»“果更新状态
        Integer newStatus = convertBpmResultToReceiptStatus(bpmResult);
        if (newStatus != null) {
            itemReceiptMapper.updateById(new MesWmItemReceiptDO()
                    .setId(id).setStatus(newStatus));
        }
    }
    /**
     * è½¬æ¢ BPM å®¡æ‰¹ç»“果为入库单状态
     */
    private Integer convertBpmResultToReceiptStatus(Integer bpmResult) {
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult)) {
            return MesWmItemReceiptStatusEnum.APPROVED.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult)) {
            return MesWmItemReceiptStatusEnum.PREPARE.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult)) {
            return MesWmItemReceiptStatusEnum.CANCELED.getStatus();
        }
        return null;
    }
    /**
     * èŽ·å–å½“å‰ç”¨æˆ· ID
     */
    private Long getCurrentUserId() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && authentication.getPrincipal() instanceof Long) {
            return (Long) authentication.getPrincipal();
        }
        return 1L; // é»˜è®¤ç”¨æˆ·
    }
    /**
     * ç”Ÿæˆå…¥åº“单编码
     */
    private String generateItemReceiptCode() {
        // TODO: ä½¿ç”¨ç¼–码规则服务生成编码
        return "IR" + System.currentTimeMillis();
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/listener/MesWmItemReceiptStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package cn.iocoder.yudao.module.mes.service.wm.itemreceipt.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptMapper;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum;
import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
 * é‡‡è´­å…¥åº“单 BPM å®¡æ‰¹çŠ¶æ€ç›‘å¬å™¨
 *
 * ç›‘听 BPM æµç¨‹å®žä¾‹çŠ¶æ€å˜æ›´äº‹ä»¶ï¼Œæ›´æ–°é‡‡è´­å…¥åº“å•çš„å®¡æ‰¹çŠ¶æ€
 */
@Component
@Slf4j
public class MesWmItemReceiptStatusListener {
    /**
     * BPM åˆ†ç±»ç¼–码:采购入库审批
     */
    public static final String ITEM_RECEIPT_APPROVE_CATEGORY_CODE = "item_receipt_approve";
    @Resource
    private MesWmItemReceiptService itemReceiptService;
    @Resource
    private MesWmItemReceiptMapper itemReceiptMapper;
    @EventListener
    public void onApplicationEvent(BpmProcessInstanceStatusEvent event) {
        // 1. è§£æžä¸šåС䏻键
        Long receiptId;
        try {
            receiptId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onApplicationEvent] ä¸šåС䏻键({}) ä¸æ˜¯æœ‰æ•ˆçš„入库单编号", event.getBusinessKey());
            return;
        }
        // 2. æ ¡éªŒå…¥åº“单存在
        MesWmItemReceiptDO receipt = itemReceiptMapper.selectById(receiptId);
        if (receipt == null) {
            log.warn("[onApplicationEvent] å…¥åº“单({}) ä¸å­˜åœ¨", receiptId);
            return;
        }
        // 3. æ ¡éªŒå…¥åº“单状态为审批中
        if (!MesWmItemReceiptStatusEnum.APPROVING.getStatus().equals(receipt.getStatus())) {
            log.warn("[onApplicationEvent] å…¥åº“单({}) ä¸å¤„于审批中状态,当前状态:{}", receiptId, receipt.getStatus());
            return;
        }
        // 4. æ›´æ–°å…¥åº“单审批状态
        itemReceiptService.updateItemReceiptAuditStatus(receiptId, event.getStatus());
        log.info("[onApplicationEvent] å…¥åº“单({}) å®¡æ‰¹çŠ¶æ€æ›´æ–°å®Œæˆï¼ŒBPM çŠ¶æ€ï¼š{}", receiptId, event.getStatus());
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java
@@ -24,6 +24,7 @@
import cn.iocoder.yudao.module.mes.service.wm.salesnotice.MesWmSalesNoticeService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -60,6 +61,9 @@
    private MesWmTransactionService wmTransactionService;
    @Resource
    private MesWmMaterialStockService materialStockService;
    @Resource
    private ErpSaleOrderApi saleOrderApi;
    @Override
    public Long createProductSales(MesWmProductSalesSaveReqVO createReqVO) {
@@ -229,6 +233,45 @@
        // 3. æ›´æ–°å‡ºåº“单状态
        productSalesMapper.updateById(new MesWmProductSalesDO()
                .setId(id).setStatus(MesWmProductSalesStatusEnum.FINISHED.getStatus()));
        // 4. æ›´æ–°å…³è”的发货通知单状态
        if (sales.getNoticeId() != null) {
            salesNoticeService.finishSalesNotice(sales.getNoticeId());
        }
        // 5. å›žå†™ ERP é”€å”®è®¢å•的出库数量和状态
        updateErpSaleOrderOutCount(sales);
    }
    /**
     * å›žå†™ ERP é”€å”®è®¢å•的出库数量和状态
     */
    private void updateErpSaleOrderOutCount(MesWmProductSalesDO sales) {
        // èŽ·å–å‡ºåº“å•è¡Œ
        List<MesWmProductSalesLineDO> lines = productSalesLineService.getProductSalesLineListBySalesId(sales.getId());
        if (CollUtil.isEmpty(lines)) {
            return;
        }
        // ç”¨äºŽå­˜å‚¨é”€å”®è®¢å• ID,避免重复更新
        Long saleOrderId = null;
        // éåŽ†è¡Œï¼ŒæŒ‰ saleOrderItemId æ›´æ–°å‡ºåº“数量
        for (MesWmProductSalesLineDO line : lines) {
            if (line.getSaleOrderItemId() != null && line.getQuantity() != null) {
                saleOrderApi.updateOrderItemOutCount(line.getSaleOrderItemId(), line.getQuantity());
                // èŽ·å–é”€å”®è®¢å• ID(从第一个有效的明细项获取)
                if (saleOrderId == null) {
                    cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO itemDTO =
                            saleOrderApi.getSaleOrderItem(line.getSaleOrderItemId()).getCheckedData();
                    if (itemDTO != null && itemDTO.getOrderId() != null) {
                        saleOrderId = itemDTO.getOrderId();
                    }
                }
            }
        }
        // æ›´æ–°é”€å”®è®¢å•的出库状态
        if (saleOrderId != null) {
            saleOrderApi.updateOrderOutStatus(saleOrderId);
        }
    }
    private void createTransactionList(MesWmProductSalesDO sales) {
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineService.java
@@ -83,4 +83,11 @@
     */
    MesWmSalesNoticeLineDO validateSalesNoticeLineExists(Long lineId, Long noticeId);
    /**
     * åˆ›å»ºå‘货通知单行(直接使用 DO)
     *
     * @param line è¡Œ DO
     */
    void createSalesNoticeLine(MesWmSalesNoticeLineDO line);
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java
@@ -152,4 +152,9 @@
        }
    }
    @Override
    public void createSalesNoticeLine(MesWmSalesNoticeLineDO line) {
        salesNoticeLineMapper.insert(line);
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java
@@ -88,4 +88,19 @@
        return convertMap(getSalesNoticeList(ids), MesWmSalesNoticeDO::getId);
    }
    /**
     * ä»Žé”€å”®è®¢å•生成发货通知单
     *
     * @param saleOrderId é”€å”®è®¢å•ID
     * @return å‘货通知单ID
     */
    Long generateSalesNoticeFromSaleOrder(Long saleOrderId);
    /**
     * å®Œæˆå‘货通知单(出库完成后调用)
     *
     * @param id ç¼–号
     */
    void finishSalesNotice(Long id);
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java
@@ -9,7 +9,11 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice.MesWmSalesNoticeMapper;
import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -39,6 +43,11 @@
    private MesWmSalesNoticeLineService salesNoticeLineService;
    @Resource
    private MesMdClientService clientService;
    @Resource
    private ErpSaleOrderApi saleOrderApi;
    @Resource
    private MesMdAutoCodeRecordService autoCodeRecordService;
    @Override
    public Long createSalesNotice(MesWmSalesNoticeSaveReqVO createReqVO) {
@@ -149,4 +158,55 @@
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long generateSalesNoticeFromSaleOrder(Long saleOrderId) {
        // 1. èŽ·å–é”€å”®è®¢å•ä¿¡æ¯
        ErpSaleOrderRespDTO saleOrder = saleOrderApi.getSaleOrder(saleOrderId).getCheckedData();
        if (saleOrder == null) {
            throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS);
        }
        // 2. èŽ·å–é”€å”®è®¢å•æ˜Žç»†
        List<ErpSaleOrderItemRespDTO> saleOrderItems = saleOrderApi.getSaleOrderItemList(saleOrderId).getCheckedData();
        if (CollUtil.isEmpty(saleOrderItems)) {
            throw exception(WM_SALES_NOTICE_SALE_ORDER_ITEM_EMPTY);
        }
        // 3. ç”Ÿæˆå‘货通知单编码
        String code = autoCodeRecordService.generateAutoCode("SALESNOTICE_CODE", null);
        // 4. åˆ›å»ºå‘货通知单主表
        MesWmSalesNoticeDO notice = new MesWmSalesNoticeDO();
        notice.setCode(code);
        notice.setName("销售订单[" + saleOrder.getNo() + "]发货通知");
        notice.setClientId(saleOrder.getCustomerId());
        notice.setSaleOrderId(saleOrderId);
        notice.setSaleOrderCode(saleOrder.getNo());
        notice.setSalesDate(java.time.LocalDateTime.now());
        notice.setStatus(PREPARE.getStatus());
        salesNoticeMapper.insert(notice);
        // 5. éåŽ†æ˜Žç»†åˆ›å»ºå‘è´§é€šçŸ¥å•è¡Œ
        for (ErpSaleOrderItemRespDTO saleOrderItem : saleOrderItems) {
            MesWmSalesNoticeLineDO line = new MesWmSalesNoticeLineDO();
            line.setNoticeId(notice.getId());
            line.setSaleOrderItemId(saleOrderItem.getId());
            line.setItemId(saleOrderItem.getProductId());
            line.setQuantity(saleOrderItem.getCount());
            salesNoticeLineService.createSalesNoticeLine(line);
        }
        return notice.getId();
    }
    @Override
    public void finishSalesNotice(Long id) {
        // æ ¡éªŒå­˜åœ¨
        MesWmSalesNoticeDO notice = validateSalesNoticeExists(id);
        // æ›´æ–°çŠ¶æ€ä¸ºå·²å®Œæˆ
        salesNoticeMapper.updateById(new MesWmSalesNoticeDO()
                .setId(id).setStatus(FINISHED.getStatus()));
    }
}
yudao-module-wms-api/pom.xml
ÎļþÒÑɾ³ý
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsPurchaseInboundReqDTO.java
ÎļþÒÑɾ³ý
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsSalesOutboundReqDTO.java
ÎļþÒÑɾ³ý
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsStockDetailRespDTO.java
ÎļþÒÑɾ³ý
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsStockQueryReqDTO.java
ÎļþÒÑɾ³ý
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/stock/WmsStockApi.java
ÎļþÒÑɾ³ý
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/transaction/WmsTransactionApi.java
ÎļþÒÑɾ³ý
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/transaction/WmsTransactionCreateReqDTO.java
ÎļþÒÑɾ³ý
yudao-module-wms/pom.xml
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/WmsHomeStatisticsController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeInventorySummaryRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderStatusRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderSummaryRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderTrendRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/WmsInventoryHistoryController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/WmsInventoryListReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/WmsInventoryPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/WmsInventoryRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/inventory/vo/history/WmsInventoryHistoryRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/WmsItemBrandController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/WmsItemCategoryController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/WmsItemController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/WmsItemSkuController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/brand/WmsItemBrandPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/brand/WmsItemBrandRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/brand/WmsItemBrandSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/category/WmsItemCategoryListReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/category/WmsItemCategoryRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/category/WmsItemCategorySaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/item/WmsItemListReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/item/WmsItemPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/item/WmsItemRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/item/WmsItemSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/sku/WmsItemSkuPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/sku/WmsItemSkuRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/item/vo/sku/WmsItemSkuSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/merchant/WmsMerchantController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/merchant/vo/WmsMerchantListReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/merchant/vo/WmsMerchantPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/merchant/vo/WmsMerchantRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/merchant/vo/WmsMerchantSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/warehouse/WmsWarehouseController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/warehouse/vo/WmsWarehousePageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/warehouse/vo/WmsWarehouseRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/md/warehouse/vo/WmsWarehouseSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/WmsCheckOrderController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/WmsCheckOrderDetailController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/detail/WmsCheckOrderDetailSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/order/WmsCheckOrderPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/order/WmsCheckOrderRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/check/vo/order/WmsCheckOrderSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/WmsMovementOrderController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/WmsMovementOrderDetailController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/detail/WmsMovementOrderDetailSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/movement/vo/order/WmsMovementOrderSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/WmsReceiptOrderController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/WmsReceiptOrderDetailController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/detail/WmsReceiptOrderDetailSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/order/WmsReceiptOrderPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/order/WmsReceiptOrderRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/receipt/vo/order/WmsReceiptOrderSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/WmsShipmentOrderController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/WmsShipmentOrderDetailController.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/detail/WmsShipmentOrderDetailSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderRespVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/order/shipment/vo/order/WmsShipmentOrderSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/package-info.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/package-info.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/inventory/WmsInventoryHistoryDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/item/WmsItemBrandDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/item/WmsItemCategoryDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/item/WmsItemDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/item/WmsItemSkuDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/merchant/WmsMerchantDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/md/warehouse/WmsWarehouseDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/check/WmsCheckOrderDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/check/WmsCheckOrderDetailDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/movement/WmsMovementOrderDetailDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/receipt/WmsReceiptOrderDetailDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/dataobject/order/shipment/WmsShipmentOrderDetailDO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/home/WmsHomeStatisticsMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryHistoryMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/inventory/WmsInventoryMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/item/WmsItemBrandMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/item/WmsItemCategoryMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/item/WmsItemMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/item/WmsItemSkuMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/merchant/WmsMerchantMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/md/warehouse/WmsWarehouseMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/check/WmsCheckOrderDetailMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/check/WmsCheckOrderMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/movement/WmsMovementOrderDetailMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/movement/WmsMovementOrderMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/receipt/WmsReceiptOrderDetailMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/receipt/WmsReceiptOrderMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/shipment/WmsShipmentOrderDetailMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/order/shipment/WmsShipmentOrderMapper.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/DictTypeConstants.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/ErrorCodeConstants.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/md/WmsMerchantTypeEnum.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderStatusEnum.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderTypeConstants.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsOrderTypeEnum.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsReceiptOrderTypeEnum.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/enums/order/WmsShipmentOrderTypeEnum.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/package-info.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/web/config/WmsWebConfiguration.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/framework/web/package-info.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/package-info.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/home/WmsHomeStatisticsService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/home/WmsHomeStatisticsServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryHistoryServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/dto/WmsInventoryChangeReqDTO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/inventory/dto/WmsInventoryCheckReqDTO.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemBrandService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemBrandServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemCategoryService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemCategoryServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemSkuService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemSkuServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/merchant/WmsMerchantService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/merchant/WmsMerchantServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderDetailService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderDetailServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderService.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/main/resources/mapper/home/WmsHomeStatisticsMapper.xml
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/md/item/WmsItemBrandServiceImplTest.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/md/warehouse/WmsWarehouseServiceImplTest.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderDetailServiceImplTest.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/check/WmsCheckOrderServiceImplTest.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderDetailServiceImplTest.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/movement/WmsMovementOrderServiceImplTest.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderDetailServiceImplTest.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/receipt/WmsReceiptOrderServiceImplTest.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderDetailServiceImplTest.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/order/shipment/WmsShipmentOrderServiceImplTest.java
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/resources/application-unit-test.yaml
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/resources/sql/clean.sql
ÎļþÒÑɾ³ý
yudao-module-wms/src/test/resources/sql/create_tables.sql
ÎļþÒÑɾ³ý
yudao-server/pom.xml
@@ -122,13 +122,6 @@
            <version>${revision}</version>
        </dependency>
        <!-- WMS ä»“库管理模块 -->
        <dependency>
            <groupId>cn.iocoder.boot</groupId>
            <artifactId>yudao-module-wms</artifactId>
            <version>${revision}</version>
        </dependency>
        <!-- IM ç›¸å…³æ¨¡å— -->
        <dependency>
            <groupId>cn.iocoder.boot</groupId>