5bb169a50335aef427d09e817901b80145cbd990..cf7bc2d68e7d86e7d4b896acf1400f534d594daa
10 天以前 gongchunyi
Merge remote-tracking branch 'origin/dev_宁夏_中盛建材' into dev_宁夏_中盛建材
cf7bc2 对比 | 目录
10 天以前 gongchunyi
feat: 添加同步记录,手动与自动不能同时拉取数据
c7b6fb 对比 | 目录
10 天以前 zss
能耗管理的能耗抄表明细附件
da2f92 对比 | 目录
10 天以前 gongchunyi
refactor: 销售生产计划表字段修改
dbf308 对比 | 目录
2026-03-10 huminmin
添加api说明
74b04f 对比 | 目录
2026-03-10 zss
Merge remote-tracking branch 'origin/dev_宁夏_中盛建材' into dev_宁夏_中盛建材
f3a001 对比 | 目录
2026-03-10 zss
能耗管理的能源类型+能耗抄表明细
d7c626 对比 | 目录
2026-03-10 huminmin
Merge branch 'dev_宁夏_中盛建材' of http://114.132.189.42:9002/r/product-inventor...
0fbedc 对比 | 目录
2026-03-10 huminmin
主生产计划列表
5cc969 对比 | 目录
2026-03-10 zss
Merge remote-tracking branch 'origin/dev_宁夏_中盛建材' into dev_宁夏_中盛建材
08ae92 对比 | 目录
2026-03-10 zss
Merge branch 'dev_New' into dev_宁夏_中盛建材
43113d 对比 | 目录
2026-03-10 gongchunyi
fix: app-key与app-secret错误
011d7c 对比 | 目录
2026-03-10 gongchunyi
refactor: 合并生产需求子表
0674b3 对比 | 目录
2026-03-10 liyong
Merge remote-tracking branch 'origin/dev_New' into dev_New
936f4b 对比 | 目录
2026-03-10 liyong
销售退货、退款、退货退款单
c58233 对比 | 目录
2026-03-10 buhuazhen
Merge remote-tracking branch 'origin/dev_New' into dev_New
306a7b 对比 | 目录
2026-03-10 buhuazhen
refactor(service): 优化依赖注入方式
f028b0 对比 | 目录
2026-03-09 maven
Merge remote-tracking branch 'origin/dev_New' into dev_New
fc7124 对比 | 目录
2026-03-09 maven
yys 优化员工工资计算逻辑
06cd1d 对比 | 目录
2026-03-09 buhuazhen
fix(mybatis): 修正createUser和updateUser填充值类型空值处理
f50da3 对比 | 目录
2026-03-09 buhuazhen
feat(projectManagement): 新增项目管理核心模块和相关实体实现
cb84f5 对比 | 目录
已添加76个文件
已修改28个文件
已删除13个文件
4370 ■■■■ 文件已修改
doc/宁夏-中盛建材.sql 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/CodeGenerator.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/controller/SalesReceiptReturnController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/controller/SalesRefundAmountOrderController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/dto/SalesReceiptReturnDto.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/dto/SalesRefundAmountOrderDto.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/mapper/SalesReceiptReturnMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/mapper/SalesRefundAmountOrderMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/pojo/AccountExpense.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/pojo/SalesReceiptReturn.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/pojo/SalesRefundAmountOrder.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/SalesReceiptReturnService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/SalesRefundAmountOrderService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/impl/SalesReceiptReturnServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/impl/SalesRefundAmountOrderServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/CustomerFollowUpFileServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/config/MybatisHandler.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/PlanStageEnum.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/ReviewStatusEnum.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/SaleEnum.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/http/HttpUtils.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/controller/EnergyConsumptionDetailController.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/controller/EnergyConsumptionDetailFileController.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/controller/EnergyController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/dto/EnergyConsumptionDetailDto.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/dto/EnergyStatisticsDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/mapper/EnergyConsumptionDetailFileMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/mapper/EnergyConsumptionDetailMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/mapper/EnergyMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/pojo/Energy.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/pojo/EnergyConsumptionDetail.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/pojo/EnergyConsumptionDetailFile.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/service/EnergyConsumptionDetailFileService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/service/EnergyConsumptionDetailService.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/service/EnergyService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/service/impl/EnergyConsumptionDetailFileServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/service/impl/EnergyConsumptionDetailServiceImpl.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/energy/service/impl/EnergyServiceImpl.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ReturnSaleProductDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ReturnSaleProductMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ReturnSaleProductService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnSaleProductServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/controller/ProdDemandDetailController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/controller/ProdDemandMainController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/mapper/ProdDemandDetailMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/mapper/ProdDemandMainMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/pojo/ProdDemandDetail.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/pojo/ProdDemandMain.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/service/ProdDemandDetailService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/service/ProdDemandMainService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/service/impl/ProdDemandDetailServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/service/impl/ProdDemandMainServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/task/ProdDemandTask.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/enums/DataSourceTypeEnum.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/enums/DataSyncTypeEnum.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/mapper/ProductionPlanMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/task/ProductionPlanTask.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/controller/InfoController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/dto/ContractInfoDto.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/dto/PlanStageDto.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/dto/SaveInfoDto.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/dto/ShippingAddressDto.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/dto/TeamDto.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/mapper/ContractInfoMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/mapper/InfoMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/mapper/ShippingAddressMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/pojo/ContractInfo.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/pojo/Info.java 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/pojo/ShippingAddress.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/service/InfoService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/service/PlanService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/service/impl/InfoServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/service/impl/handle/ContractInfoHandleService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/service/impl/handle/InfoHandleService.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/service/impl/handle/ShippingAddressHandleService.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/vo/SaveInfoVo.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrderProductsController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderProductsDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrderProductsMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrderProducts.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/PurchaseReturnOrderProductsService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/PurchaseReturnOrdersService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrderProductsServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/dto/CalculateSalaryDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-newTest.yml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zsjc.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/account/SalesReceiptReturnMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/account/SalesRefundAmountOrderMapper.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/energy/EnergyConsumptionDetailFileMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/energy/EnergyConsumptionDetailMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/energy/EnergyMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/prodDemand/ProdDemandDetailMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/prodDemand/ProdDemandMainMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/productionPlan/ProductionPlanMapper.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/projectManagement/ContractInfoMapper.xml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/projectManagement/InfoMapper.xml 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/projectManagement/ShippingAddressMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/PurchaseReturnOrderProductsMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/ÄþÏÄ-ÖÐÊ¢½¨²Ä.sql
@@ -1,53 +1,84 @@
CREATE TABLE `prod_demand_main`
DROP TABLE IF EXISTS `production_plan`;
CREATE TABLE production_plan
(
    `id`                 bigint(20)  NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    `tenant_id`          bigint(20)  NOT NULL COMMENT '租户编号',
    `dept_id`            bigint(20)   DEFAULT NULL COMMENT '部门ID (用于数据权限隔离)',
    `form_instance_id`   varchar(64) NOT NULL COMMENT '表单实例唯一ID (关联子表用)',
    `serial_no`          varchar(64)  DEFAULT NULL COMMENT '单据流水号 (serialNo)',
    `title`              varchar(128) DEFAULT NULL COMMENT '单据标题 (title)',
    `originator_user_id` varchar(64)  DEFAULT NULL COMMENT '第三方发起人ID (creatorUserId)',
    `originator_name`    varchar(64)  DEFAULT NULL COMMENT '第三方发起人姓名 (originator.userName)',
    `biz_create_time`    datetime     DEFAULT NULL COMMENT '第三方单据创建时间 (createdTimeGMT)',
    `project_name`       varchar(128) DEFAULT NULL COMMENT '项目名称/客户 (textField_lbkozohg)',
    `batch_no`           varchar(128) DEFAULT NULL COMMENT '批次/关联编号 (textField_l7fytfco)',
    `contact_person`     varchar(128) DEFAULT NULL COMMENT '联系人/备注 (textareaField_l7fytfcy)',
    `ext_text1`          varchar(128) DEFAULT NULL COMMENT '预留文本1 (textField_l7fytfcx)',
    `ext_text2`          varchar(128) DEFAULT NULL COMMENT '预留文本2 (textField_lbknlltp)',
    `create_user`        bigint(20)   DEFAULT NULL COMMENT '创建者',
    `create_time`        datetime     DEFAULT NULL COMMENT '创建时间',
    `update_user`        bigint(20)   DEFAULT NULL COMMENT '更新者',
    `update_time`        datetime     DEFAULT NULL COMMENT '更新时间',
    `remark`             varchar(500) DEFAULT NULL COMMENT '备注',
    id                 BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    form_instance_id   VARCHAR(64) COMMENT '表单实例ID',
    serial_no          VARCHAR(50) COMMENT '流水号',
    apply_no           VARCHAR(100) COMMENT '申请单编号',
    customer_name      VARCHAR(200) COMMENT '客户名称',
    material_code      VARCHAR(100) COMMENT '物料编码',
    product_name       VARCHAR(200) COMMENT '产品名称',
    product_spec       VARCHAR(200) COMMENT '产品规格',
    length             INT COMMENT '长',
    width              INT COMMENT '宽',
    height             INT COMMENT '高',
    quantity           INT COMMENT '块数',
    total_count        INT COMMENT '此次统计数量',
    volume             DECIMAL(10, 4) COMMENT '方数',
    strength           VARCHAR(50) COMMENT '强度',
    start_date         DATETIME COMMENT '开始日期',
    end_date           DATETIME COMMENT '结束日期',
    submitter          VARCHAR(100) COMMENT '提交人',
    submit_org         VARCHAR(200) COMMENT '提交人组织',
    remark_one         TEXT COMMENT '备注1',
    remark_two         TEXT COMMENT '备注2',
    creator_name       VARCHAR(100) COMMENT '创建人',
    modifier_name      VARCHAR(100) COMMENT '修改人',
    form_created_time  DATETIME COMMENT '表单创建时间',
    form_modified_time DATETIME COMMENT '表单修改时间',
    data_sync_type     TINYINT  DEFAULT 1 COMMENT '数据同步类型:1=手动 2=定时任务',
    data_source_type   TINYINT  DEFAULT 1 COMMENT '数据来源类型:1=销售订单 2=销售预测',
    create_time        DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '数据库创建时间',
    update_time        DATETIME COMMENT '数据库更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_form_instance_id` (`form_instance_id`)
    INDEX idx_apply_no (apply_no),
    INDEX idx_serial_no (serial_no),
    INDEX idx_form_instance_id (form_instance_id),
    INDEX idx_material_code (material_code)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='销售生产需求';
  DEFAULT CHARSET = utf8mb4 COMMENT ='销售生产计划';
CREATE TABLE `prod_demand_detail`
(
    `id`                  bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    `tenant_id`           bigint(20) NOT NULL COMMENT '租户编号',
    `prod_demand_main_id` bigint(20) NOT NULL COMMENT '父类关联ID',
    `material_code`       varchar(64)    DEFAULT NULL COMMENT '物料编码 (textField_l9xo62q5)',
    `material_category`   varchar(64)    DEFAULT NULL COMMENT '物料分类 (textField_l9xo62q7)',
    `spec_desc`           varchar(128)   DEFAULT NULL COMMENT '规格描述 (textField_l9xo62q8)',
    `grade_type`          varchar(32)    DEFAULT NULL COMMENT '等级/类型 (radioField_m9urarr2)',
    `length`              decimal(10, 2) DEFAULT NULL COMMENT '长度 (numberField_lb7lgatg)',
    `width`               decimal(10, 2) DEFAULT NULL COMMENT '宽度 (numberField_lb7lgath)',
    `thickness`           decimal(10, 2) DEFAULT NULL COMMENT '厚度 (numberField_lb7lgati)',
    `quantity`            int(11)        DEFAULT NULL COMMENT '数量 (numberField_lb7lgatj)',
    `volume`              decimal(10, 4) DEFAULT NULL COMMENT '总体积 (numberField_l7fytfd3)',
    `date_range`          varchar(255)   DEFAULT NULL COMMENT '时间区间数组字符串 (cascadeDateField_lfxqqluw)',
    `association_receipt` text           DEFAULT NULL COMMENT '关联的其他单据 (associationFormField_l9xo62q6_id)',
    `create_user`         bigint(20)     DEFAULT NULL COMMENT '创建者',
    `create_time`         datetime       DEFAULT NULL COMMENT '创建时间',
    `update_user`         bigint(20)     DEFAULT NULL COMMENT '更新者',
    `update_time`         datetime       DEFAULT NULL COMMENT '更新时间',
    `remark`              varchar(500)   DEFAULT NULL COMMENT '备注',
CREATE TABLE `product-inventory-management-zsjc`.`energy`  (
    `id` int NOT NULL AUTO_INCREMENT,
    `energy_tyep` varchar(255) NULL COMMENT '能源类型',
    `energy_name` varchar(255) NULL COMMENT '能源名称',
    `unit` varchar(255) NULL COMMENT '单位',
    `unit_price` decimal(10, 2) NULL COMMENT '单价',
    `remark` varchar(255) NULL COMMENT '备注',
    `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
    `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
    `create_user` bigint NULL DEFAULT NULL COMMENT '创建者',
    `update_user` bigint NULL DEFAULT NULL COMMENT '更新者',
    PRIMARY KEY (`id`)
    ) COMMENT = '能源类型';
    PRIMARY KEY (`id`),
    KEY `idx_prod_demand_main_id` (`prod_demand_main_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='销售生产需求_明细表';
CREATE TABLE `product-inventory-management-zsjc`.`energy_consumption_detail`  (
    `id` int NOT NULL AUTO_INCREMENT,
    `energy_id` int NULL COMMENT '外检关联能源类型id',
    `type` varchar(255) NULL COMMENT '办公/生产',
    `meter_reading_location` varchar(255) NULL COMMENT '抄表位置',
    `meter_reading_date` date NULL COMMENT '抄表日期',
    `start_code` decimal(10, 2) NULL COMMENT '起码',
    `stop_code` decimal(10, 2) NULL COMMENT '止码',
    `dosage` decimal(10, 2) NULL COMMENT '用量',
    `remark` varchar(255) NULL COMMENT '备注',
    `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
    `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
    `create_user` bigint NULL DEFAULT NULL COMMENT '创建者',
    `update_user` bigint NULL DEFAULT NULL COMMENT '更新者',
    PRIMARY KEY (`id`)
    ) COMMENT = '能源类型-能耗抄表明细';
CREATE TABLE `product-inventory-management-zsjc`.`energy_consumption_detail_file`  (
    `id` int NOT NULL AUTO_INCREMENT,
    `energy_consumption_detail_id` int NULL COMMENT '关联外键能耗抄表id',
    `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
    `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
    `file_size` double NULL DEFAULT NULL,
    `create_time` timestamp(0) NULL DEFAULT NULL,
    `create_user` int NULL DEFAULT NULL,
    `update_time` timestamp(0) NULL DEFAULT NULL,
    `update_user` int NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) COMMENT = '能源类型-能耗抄表明细_附件';
pom.xml
@@ -328,7 +328,10 @@
            <artifactId>hutool-all</artifactId>
            <version>5.8.43</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>
    </dependencies>
src/main/java/com/ruoyi/CodeGenerator.java
@@ -19,11 +19,11 @@
// æ¼”示例子,执行 main æ–¹æ³•控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {
    public static String database_url = "jdbc:mysql://1.15.17.182:9999/product-inventory-management-new";
    public static String database_url = "jdbc:mysql://1.15.17.182:9999/product-inventory-management-zsjc";
    public static String database_username = "root";
    public static String database_password= "xd@123456..";
    public static String author = "芯导软件(江苏)有限公司";
    public static String model = "staff"; // æ¨¡å—
    public static String model = "energy"; // æ¨¡å—
    public static String setParent = "com.ruoyi."+ model; // åŒ…路径
    public static String tablePrefix = ""; // è®¾ç½®è¿‡æ»¤è¡¨å‰ç¼€
    public static void main(String[] args) {
src/main/java/com/ruoyi/account/controller/SalesReceiptReturnController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.account.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.account.dto.SalesReceiptReturnDto;
import com.ruoyi.account.pojo.SalesReceiptReturn;
import com.ruoyi.account.service.SalesReceiptReturnService;
import com.ruoyi.account.service.impl.SalesReceiptReturnServiceImpl;
import com.ruoyi.framework.web.domain.R;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * æ”¶æ¬¾é€€è´§è¡¨ å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-09 03:34:18
 */
@RestController
@RequestMapping("/salesReceiptReturn")
public class SalesReceiptReturnController {
    @Autowired
    private  SalesReceiptReturnService salesReceiptReturnService;
    @GetMapping("/page")
    @ApiOperation("收款退货表-分页查询")
    public R<IPage<SalesReceiptReturnDto>> page(SalesReceiptReturnDto salesReceiptReturnDto) {
        return R.ok(salesReceiptReturnService.pageSalesReceiptReturnDto(salesReceiptReturnDto));
    }
}
src/main/java/com/ruoyi/account/controller/SalesRefundAmountOrderController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.ruoyi.account.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.dto.SalesRefundAmountOrderDto;
import com.ruoyi.account.pojo.SalesRefundAmountOrder;
import com.ruoyi.account.service.SalesRefundAmountOrderService;
import com.ruoyi.framework.web.domain.R;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
 * é”€å”®ç®¡ç†--退款单 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-07 10:16:47
 */
@RestController
@RequestMapping("/salesRefundAmountOrder")
public class SalesRefundAmountOrderController {
    @Autowired
    private SalesRefundAmountOrderService salesRefundAmountOrderService;
    @GetMapping("/page")
    public R pageSalesRefundAmountOrderDto(Page<SalesRefundAmountOrderDto> page, SalesRefundAmountOrderDto salesRefundAmountOrder) {
        return R.ok(salesRefundAmountOrderService.pageSalesRefundAmountOrderDto(page, salesRefundAmountOrder));
    }
    @ApiOperation("处理")
    @PostMapping("/dispose")
    public R dispose( SalesRefundAmountOrderDto salesRefundAmountOrderId) {
        return R.ok(salesRefundAmountOrderService.dispose(salesRefundAmountOrderId));
    }
}
src/main/java/com/ruoyi/account/dto/SalesReceiptReturnDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.ruoyi.account.dto;
import com.ruoyi.account.pojo.SalesReceiptReturn;
import lombok.Data;
@Data
public class SalesReceiptReturnDto extends SalesReceiptReturn {
}
src/main/java/com/ruoyi/account/dto/SalesRefundAmountOrderDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.account.dto;
import com.ruoyi.account.pojo.SalesRefundAmountOrder;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class SalesRefundAmountOrderDto extends SalesRefundAmountOrder {
    @ApiModelProperty("退货单号")
    private String returnManagementNo;
    @ApiModelProperty("客户名称")
    private String customerName;
    @ApiModelProperty("销售单号")
    private String salesContractNo;
    @ApiModelProperty("创建人名称")
    private String createUserName;
}
src/main/java/com/ruoyi/account/mapper/SalesReceiptReturnMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.account.mapper;
import com.ruoyi.account.pojo.SalesReceiptReturn;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * æ”¶æ¬¾é€€è´§è¡¨ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-09 03:34:18
 */
@Mapper
public interface SalesReceiptReturnMapper extends BaseMapper<SalesReceiptReturn> {
}
src/main/java/com/ruoyi/account/mapper/SalesRefundAmountOrderMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.account.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.dto.SalesRefundAmountOrderDto;
import com.ruoyi.account.pojo.SalesRefundAmountOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * é”€å”®ç®¡ç†--退款单 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-07 10:16:47
 */
@Mapper
public interface SalesRefundAmountOrderMapper extends BaseMapper<SalesRefundAmountOrder> {
    IPage<SalesRefundAmountOrderDto> pageSalesRefundAmountOrderDto(Page<SalesRefundAmountOrderDto> page,@Param("ew") SalesRefundAmountOrderDto salesRefundAmountOrder);
}
src/main/java/com/ruoyi/account/pojo/AccountExpense.java
@@ -35,7 +35,7 @@
    private Long businessId;
    /**
     * ä¸šåŠ¡ç±»åž‹ 1-付款 2-还款
     * ä¸šåŠ¡ç±»åž‹ 1-付款 2-还款 3-薪资发放
     */
    private Integer businessType;
src/main/java/com/ruoyi/account/pojo/SalesReceiptReturn.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
package com.ruoyi.account.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
 * <p>
 * æ”¶æ¬¾é€€è´§è¡¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-09 03:34:18
 */
@Getter
@Setter
@TableName("sales_receipt_return")
@ApiModel(value = "SalesReceiptReturn对象", description = "收款退货表")
public class SalesReceiptReturn implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键 ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("退款单号")
    private String refundId;
    @ApiModelProperty("付款账号")
    private String paymentAccount;
    @ApiModelProperty("付款账号名称")
    private String paymentAccountName;
    @ApiModelProperty("付款方式")
    private Byte paymentMethod;
    @ApiModelProperty("实际付款金额")
    private BigDecimal actualAmount;
    @ApiModelProperty("手续费")
    private BigDecimal fee;
    @ApiModelProperty("交易号")
    private String transactionNo;
    @ApiModelProperty("优惠金额")
    private BigDecimal discountAmount;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("创建者")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
}
src/main/java/com/ruoyi/account/pojo/SalesRefundAmountOrder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.ruoyi.account.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 * é”€å”®ç®¡ç†--退款单
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-07 10:16:47
 */
@Getter
@Setter
@TableName("sales_refund_amount_order")
@ApiModel(value = "SalesRefundAmountOrder对象", description = "销售管理--退款单")
public class SalesRefundAmountOrder implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("退货单号id")
    private Long returnManagementId;
    @ApiModelProperty("状态")
    private Integer status;
    @ApiModelProperty("应退款金额")
    private BigDecimal refundAmount;
    @ApiModelProperty("已退款金额")
    private BigDecimal refundedAmount;
    @ApiModelProperty("未退款金额")
    private BigDecimal notRefundedAmount;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人id")
    private Long createUserId;
    @ApiModelProperty("更新人id")
    private Long updateUserId;
}
src/main/java/com/ruoyi/account/service/SalesReceiptReturnService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.account.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.account.dto.SalesReceiptReturnDto;
import com.ruoyi.account.pojo.SalesReceiptReturn;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * æ”¶æ¬¾é€€è´§è¡¨ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-09 03:34:18
 */
public interface SalesReceiptReturnService extends IService<SalesReceiptReturn> {
    IPage<SalesReceiptReturnDto> pageSalesReceiptReturnDto(SalesReceiptReturnDto salesReceiptReturnDto);
}
src/main/java/com/ruoyi/account/service/SalesRefundAmountOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.account.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.dto.SalesRefundAmountOrderDto;
import com.ruoyi.account.pojo.SalesRefundAmountOrder;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * é”€å”®ç®¡ç†--退款单 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-07 10:16:47
 */
public interface SalesRefundAmountOrderService extends IService<SalesRefundAmountOrder> {
    IPage<SalesRefundAmountOrderDto> pageSalesRefundAmountOrderDto(Page<SalesRefundAmountOrderDto> page, SalesRefundAmountOrderDto salesRefundAmountOrder);
    Boolean addSalesRefundAmountOrderDto(SalesRefundAmountOrderDto salesRefundAmountOrder);
    Boolean dispose(SalesRefundAmountOrderDto salesRefundAmountOrder);
}
src/main/java/com/ruoyi/account/service/impl/SalesReceiptReturnServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.account.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.account.dto.SalesReceiptReturnDto;
import com.ruoyi.account.pojo.SalesReceiptReturn;
import com.ruoyi.account.mapper.SalesReceiptReturnMapper;
import com.ruoyi.account.service.SalesReceiptReturnService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * æ”¶æ¬¾é€€è´§è¡¨ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-09 03:34:18
 */
@Service
public class SalesReceiptReturnServiceImpl extends ServiceImpl<SalesReceiptReturnMapper, SalesReceiptReturn> implements SalesReceiptReturnService {
    @Override
    public IPage<SalesReceiptReturnDto> pageSalesReceiptReturnDto(SalesReceiptReturnDto salesReceiptReturnDto) {
        return null;
    }
}
src/main/java/com/ruoyi/account/service/impl/SalesRefundAmountOrderServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.account.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.dto.SalesRefundAmountOrderDto;
import com.ruoyi.account.pojo.SalesRefundAmountOrder;
import com.ruoyi.account.mapper.SalesRefundAmountOrderMapper;
import com.ruoyi.account.service.SalesRefundAmountOrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * <p>
 * é”€å”®ç®¡ç†--退款单 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-07 10:16:47
 */
@Service
public class SalesRefundAmountOrderServiceImpl extends ServiceImpl<SalesRefundAmountOrderMapper, SalesRefundAmountOrder> implements SalesRefundAmountOrderService {
    @Autowired
    private SalesRefundAmountOrderMapper salesRefundAmountOrderMapper;
    @Override
    public IPage<SalesRefundAmountOrderDto> pageSalesRefundAmountOrderDto(Page<SalesRefundAmountOrderDto> page, SalesRefundAmountOrderDto salesRefundAmountOrder) {
        return salesRefundAmountOrderMapper.pageSalesRefundAmountOrderDto(page, salesRefundAmountOrder);
    }
    @Override
    public Boolean addSalesRefundAmountOrderDto(SalesRefundAmountOrderDto salesRefundAmountOrder) {
        return this.save(salesRefundAmountOrder);
    }
    @Override
    public Boolean dispose(SalesRefundAmountOrderDto salesRefundAmountOrder) {
        return null;
    }
}
src/main/java/com/ruoyi/basic/service/impl/CustomerFollowUpFileServiceImpl.java
@@ -11,6 +11,8 @@
import com.ruoyi.basic.service.CustomerFollowUpService;
import com.ruoyi.common.vo.SimpleFileVo;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.*;
@@ -31,7 +33,9 @@
@RequiredArgsConstructor
public class CustomerFollowUpFileServiceImpl extends ServiceImpl<CustomerFollowUpFileMapper, CustomerFollowUpFile> implements CustomerFollowUpFileService {
    private final CustomerFollowUpService customerFollowUpService;
    @Autowired
    @Lazy
    private CustomerFollowUpService customerFollowUpService;
    @Override
@@ -64,7 +68,8 @@
            if (StrUtil.isNotBlank(attachmentIds)) {
                List<SimpleFileVo> fileVos = Arrays.stream(attachmentIds.split(","))
                        .map(Long::valueOf)
                        .map(it->collectMap.getOrDefault(it, (SimpleFileVo) Collections.emptyList()))
                        .map(it->collectMap.getOrDefault(it, null))
                        .filter(Objects::nonNull)
                        .collect(Collectors.toList());
                setAttachmentList.accept(t, fileVos);
            }
src/main/java/com/ruoyi/common/config/MybatisHandler.java
@@ -6,6 +6,7 @@
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Optional;
@Component
public class MybatisHandler implements MetaObjectHandler {
@@ -22,6 +23,8 @@
        this.strictInsertFill(metaObject, "updateTime",  LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "createUser", Integer.class, userId);
        this.strictInsertFill(metaObject, "updateUser", Integer.class, userId);
        this.strictInsertFill(metaObject, "createUser", Long.class, userId == null ? 0 : userId.longValue());
        this.strictInsertFill(metaObject, "updateUser", Long.class, userId == null ? 0 : userId.longValue());
        this.strictInsertFill(metaObject, "tenantId", Long.class, tenantId);
    }
src/main/java/com/ruoyi/common/enums/PlanStageEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.common.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import lombok.Getter;
import java.io.Serializable;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Getter
public enum PlanStageEnum implements BaseEnum<Integer>, Serializable {
    TO_BEGIN(1, "待开始"),
    ON_GOING(2, "进行中"),
    ENDED(3, "已结束");
    private final Integer code;
    private final String value;
    PlanStageEnum(Integer code, String value) {
        this.code = code;
        this.value = value;
    }
}
src/main/java/com/ruoyi/common/enums/ReviewStatusEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.common.enums;
import lombok.Getter;
import java.io.Serializable;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Getter
public enum ReviewStatusEnum implements BaseEnum<Integer>, Serializable {
    PENDING_REVIEW(0, "待审核"),
    APPROVED(1, "已审核"),
    REJECTED(2, "审核未通过");
    private final Integer code;
    private final String value;
    ReviewStatusEnum(Integer code, String value) {
        this.code = code;
        this.value = value;
    }
}
src/main/java/com/ruoyi/common/enums/SaleEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.common.enums;
import lombok.Getter;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Getter
public enum SaleEnum implements BaseEnum<Integer>{
    SALE(1, "销售"),
    PURCHASE(2, "采购"),
    MANAGEMENT(3, "项目");
    private final Integer code;
    private final String value;
    SaleEnum(Integer code, String value) {
        this.code = code;
        this.value = value;
    }
}
src/main/java/com/ruoyi/common/utils/http/HttpUtils.java
@@ -25,7 +25,7 @@
/**
 * é€šç”¨http发送方法
 *
 *
 * @author ruoyi
 */
public class HttpUtils
@@ -132,7 +132,7 @@
    /**
     * å‘指定 URL å‘送POST方法的请求
     *
     *
     * @param url å‘送请求的 URL
     * @param param è¯·æ±‚参数
     * @param contentType å†…容类型
@@ -299,7 +299,7 @@
     */
    public static String sendPostJson(String url, String jsonParam) {
        // é‡è½½è°ƒç”¨ï¼Œé»˜è®¤ä½¿ç”¨UTF-8编码,Content-Type固定为application/json
        return sendPostJson(url, jsonParam, StandardCharsets.UTF_8.name(),null);
        return sendPostJson(url, jsonParam, StandardCharsets.UTF_8.name(), null, "");
    }
    /**
@@ -311,7 +311,7 @@
     */
    public static String sendPostJson(String url, String jsonParam, String headerValue) {
        // é‡è½½è°ƒç”¨ï¼Œé»˜è®¤ä½¿ç”¨UTF-8编码,Content-Type固定为application/json
        return sendPostJson(url, jsonParam, StandardCharsets.UTF_8.name(),headerValue);
        return sendPostJson(url, jsonParam, StandardCharsets.UTF_8.name(),headerValue,"");
    }
    /**
@@ -321,7 +321,7 @@
     * @param charset ç¼–码类型(如UTF-8、GBK等,建议使用StandardCharsets常量)
     * @return è¿œç¨‹èµ„源的响应结果
     */
    public static String sendPostJson(String url, String jsonParam, String charset,String headerValue) {
    public static String sendPostJson(String url, String jsonParam, String charset,String headerValue,String accessToken) {
        PrintWriter out = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
@@ -340,6 +340,9 @@
            if(StringUtils.isNotEmpty(headerValue)){
                conn.setRequestProperty("Authorization", headerValue);
            }
            if (StringUtils.isNotEmpty(accessToken)) {
                conn.setRequestProperty("x-acs-dingtalk-access-token", accessToken);
            }
            // 2. å¼€å¯è¾“入输出流(POST请求必须)
            conn.setDoOutput(true);
            conn.setDoInput(true);
src/main/java/com/ruoyi/energy/controller/EnergyConsumptionDetailController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.ruoyi.energy.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.energy.dto.EnergyConsumptionDetailDto;
import com.ruoyi.energy.dto.EnergyStatisticsDto;
import com.ruoyi.energy.pojo.Energy;
import com.ruoyi.energy.pojo.EnergyConsumptionDetail;
import com.ruoyi.energy.service.EnergyConsumptionDetailService;
import com.ruoyi.energy.service.EnergyService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
/**
 * <p>
 * èƒ½æºç±»åž‹-能耗抄表明细 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 11:22:20
 */
@RestController
@RequestMapping("/energyConsumptionDetail")
@Api(tags = "能耗管理-能耗抄表明细")
public class EnergyConsumptionDetailController {
    @Autowired
    private EnergyConsumptionDetailService energyConsumptionDetailService;
    @GetMapping("page")
    @ApiOperation("分页查询")
    public R page(Page<EnergyConsumptionDetailDto> page, EnergyConsumptionDetailDto energyConsumptionDetailDto) {
        return R.ok(energyConsumptionDetailService.pageEnergyConsumptionDetail(page, energyConsumptionDetailDto));
    }
    @ApiOperation("新增/修改能耗抄表")
    @PostMapping()
    public R add(@RequestBody EnergyConsumptionDetail energyConsumptionDetail) {
        return R.ok(energyConsumptionDetailService.saveOrUpdate(energyConsumptionDetail));
    }
    @ApiOperation("删除能耗抄表")
    @DeleteMapping("/{ids}")
    public R delete(@PathVariable("ids") Long[] ids) {
        return R.ok(energyConsumptionDetailService.removeBatchByIds(Arrays.asList(ids)));
    }
    @Log(title = "能耗抄表明细-导入", businessType = BusinessType.IMPORT)
    @PostMapping("/importData")
    public R importData(MultipartFile file) throws Exception {
        return energyConsumptionDetailService.importData(file);
    }
    @PostMapping("/downloadTemplate")
    @Log(title = "能耗抄表-下载模板", businessType = BusinessType.EXPORT)
    public void downloadTemplate(HttpServletResponse response) {
        ExcelUtil<EnergyConsumptionDetailDto> util = new ExcelUtil<EnergyConsumptionDetailDto>(EnergyConsumptionDetailDto.class);
        util.importTemplateExcel(response, "能耗抄表模版");
    }
    @PostMapping("/export")
    @ApiOperation("能耗抄表-导出")
    @Log(title = "能耗抄表-导出", businessType = BusinessType.EXPORT)
    public void export(HttpServletResponse response) {
        energyConsumptionDetailService.export(response);
    }
    /*******************************************汇总统计*****************************************************************************************************************************************************************************/
    @GetMapping("/statistics")
    @ApiOperation("按日月年汇总统计")
    public R statistics(EnergyStatisticsDto energyStatisticsDto) {
        return R.ok(energyConsumptionDetailService.statistics(energyStatisticsDto));
    }
}
src/main/java/com/ruoyi/energy/controller/EnergyConsumptionDetailFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ruoyi.energy.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.energy.dto.EnergyConsumptionDetailDto;
import com.ruoyi.energy.pojo.EnergyConsumptionDetail;
import com.ruoyi.energy.pojo.EnergyConsumptionDetailFile;
import com.ruoyi.energy.service.EnergyConsumptionDetailFileService;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.pojo.ProductWorkOrderFile;
import com.ruoyi.production.service.ProductWorkOrderFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
/**
 * <p>
 * èƒ½æºç±»åž‹-能耗抄表明细_附件 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 05:07:33
 */
@RestController
@RequestMapping("/energyConsumptionDetailFile")
@Api(tags = "能耗管理-能耗抄表明细-附件")
public class EnergyConsumptionDetailFileController {
    @Autowired
    private EnergyConsumptionDetailFileService energyConsumptionDetailFileService;
    @ApiOperation("新增能耗抄表-附件")
    @PostMapping()
    public R add(@RequestBody EnergyConsumptionDetailFile energyConsumptionDetailFile) {
        return R.ok(energyConsumptionDetailFileService.save(energyConsumptionDetailFile));
    }
    @ApiOperation("删除能耗抄表-附件")
    @DeleteMapping("/{ids}")
    public R delete(@PathVariable("ids") Long[] ids) {
        return R.ok(energyConsumptionDetailFileService.removeBatchByIds(Arrays.asList(ids)));
    }
    @GetMapping("page")
    @ApiOperation("分页查询")
    public R page(Page<EnergyConsumptionDetailFile> page, EnergyConsumptionDetailFile energyConsumptionDetailFile) {
        return R.ok(energyConsumptionDetailFileService.page(page,Wrappers.<EnergyConsumptionDetailFile>lambdaQuery().eq(EnergyConsumptionDetailFile::getEnergyConsumptionDetailId,energyConsumptionDetailFile.getEnergyConsumptionDetailId())));
    }
}
src/main/java/com/ruoyi/energy/controller/EnergyController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.ruoyi.energy.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.energy.pojo.Energy;
import com.ruoyi.energy.service.EnergyService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.service.ProcessRouteService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
/**
 * <p>
 * èƒ½æºç±»åž‹ å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 10:50:18
 */
@RestController
@RequestMapping("/energy")
@Api(tags = "能耗管理-能源类型")
public class EnergyController {
    @Autowired
    private EnergyService energyService;
    @GetMapping("page")
    @ApiOperation("分页查询")
    public R page(Page<Energy> page, Energy energy) {
        return R.ok(energyService.pageEnergy(page, energy));
    }
    @ApiOperation("新增/修改能源类型")
    @PostMapping()
    public R add(@RequestBody Energy energy) {
        return R.ok(energyService.saveOrUpdate(energy));
    }
    @ApiOperation("删除能源类型")
    @DeleteMapping("/{ids}")
    public R delete(@PathVariable("ids") Long[] ids) {
        return R.ok(energyService.batchDelete(Arrays.asList(ids)));
    }
    @Log(title = "能源类型-导入", businessType = BusinessType.IMPORT)
    @PostMapping("/importData")
    public R importData(MultipartFile file) throws Exception {
        return energyService.importData(file);
    }
    @PostMapping("/downloadTemplate")
    @Log(title = "能源类型-下载模板", businessType = BusinessType.EXPORT)
    public void downloadTemplate(HttpServletResponse response) {
        ExcelUtil<Energy> util = new ExcelUtil<Energy>(Energy.class);
        util.importTemplateExcel(response, "能源类型模版");
    }
    @PostMapping("/export")
    @ApiOperation("能源类型-导出")
    @Log(title = "能源类型-导出", businessType = BusinessType.EXPORT)
    public void export(HttpServletResponse response) {
        energyService.export(response);
    }
}
src/main/java/com/ruoyi/energy/dto/EnergyConsumptionDetailDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.energy.dto;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.energy.pojo.EnergyConsumptionDetail;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
//能耗抄表明细
@Data
@ExcelIgnoreUnannotated
public class EnergyConsumptionDetailDto extends EnergyConsumptionDetail {
    @ApiModelProperty("能源类型")
    @Excel(name = "能源类型")
    private String energyTyep;
    @ApiModelProperty("能源名称")
    @Excel(name = "能源名称")
    private String energyName;
    @ApiModelProperty("单位")
    @Excel(name = "单位")
    private String unit;
    //创建人
    private String createUserName;
}
src/main/java/com/ruoyi/energy/dto/EnergyStatisticsDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.energy.dto;
import lombok.Data;
import java.time.LocalDate;
//按日月年汇总统计能耗的传参
@Data
public class EnergyStatisticsDto {
    //开始日期
    private LocalDate startDate;
    //结束日期
    private LocalDate endDate;
    //能耗场景(办公/生产)
    private String type;
}
src/main/java/com/ruoyi/energy/mapper/EnergyConsumptionDetailFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.energy.mapper;
import com.ruoyi.energy.pojo.EnergyConsumptionDetailFile;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * èƒ½æºç±»åž‹-能耗抄表明细_附件 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 05:07:33
 */
@Mapper
public interface EnergyConsumptionDetailFileMapper extends BaseMapper<EnergyConsumptionDetailFile> {
}
src/main/java/com/ruoyi/energy/mapper/EnergyConsumptionDetailMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.energy.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.energy.dto.EnergyConsumptionDetailDto;
import com.ruoyi.energy.pojo.EnergyConsumptionDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * èƒ½æºç±»åž‹-能耗抄表明细 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 11:22:20
 */
@Mapper
public interface EnergyConsumptionDetailMapper extends BaseMapper<EnergyConsumptionDetail> {
    IPage<EnergyConsumptionDetailDto> pageEnergyConsumptionDetail(Page<EnergyConsumptionDetailDto> page, @Param("c") EnergyConsumptionDetailDto energyConsumptionDetailDto);
}
src/main/java/com/ruoyi/energy/mapper/EnergyMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.energy.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.energy.pojo.Energy;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * èƒ½æºç±»åž‹ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 10:50:18
 */
@Mapper
public interface EnergyMapper extends BaseMapper<Energy> {
    IPage<Energy> pageEnergy(Page<Energy> page, @Param("c") Energy energy);
}
src/main/java/com/ruoyi/energy/pojo/Energy.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.ruoyi.energy.pojo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 * èƒ½æºç±»åž‹
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 10:50:18
 */
@Getter
@Setter
@TableName("energy")
@ApiModel(value = "Energy对象", description = "能源类型")
@ExcelIgnoreUnannotated
public class Energy implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("能源类型")
    @Excel(name = "能源类型")
    private String energyTyep;
    @ApiModelProperty("能源名称")
    @Excel(name = "能源名称")
    private String energyName;
    @ApiModelProperty("单位")
    @Excel(name = "单位")
    private String unit;
    @ApiModelProperty("单价")
    @Excel(name = "单价")
    private BigDecimal unitPrice;
    @ApiModelProperty("备注")
    @Excel(name = "备注")
    private String remark;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty("创建者")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    @ApiModelProperty("更新者")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    //创建人
    @TableField(exist = false)
    private String createUserName;
}
src/main/java/com/ruoyi/energy/pojo/EnergyConsumptionDetail.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.ruoyi.energy.pojo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 * èƒ½æºç±»åž‹-能耗抄表明细
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 11:22:20
 */
@Getter
@Setter
@TableName("energy_consumption_detail")
@ApiModel(value = "EnergyConsumptionDetail对象", description = "能源类型-能耗抄表明细")
@ExcelIgnoreUnannotated
public class EnergyConsumptionDetail implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("外检关联能源类型id")
    private Integer energyId;
    @ApiModelProperty("办公/生产")
    @Excel(name = "能耗场景")
    private String type;
    @ApiModelProperty("抄表位置")
    private String meterReadingLocation;
    @ApiModelProperty("抄表日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "日期")
    private LocalDate meterReadingDate;
    @ApiModelProperty("起码")
    @Excel(name = "起码")
    private BigDecimal startCode;
    @ApiModelProperty("止码")
    @Excel(name = "止码")
    private BigDecimal stopCode;
    @ApiModelProperty("用量")
    @Excel(name = "用量")
    private BigDecimal dosage;
    @ApiModelProperty("备注")
    @Excel(name = "备注")
    private String remark;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty("创建者")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    @ApiModelProperty("更新者")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
}
src/main/java/com/ruoyi/energy/pojo/EnergyConsumptionDetailFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.ruoyi.energy.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
 * <p>
 * èƒ½æºç±»åž‹-能耗抄表明细_附件
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 05:07:33
 */
@Getter
@Setter
@TableName("energy_consumption_detail_file")
@ApiModel(value = "EnergyConsumptionDetailFile对象", description = "能源类型-能耗抄表明细_附件")
public class EnergyConsumptionDetailFile implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("关联外键能耗抄表id")
    private Integer energyConsumptionDetailId;
    private String name;
    private String url;
    private Object fileSize;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
}
src/main/java/com/ruoyi/energy/service/EnergyConsumptionDetailFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.energy.service;
import com.ruoyi.energy.pojo.EnergyConsumptionDetailFile;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * èƒ½æºç±»åž‹-能耗抄表明细_附件 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 05:07:33
 */
public interface EnergyConsumptionDetailFileService extends IService<EnergyConsumptionDetailFile> {
}
src/main/java/com/ruoyi/energy/service/EnergyConsumptionDetailService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.energy.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.energy.dto.EnergyConsumptionDetailDto;
import com.ruoyi.energy.dto.EnergyStatisticsDto;
import com.ruoyi.energy.pojo.EnergyConsumptionDetail;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.framework.web.domain.R;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * èƒ½æºç±»åž‹-能耗抄表明细 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 11:22:20
 */
public interface EnergyConsumptionDetailService extends IService<EnergyConsumptionDetail> {
    IPage<EnergyConsumptionDetailDto> pageEnergyConsumptionDetail(Page<EnergyConsumptionDetailDto> page, EnergyConsumptionDetailDto energyConsumptionDetailDto);
    R importData(MultipartFile file);
    void export(HttpServletResponse response);
    Object statistics(EnergyStatisticsDto energyStatisticsDto);
}
src/main/java/com/ruoyi/energy/service/EnergyService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.energy.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.energy.pojo.Energy;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.framework.web.domain.R;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * <p>
 * èƒ½æºç±»åž‹ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 10:50:18
 */
public interface EnergyService extends IService<Energy> {
    IPage<Energy> pageEnergy(Page<Energy> page, Energy energy);
    boolean batchDelete(List<Long> ids);
    R importData(MultipartFile file);
    void export(HttpServletResponse response);
}
src/main/java/com/ruoyi/energy/service/impl/EnergyConsumptionDetailFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.energy.service.impl;
import com.ruoyi.energy.pojo.EnergyConsumptionDetailFile;
import com.ruoyi.energy.mapper.EnergyConsumptionDetailFileMapper;
import com.ruoyi.energy.service.EnergyConsumptionDetailFileService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * èƒ½æºç±»åž‹-能耗抄表明细_附件 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 05:07:33
 */
@Service
public class EnergyConsumptionDetailFileServiceImpl extends ServiceImpl<EnergyConsumptionDetailFileMapper, EnergyConsumptionDetailFile> implements EnergyConsumptionDetailFileService {
}
src/main/java/com/ruoyi/energy/service/impl/EnergyConsumptionDetailServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.ruoyi.energy.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.energy.dto.EnergyConsumptionDetailDto;
import com.ruoyi.energy.dto.EnergyStatisticsDto;
import com.ruoyi.energy.mapper.EnergyMapper;
import com.ruoyi.energy.pojo.Energy;
import com.ruoyi.energy.pojo.EnergyConsumptionDetail;
import com.ruoyi.energy.mapper.EnergyConsumptionDetailMapper;
import com.ruoyi.energy.service.EnergyConsumptionDetailService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.framework.web.domain.R;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
 * èƒ½æºç±»åž‹-能耗抄表明细 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 11:22:20
 */
@Service
public class EnergyConsumptionDetailServiceImpl extends ServiceImpl<EnergyConsumptionDetailMapper, EnergyConsumptionDetail> implements EnergyConsumptionDetailService {
    @Autowired
    private EnergyConsumptionDetailMapper energyConsumptionDetailMapper;
    @Autowired
    private EnergyMapper energyMapper;
    @Override
    public IPage<EnergyConsumptionDetailDto> pageEnergyConsumptionDetail(Page<EnergyConsumptionDetailDto> page, EnergyConsumptionDetailDto energyConsumptionDetailDto) {
        return energyConsumptionDetailMapper.pageEnergyConsumptionDetail(page,energyConsumptionDetailDto);
    }
    @Override
    public R importData(MultipartFile file) {
        try {
            ExcelUtil<EnergyConsumptionDetailDto> util = new ExcelUtil<EnergyConsumptionDetailDto>(EnergyConsumptionDetailDto.class);
            List<EnergyConsumptionDetailDto> energyConsumptionDetailDtoList = util.importExcel(file.getInputStream());
            if(CollectionUtils.isEmpty(energyConsumptionDetailDtoList)){
                return R.fail("模板错误或导入数据为空");
            }
            List<EnergyConsumptionDetail> list = energyConsumptionDetailDtoList.stream().map(energyConsumptionDetailDto -> {
                if (ObjectUtils.isEmpty(energyConsumptionDetailDto)) {
                    throw new RuntimeException("使用模板进行导入");
                }
                if (ObjectUtils.isEmpty(energyConsumptionDetailDto.getEnergyTyep()) && ObjectUtils.isEmpty(energyConsumptionDetailDto.getEnergyName())) {
                    throw new RuntimeException("能源类型不能为空");
                }
                List<Energy> energy = energyMapper.selectList(Wrappers.<Energy>lambdaQuery()
                        .eq(Energy::getEnergyTyep, energyConsumptionDetailDto.getEnergyTyep())
                        .eq(Energy::getEnergyName, energyConsumptionDetailDto.getEnergyName()));
                if (CollectionUtils.isEmpty(energy)) {
                    throw new RuntimeException("导入数据中的能源类型在系统中不存在,请先前往能源类型中配置!");
                }
                EnergyConsumptionDetail energyConsumptionDetail = new EnergyConsumptionDetail();
                BeanUtils.copyProperties(energyConsumptionDetailDto, energyConsumptionDetail);
                energyConsumptionDetail.setEnergyId(energy.get(0).getId());
                return energyConsumptionDetail;
            }).collect(Collectors.toList());
            this.saveOrUpdateBatch(list);
            return R.ok(true);
        }catch (Exception e){
            e.printStackTrace();
            return R.fail(e.getMessage());
        }
    }
    @Override
    public void export(HttpServletResponse response) {
        List<EnergyConsumptionDetailDto> list = energyConsumptionDetailMapper.pageEnergyConsumptionDetail(new Page<>(-1,-1),new EnergyConsumptionDetailDto()).getRecords();
        if(CollectionUtils.isEmpty(list)){
            throw new RuntimeException("无导出数据");
        }
        ExcelUtil<EnergyConsumptionDetailDto> util = new ExcelUtil<>(EnergyConsumptionDetailDto.class);
        util.exportExcel(response, list, "能耗抄表");
    }
    @Override
    public Object statistics(EnergyStatisticsDto energyStatisticsDto) {
        return null;
    }
}
src/main/java/com/ruoyi/energy/service/impl/EnergyServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.ruoyi.energy.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.energy.mapper.EnergyConsumptionDetailMapper;
import com.ruoyi.energy.pojo.Energy;
import com.ruoyi.energy.mapper.EnergyMapper;
import com.ruoyi.energy.pojo.EnergyConsumptionDetail;
import com.ruoyi.energy.service.EnergyService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.framework.web.domain.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * <p>
 * èƒ½æºç±»åž‹ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-10 10:50:18
 */
@Service
public class EnergyServiceImpl extends ServiceImpl<EnergyMapper, Energy> implements EnergyService {
    @Autowired
    private EnergyMapper energyMapper;
    @Autowired
    private EnergyConsumptionDetailMapper energyConsumptionDetailMapper;
    @Override
    public IPage<Energy> pageEnergy(Page<Energy> page, Energy energy) {
        return energyMapper.pageEnergy(page,energy);
    }
    @Override
    public boolean batchDelete(List<Long> ids) {
        //先判断是否已经有填写的能耗数据
        List<EnergyConsumptionDetail> energyConsumptionDetails = energyConsumptionDetailMapper.selectList(Wrappers.<EnergyConsumptionDetail>lambdaQuery().in(EnergyConsumptionDetail::getEnergyId, ids));
        if (CollectionUtils.isNotEmpty(energyConsumptionDetails)){
            throw new RuntimeException("选中的能源类型已有对应的能耗数据,无法进行删除!");
        }
        return removeBatchByIds(ids);
    }
    @Override
    public R importData(MultipartFile file) {
        try {
            ExcelUtil<Energy> util = new ExcelUtil<Energy>(Energy.class);
            List<Energy> energyList = util.importExcel(file.getInputStream());
            if(CollectionUtils.isEmpty(energyList)){
                return R.fail("模板错误或导入数据为空");
            }
            energyList.forEach(energy -> {
                if (ObjectUtils.isEmpty(energy)) {
                    throw new RuntimeException("使用模板进行导入");
                }
                if (ObjectUtils.isEmpty(energy.getEnergyTyep())) {
                    throw new RuntimeException("能源类型不能为空");
                }
            });
            this.saveOrUpdateBatch(energyList);
            return R.ok(true);
        }catch (Exception e){
            e.printStackTrace();
            return R.fail(e.getMessage());
        }
    }
    @Override
    public void export(HttpServletResponse response) {
        List<Energy> list = energyMapper.selectList(null);
        if(CollectionUtils.isEmpty(list)){
            throw new RuntimeException("无导出数据");
        }
        ExcelUtil<Energy> util = new ExcelUtil<>(Energy.class);
        util.exportExcel(response, list, "能源类型");
    }
}
src/main/java/com/ruoyi/procurementrecord/dto/ReturnSaleProductDto.java
@@ -18,4 +18,10 @@
    private BigDecimal unQuantity;
    private BigDecimal totalReturnNum;
    // é€€è´§æ€»ä»·
    private BigDecimal price;
    // é€€è´§æ€»ä»·
    private BigDecimal taxInclusiveUnitPrice;
}
src/main/java/com/ruoyi/procurementrecord/mapper/ReturnSaleProductMapper.java
@@ -20,4 +20,6 @@
public interface ReturnSaleProductMapper extends BaseMapper<ReturnSaleProduct> {
    List<ReturnSaleProductDto> listReturnSaleProductDto(@Param("returnManagementId") Long returnManagementId);
    List<ReturnSaleProductDto> listReturnSaleProduct(@Param("returnManagementId") Long returnManagementId);
}
src/main/java/com/ruoyi/procurementrecord/service/ReturnSaleProductService.java
@@ -17,4 +17,6 @@
public interface ReturnSaleProductService extends IService<ReturnSaleProduct> {
    List<ReturnSaleProductDto> listReturnSaleProductDto(Long returnManagementId);
    List<ReturnSaleProductDto> listReturnSaleProduct(Long returnManagementId);
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
@@ -1,10 +1,16 @@
package com.ruoyi.procurementrecord.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.dto.SalesRefundAmountOrderDto;
import com.ruoyi.account.pojo.SalesRefundAmountOrder;
import com.ruoyi.account.service.SalesRefundAmountOrderService;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.procurementrecord.dto.ReturnManagementDto;
import com.ruoyi.procurementrecord.dto.ReturnSaleProductDto;
import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper;
import com.ruoyi.procurementrecord.pojo.ReturnManagement;
import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct;
@@ -22,6 +28,7 @@
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@@ -42,6 +49,8 @@
    private ShippingInfoService shippingInfoService;
    @Autowired
    private SalesLedgerMapper salesLedgerMapper;
    @Autowired
    private SalesRefundAmountOrderService salesRefundAmountOrderService;
    @Override
    public IPage<ReturnManagementDto> listPage(Page page, ReturnManagementDto returnManagement) {
@@ -91,8 +100,22 @@
    @Override
    public boolean handle(Long returnManagementId) {
        ReturnManagement byId = this.getById(returnManagementId);
        List<ReturnSaleProductDto> list = returnSaleProductService.listReturnSaleProduct(returnManagementId);
        byId.setStatus(1);
        updateById(byId);
        SalesRefundAmountOrderDto salesRefundAmountOrder = new SalesRefundAmountOrderDto();
        salesRefundAmountOrder.setReturnManagementId(returnManagementId);
        salesRefundAmountOrder.setStatus(0);
        salesRefundAmountOrder.setCreateTime(byId.getCreateTime());
        salesRefundAmountOrder.setCreateUserId(SecurityUtils.getUserId());
        BigDecimal bigDecimal = new BigDecimal(0);
        for (ReturnSaleProductDto returnSaleProduct : list) {
            bigDecimal = bigDecimal.add(returnSaleProduct.getPrice());
            salesRefundAmountOrder.setRefundedAmount(new BigDecimal(0));
        }
        salesRefundAmountOrder.setRefundAmount(bigDecimal);
        salesRefundAmountOrder.setNotRefundedAmount(salesRefundAmountOrder.getRefundedAmount());
        salesRefundAmountOrderService.addSalesRefundAmountOrderDto(salesRefundAmountOrder);
        return true;
    }
src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnSaleProductServiceImpl.java
@@ -29,4 +29,9 @@
        return returnSaleProductMapper.listReturnSaleProductDto(returnManagementId);
    }
    @Override
    public List<ReturnSaleProductDto> listReturnSaleProduct(Long returnManagementId) {
        return returnSaleProductMapper.listReturnSaleProduct(returnManagementId);
    }
}
src/main/java/com/ruoyi/prodDemand/controller/ProdDemandDetailController.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/controller/ProdDemandMainController.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/mapper/ProdDemandDetailMapper.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/mapper/ProdDemandMainMapper.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/pojo/ProdDemandDetail.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/pojo/ProdDemandMain.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/service/ProdDemandDetailService.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/service/ProdDemandMainService.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/service/impl/ProdDemandDetailServiceImpl.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/service/impl/ProdDemandMainServiceImpl.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/task/ProdDemandTask.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.ruoyi.productionPlan.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import com.ruoyi.productionPlan.service.ProductionPlanService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚控制层
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 10:01
 */
@RestController
@RequestMapping("/productionPlan")
@Api(tags = "主生产计划")
public class ProductionPlanController {
    @Resource
    private ProductionPlanService productionPlanService;
    @GetMapping("/listPage")
    @ApiOperation("获取生产计划列表")
    public AjaxResult productionPlanListPage(Page page, ProductionPlanDto productionPlanDto) {
        return AjaxResult.success(productionPlanService.listPage(page, productionPlanDto));
    }
    @GetMapping("/loadProdData")
    @Log(title = "拉取销售生产计划", businessType = BusinessType.INSERT)
    public AjaxResult loadProdData() {
        productionPlanService.loadProdData();
        return AjaxResult.success();
    }
}
src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
package com.ruoyi.productionPlan.dto;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
public class ProductionPlanDto extends ProductionPlan {
}
src/main/java/com/ruoyi/productionPlan/enums/DataSourceTypeEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.productionPlan.enums;
import lombok.Getter;
/**
 * <br>
 * æ•°æ®æ¥æºæ–¹å¼æžšä¸¾ç±»
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 10:37
 */
@Getter
public enum DataSourceTypeEnum {
    SALES_ORDER(1, "销售订单"),
    PRODUCTION_FORECAST(2, "生产预测");
    private final Integer code;
    private final String desc;
    DataSourceTypeEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    public static DataSourceTypeEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (DataSourceTypeEnum type : DataSourceTypeEnum.values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        return null;
    }
}
src/main/java/com/ruoyi/productionPlan/enums/DataSyncTypeEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.productionPlan.enums;
import lombok.Getter;
/**
 * <br>
 * æ•°æ®æ–¹å¼æžšä¸¾ç±»
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 10:36
 */
@Getter
public enum DataSyncTypeEnum {
    MANUAL(1, "手动"),
    SCHEDULED(2, "定时");
    private final Integer code;
    private final String desc;
    DataSyncTypeEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    public static DataSyncTypeEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (DataSyncTypeEnum type : DataSyncTypeEnum.values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        return null;
    }
}
src/main/java/com/ruoyi/productionPlan/mapper/ProductionPlanMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.productionPlan.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
import com.ruoyi.staff.dto.StaffLeaveDto;
import org.apache.ibatis.annotations.Param;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚Mapper
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 9:56
 */
public interface ProductionPlanMapper extends BaseMapper<ProductionPlan> {
    IPage<ProductionPlanDto> listPage(Page page, @Param("c") ProductionPlanDto productionPlanDto);
}
src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,176 @@
package com.ruoyi.productionPlan.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 9:54
 */
@Data
@TableName("production_plan")
public class ProductionPlan {
    /**
     * ä¸»é”®
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * è¡¨å•实例ID
     */
    private String formInstanceId;
    /**
     * æµæ°´å·
     */
    private String serialNo;
    /**
     * ç”³è¯·å•编号
     */
    private String applyNo;
    /**
     * å®¢æˆ·åç§°
     */
    private String customerName;
    /**
     * ç‰©æ–™ç¼–码
     */
    private String materialCode;
    /**
     * äº§å“åç§°
     */
    private String productName;
    /**
     * äº§å“è§„æ ¼
     */
    private String productSpec;
    /**
     * é•¿
     */
    private Integer length;
    /**
     * å®½
     */
    private Integer width;
    /**
     * é«˜
     */
    private Integer height;
    /**
     * å—æ•°
     */
    private Integer quantity;
    /**
     * æ–¹æ•°
     */
    private BigDecimal volume;
    /**
     * å¼ºåº¦
     */
    private String strength;
    /**
     * å¼€å§‹æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startDate;
    /**
     * ç»“束日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endDate;
    /**
     * æäº¤äºº
     */
    private String submitter;
    /**
     * æäº¤äººç»„织
     */
    private String submitOrg;
    /**
     * å¤‡æ³¨1
     */
    private String remarkOne;
    /**
     * å¤‡æ³¨2
     */
    private String remarkTwo;
    /**
     * åˆ›å»ºäºº
     */
    private String creatorName;
    /**
     * ä¿®æ”¹äºº
     */
    private String modifierName;
    /**
     * è¡¨å•创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime formCreatedTime;
    /**
     * è¡¨å•修改时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime formModifiedTime;
    /**
     * æ•°æ®åŒæ­¥ç±»åž‹ï¼š1=手动 2=定时任务
     */
    private Integer dataSyncType;
    /**
     * æ•°æ®æ¥æºç±»åž‹ï¼š1=销售订单 2=销售预测
     */
    private Integer dataSourceType;
    /**
     * æ•°æ®åº“创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    /**
     * æ•°æ®åº“æ›´æ–°æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime updateTime;
    /**
     * å½“前更新数量
     */
    private Integer totalCount;
}
src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.productionPlan.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚接口
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 10:00
 */
public interface ProductionPlanService extends IService<ProductionPlan> {
    IPage<ProductionPlanDto> listPage(Page page, ProductionPlanDto productionPlanDto);
    /**
     * æ‰‹åŠ¨åŒæ­¥
     */
    void loadProdData();
    /**
     * å®šæ—¶åŒæ­¥
     */
    void syncProdDataJob();
}
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,307 @@
package com.ruoyi.productionPlan.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.framework.config.AliDingConfig;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import com.ruoyi.productionPlan.mapper.ProductionPlanMapper;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
import com.ruoyi.productionPlan.service.ProductionPlanService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚接口实现类
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 10:00
 */
@Slf4j
@Service
public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper, ProductionPlan> implements ProductionPlanService {
    @Autowired
    private AliDingConfig aliDingConfig;
    @Autowired
    private ProductionPlanMapper productionPlanMapper;
    /**
     * åŒæ­¥é”ï¼Œç¡®ä¿æ‰‹åŠ¨å’Œå®šæ—¶ä»»åŠ¡ä¸åŒæ—¶æ‰§è¡Œ
     */
    private final ReentrantLock syncLock = new ReentrantLock();
    @Override
    public IPage<ProductionPlanDto> listPage(Page page, ProductionPlanDto productionPlanDto) {
        return productionPlanMapper.listPage(page, productionPlanDto);
    }
    /**
     * é¡µé¢æ‰‹åŠ¨åŒæ­¥
     */
    @Override
    public void loadProdData() {
        syncProdData(1);
    }
    /**
     * å®šæ—¶ä»»åŠ¡åŒæ­¥
     */
    @Override
    public void syncProdDataJob() {
        syncProdData(2);
    }
    /**
     * åŒæ­¥æ•°æ®
     */
    @Transactional(rollbackFor = Exception.class)
    public void syncProdData(Integer dataSyncType) {
        if (!syncLock.tryLock()) {
            log.warn("同步正在进行中,本次 {} åŒæ­¥è¯·æ±‚被跳过", dataSyncType == 1 ? "手动" : "定时任务");
            return;
        }
        try {
            //  èŽ·å– AccessToken
            String accessToken = getAccessToken();
            if (StringUtils.isEmpty(accessToken)) {
                return;
            }
            //  èŽ·å–æœ¬åœ°æœ€åŽåŒæ­¥æ—¶é—´
            LocalDateTime lastSyncTime = getLastSyncTime();
            log.info("开始增量同步,本地最后修改时间: {}", lastSyncTime);
            int pageNumber = 1;
            int pageSize = 50;
            boolean hasMore = true;
            int totalSynced = 0;
            while (hasMore) {
                //  æŸ¥è¯¢å‚æ•°
                JSONObject searchParam = buildSearchParam(lastSyncTime, pageNumber, pageSize);
                //  è°ƒç”¨å®œæ­æŽ¥å£æ‹‰å–数据
                String dataRes = HttpUtils.sendPostJson(
                        aliDingConfig.getSearchFormDataUrl(),
                        searchParam.toJSONString(),
                        StandardCharsets.UTF_8.name(),
                        null,
                        accessToken
                );
                if (StringUtils.isEmpty(dataRes)) {
                    log.warn("第 {} é¡µæ‹‰å–数据为空", pageNumber);
                    break;
                }
                JSONObject resultObj = JSON.parseObject(dataRes);
                JSONArray dataArr = resultObj.getJSONArray("data");
                Integer totalCount = resultObj.getInteger("totalCount");
                if (dataArr == null || dataArr.isEmpty()) {
                    log.info("没有更多新数据需要同步");
                    break;
                }
                //  è§£æžå¹¶ä¿å­˜æ•°æ®
                List<ProductionPlan> list = parseProductionPlans(dataArr, dataSyncType, totalCount);
                if (!list.isEmpty()) {
                    //  å¤„理更新或新增
                    processSaveOrUpdate(list);
                    totalSynced += list.size();
                }
                //  åˆ¤æ–­æ˜¯å¦è¿˜æœ‰ä¸‹ä¸€é¡µ
                hasMore = (pageNumber * pageSize) < totalCount;
                pageNumber++;
                log.info("正在同步第 {} é¡µï¼Œå½“前已同步 {}/{}", pageNumber - 1, totalSynced, totalCount);
            }
            log.info("数据同步完成,共同步 {} æ¡æ•°æ®", totalSynced);
        } catch (Exception e) {
            log.error("同步生产计划异常", e);
        } finally {
            // é‡Šæ”¾é”
            syncLock.unlock();
        }
    }
    private String getAccessToken() {
        String params = "appkey=" + aliDingConfig.getAppKey()
                + "&appsecret=" + aliDingConfig.getAppSecret();
        String tokenRes = HttpUtils.sendGet(aliDingConfig.getAccessTokenUrl(), params);
        JSONObject tokenObj = JSON.parseObject(tokenRes);
        String accessToken = tokenObj.getString("access_token");
        if (StringUtils.isEmpty(accessToken)) {
            log.error("获取钉钉AccessToken失败: {}", tokenRes);
        }
        return accessToken;
    }
    private LocalDateTime getLastSyncTime() {
        // æŸ¥è¯¢æœ¬åœ°æ•°æ®åº“中 formModifiedTime æœ€å¤§çš„记录
        LambdaQueryWrapper<ProductionPlan> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByDesc(ProductionPlan::getFormModifiedTime).last("LIMIT 1");
        ProductionPlan lastRecord = this.getOne(queryWrapper);
        return lastRecord != null ? lastRecord.getFormModifiedTime() : null;
    }
    private JSONObject buildSearchParam(LocalDateTime lastSyncTime, int pageNumber, int pageSize) {
        JSONObject searchParam = new JSONObject();
        searchParam.put("appType", aliDingConfig.getAppType());
        searchParam.put("systemToken", aliDingConfig.getSystemToken());
        searchParam.put("userId", aliDingConfig.getUserId());
        searchParam.put("formUuid", aliDingConfig.getFormUuid());
        searchParam.put("pageSize", pageSize);
        searchParam.put("pageNumber", pageNumber);
        // é»˜è®¤æŒ‰ä¿®æ”¹æ—¶é—´å‡åºæŽ’序,确保分页拉取数据的连续性
        // "+" è¡¨ç¤ºå‡åºï¼Œ"gmt_modified" æ˜¯å®˜æ–¹å†…置字段
        searchParam.put("orderConfigJson", "{\"gmt_modified\":\"+\"}");
        // è®¾ç½®ä¿®æ”¹æ—¶é—´ç­›é€‰åŒºé—´ (格式必须为yyyy-MM-dd HH:mm:ss)
        if (lastSyncTime != null) {
            // èµ·å§‹æ—¶é—´ï¼šä¸Šæ¬¡åŒæ­¥åˆ°çš„æœ€åŽä¸€æ¡æ•°æ®çš„修改时间
            String startTime = lastSyncTime.plusSeconds(1).atZone(ZoneId.systemDefault())
                    .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            searchParam.put("modifiedFromTimeGMT", startTime);
        }
        // æˆªæ­¢æ—¶é—´ï¼šå½“前时间,确保获取最新的已修改/已新增数据
        String endTime = LocalDateTime.now().atZone(ZoneId.systemDefault())
                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        searchParam.put("modifiedToTimeGMT", endTime);
        return searchParam;
    }
    private List<ProductionPlan> parseProductionPlans(JSONArray dataArr, Integer dataSyncType, Integer totalCount) {
        List<ProductionPlan> list = new ArrayList<>();
        LocalDateTime now = LocalDateTime.now();
        for (int i = 0; i < dataArr.size(); i++) {
            JSONObject item = dataArr.getJSONObject(i);
            String formInstanceId = item.getString("formInstanceId");
            String serialNo = item.getString("serialNo");
            JSONObject originator = item.getJSONObject("originator");
            String originatorName = originator != null && originator.containsKey("userName")
                    ? originator.getJSONObject("userName").getString("nameInChinese") : "未知";
            JSONObject formData = item.getJSONObject("formData");
            JSONArray tableArr = formData.getJSONArray("tableField_l7fytfcn");
            if (tableArr == null || tableArr.isEmpty()) {
                continue;
            }
            for (int j = 0; j < tableArr.size(); j++) {
                JSONObject row = tableArr.getJSONObject(j);
                ProductionPlan plan = new ProductionPlan();
                plan.setFormInstanceId(formInstanceId);
                plan.setSerialNo(serialNo);
                plan.setApplyNo(formData.getString("textField_l7fytfco"));
                plan.setCustomerName(formData.getString("textField_lbkozohg"));
                plan.setMaterialCode(row.getString("textField_l9xo62q5"));
                plan.setProductName(row.getString("textField_l9xo62q7"));
                plan.setProductSpec(row.getString("textField_l9xo62q8"));
                plan.setLength(row.getInteger("numberField_lb7lgatg_value"));
                plan.setWidth(row.getInteger("numberField_lb7lgath_value"));
                plan.setHeight(row.getInteger("numberField_lb7lgati_value"));
                plan.setQuantity(row.getInteger("numberField_lb7lgatj_value"));
                plan.setVolume(row.getBigDecimal("numberField_l7fytfd3_value"));
                plan.setStrength(row.getString("radioField_m9urarr2_id"));
                JSONArray dateArr = row.getJSONArray("cascadeDateField_lfxqqluw");
                if (dateArr != null && dateArr.size() == 2) {
                    try {
                        long start = Long.parseLong(dateArr.getString(0));
                        long end = Long.parseLong(dateArr.getString(1));
                        plan.setStartDate(Instant.ofEpochMilli(start).atZone(ZoneId.systemDefault()).toLocalDateTime());
                        plan.setEndDate(Instant.ofEpochMilli(end).atZone(ZoneId.systemDefault()).toLocalDateTime());
                    } catch (Exception e) {
                        log.warn("解析日期失败: {}", dateArr);
                    }
                }
                plan.setSubmitter(originatorName);
                plan.setSubmitOrg("宁夏中创绿能实业集团有限公司");
                plan.setRemarkOne(formData.getString("textareaField_l7fytfcy"));
                plan.setRemarkTwo(formData.getString("textField_l7fytfcx"));
                plan.setCreatorName(originatorName);
                JSONObject modifyUser = item.getJSONObject("modifyUser");
                if (modifyUser != null && modifyUser.containsKey("userName")) {
                    plan.setModifierName(modifyUser.getJSONObject("userName").getString("nameInChinese"));
                }
                plan.setFormCreatedTime(parseUtcTime(item.getString("createdTimeGMT")));
                plan.setFormModifiedTime(parseUtcTime(item.getString("modifiedTimeGMT")));
                plan.setDataSyncType(dataSyncType);
                plan.setDataSourceType(1);
                plan.setCreateTime(now);
                plan.setUpdateTime(now);
                plan.setTotalCount(totalCount);
                list.add(plan);
            }
        }
        return list;
    }
    private void processSaveOrUpdate(List<ProductionPlan> list) {
        for (ProductionPlan plan : list) {
            LambdaQueryWrapper<ProductionPlan> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(ProductionPlan::getFormInstanceId, plan.getFormInstanceId())
                    .eq(ProductionPlan::getMaterialCode, plan.getMaterialCode());
            ProductionPlan existing = this.getOne(queryWrapper);
            if (existing != null) {
                plan.setId(existing.getId());
                this.updateById(plan);
            } else {
                this.save(plan);
            }
        }
    }
    private LocalDateTime parseUtcTime(String utcString) {
        if (StringUtils.isEmpty(utcString)) {
            return null;
        }
        try {
            OffsetDateTime odt = OffsetDateTime.parse(utcString);
            return odt.toLocalDateTime();
        } catch (DateTimeParseException ex) {
            log.warn("解析时间 {} å¤±è´¥: {}", utcString, ex.getMessage());
            return null;
        }
    }
}
src/main/java/com/ruoyi/productionPlan/task/ProductionPlanTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.productionPlan.task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.ruoyi.productionPlan.service.ProductionPlanService;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚定时任务
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/09 17:02
 */
@Component
public class ProductionPlanTask {
    @Autowired
    private ProductionPlanService productionPlanService;
    @Scheduled(cron = "0 0 * * * ?")
    public void syncProdDataJob() {
        productionPlanService.syncProdDataJob();
    }
}
src/main/java/com/ruoyi/projectManagement/controller/InfoController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.projectManagement.controller;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.projectManagement.service.InfoService;
import com.ruoyi.projectManagement.vo.SaveInfoVo;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@RestController
@RequestMapping("/projectManagement/info")
@Api(value = "InfoController", tags = "项目管理信息表(项目管理类型)")
@RequiredArgsConstructor
public class InfoController {
    private final InfoService infoService;
    @PostMapping("/save")
    public AjaxResult save(@RequestBody @Valid SaveInfoVo saveInfoVo) {
        infoService.save(saveInfoVo);
        return AjaxResult.success();
    }
}
src/main/java/com/ruoyi/projectManagement/dto/ContractInfoDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
package com.ruoyi.projectManagement.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ContractInfoDto implements Serializable {
    /**
     *
     */
    private Long id;
    /**
     * åç§°
     */
    private String name;
    /**
     * æ€§åˆ«
     */
    private String sex;
    /**
     * ç”Ÿæ—¥
     */
    private String birthday;
    /**
     * éƒ¨é—¨
     */
    private String department;
    /**
     * èŒåŠ¡
     */
    private String job;
    /**
     * æ‰‹æœºå·
     */
    private String phoneNumber;
    /**
     * é‚®ç®±
     */
    private String email;
    /**
     * QQ
     */
    private String qq;
    /**
     * å›ºå®šå·ç 
     */
    private String lineaFissa;
    /**
     * å¾®ä¿¡
     */
    private String wx;
    /**
     * ç±è´¯
     */
    private String origineEtnica;
    /**
     * æ³•人代表
     */
    private String rappresentanteLegale;
    /**
     * å¯¹åº”项目管理信息id
     */
    private Long projectManagementInfoId;
}
src/main/java/com/ruoyi/projectManagement/dto/PlanStageDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.projectManagement.dto;
import com.ruoyi.common.enums.PlanStageEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PlanStageDto implements Serializable {
    private Long id;
    private String name;
    private PlanStageEnum planStageEnum;
}
src/main/java/com/ruoyi/projectManagement/dto/SaveInfoDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.ruoyi.projectManagement.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SaveInfoDto implements Serializable {
    private Long id;
    private String no;
    @NotBlank
    private String title;
    private Long clientId;
    private String clientName;
    // å¼•用的父id
    private Long projectManagementInfoParentId;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate establishTime;
    // é¡¹ç›®ç±»åž‹ id
    @NotNull
    private Long projectManagementPlanId;
    private String source;
    private Long managerId;
    private String managerName;
    private Long salesmanId;
        private String salesmanName;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate planStartTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate planEndTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate actualStartTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate actualEndTime;
    // é¡¹ç›®çŠ¶æ€
    private Integer status;
    private Long departmentId;
    private String departmentName;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate orderDate;
    private String orderAmount;
    private String remark;
    private List<String> attachmentIds; // é™„ä»¶ids
    private List<TeamDto> teamList;
}
src/main/java/com/ruoyi/projectManagement/dto/ShippingAddressDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.projectManagement.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ShippingAddressDto implements Serializable {
    private Long id;
    /**
     * æ”¶è´§äºº
     */
    private String consignee;
    /**
     * è”系方式
     */
    private String contract;
    /**
     * åœ°å€
     */
    private String address;
}
src/main/java/com/ruoyi/projectManagement/dto/TeamDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.projectManagement.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.Date;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TeamDto implements Serializable {
    private Integer userId;
    private String userName;
    private String userRoleId;
    private String userRoleName;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date joinTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date departTime;
    private String contact;
    private String remark;
}
src/main/java/com/ruoyi/projectManagement/mapper/ContractInfoMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.projectManagement.mapper;
import com.ruoyi.projectManagement.pojo.ContractInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author buhuazhen
* @description é’ˆå¯¹è¡¨ã€project_management_contract_info(项目联系信息)】的数据库操作Mapper
* @createDate 2026-03-09 16:38:09
* @Entity com.ruoyi.projectManagement.pojo.ContractInfo
*/
public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
}
src/main/java/com/ruoyi/projectManagement/mapper/InfoMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.projectManagement.mapper;
import com.ruoyi.projectManagement.pojo.Info;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author buhuazhen
* @description é’ˆå¯¹è¡¨ã€project_management_info(项目管理信息)】的数据库操作Mapper
* @createDate 2026-03-09 13:57:50
* @Entity com.ruoyi.projectManagement.pojo.Info
*/
public interface InfoMapper extends BaseMapper<Info> {
}
src/main/java/com/ruoyi/projectManagement/mapper/ShippingAddressMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.projectManagement.mapper;
import com.ruoyi.projectManagement.pojo.ShippingAddress;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author buhuazhen
* @description é’ˆå¯¹è¡¨ã€project_management_shipping_address(收货地址)】的数据库操作Mapper
* @createDate 2026-03-09 16:28:07
* @Entity com.ruoyi.projectManagement.pojo.ShippingAddress
*/
public interface ShippingAddressMapper extends BaseMapper<ShippingAddress> {
}
src/main/java/com/ruoyi/projectManagement/pojo/ContractInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
package com.ruoyi.projectManagement.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
/**
 * é¡¹ç›®è”系信息
 * @TableName project_management_contract_info
 */
@TableName(value ="project_management_contract_info")
@Data
public class ContractInfo implements Serializable {
    /**
     *
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * åç§°
     */
    @TableField(value = "name")
    private String name;
    /**
     * æ€§åˆ«
     */
    @TableField(value = "sex")
    private String sex;
    /**
     * ç”Ÿæ—¥
     */
    @TableField(value = "birthday")
    private String birthday;
    /**
     * éƒ¨é—¨
     */
    @TableField(value = "department")
    private String department;
    /**
     * èŒåŠ¡
     */
    @TableField(value = "job")
    private String job;
    /**
     * æ‰‹æœºå·
     */
    @TableField(value = "phone_number")
    private String phoneNumber;
    /**
     * é‚®ç®±
     */
    @TableField(value = "email")
    private String email;
    /**
     * QQ
     */
    @TableField(value = "qq")
    private String qq;
    /**
     * å›ºå®šå·ç 
     */
    @TableField(value = "linea_fissa")
    private String lineaFissa;
    /**
     * å¾®ä¿¡
     */
    @TableField(value = "wx")
    private String wx;
    /**
     * ç±è´¯
     */
    @TableField(value = "origine_etnica")
    private String origineEtnica;
    /**
     * æ³•人代表
     */
    @TableField(value = "rappresentante_legale")
    private String rappresentanteLegale;
    /**
     * å¯¹åº”项目管理信息id
     */
    @TableField(value = "project_management_info_id")
    private Long projectManagementInfoId;
    /**
     *
     */
    @TableField(value = "is_delete")
    private Integer isDelete;
    /**
     *
     */
    @TableField(value = "create_user", fill = FieldFill.INSERT)
    private Long createUser;
    /**
     *
     */
    @TableField(value = "update_user", fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    /**
     *
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     *
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/projectManagement/pojo/Info.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,210 @@
package com.ruoyi.projectManagement.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.ruoyi.projectManagement.dto.PlanStageDto;
import com.ruoyi.projectManagement.dto.TeamDto;
import lombok.Data;
/**
 * é¡¹ç›®ç®¡ç†ä¿¡æ¯
 * @TableName project_management_info
 */
@TableName(value ="project_management_info",autoResultMap = true)
@Data
public class Info implements Serializable {
    /**
     *
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * é¡¹ç›®ç¼–号
     */
    @TableField(value = "no")
    private String no;
    /**
     * ä¸»é¢˜
     */
    @TableField(value = "title")
    private String title;
    /**
     * å®¢æˆ·id
     */
    @TableField(value = "client_id")
    private Long clientId;
    /**
     * å®¢æˆ·åç§°
     */
    @TableField(value = "client_name")
    private String clientName;
    /**
     * ç´¢å¼•的父项目id
     */
    @TableField(value = "project_management_info_parent_id")
    private Long projectManagementInfoParentId;
    /**
     * ç«‹é¡¹æ—¶é—´
     */
    @TableField(value = "establish_time")
    private LocalDate establishTime;
    /**
     * é¡¹ç›®é˜¶æ®µid
     */
    @TableField(value = "project_management_plan_id")
    private Long projectManagementPlanId;
    /**
     * æ¥æº
     */
    @TableField(value = "source")
    private String source;
    /**
     * é¡¹ç›®ç»ç†id
     */
    @TableField(value = "manager_id")
    private Long managerId;
    /**
     * é¡¹ç›®ç»ç†åå­—
     */
    @TableField(value = "manager_name")
    private String managerName;
    /**
     * ä¸šåŠ¡å‘˜id
     */
    @TableField(value = "salesman_id")
    private Long salesmanId;
    /**
     * ä¸šåŠ¡å‘˜åå­—
     */
    @TableField(value = "salesman_name")
    private String salesmanName;
    /**
     *
     */
    @TableField(value = "is_delete")
    private Integer isDelete;
    /**
     *
     */
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     *
     */
    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     *
     */
    @TableField(value = "create_user",fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     *
     */
    @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * è®¡åˆ’开始时间
     */
    @TableField(value = "plan_start_time")
    private LocalDate planStartTime;
    /**
     * è®¡åˆ’结束时间
     */
    @TableField(value = "plan_end_time")
    private LocalDate planEndTime;
    /**
     * å®žé™…开始时间
     */
    @TableField(value = "actual_start_time")
    private LocalDate actualStartTime;
    /**
     * å®žé™…结束日期
     */
    @TableField(value = "actual_end_time")
    private LocalDate actualEndTime;
    /**
     * å®¡æ ¸çŠ¶æ€
     */
    @TableField(value = "review_status")
    private Integer reviewStatus;
    /**
     * é¡¹ç›®çŠ¶æ€
     */
    @TableField(value = "status")
    private Integer status;
    /**
     * éƒ¨é—¨id
     */
    @TableField(value = "department_id")
    private Long departmentId;
    /**
     * éƒ¨é—¨åå­—
     */
    @TableField(value = "department_name")
    private String departmentName;
    /**
     * è®¢å•日期
     */
    @TableField(value = "order_date")
    private LocalDate orderDate;
    /**
     * è®¢å•金额
     */
    @TableField(value = "order_amount")
    private String orderAmount;
    /**
     * å¤‡æ³¨
     */
    @TableField(value = "remark")
    private String remark;
    /**
     * é™„ä»¶
     */
    @TableField(value = "attachment")
    private String attachment;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
    @TableField(value = "plan_stage",typeHandler = JacksonTypeHandler.class)
    private List<PlanStageDto> planStage;
    @TableField(value = "team",typeHandler = JacksonTypeHandler.class)
    private List<TeamDto> team;
}
src/main/java/com/ruoyi/projectManagement/pojo/ShippingAddress.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
package com.ruoyi.projectManagement.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
/**
 * æ”¶è´§åœ°å€
 * @TableName project_management_shipping_address
 */
@TableName(value ="project_management_shipping_address")
@Data
public class ShippingAddress implements Serializable {
    /**
     *
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * æ”¶è´§äºº
     */
    @TableField(value = "consignee")
    private String consignee;
    /**
     * è”系方式
     */
    @TableField(value = "contract")
    private String contract;
    /**
     * åœ°å€
     */
    @TableField(value = "address")
    private String address;
    /**
     *
     */
    @TableField(value = "is_delete")
    private Integer isDelete;
    /**
     *
     */
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     *
     */
    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     *
     */
    @TableField(value = "create_user",fill = FieldFill.INSERT)
    private Long createUser;
    /**
     *
     */
    @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    @TableField(value = "project_management_info_id")
    private Long projectManagementInfoId;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/projectManagement/service/InfoService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.projectManagement.service;
import com.ruoyi.projectManagement.vo.SaveInfoVo;
import javax.validation.constraints.NotNull;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
public interface InfoService {
    void save(@NotNull SaveInfoVo saveInfoVo);
}
src/main/java/com/ruoyi/projectManagement/service/PlanService.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.projectManagement.pojo.Plan;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.projectManagement.pojo.PlanNode;
import com.ruoyi.projectManagement.vo.PlanVo;
import com.ruoyi.projectManagement.vo.SavePlanNodeVo;
import com.ruoyi.projectManagement.vo.SavePlanVo;
@@ -33,6 +34,8 @@
     */
    void savePlanNode(@NotNull Long planId,@Nullable List<SavePlanNodeVo> savePlanNodeVos);
    List<PlanNode> getPlanNodeByPlanId(@NotNull Long planId);
    /**
     * åˆ é™¤é¡¹ç›®ç®¡ç†è®¡åˆ’
     * @param id
src/main/java/com/ruoyi/projectManagement/service/impl/InfoServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.projectManagement.service.impl;
import com.ruoyi.common.enums.SaleEnum;
import com.ruoyi.projectManagement.service.InfoService;
import com.ruoyi.projectManagement.service.impl.handle.ContractInfoHandleService;
import com.ruoyi.projectManagement.service.impl.handle.InfoHandleService;
import com.ruoyi.projectManagement.service.impl.handle.ShippingAddressHandleService;
import com.ruoyi.projectManagement.vo.SaveInfoVo;
import com.ruoyi.sales.service.ISalesLedgerService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class InfoServiceImpl implements InfoService {
    private final InfoHandleService infoHandleService;
    private final ContractInfoHandleService contractInfoHandleService;
    private final ShippingAddressHandleService shippingAddressHandleService;
    private final ISalesLedgerService salesLedgerService;
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void save(SaveInfoVo saveInfoVo) {
        // ä¿å­˜ä¸»ä¿¡æ¯
        Long infoId = infoHandleService.save(saveInfoVo.getInfo());
        shippingAddressHandleService.save(infoId, saveInfoVo.getShippingAddress());
        contractInfoHandleService.save(infoId, saveInfoVo.getContractInfo());
        salesLedgerService.handleSalesLedgerProducts(infoId, saveInfoVo.getSalesLedgerProductList(), SaleEnum.MANAGEMENT);
    }
}
src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
@@ -93,16 +93,17 @@
        });
    }
    private List<PlanNode> getPlanNodeByPlanId(Long planId) {
    @Override
    public List<PlanNode> getPlanNodeByPlanId(Long planId) {
        return planNodeMapper.selectList(new LambdaQueryWrapper<PlanNode>()
                .eq(PlanNode::getIsDelete, 0)
                .eq(PlanNode::getProjectManagementPlanId, planId));
                .eq(PlanNode::getProjectManagementPlanId, planId).orderByAsc(PlanNode::getSort));
    }
    private List<PlanNode> getPlanNodeByPlanIds(List<Long> planIds) {
        return planNodeMapper.selectList(new LambdaQueryWrapper<PlanNode>()
                .eq(PlanNode::getIsDelete, 0)
                .in(PlanNode::getProjectManagementPlanId, planIds));
                .in(PlanNode::getProjectManagementPlanId, planIds).orderByAsc(PlanNode::getSort));
    }
src/main/java/com/ruoyi/projectManagement/service/impl/handle/ContractInfoHandleService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.projectManagement.service.impl.handle;
import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.projectManagement.dto.ContractInfoDto;
import com.ruoyi.projectManagement.mapper.ContractInfoMapper;
import com.ruoyi.projectManagement.pojo.ContractInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Component
@Transactional(rollbackFor = Exception.class,readOnly = true)
public class ContractInfoHandleService{
    @Autowired
    private ContractInfoMapper contractInfoMapper;
    @Transactional(rollbackFor = Exception.class)
    public void save(@Nullable Long id, @NotNull ContractInfoDto contractInfoDto) {
        ContractInfo contractInfo = BeanUtil.copyProperties(contractInfoDto, ContractInfo.class);
        contractInfo.setProjectManagementInfoId(id);
        if (contractInfoDto.getId() == null) {
            contractInfoMapper.insert(contractInfo);
        } else {
            contractInfoMapper.updateById(contractInfo);
        }
    }
}
src/main/java/com/ruoyi/projectManagement/service/impl/handle/InfoHandleService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
package com.ruoyi.projectManagement.service.impl.handle;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.enums.PlanStageEnum;
import com.ruoyi.common.enums.ReviewStatusEnum;
import com.ruoyi.common.utils.EnumUtil;
import com.ruoyi.projectManagement.dto.PlanStageDto;
import com.ruoyi.projectManagement.dto.SaveInfoDto;
import com.ruoyi.projectManagement.mapper.InfoMapper;
import com.ruoyi.projectManagement.pojo.Info;
import com.ruoyi.projectManagement.pojo.PlanNode;
import com.ruoyi.projectManagement.service.PlanService;
import com.ruoyi.projectManagement.service.impl.PlanServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.validation.constraints.NotNull;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Component
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class,readOnly = true)
public class InfoHandleService {
    private static final String GENERATE_SERIAL_NUMBER_PREFIX = "XM";
    private final InfoMapper infoMapper;
    private final PlanService planService;
    @Transactional(rollbackFor = Exception.class)
    public Long save(@NotNull SaveInfoDto saveInfoDto){
        Info info = BeanUtil.copyProperties(saveInfoDto, Info.class);
        // é™„件特殊处理
        String attachmentIds = StrUtil.join(",", Optional.ofNullable(saveInfoDto.getAttachmentIds()).orElse(Collections.emptyList()));
        info.setAttachment(attachmentIds);
        // ç”Ÿæˆåºå· (如果需要自动生成的话)
        if(StrUtil.isBlank(info.getNo())){
            info.setNo(generateSerialNumber());
        }
        info.setTeam(saveInfoDto.getTeamList());
        if(info.getId() == null){
            // ç”Ÿæˆå¯¹åº”的阶段关系数据
            info.setPlanStage(getPlanStageList(info.getProjectManagementPlanId()));
            // æ’入默认状态
            info.setStatus(PlanStageEnum.TO_BEGIN.getCode());
            info.setReviewStatus(ReviewStatusEnum.PENDING_REVIEW.getCode());
            infoMapper.insert(info);
        }else {
            infoMapper.updateById(info);
        }
        return info.getId();
    }
    private List<PlanStageDto> getPlanStageList(@NotNull Long planId) {
        List<PlanNode> planNodeByPlanId = planService.getPlanNodeByPlanId(planId);
        return planNodeByPlanId.stream().map(it-> new PlanStageDto(it.getId(), it.getName(), PlanStageEnum.TO_BEGIN)).collect(Collectors.toList());
    }
    /**
     * ç”Ÿæˆé¡¹ç›®ç¼–号
     * @return
     */
    private String generateSerialNumber() {
        // èŽ·å–å½“å‰æ—¥æœŸ
        String date = DateUtil.format(DateUtil.date(), "yyyyMMdd");
        // æŸ¥è¯¢ä»Šå¤©å·²ç»ç”Ÿæˆçš„æ•°é‡
        LambdaQueryWrapper<Info> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.likeRight(Info::getNo, GENERATE_SERIAL_NUMBER_PREFIX + date);
        Long count = infoMapper.selectCount(queryWrapper);
        // åºå· +1
        Long serial = count + 1;
        // 3位补0
        String serialStr = String.format("%03d", serial);
        return GENERATE_SERIAL_NUMBER_PREFIX + date + serialStr;
    }
}
src/main/java/com/ruoyi/projectManagement/service/impl/handle/ShippingAddressHandleService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.projectManagement.service.impl.handle;
import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.projectManagement.dto.ShippingAddressDto;
import com.ruoyi.projectManagement.mapper.ShippingAddressMapper;
import com.ruoyi.projectManagement.pojo.ShippingAddress;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Component
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class,readOnly = true)
public class ShippingAddressHandleService {
    private final ShippingAddressMapper shippingAddressMapper;
    @Transactional(rollbackFor = Exception.class)
    public void save(@Nullable Long infoId,@NotNull ShippingAddressDto shippingAddressDto){
        ShippingAddress shippingAddress = BeanUtil.copyProperties(shippingAddressDto, ShippingAddress.class);
        shippingAddress.setProjectManagementInfoId(infoId);
        if (shippingAddressDto.getId() == null) {
            shippingAddressMapper.insert(shippingAddress);
        }else {
            shippingAddressMapper.updateById(shippingAddress);
        }
    }
}
src/main/java/com/ruoyi/projectManagement/vo/SaveInfoVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.projectManagement.vo;
import com.ruoyi.projectManagement.dto.ContractInfoDto;
import com.ruoyi.projectManagement.dto.SaveInfoDto;
import com.ruoyi.projectManagement.dto.ShippingAddressDto;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.Valid;
import java.io.Serializable;
import java.util.List;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SaveInfoVo implements Serializable {
    @Valid
    private SaveInfoDto info;
    @Valid
    private ShippingAddressDto shippingAddress;
    @Valid
    private ContractInfoDto contractInfo;
    private List<SalesLedgerProduct> salesLedgerProductList;
}
src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java
@@ -1,5 +1,7 @@
package com.ruoyi.projectManagement.vo;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -22,7 +24,7 @@
    private Long id;
    @NotBlank
    private String name;
    @NotBlank
//    @NotBlank
    private String description;
    private List<String> attachmentIds;
@@ -30,4 +32,5 @@
    @Valid
    private List<SavePlanNodeVo> savePlanNodeList;
}
src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrderProductsController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.purchase.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-09 01:37:44
 */
@RestController
@RequestMapping("/purchaseReturnOrderProducts")
public class PurchaseReturnOrderProductsController {
}
src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java
@@ -42,6 +42,6 @@
        if (purchaseReturnOrderDto.getIsDefaultNo()) {
            purchaseReturnOrderDto.setNo(OrderUtils.countTodayByCreateTime(purchaseReturnOrdersMapper, "CGTL"));
        }
        return AjaxResult.success(purchaseReturnOrdersService.save(purchaseReturnOrderDto));
        return AjaxResult.success(purchaseReturnOrdersService.add(purchaseReturnOrderDto));
    }
}
src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderDto.java
@@ -1,10 +1,16 @@
package com.ruoyi.purchase.dto;
import com.ruoyi.purchase.pojo.PurchaseReturnOrderProducts;
import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
import lombok.Data;
import java.util.List;
@Data
public class PurchaseReturnOrderDto extends PurchaseReturnOrders {
    // æ˜¯å¦ä½¿ç”¨ç³»ç»Ÿå•号
    private Boolean isDefaultNo;
    private List<PurchaseReturnOrderProductsDto> purchaseReturnOrderProductsDtos;
}
src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderProductsDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.purchase.dto;
import com.ruoyi.purchase.pojo.PurchaseReturnOrderProducts;
import lombok.Data;
@Data
public class PurchaseReturnOrderProductsDto extends PurchaseReturnOrderProducts {
    private String productName;
    private String model;
    private String unit;
}
src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrderProductsMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.purchase.mapper;
import com.ruoyi.purchase.pojo.PurchaseReturnOrderProducts;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-09 01:37:44
 */
@Mapper
public interface PurchaseReturnOrderProductsMapper extends BaseMapper<PurchaseReturnOrderProducts> {
}
src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrderProducts.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.ruoyi.purchase.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
 * <p>
 *
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-09 01:37:44
 */
@Getter
@Setter
@TableName("purchase_return_order_products")
@ApiModel(value = "PurchaseReturnOrderProducts对象", description = "")
public class PurchaseReturnOrderProducts implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("退货单id")
    private Long purchaseReturnOrderId;
    @ApiModelProperty("采购产品id")
    private Long salesLedgerProductId;
    @ApiModelProperty("录入时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("退货数量")
    private BigDecimal num;
}
src/main/java/com/ruoyi/purchase/service/PurchaseReturnOrderProductsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.purchase.service;
import com.ruoyi.purchase.pojo.PurchaseReturnOrderProducts;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-09 01:37:44
 */
public interface PurchaseReturnOrderProductsService extends IService<PurchaseReturnOrderProducts> {
}
src/main/java/com/ruoyi/purchase/service/PurchaseReturnOrdersService.java
@@ -17,4 +17,6 @@
 */
public interface PurchaseReturnOrdersService extends IService<PurchaseReturnOrders> {
    IPage<PurchaseReturnOrderVo> listPage(Page page, PurchaseReturnOrderDto purchaseReturnOrderDto);
    Boolean add(PurchaseReturnOrderDto purchaseReturnOrderDto);
}
src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrderProductsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.purchase.service.impl;
import com.ruoyi.purchase.pojo.PurchaseReturnOrderProducts;
import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper;
import com.ruoyi.purchase.service.PurchaseReturnOrderProductsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-03-09 01:37:44
 */
@Service
public class PurchaseReturnOrderProductsServiceImpl extends ServiceImpl<PurchaseReturnOrderProductsMapper, PurchaseReturnOrderProducts> implements PurchaseReturnOrderProductsService {
}
src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.purchase.dto.PurchaseReturnOrderDto;
import com.ruoyi.purchase.dto.PurchaseReturnOrderProductsDto;
import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper;
import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
import com.ruoyi.purchase.service.PurchaseReturnOrdersService;
@@ -10,6 +12,7 @@
import com.ruoyi.purchase.vo.PurchaseReturnOrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * <p>
@@ -23,9 +26,24 @@
public class PurchaseReturnOrdersServiceImpl extends ServiceImpl<PurchaseReturnOrdersMapper, PurchaseReturnOrders> implements PurchaseReturnOrdersService {
    @Autowired
    private PurchaseReturnOrdersMapper purchaseReturnOrdersMapper;
    @Autowired
    private PurchaseReturnOrderProductsMapper purchaseReturnOrderProductsMapper;
    @Override
    public IPage<PurchaseReturnOrderVo> listPage(Page page, PurchaseReturnOrderDto purchaseReturnOrderDto) {
        return purchaseReturnOrdersMapper.listPage(page, purchaseReturnOrderDto);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean add(PurchaseReturnOrderDto purchaseReturnOrderDto) {
        this.save(purchaseReturnOrderDto);
        if (purchaseReturnOrderDto.getPurchaseReturnOrderProductsDtos().isEmpty()) {
            for (PurchaseReturnOrderProductsDto purchaseReturnOrderProductsDto :purchaseReturnOrderDto.getPurchaseReturnOrderProductsDtos()) {
                purchaseReturnOrderProductsDto.setPurchaseReturnOrderId(purchaseReturnOrderDto.getId());
                purchaseReturnOrderProductsMapper.insert(purchaseReturnOrderProductsDto);
            }
        }
        return true;
    }
}
src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -4,11 +4,13 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.aftersalesservice.pojo.AfterSalesService;
import com.ruoyi.common.enums.SaleEnum;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.dto.LossProductModelDto;
import com.ruoyi.sales.dto.MonthlyAmountDto;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
@@ -28,6 +30,8 @@
    int addOrUpdateSalesLedger(SalesLedgerDto salesLedgerDto);
    void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type);
    SalesLedgerDto getSalesLedgerWithProducts(SalesLedgerDto salesLedgerDto);
    List getSalesNo();
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -15,8 +15,10 @@
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.enums.SaleEnum;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.EnumUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -636,7 +638,7 @@
            // 4. å¤„理子表数据
            List<SalesLedgerProduct> productList = salesLedgerDto.getProductData();
            if (productList != null && !productList.isEmpty()) {
                handleSalesLedgerProducts(salesLedger.getId(), productList, salesLedgerDto.getType());
                handleSalesLedgerProducts(salesLedger.getId(), productList, EnumUtil.fromCode(SaleEnum.class,salesLedgerDto.getType()));
                updateMainContractAmount(
                        salesLedger.getId(),
                        productList,
@@ -734,7 +736,8 @@
    }
    private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) {
    @Override
    public void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type) {
        // æŒ‰ID分组,区分新增和更新的记录
        Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream()
                .peek(p -> p.setSalesLedgerId(salesLedgerId))
@@ -746,14 +749,14 @@
        // æ‰§è¡Œæ›´æ–°æ“ä½œ
        if (!updateList.isEmpty()) {
            for (SalesLedgerProduct product : updateList) {
                product.setType(type);
                product.setType(type.getCode());
                salesLedgerProductMapper.updateById(product);
            }
        }
        // æ‰§è¡Œæ’入操作
        if (!insertList.isEmpty()) {
            for (SalesLedgerProduct salesLedgerProduct : insertList) {
                salesLedgerProduct.setType(type);
                salesLedgerProduct.setType(type.getCode());
                salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
                salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
                salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice());
src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java
@@ -4,6 +4,7 @@
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.dto.CalculateSalaryDto;
import com.ruoyi.staff.pojo.StaffSalaryMain;
import com.ruoyi.staff.service.StaffSalaryMainService;
import io.swagger.annotations.Api;
@@ -39,8 +40,8 @@
    @ApiOperation("通过部门ids获取用户信息计算每个员工的工资")
    @PostMapping("/calculateSalary")
    public AjaxResult calculateSalary(@RequestBody List<Long> ids) {
        return staffSalaryMainService.calculateSalary(ids);
    public AjaxResult calculateSalary(@RequestBody CalculateSalaryDto calculateSalaryDto) {
        return staffSalaryMainService.calculateSalary(calculateSalaryDto);
    }
    @PostMapping("/add")
src/main/java/com/ruoyi/staff/dto/CalculateSalaryDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.staff.dto;
import lombok.Data;
import java.util.List;
/**
 * @author :yys
 * @date : 2026/3/9 11:53
 */
@Data
public class CalculateSalaryDto {
    private List<Long> ids;
    private String date;
}
src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.dto.CalculateSalaryDto;
import com.ruoyi.staff.pojo.StaffSalaryMain;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -25,5 +26,5 @@
    AjaxResult delete(List<Long> ids);
    AjaxResult calculateSalary(List<Long> ids);
    AjaxResult calculateSalary(CalculateSalaryDto calculateSalaryDto);
}
src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
@@ -4,6 +4,9 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.UserAccountDto;
import com.ruoyi.production.dto.UserProductionAccountingDto;
import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.domain.SysUserDept;
@@ -58,6 +61,9 @@
    @Autowired
    private StaffOnJobMapper staffOnJobMapper;
    @Autowired
    private SalesLedgerProductionAccountingService salesLedgerProductionAccountingService;
    @Override
@@ -160,7 +166,7 @@
     * é€šè¿‡å‘˜å·¥id计算社保方案
     * @param id
     */
    public void calculateByEmployeeId(Integer id,Map<String, Object> map) {
    public void calculateByEmployeeId(Integer id,Map<String, Object> map,String date) {
        // 1. å…¥å‚校验
        if (id == null) {
            return; // æˆ–返回空列表,根据业务需求调整
@@ -211,6 +217,20 @@
        // ä¸ªç¨Žé‡‘额(无社保版)
        BigDecimal bigDecimal = TaxCalculator.calculateMonthlyTax(basicSalary, schemeAmount, gjj);
        map.put("salaryTax", bigDecimal);
        // è®¡æ—¶å·¥èµ„ è®¡ä»¶å·¥èµ„
        UserProductionAccountingDto userProductionAccountingDto = new UserProductionAccountingDto();
        userProductionAccountingDto.setUserId(getUidByStaffId(staffId));
        userProductionAccountingDto.setDate(date);
        UserAccountDto byUserId = salesLedgerProductionAccountingService.getByUserId(userProductionAccountingDto);
        if(byUserId != null){
            map.put("pieceSalary", byUserId.getAccountBalance());
            map.put("hourlySalary", byUserId.getAccount());
            // åº”发 å®žå‘增加
            grossSalary = grossSalary.add(byUserId.getAccountBalance()).add(byUserId.getAccount());
            map.put("grossSalary", grossSalary);
            netSalary = netSalary.add(byUserId.getAccountBalance()).add(byUserId.getAccount());
            map.put("netSalary", netSalary);
        }
        // 2. æŸ¥è¯¢è¯¥äººå‘˜å¯¹åº”的社保方案
        List<SchemeApplicableStaff> schemeList = schemeApplicableStaffMapper.selectSchemeByStaffId(staffId);
        if (CollectionUtils.isEmpty(schemeList)) {
@@ -244,6 +264,26 @@
    }
    /**
     * é€šè¿‡å‘˜å·¥Id获取用户id
     * @param staffId
     * @return
     */
    public Long getUidByStaffId(Long staffId){
        StaffOnJob staffOnJob = staffOnJobMapper.selectById(staffId);
        if(staffOnJob == null){
            return -1L; // è¿”回不存在Id
        }
        SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>()
                .eq(SysUser::getUserName, staffOnJob.getStaffNo())
                .eq(SysUser::getDelFlag, "0")
                .last("limit 1"));
        if(sysUser == null){
            return -1L; // è¿”回不存在Id
        }
        return sysUser.getUserId();
    }
    /**
     * è®¡ç®—
     * @param type
     * @param bigDecimal
src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java
@@ -2,14 +2,20 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.mapper.AccountExpenseMapper;
import com.ruoyi.account.pojo.AccountExpense;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.domain.SysUserDept;
import com.ruoyi.project.system.mapper.SysUserDeptMapper;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.staff.dto.CalculateSalaryDto;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import com.ruoyi.staff.mapper.StaffSalaryDetailMapper;
import com.ruoyi.staff.pojo.SchemeApplicableStaff;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.pojo.StaffSalaryDetail;
import com.ruoyi.staff.pojo.StaffSalaryMain;
import com.ruoyi.staff.mapper.StaffSalaryMainMapper;
@@ -52,6 +58,12 @@
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private StaffOnJobMapper staffOnJobMapper;
    @Autowired
    private AccountExpenseMapper accountExpenseMapper;
    @Override
    public AjaxResult listPage(Page page, StaffSalaryMain staffSalaryMain) {
@@ -104,6 +116,21 @@
            detail.setMainId(staffSalaryMain.getId());
        });
        staffSalaryDetailService.saveBatch(staffSalaryMain.getStaffSalaryDetailList());
        // å’Œè´¢åŠ¡è”åŠ¨ï¼Œæ–°å¢žæ”¯å‡º
        if(staffSalaryMain.getStatus().equals(5)){
            AccountExpense accountExpense = new AccountExpense();
            accountExpense.setBusinessType(3);
            accountExpense.setExpenseMoney(staffSalaryMain.getTotalSalary());
            accountExpense.setBusinessId(staffSalaryMain.getId());
            accountExpense.setExpenseDate(new Date());
            accountExpense.setExpenseMethod("2");
            accountExpense.setExpenseType("1");
            accountExpense.setExpenseDescribed(staffSalaryMain.getSalaryTitle());
            accountExpense.setNote(staffSalaryMain.getRemark());
            accountExpense.setInputUser(SecurityUtils.getLoginUser().getNickName());
            accountExpense.setInputTime(new Date());
            accountExpenseMapper.insert(accountExpense);
        }
        return AjaxResult.success("修改成功");
    }
@@ -118,16 +145,16 @@
    }
    @Override
    public AjaxResult calculateSalary(List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)){
    public AjaxResult calculateSalary(CalculateSalaryDto calculateSalaryDto) {
        if(CollectionUtils.isEmpty(calculateSalaryDto.getIds())){
            return AjaxResult.error("参数错误");
        }
        List<Map<String, Object>> longs = setSchemeApplicableStaffUserInfo(ids); // é€šè¿‡éƒ¨é—¨ids获取用户信息
        List<Map<String, Object>> longs = setSchemeApplicableStaffUserInfo(calculateSalaryDto.getIds()); // é€šè¿‡éƒ¨é—¨ids获取用户信息
        if(CollectionUtils.isEmpty(longs)){
            return AjaxResult.error("无员工");
        }
        for (Map<String, Object> id : longs) {
            schemeApplicableStaffService.calculateByEmployeeId((Integer) id.get("id"),id);
            schemeApplicableStaffService.calculateByEmployeeId((Integer) id.get("id"),id,calculateSalaryDto.getDate());
        }
        return AjaxResult.success(longs);
    }
@@ -139,4 +166,5 @@
        // é€šè¿‡éƒ¨é—¨èŽ·å–äººå‘˜id
        return sysUserDeptMapper.setSchemeApplicableStaffUserInfo(ids);
    }
}
src/main/resources/application-newTest.yml
@@ -15,6 +15,14 @@
  captchaType: math
  # ååŒå®¡æ‰¹ç¼–号前缀(配置文件后缀命名)
  approvalNumberPrefix: NEWTEST
  # ä¸ªæŽ¨ Unipush é…ç½®
  getui:
    appId: PfjyAAE0FK64FaO1w2CMb1
    appKey: zTMb831OEL6J4GK1uE3Ob4
    masterSecret: K1GFtsv42v61tXGnF7SGE5
    domain: https://restapi.getui.cn/v2/
    # ç¦»çº¿æŽ¨é€ä½¿ç”¨çš„包名/组件名
    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
src/main/resources/application-zsjc.yml
@@ -26,14 +26,14 @@
    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
  ali-ding:
    app-key: "dingj5d95ijzaf8lka7c"
    app-secret: "XqZUBeCfaz8z51vz0TdSu_KxP-aUuUu-ebJ5mT25yeELSyAuFrQ7F_g7exQBWf0sb"
    app-key: "dingjnydbagc9ol7cwq4"
    app-secret: "fO07qSZC5SMLw9It3Ydd3BuoFyVbRlsWXUnVr2kwPJXz0OpUntCAO5dqnr8G7zq5"
    user-id: "290166234126410562"
    app-type: "APP_UY8XMO7GNA8OF08EFNVQ"
    form-uuid: "FORM-4IA66891C5H3QWMDBSGO05C0OX9628GRPYF7L8"
    system-token: "4J766L91OFH3V612E7LG5B4DI8M13MQF9VF7LG4"
    # æŽ¥å£åœ°å€
    access-token-url: "https://api.dingtalk.com/v1.0/oauth2/accessToken"
    access-token-url: "https://oapi.dingtalk.com/gettoken"
    search-form-data-url: "https://api.dingtalk.com/v2.0/yida/forms/instances/search"
# å¼€å‘环境配置
src/main/resources/mapper/account/SalesReceiptReturnMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.account.mapper.SalesReceiptReturnMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.account.pojo.SalesReceiptReturn">
        <id column="id" property="id" />
        <result column="refund_id" property="refundId" />
        <result column="payment_account" property="paymentAccount" />
        <result column="payment_account_name" property="paymentAccountName" />
        <result column="payment_method" property="paymentMethod" />
        <result column="actual_amount" property="actualAmount" />
        <result column="fee" property="fee" />
        <result column="transaction_no" property="transactionNo" />
        <result column="discount_amount" property="discountAmount" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="create_user" property="createUser" />
    </resultMap>
</mapper>
src/main/resources/mapper/account/SalesRefundAmountOrderMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.account.mapper.SalesRefundAmountOrderMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.account.pojo.SalesRefundAmountOrder">
        <id column="id" property="id" />
        <result column="return_management_id" property="returnManagementId" />
        <result column="status" property="status" />
        <result column="refund_amount" property="refundAmount" />
        <result column="refunded_amount" property="refundedAmount" />
        <result column="not_refunded_amount" property="notRefundedAmount" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="create_user_id" property="createUserId" />
        <result column="update_user_id" property="updateUserId" />
    </resultMap>
    <select id="pageSalesRefundAmountOrderDto" resultType="com.ruoyi.account.dto.SalesRefundAmountOrderDto">
        select sl.sales_contract_no,
        sl.customer_contract_no,
        slp.specification_model,
        slp.product_category as product_name,
        slp.unit,
        sl.customer_name,
        rm.return_no as return_management_no,
        srao.*
        from sales_refund_amount_order srao
        left join return_management rm on srao.return_management_id = rm.id
        left join return_sale_product rs on rm.id = rs.return_management_id
        left join sales_ledger_product slp on rs.return_sale_ledger_product_id = slp.id
        left join sales_ledger sl on slp.sales_ledger_id = sl.id
        <where>
            <if test="ew.salesContractNo != null and ew.salesContractNo !=''">
                and sl.sales_contract_no like concat('%',#{ew.salesContractNo},'%')
            </if>
            <if test="ew.returnManagementNo != null and ew.returnManagementNo !=''">
                and rm.return_no like concat('%',#{ew.returnManagementNo},'%')
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/energy/EnergyConsumptionDetailFileMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.energy.mapper.EnergyConsumptionDetailFileMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.energy.pojo.EnergyConsumptionDetailFile">
        <id column="id" property="id" />
        <result column="energy_consumption_detail_id" property="energyConsumptionDetailId" />
        <result column="name" property="name" />
        <result column="url" property="url" />
        <result column="file_size" property="fileSize" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
    </resultMap>
</mapper>
src/main/resources/mapper/energy/EnergyConsumptionDetailMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.energy.mapper.EnergyConsumptionDetailMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.energy.pojo.EnergyConsumptionDetail">
        <id column="id" property="id"/>
        <result column="energy_id" property="energyId"/>
        <result column="type" property="type"/>
        <result column="meter_reading_location" property="meterReadingLocation"/>
        <result column="meter_reading_date" property="meterReadingDate"/>
        <result column="start_code" property="startCode"/>
        <result column="stop_code" property="stopCode"/>
        <result column="dosage" property="dosage"/>
        <result column="remark" property="remark"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="create_user" property="createUser"/>
        <result column="update_user" property="updateUser"/>
    </resultMap>
    <select id="pageEnergyConsumptionDetail"
            resultType="com.ruoyi.energy.dto.EnergyConsumptionDetailDto">
        select *
        from (select ecd.*, e.energy_tyep, e.energy_name, e.unit, su.nick_name createUserName
              from energy_consumption_detail ecd
                       left join energy e on ecd.energy_id = e.id
                       left join sys_user su on ecd.create_user = su.user_id) A
         <where>
            <if test="c.energyTyep != null and c.energyTyep != ''">
                and energy_tyep like concat('%',#{c.energyTyep},'%')
            </if>
             <if test="c.energyName != null and c.energyName != ''">
                and energy_name like concat('%',#{c.energyName},'%')
            </if>
             <if test="c.meterReadingDate != null and c.meterReadingDate != ''">
                 and meter_reading_date =#{c.meterReadingDate}
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/energy/EnergyMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.energy.mapper.EnergyMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.energy.pojo.Energy">
        <id column="id" property="id"/>
        <result column="energy_tyep" property="energyTyep"/>
        <result column="energy_name" property="energyName"/>
        <result column="unit" property="unit"/>
        <result column="unit_price" property="unitPrice"/>
        <result column="remark" property="remark"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="create_user" property="createUser"/>
        <result column="update_user" property="updateUser"/>
    </resultMap>
    <select id="pageEnergy" resultType="com.ruoyi.energy.pojo.Energy">
        select * from (select e.*, su.nick_name createUserName
        from energy e
                 left join sys_user su on e.create_user = su.user_id)A
        <where>
            <if test="c.energyTyep != null and c.energyTyep != ''">
                and energy_tyep like concat('%',#{c.energyTyep},'%')
            </if>
             <if test="c.energyName != null and c.energyName != ''">
                and energy_name like concat('%',#{c.energyName},'%')
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml
@@ -28,5 +28,11 @@
                            GROUP BY return_sale_ledger_product_id) rs ON rs.return_sale_ledger_product_id = slp.id
        where rm.id =#{returnManagementId}
    </select>
    <select id="listReturnSaleProduct" resultType="com.ruoyi.procurementrecord.dto.ReturnSaleProductDto">
        select rsp.*,slp.tax_inclusive_unit_price ,slp.tax_inclusive_total_price*rsp.num as price
        from return_sale_product rsp
                 left join sales_ledger_product slp on slp.id = rsp.return_sale_ledger_product_id
        where rsp.return_management_id = #{returnManagementId}
    </select>
</mapper>
src/main/resources/mapper/prodDemand/ProdDemandDetailMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/prodDemand/ProdDemandMainMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/productionPlan/ProductionPlanMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.productionPlan.mapper.ProductionPlanMapper">
    <resultMap id="ProductionPlanResultMap" type="com.ruoyi.productionPlan.pojo.ProductionPlan">
        <id property="id" column="id"/>
        <result property="formInstanceId" column="form_instance_id"/>
        <result property="serialNo" column="serial_no"/>
        <result property="applyNo" column="apply_no"/>
        <result property="customerName" column="customer_name"/>
        <result property="materialCode" column="material_code"/>
        <result property="productName" column="product_name"/>
        <result property="productSpec" column="product_spec"/>
        <result property="length" column="length"/>
        <result property="width" column="width"/>
        <result property="height" column="height"/>
        <result property="quantity" column="quantity"/>
        <result property="volume" column="volume"/>
        <result property="strength" column="strength"/>
        <result property="startDate" column="start_date"/>
        <result property="endDate" column="end_date"/>
        <result property="submitter" column="submitter"/>
        <result property="submitOrg" column="submit_org"/>
        <result property="remarkOne" column="remark_one"/>
        <result property="remarkTwo" column="remark_two"/>
        <result property="creatorName" column="creator_name"/>
        <result property="modifierName" column="modifier_name"/>
        <result property="formCreatedTime" column="form_created_time"/>
        <result property="formModifiedTime" column="form_modified_time"/>
        <result property="dataSyncType" column="data_sync_type"/>
        <result property="dataSourceType" column="data_source_type"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="totalCount" column="total_count"/>
    </resultMap>
    <select id="listPage" resultMap="ProductionPlanResultMap">
        SELECT *
        FROM production_plan
        WHERE 1 = 1
    </select>
</mapper>
src/main/resources/mapper/projectManagement/ContractInfoMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.projectManagement.mapper.ContractInfoMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.projectManagement.pojo.ContractInfo">
            <id property="id" column="id" jdbcType="BIGINT"/>
            <result property="name" column="name" jdbcType="VARCHAR"/>
            <result property="sex" column="sex" jdbcType="VARCHAR"/>
            <result property="birthday" column="birthday" jdbcType="VARCHAR"/>
            <result property="department" column="department" jdbcType="VARCHAR"/>
            <result property="job" column="job" jdbcType="VARCHAR"/>
            <result property="phoneNumber" column="phone_number" jdbcType="VARCHAR"/>
            <result property="email" column="email" jdbcType="VARCHAR"/>
            <result property="qq" column="qq" jdbcType="VARCHAR"/>
            <result property="lineaFissa" column="linea_fissa" jdbcType="VARCHAR"/>
            <result property="wx" column="wx" jdbcType="VARCHAR"/>
            <result property="origineEtnica" column="origine_etnica" jdbcType="VARCHAR"/>
            <result property="rappresentanteLegale" column="rappresentante_legale" jdbcType="VARCHAR"/>
            <result property="projectManagementInfoId" column="project_management_info_id" jdbcType="BIGINT"/>
            <result property="isDelete" column="is_delete" jdbcType="INTEGER"/>
            <result property="createUser" column="create_user" jdbcType="BIGINT"/>
            <result property="updateUser" column="update_user" jdbcType="BIGINT"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <sql id="Base_Column_List">
        id,name,sex,
        birthday,department,job,
        phone_number,email,qq,
        linea_fissa,wx,origine_etnica,
        rappresentante_legale,project_management_info_id,is_delete,
        create_user,update_user,create_time,
        update_time
    </sql>
</mapper>
src/main/resources/mapper/projectManagement/InfoMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.projectManagement.mapper.InfoMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.projectManagement.pojo.Info">
            <id property="id" column="id" jdbcType="BIGINT"/>
            <result property="no" column="no" jdbcType="VARCHAR"/>
            <result property="title" column="title" jdbcType="VARCHAR"/>
            <result property="clientId" column="client_id" jdbcType="BIGINT"/>
            <result property="clientName" column="client_name" jdbcType="VARCHAR"/>
            <result property="projectManagementInfoParentId" column="project_management_info_parent_id" jdbcType="BIGINT"/>
            <result property="establishTime" column="establish_time" jdbcType="TIMESTAMP"/>
            <result property="projectManagementPlanId" column="project_management_plan_id" jdbcType="BIGINT"/>
            <result property="source" column="source" jdbcType="VARCHAR"/>
            <result property="managerId" column="manager_id" jdbcType="BIGINT"/>
            <result property="managerName" column="manager_name" jdbcType="VARCHAR"/>
            <result property="salesmanId" column="salesman_id" jdbcType="BIGINT"/>
            <result property="salesmanName" column="salesman_name" jdbcType="VARCHAR"/>
            <result property="isDelete" column="is_delete" jdbcType="INTEGER"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
            <result property="createUser" column="create_user" jdbcType="INTEGER"/>
            <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
            <result property="planStartTime" column="plan_start_time" jdbcType="TIMESTAMP"/>
            <result property="planEndTime" column="plan_end_time" jdbcType="TIMESTAMP"/>
            <result property="actualStartTime" column="actual_start_time" jdbcType="TIMESTAMP"/>
            <result property="actualEndTime" column="actual_end_time" jdbcType="TIMESTAMP"/>
            <result property="status" column="status" jdbcType="INTEGER"/>
            <result property="departmentId" column="department_id" jdbcType="BIGINT"/>
            <result property="departmentName" column="department_name" jdbcType="VARCHAR"/>
            <result property="orderDate" column="order_date" jdbcType="TIMESTAMP"/>
            <result property="orderAmount" column="order_amount" jdbcType="VARCHAR"/>
            <result property="remark" column="remark" jdbcType="VARCHAR"/>
            <result property="attachment" column="attachment" jdbcType="VARCHAR"/>
    </resultMap>
    <sql id="Base_Column_List">
        id,no,title,
        client_id,client_name,project_management_info_parent_id,
        establish_time,project_management_plan_id,source,
        manager_id,manager_name,salesman_id,
        salesman_name,is_delete,create_time,
        update_time,create_user,update_user,
        plan_start_time,plan_end_time,actual_start_time,
        actual_end_time,status,department_id,
        department_name,order_date,order_amount,
        remark,attachment
    </sql>
</mapper>
src/main/resources/mapper/projectManagement/ShippingAddressMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.projectManagement.mapper.ShippingAddressMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.projectManagement.pojo.ShippingAddress">
            <id property="id" column="id" jdbcType="BIGINT"/>
            <result property="consignee" column="consignee" jdbcType="VARCHAR"/>
            <result property="contract" column="contract" jdbcType="VARCHAR"/>
            <result property="address" column="address" jdbcType="VARCHAR"/>
            <result property="isDelete" column="is_delete" jdbcType="INTEGER"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
            <result property="createUser" column="create_user" jdbcType="BIGINT"/>
            <result property="updateUser" column="update_user" jdbcType="BIGINT"/>
    </resultMap>
    <sql id="Base_Column_List">
        id,consignee,contract,
        address,is_delete,create_time,
        update_time,create_user,update_user
    </sql>
</mapper>
src/main/resources/mapper/purchase/PurchaseReturnOrderProductsMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.purchase.pojo.PurchaseReturnOrderProducts">
        <id column="id" property="id" />
        <result column="purchase_return_order_id" property="purchaseReturnOrderId" />
        <result column="sales_ledger_product_id" property="salesLedgerProductId" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="num" property="num" />
    </resultMap>
</mapper>