liyong
8 天以前 ca0565e53494417b3779759f8d3898e07bfd5929
Merge remote-tracking branch 'refs/remotes/origin/jtwy' into sqd-hb

# Conflicts:
# src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
# src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
# src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
# src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
# src/main/java/com/ruoyi/home/controller/HomeController.java
# src/main/java/com/ruoyi/home/service/HomeService.java
# src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
# src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
# src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
# src/main/java/com/ruoyi/procurementrecord/dto/Details.java
# src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
# src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
# src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
# src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
# src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
# src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
# src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
# src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
# src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
# src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java
# src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
# src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
# src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
# src/main/java/com/ruoyi/production/service/impl/SalesLedgerProductionAccountingServiceImpl.java
# src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
# src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
# src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
# src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
# src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
# src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
# src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
# src/main/java/com/ruoyi/staff/service/impl/StaffJoinLeaveRecordServiceImpl.java
# src/main/resources/application-dev.yml
# src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
# src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml
# src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
# src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
已添加122个文件
已修改171个文件
9730 ■■■■■ 文件已修改
doc/1767778273_add_product_order_id_to_product_work_order.sql 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20260113-product_model.sql 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/create_table_process_route.sql 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/create_table_process_route_item.sql 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/create_table_product_process.sql 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/create_table_product_structure.sql 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/create_table_production_product_main.sql 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/CodeGenerator.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/ProductController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/ProductModelDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/SupplierManageFileMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/Customer.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/ProductModel.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/SupplierManage.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/SupplierManageFile.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/IProductService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/SupplierManageFileService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/SupplierManageFileServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/Notice.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/impl/NoticeServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/config/MybatisHandler.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/OrderUtils.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/vo/FileVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/compensationperformance/pojo/CompensationPerformance.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceAssetInfoDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceLedgerDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceLedger.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/IDeviceLedgerService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/dto/WordDateDto.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/dto/ProductionProgressDto.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/QuartzConfig.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerRecordController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/Details.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/InventoryInformationDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementExceptionRecordMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementExceptionRecord.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java 276 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProcessRouteController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductBomController.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductOrderController.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductProcessController.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductProcessRouteController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductStructureController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionProductInputController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionProductOutputController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductBomDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductOrderDto.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductProcessDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductProcessRouteItemDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductStructureDto.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionProductInputDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionProductOutputDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionReportDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProcessRouteItemMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProcessRouteMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductBomMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductProcessRouteItemMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductProcessRouteMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionProductInputMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionProductOutputMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/SpeculativeTradingInfoMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProcessRoute.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductBom.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductOrder.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductProcess.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductStructure.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/SpeculativeTradingInfo.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProcessRouteItemService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProcessRouteService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductBomService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductOrderService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductProcessRouteItemService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductProcessRouteService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductProcessService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductStructureService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionProductInputService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionProductMainService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionProductOutputService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductInputServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 299 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductOutputServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerProductionAccountingServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java 253 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/monitor/service/impl/SysJobServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysUserController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/ProductRecordDto.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/mapper/ProductRecordMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/IProductRecordService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/InvoiceLedgerController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/ReceiptPaymentRecordDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/LossMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/ShipmentApprovalMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/InvoiceLedgerFile.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/Loss.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/ShipmentApproval.java 352 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ShipmentApprovalService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 276 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/ShipmentApprovalServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/dto/SaveStaffSchedulingDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/dto/StaffSchedulingDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/StaffScheduling.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/StaffSchedulingService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffJoinLeaveRecordServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffSchedulingServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-bdsm.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-bhmy.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-cjny.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-cmny.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-demo.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hbkj.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hbxm.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hckx.yml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hckxTest.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hcmy.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hhkj.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hsmy.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hsxny.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hxgy.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hysn.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jjxm.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jlsn.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jsmy.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jsyny.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jtwy.yml 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-mkzs.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-mqsp.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-mxsc.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-native.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-phmk.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-rzny.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-tjxm.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-tymk.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-xyhb.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zyrqCopy.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/ProductModelMapper.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/SupplierManageFileMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/SupplierManageMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceLedgerMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceRepairMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementExceptionRecordMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProcessRouteItemMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProcessRouteMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductBomMapper.xml 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductOrderMapper.xml 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductProcessMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductProcessRouteMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductStructureMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductWorkOrderMapper.xml 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductInputMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductMainMapper.xml 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductOutputMapper.xml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerWorkMapper.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/InvoicePurchaseMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/ProductRecordMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityInspectMapper.xml 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/ReceiptPaymentMapper.xml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/ShipmentApprovalMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/staff/StaffSchedulingMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysUserDeptMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysUserMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/劳动合同书.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/1767778273_add_product_order_id_to_product_work_order.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
alter table product_work_order
    add product_order_id bigint not null default 0 comment '生产订单id';
doc/20260113-product_model.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
alter table product_model
    add product_code varchar(255)  null comment '产品编码';
alter table process_route
    add process_route_code varchar(255)  null comment '工艺路线编码';
alter table procurement_record_storage
    add product_model_id bigint null comment '产品规格id';
alter table procurement_record_out
    add product_model_id bigint null comment '产品规格id';
alter table quality_inspect
    add product_model_id bigint null comment '产品规格id';
doc/create_table_process_route.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
# å·¥è‰ºè·¯çº¿
drop table if exists process_route;
create table process_route
(
    id          bigint auto_increment primary key,
    product_model_id  bigint       not null default 0 comment '产品id',
    description varchar(255) not null default '' comment '描述',
    tenant_id   bigint       not null comment '租户id',
    create_time datetime     null comment '录入时间',
    update_time datetime     null comment '更新时间'
);
doc/create_table_process_route_item.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
# å·¥è‰ºè·¯çº¿é¡¹ç›®
drop table if exists process_route_item;
create table process_route_item
(
    id               bigint auto_increment primary key,
    route_id         bigint   not null default 0 comment '工艺路线id',
    product_model_id bigint   not null default 0 comment '产品id',
    process_id       bigint   not null default 0 comment '工序id',
    tenant_id        bigint   not null comment '租户id',
    create_time      datetime null comment '录入时间',
    update_time      datetime null comment '更新时间'
);
# ç”Ÿäº§å·¥è‰ºè·¯çº¿é¡¹ç›®
drop table if exists product_process_route_item;
create table product_process_route_item
(
    id               bigint auto_increment primary key,
    route_id         bigint   not null default 0 comment '工艺路线id',
    product_model_id bigint   not null default 0 comment '销售台账产品id',
    process_id       bigint   not null default 0 comment '工序id',
    tenant_id        bigint   not null comment '租户id',
    create_time      datetime null comment '录入时间',
    update_time      datetime null comment '更新时间'
);
# ç”Ÿäº§è®¢å•
drop table if exists product_order;
create table product_order
(
    id               bigint auto_increment primary key,
    sales_ledger_id  bigint   not null default 0 comment '销售台账id',
    product_model_id bigint   not null default 0 comment '销售台账产品id',
    route_id         bigint   not null default 0 comment '工艺路线id',
    nps_no          varchar(255) not null default '' comment '生产订单号',
    status            int not null default 0 comment '状态 0 å¾…确认 1 å·²ç¡®è®¤',
    tenant_id        bigint   not null comment '租户id',
    create_time      datetime null comment '录入时间',
    update_time      datetime null comment '更新时间'
);
alter table quality_inspect
    add purchase_ledger_id int null comment '采购订单id';
# ç”Ÿäº§å·¥å•
drop table if exists product_work_order;
create table product_work_order
(
    id               bigint auto_increment primary key,
    product_process_route_item_id bigint   not null default 0 comment '工艺路线项目id',
    create_time      datetime null comment '录入时间',
    update_time      datetime null comment '更新时间',
    work_order_no    varchar(255) not null default '' comment '工单编号',
    plan_start_time  datetime null comment '计划开始时间',
    plan_end_time    datetime null comment '计划结束时间',
    actual_start_time  datetime null comment '实际开始时间',
    actual_end_time    datetime null comment '实际结束时间',
    status           int not null default 0 comment '状态  1 å¾…确认  2 å¾…生产 3生产中 4已生产 ',
    tenant_id        bigint   not null comment '租户id'
);
alter table product_process
    add salary_quota numeric(16,3) null comment '工资定额';
doc/create_table_product_process.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
# å·¥åº
drop table if exists product_process;
create table product_process
(
    id          bigint auto_increment
        primary key,
    create_time datetime null comment '录入时间',
    update_time datetime null comment '更新时间',
    name        varchar(255) not null default '' comment '工艺名称',
    no          varchar(255) not null default '' comment '工艺编号',
    remark      varchar(255) not null default '' comment '备注',
    tenant_id   bigint       not null default 0 comment '租户id'
);
doc/create_table_product_structure.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
# äº§å“ç»“æž„
drop table if exists product_structure;
create table product_structure
(
    id                 bigint auto_increment
        primary key,
    product_model_id         bigint         not null comment '产品id',
    process_id         bigint         not null comment '工序id',
    unit_quantity      numeric(16, 4) not null comment '单位产出需要数量',
    demanded_quantity  numeric(16, 4) not null comment '需求数量',
    unit               varchar(255)   not null comment '单位',
    disk_quantity      numeric(16, 4) not null comment '盘数量',
    tenant_id          bigint         not null comment '租户id'
);
alter table product_structure
    add parent_id bigint null comment '父id';
doc/create_table_production_product_main.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
drop table if exists production_product_main;
create table production_product_main
(
    id            bigint auto_increment
        primary key,
    product_no    varchar(255) not null comment '报工单号',
    user_id       bigint       not null comment '报工用户id',
    work_order_id bigint       not null comment '工单id',
    status        int          not null comment '状态 0 å¾…报工 1 å¾…确认',
    create_time   datetime     null comment '录入时间',
    tenant_id          bigint         not null comment '租户id'
);
drop table if exists production_product_output;
create table production_product_output
(
    id               bigint auto_increment
        primary key,
    product_main_id  bigint         not null comment '报工单id',
    product_model_id bigint         not null comment '产品id',
    quantity         numeric(16, 4) not null comment '数量',
    create_time      datetime       null comment '录入时间',
    tenant_id          bigint         not null comment '租户id'
);
drop table if exists production_product_input;
create table production_product_input
(
    id               bigint auto_increment
        primary key,
    product_main_id  bigint         not null comment '报工单id',
    product_model_id bigint         not null comment '产品id',
    quantity         numeric(16, 4) not null comment '数量',
    create_time      datetime       null comment '录入时间',
    tenant_id          bigint         not null comment '租户id'
)
pom.xml
@@ -110,6 +110,13 @@
            <scope>runtime</scope>
        </dependency>
        <!-- FreeMarker æ¨¡æ¿å¼•擎:处理变量占位符 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.32</version>
        </dependency>
        <!-- pagehelper åˆ†é¡µæ’ä»¶ -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
src/main/java/com/ruoyi/CodeGenerator.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,130 @@
package com.ruoyi;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableField;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import java.util.Collections;
import java.util.Scanner;
// æ¼”示例子,执行 main æ–¹æ³•控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {
    public static String database_url = "jdbc:mysql://1.15.17.182:9999/product-inventory-management-jtwy";
    public static String database_username = "root";
    public static String database_password= "xd@123456..";
    public static String author = "芯导软件(江苏)有限公司";
    public static String model = "production"; // æ¨¡å—
    public static String setParent = "com.ruoyi."+ model; // åŒ…路径
    public static String tablePrefix = ""; // è®¾ç½®è¿‡æ»¤è¡¨å‰ç¼€
    public static void main(String[] args) {
        String projectPath = System.getProperty("user.dir");
        FastAutoGenerator.create(database_url, database_username, database_password)
                // å…¨å±€é…ç½®
                .globalConfig(builder -> {
                    builder.author(author) // è®¾ç½®ä½œè€…
                            .commentDate("yyyy-MM-dd hh:mm:ss")   //注释日期
                            .outputDir(projectPath  + "/src/main/java") // æŒ‡å®šè¾“出目录
                            .disableOpenDir() //禁止打开输出目录,默认打开
                            .enableSwagger() // å¼€å¯swagger
                    ;
                })
                // æ•°æ®æºé…ç½®ï¼ˆæ ¸å¿ƒï¼šè‡ªå®šä¹‰ç±»åž‹è½¬æ¢ï¼Œå¼ºåˆ¶tenant_id为Long)
                .dataSourceConfig(builder -> {
                    builder.typeConvert(new MySqlTypeConvert() {
                        /**
                         * è‡ªå®šä¹‰å­—段类型转换
                         * @param globalConfig å…¨å±€é…ç½®
                         * @param tableField è¡¨å­—段信息
                         * @return è½¬æ¢åŽçš„字段类型
                         */
                        @Override
                        public DbColumnType processTypeConvert(GlobalConfig globalConfig, TableField tableField) {
                            // å¼ºåˆ¶tenant_id字段类型为Long
                            if ("tenant_id".equalsIgnoreCase(tableField.getName())) {
                                return DbColumnType.LONG;
                            }
                            // å…¶ä»–字段使用默认转换规则
                            return (DbColumnType) super.processTypeConvert(globalConfig, tableField);
                        }
                    });
                })
                // åŒ…配置
                .packageConfig(builder -> {
                    builder.entity("pojo");
                    builder.parent(setParent) // è®¾ç½®çˆ¶åŒ…名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath  +  "/src/main/resources/mapper/"+model)); // è®¾ç½®mapperXml生成路径
                })
                // ç­–略配置
                .strategyConfig(builder -> {
                    builder.addInclude(scanner("表名,多个空格分割").split(" ")) // è®¾ç½®éœ€è¦ç”Ÿæˆçš„表名
                            .addTablePrefix(tablePrefix) // è®¾ç½®è¿‡æ»¤è¡¨å‰ç¼€
                            // Entity ç­–略配置
                            .entityBuilder()
                            .enableLombok() //开启 Lombok
                            .naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略:下划线转驼峰命
                            .columnNaming(NamingStrategy.underline_to_camel)    //数据库表字段映射到实体的命名策略:下划线转驼峰命
                            .enableFileOverride() // è¦†ç›–已经生成的Entity文件
                            .logicDeleteColumnName("state")
                            .addTableFills(
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("update_time", FieldFill.INSERT_UPDATE),
                                    new Column("create_user", FieldFill.INSERT),
                                    new Column("update_user", FieldFill.INSERT_UPDATE),
                                    new Column("tenant_id", FieldFill.INSERT)
                            )
                            .idType(IdType.AUTO) // è‡ªå¢žä¸»é”®
                            // Mapper ç­–略配置
                            .mapperBuilder()
                            .enableFileOverride() // è¦†ç›–已生成Mapper文件
                            .enableBaseResultMap() // è‡ªåŠ¨ç”ŸæˆresultMap
                            .mapperAnnotation(org.apache.ibatis.annotations.Mapper.class)
                            // Service ç­–略配置
                            .serviceBuilder()
                            .formatServiceFileName("%sService") //格式化 service æŽ¥å£æ–‡ä»¶åç§°ï¼Œ%s进行匹配表名,如 UserService
                            .formatServiceImplFileName("%sServiceImpl") //格式化 service å®žçŽ°ç±»æ–‡ä»¶åç§°ï¼Œ%s进行匹配表名,如 UserServiceImpl
                            .enableFileOverride() // è¦†ç›–已生成文件
                            // Controller ç­–略配置
                            .controllerBuilder()
                            .enableFileOverride() // è¦†ç›–已生成文件
                            .enableRestStyle() // å¼€å¯ç”Ÿæˆ@RestController æŽ§åˆ¶å™¨
                    ;
                })
                //5、模板引擎
                .templateEngine(new FreemarkerTemplateEngine())    //默认
                .execute();
    }
    /**
     * <p>
     * è¯»å–控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }
}
src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java
@@ -24,8 +24,10 @@
import java.math.BigDecimal;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@AllArgsConstructor
@Service
@@ -115,38 +117,87 @@
    @Override
    public Map<String, List<String>> analysis() {
        // èŽ·å–æœ¬å‘¨çš„æ—¶é—´èŒƒå›´
        LocalDate startOfWeek = LocalDate.now().with(DayOfWeek.MONDAY);
        LocalDate endOfWeek = LocalDate.now().with(DayOfWeek.SUNDAY);
        // èŽ·å–æœ€è¿‘å››ä¸ªæœˆï¼ˆå½“å‰æœˆ + å‰3个月)的时间范围
        LocalDate today = LocalDate.now();
        DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM"); // å¹´æœˆæ ¼å¼åŒ–器
        Map<String, List<String>> result = new HashMap<>();
        List<String> days = new ArrayList<>();
        List<String> totalIncomeList = new ArrayList<>();
        List<String> totalExpenseList = new ArrayList<>();
        List<String> netIncomeList = new ArrayList<>();
        // æ ¹æ®æ—¶é—´èŒƒå›´å¾ªçŽ¯æŸ¥è¯¢æ¯ä¸€å¤©çš„æ€»æ”¶å…¥ï¼Œæ€»æ”¯å‡º,净收入(总收入-总支出)
        for (LocalDate date = startOfWeek; date.isBefore(endOfWeek) || date.isEqual(endOfWeek); date = date.plusDays(1)) {
            BigDecimal totalIncome = accountIncomeMapper.selectList(Wrappers.<AccountIncome>lambdaQuery()
                    .eq(AccountIncome::getInputTime, date.toString()))
                    .stream()
                    .map(AccountIncome::getIncomeMoney)
                    .filter(Objects::nonNull)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal totalExpense = accountExpenseMapper.selectList(Wrappers.<AccountExpense>lambdaQuery()
                    .eq(AccountExpense::getInputTime, date.toString()))
                    .stream()
                    .map(AccountExpense::getExpenseMoney)
                    .filter(Objects::nonNull)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
        List<String> months = new ArrayList<>(); // å­˜å‚¨å¹´æœˆï¼ˆå¦‚ 2025-12、2025-11)
        List<String> totalIncomeList = new ArrayList<>(); // æ¯æœˆæ€»æ”¶å…¥
        List<String> totalExpenseList = new ArrayList<>(); // æ¯æœˆæ€»æ”¯å‡º
        List<String> netIncomeList = new ArrayList<>(); // æ¯æœˆå‡€æ”¶å…¥ï¼ˆæ”¶å…¥-支出)
        // æ­¥éª¤1:计算近4个月的年月列表(当前月、前1月、前2月、前3月)
        List<String> targetMonths = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            LocalDate currentMonth = today.minusMonths(i);
            String monthStr = currentMonth.format(monthFormatter);
            targetMonths.add(monthStr);
        }
        // åè½¬åˆ—表,确保顺序为「前3月 â†’ å½“前月」(可选,按需求调整顺序)
        Collections.reverse(targetMonths);
        // æ­¥éª¤2:一次性查询近4个月所有收入数据,按“年月”分组汇总
        LocalDate fourMonthsAgo = today.minusMonths(3).withDayOfMonth(1); // è¿‘4个月起始日(前3月1号)
        LocalDate currentMonthEnd = today.withDayOfMonth(today.lengthOfMonth()); // å½“前月结束日
        ZoneId zoneId = ZoneId.of("Asia/Shanghai");
        // æŸ¥è¯¢è¿‘4个月所有收入
        List<AccountIncome> allIncomes = accountIncomeMapper.selectList(
                Wrappers.<AccountIncome>lambdaQuery()
                        .ge(AccountIncome::getIncomeDate, fourMonthsAgo.toString()) // å¤§äºŽç­‰äºŽèµ·å§‹æ—¥
                        .le(AccountIncome::getIncomeDate, currentMonthEnd.toString()) // å°äºŽç­‰äºŽç»“束日
        );
        // æ”¶å…¥æŒ‰â€œå¹´æœˆâ€åˆ†ç»„汇总(key:年月字符串,value:当月总收入)
        Map<String, BigDecimal> monthlyIncomeMap = allIncomes.stream()
                .filter(income -> income.getIncomeMoney() != null) // è¿‡æ»¤ç©ºé‡‘额
                .collect(Collectors.groupingBy(
                        income -> {
                            // å°†è¾“入时间(字符串)转换为LocalDate,再格式化为年月
                            LocalDate inputDate = income.getIncomeDate().toInstant().atZone(zoneId).toLocalDate();
                            return inputDate.format(monthFormatter);
                        },
                        Collectors.reducing(BigDecimal.ZERO, AccountIncome::getIncomeMoney, BigDecimal::add)
                ));
        // æ­¥éª¤3:一次性查询近4个月所有支出数据,按“年月”分组汇总
        List<AccountExpense> allExpenses = accountExpenseMapper.selectList(
                Wrappers.<AccountExpense>lambdaQuery()
                        .ge(AccountExpense::getExpenseDate, fourMonthsAgo.toString())
                        .le(AccountExpense::getExpenseDate, currentMonthEnd.toString())
        );
        // æ”¯å‡ºæŒ‰â€œå¹´æœˆâ€åˆ†ç»„汇总
        Map<String, BigDecimal> monthlyExpenseMap = allExpenses.stream()
                .filter(expense -> expense.getExpenseMoney() != null) // è¿‡æ»¤ç©ºé‡‘额
                .collect(Collectors.groupingBy(
                        expense -> {
                            LocalDate inputDate = expense.getExpenseDate().toInstant().atZone(zoneId).toLocalDate();
                            return inputDate.format(monthFormatter);
                        },
                        Collectors.reducing(BigDecimal.ZERO, AccountExpense::getExpenseMoney, BigDecimal::add)
                ));
        // æ­¥éª¤4:循环4个目标月份,填充统计数据(无数据时默认为0)
        for (String month : targetMonths) {
            // å½“月总收入(无数据则为0)
            BigDecimal totalIncome = monthlyIncomeMap.getOrDefault(month, BigDecimal.ZERO);
            // å½“月总支出(无数据则为0)
            BigDecimal totalExpense = monthlyExpenseMap.getOrDefault(month, BigDecimal.ZERO);
            // å½“月净收入(收入 - æ”¯å‡ºï¼‰
            BigDecimal netIncome = totalIncome.subtract(totalExpense);
            days.add(date.toString());
            // å¡«å……列表
            months.add(month);
            totalIncomeList.add(totalIncome.toString());
            totalExpenseList.add(totalExpense.toString());
            netIncomeList.add(netIncome.toString());
        }
        result.put("days", days);  //  å¤©
        result.put("totalIncome", totalIncomeList); // æ”¶å…¥
        result.put("totalExpense", totalExpenseList); // æ”¯å‡º
        result.put("netIncome", netIncomeList); // å‡€æ”¶å…¥
        // ç»„装结果
        result.put("days", months); // å¹´æœˆï¼ˆå¦‚ ["2025-09", "2025-10", "2025-11", "2025-12"])
        result.put("totalIncome", totalIncomeList); // å¯¹åº”月份总收入
        result.put("totalExpense", totalExpenseList); // å¯¹åº”月份总支出
        result.put("netIncome", netIncomeList); // å¯¹åº”月份净收入
        return result;
    }
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -1,6 +1,7 @@
package com.ruoyi.approve.pojo;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@@ -12,6 +13,7 @@
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * å®¡æ‰¹æµç¨‹è¡¨
@@ -135,11 +137,34 @@
    @ApiModelProperty(value = "审批备注")
    private String approveRemark;
    @Excel(name = "开始时间", dateFormat = "yyyy-MM-dd",width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "开始时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date startDate;
    @Excel(name = "结束时间", dateFormat = "yyyy-MM-dd",width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "结束时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date endDate;
    private BigDecimal price;
    private String location;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private LocalDateTime createTime;
    /**
     * è®¾å¤‡æŠ¥ä¿®id
     */
    private Long deviceRepairId;
    /**
     * æŠ¥ä¿®é‡‘额
     */
    private BigDecimal maintenancePrice;
    private static final long serialVersionUID = 1L;
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -10,6 +10,8 @@
import com.ruoyi.approve.service.IApproveNodeService;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.mapper.DeviceRepairMapper;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.other.service.impl.TempFileServiceImpl;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
@@ -43,6 +45,9 @@
    @Autowired
    private CommonFileMapper fileMapper;
    @Autowired
    private DeviceRepairMapper deviceRepairMapper;
    public ApproveProcess getApproveById(String id) {
@@ -135,8 +140,21 @@
            approveProcess.setApproveUserCurrentId(approveNode1.getApproveNodeUserId());
            approveProcess.setApproveUserCurrentName(approveNode1.getApproveNodeUser());
        }
        if(approveProcess.getApproveStatus().equals(2) || approveProcess.getApproveStatus().equals(3) || approveProcess.getApproveStatus().equals(4)){
            approveProcess.setApproveOverTime(new Date());
        }
        approveProcessMapper.updateById(approveProcess);
        DeviceRepair deviceRepair = deviceRepairMapper.selectById(approveProcess.getDeviceRepairId());
        if(deviceRepair == null) throw new RuntimeException("设备报修不存在");
        if(approveProcess.getApproveStatus().equals(2)){
            // åŒæ„
            deviceRepair.setStatus(1);
        }else if(approveProcess.getApproveStatus().equals(3)){
            // æ‹’绝
            deviceRepair.setStatus(2);
        }
        deviceRepairMapper.updateById(deviceRepair);
        // ç»‘定附件
        if(!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1){
            tempFileService.migrateTempFilesToFormal(approveNode.getId(), approveNode.getTempFileIds(), FileNameType.ApproveNode.getValue());
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -15,6 +15,7 @@
import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.other.service.impl.TempFileServiceImpl;
import com.ruoyi.project.system.domain.SysDept;
@@ -25,6 +26,7 @@
import com.ruoyi.sales.pojo.CommonFile;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
@@ -87,6 +89,8 @@
        approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(",")));
        approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? null : dateFormat.parse(approveProcessVO.getApproveTime()));
        approveProcess.setApproveReason(approveProcessVO.getApproveReason());
        approveProcess.setDeviceRepairId(approveProcessVO.getDeviceRepairId());
        approveProcess.setMaintenancePrice(approveProcessVO.getMaintenancePrice());
        approveProcess.setApproveOverTime(null);
        approveProcess.setApproveStatus(0);
        approveProcess.setApproveDelete(0);
@@ -171,6 +175,7 @@
    @Override
    public void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo) throws IOException {
        ApproveProcess approve = approveProcessMapper.selectById(approveGetAndUpdateVo.getId());
        BeanUtils.copyProperties(approveGetAndUpdateVo, approve);
        approve.setApproveUserIds(approveGetAndUpdateVo.getApproveUserIds());
        approve.setApproveReason(approveGetAndUpdateVo.getApproveReason());
        SysUser sysUser = sysUserMapper.selectUserById(approveGetAndUpdateVo.getApproveUser());
src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java
@@ -1,9 +1,15 @@
package com.ruoyi.approve.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.sales.pojo.CommonFile;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Data
@@ -19,11 +25,29 @@
    private String approveUserIds;
    private String approveDeptName;
    private Long approveUser;
    private String approveTime;
    private Integer approveStatus;
    @Excel(name = "开始时间", dateFormat = "yyyy-MM-dd",width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "开始时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date startDate;
    @Excel(name = "结束时间", dateFormat = "yyyy-MM-dd",width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "结束时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date endDate;
    private BigDecimal price;
    private String location;
    /**
     * å®¡æ‰¹ç±»åž‹
     */
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -1,33 +1,78 @@
package com.ruoyi.approve.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.sales.pojo.CommonFile;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Data
public class ApproveProcessVO {
    /**
     * ä¸´æ—¶æ–‡ä»¶id列表
     */
    private List<String> tempFileIds;
    /**
     * å®¡æ‰¹æµç¨‹id
     */
    private Long id;
    private String approveId;
    /**
     * å®¡æ‰¹éƒ¨é—¨id
     */
    private Long approveDeptId;
    /**
     * å®¡æ‰¹æ—¶é—´
     */
    private String approveTime;
    /**
     * ç”³è¯·äººid
     */
    // ç”³è¯·äºº
    private Long approveUser;
    /**
     * å®¡æ‰¹äººid列表
     */
    // å®¡æ‰¹äºº
    private String approveUserIds;
    /**
     * å®¡æ‰¹ç†ç”±
     */
    private String approveReason;
    @Excel(name = "开始时间", dateFormat = "yyyy-MM-dd",width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "开始时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date startDate;
    @Excel(name = "结束时间", dateFormat = "yyyy-MM-dd",width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "结束时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date endDate;
    private BigDecimal price;
    private String location;
    /**
     * å®¡æ‰¹ç±»åž‹
     */
    private Integer approveType;
     /**
     * è®¾å¤‡æŠ¥ä¿®id
     */
    private Long deviceRepairId;
     /**
     * æŠ¥ä¿®é‡‘额
     */
    private BigDecimal maintenancePrice;
}
src/main/java/com/ruoyi/basic/controller/ProductController.java
@@ -1,5 +1,6 @@
package com.ruoyi.basic.controller;
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.ruoyi.basic.dto.ProductDto;
@@ -13,7 +14,13 @@
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.service.ISalesLedgerProductService;
import com.ruoyi.sales.service.ISalesLedgerService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -28,8 +35,8 @@
    private IProductService productService;
    private IProductModelService productModelService;
    @Autowired
    private ISalesLedgerProductService salesLedgerProductService;
    /**
     * æŸ¥è¯¢äº§å“
     */
@@ -73,6 +80,13 @@
        if (ids == null || ids.length == 0) {
            return AjaxResult.error("请传入要删除的ID");
        }
        // æ£€æŸ¥æ˜¯å¦æœ‰é”€å”®å•†å“è®°å½•关联该产品
        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(SalesLedgerProduct::getProductId, ids);
        List<SalesLedgerProduct> salesLedgerProductList = salesLedgerProductService.list(queryWrapper);
        if (salesLedgerProductList.size() > 0) {
            return AjaxResult.error("该产品存在销售/采购记录,不能删除");
        }
        return toAjax(productService.delProductByIds(ids));
    }
@@ -85,6 +99,13 @@
        if (ids == null || ids.length == 0) {
            return AjaxResult.error("请传入要删除的ID");
        }
        // æ£€æŸ¥æ˜¯å¦æœ‰é”€å”®å•†å“è®°å½•关联该产品规格型号
        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(SalesLedgerProduct::getProductModelId, ids);
        List<SalesLedgerProduct> salesLedgerProductList = salesLedgerProductService.list(queryWrapper);
        if (salesLedgerProductList.size() > 0) {
            return AjaxResult.error("该产品规格型号存在销售/采购记录,不能删除");
        }
        return toAjax(productModelService.delProductModel(ids));
    }
@@ -96,6 +117,12 @@
        return productModelService.modelListPage(page, productDto);
    }
    @ApiOperation("分页查询所有产品型号")
    @GetMapping("/pageModel")
    public IPage<ProductModel> listPageProductModel(Page<ProductModel> page, ProductModel productModel) {
        return productService.listPageProductModel(page, productModel);
    }
    /**
     * å¯¼å…¥äº§å“
     */
src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.SupplierManageFile;
import com.ruoyi.basic.service.SupplierManageFileService;
import com.ruoyi.framework.web.domain.AjaxResult;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * ä¾›åº”商附件
 */
@RestController
@RequestMapping("/basic/supplierManageFile")
public class SupplierManageFileController {
    @Resource
    private SupplierManageFileService supplierManageFileService;
    /**
     * æ–°å¢ž
     * @param supplierManageFile
     * @return
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SupplierManageFile supplierManageFile) {
        return AjaxResult.success(supplierManageFileService.save(supplierManageFile));
    }
    /**
     * åˆ é™¤
     * @param ids
     * @return
     */
    @DeleteMapping("/del")
    public AjaxResult delSupplierManageFile(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
        }
        //删除检验附件
        return AjaxResult.success(supplierManageFileService.removeBatchByIds(ids));
    }
    /**
     *分页查询
     * @param page
     * @param supplierManageFile
     * @return
     */
    @GetMapping("/listPage")
    public AjaxResult supplierManageFileListPage(Page page, SupplierManageFile supplierManageFile) {
        return AjaxResult.success(supplierManageFileService.supplierManageFileListPage(page, supplierManageFile));
    }
}
src/main/java/com/ruoyi/basic/dto/ProductModelDto.java
@@ -1,8 +1,12 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.production.dto.ProductStructureDto;
import lombok.Data;
import java.util.List;
@Data
public class ProductModelDto extends ProductModel {
    private List<ProductStructureDto> productStructureList;
}
src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
@@ -1,7 +1,10 @@
package com.ruoyi.basic.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.basic.pojo.ProductModel;
import org.apache.ibatis.annotations.Param;
/**
@@ -11,5 +14,9 @@
 * @date 2025-05-19
 */
public interface ProductModelMapper extends BaseMapper<ProductModel> {
    IPage<ProductModel> listPageProductModel(Page<ProductModel> page, @Param("c") ProductModel productModel);
    ProductModel selectLatestRecord();
}
src/main/java/com/ruoyi/basic/mapper/SupplierManageFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.basic.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.basic.pojo.SupplierManageFile;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface SupplierManageFileMapper extends BaseMapper<SupplierManageFile> {
    IPage<SupplierManageFile> supplierManageFileListPage(Page page, @Param("supplierManageFile") SupplierManageFile supplierManageFile);
}
src/main/java/com/ruoyi/basic/pojo/Customer.java
@@ -31,6 +31,10 @@
     */
    @Excel(name = "客户名称")
    private String customerName;
    /** å®¢æˆ·åˆ†ç±»ï¼šé›¶å”®å®¢æˆ·ï¼Œè¿›é”€å•†å®¢æˆ· */
    @Excel(name = "客户分类")
    private String customerType;
    /**
     * çº³ç¨Žäººè¯†åˆ«å·
src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -5,6 +5,8 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@TableName("product_model")
public class ProductModel {
@@ -39,7 +41,22 @@
    @Excel(name = "单位")
    private String unit;
    /**
     * ç”Ÿäº§ç‚’机
     */
    @Excel(name = "生产炒机")
    private String speculativeTradingName;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @TableField(exist = false)
    @Excel(name = "入库数量")
    private BigDecimal inboundNum;
    @TableField(exist = false)
    @Excel(name = "出库数量")
    private BigDecimal outboundNum;
    @TableField(exist = false)
    @Excel(name = "剩余库存")
    private BigDecimal stockQuantity;
}
src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
@@ -56,6 +56,9 @@
    @JsonFormat(pattern = "yyyy-MM-dd")
//    @Excel(name = "维护时间", width = 30, dateFormat = "yyyy-MM-dd")
    private LocalDate maintainTime;
    @Excel(name = "是否白名单")
    @ApiModelProperty(value = "是否白名单(0是 1否)")
    private Integer isWhite;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
src/main/java/com/ruoyi/basic/pojo/SupplierManageFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * ä¾›åº”商管理--附件
 * supplier_manage_file
 */
@TableName(value = "supplier_manage_file")
@Data
public class SupplierManageFile implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "文件名称")
    private String name;
    @ApiModelProperty(value = "文件路径")
    private String url;
    @ApiModelProperty(value = "文件大小")
    private int fileSize;
    @ApiModelProperty(value = "供应商ID")
    @NotBlank(message = "供应商id不能为空!")
    private Long supplierId;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/basic/service/IProductService.java
@@ -1,9 +1,12 @@
package com.ruoyi.basic.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.basic.dto.ProductDto;
import com.ruoyi.basic.dto.ProductTreeDto;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import java.util.List;
@@ -15,4 +18,5 @@
    List<ProductTreeDto> selectProductList(ProductDto productDto);
    IPage<ProductModel> listPageProductModel(Page<ProductModel> page, ProductModel productModel);
}
src/main/java/com/ruoyi/basic/service/SupplierManageFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.basic.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.basic.pojo.SupplierManageFile;
public interface SupplierManageFileService extends IService<SupplierManageFile> {
    IPage<SupplierManageFile> supplierManageFileListPage(Page page, SupplierManageFile supplierManageFile);
}
src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -74,9 +74,13 @@
        // 2. æž„建查询条件(增强空值安全)
        LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<>();
        String customerName = customer.getCustomerName();
        String customerType = customer.getCustomerType();
        if (StringUtils.isNotBlank(customerName)) {
            queryWrapper.like(Customer::getCustomerName, customerName);
        }
        if (StringUtils.isNotBlank(customerType)) {
            queryWrapper.like(Customer::getCustomerType, customerType);
        }
        // 3. æ‰§è¡Œåˆ†é¡µæŸ¥è¯¢ï¼ˆä¿ç•™åˆ†é¡µå…ƒæ•°æ®ï¼‰
        IPage<Customer> customerPage = customerMapper.selectPage(page, queryWrapper);
src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -14,12 +14,15 @@
import com.ruoyi.basic.service.IProductModelService;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -51,6 +54,8 @@
        }
    }
    @Override
    public int delProductModel(Long[] ids) {
        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>()
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
@@ -1,6 +1,8 @@
package com.ruoyi.basic.service.impl;
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.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.ProductDto;
@@ -63,6 +65,10 @@
        return tree;
    }
    @Override
    public IPage<ProductModel> listPageProductModel(Page<ProductModel> page, ProductModel productModel) {
        return productModelMapper.listPageProductModel(page, productModel);
    }
    // é€’归构建子节点
src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java
@@ -80,7 +80,7 @@
    @Override
    public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, String fileType) {
        // åˆ é™¤æ—§å›¾
        deleteStorageAttachment(new StorageAttachment(fileType, (long) recordType.ordinal(), recordId));
//        deleteStorageAttachment(new StorageAttachment(fileType, (long) recordType.ordinal(), recordId));
        for (StorageAttachment attachment : attachments) {
            // èŽ·å–å…³è”è®°å½•
            StorageBlob storageBlob = attachment.getStorageBlobDTO();
src/main/java/com/ruoyi/basic/service/impl/SupplierManageFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.basic.service.impl;
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.basic.mapper.SupplierManageFileMapper;
import com.ruoyi.basic.pojo.SupplierManageFile;
import com.ruoyi.basic.service.SupplierManageFileService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@AllArgsConstructor
@Service
public class SupplierManageFileServiceImpl extends ServiceImpl<SupplierManageFileMapper, SupplierManageFile> implements SupplierManageFileService {
    private SupplierManageFileMapper supplierManageFileMapper;
    @Override
    public IPage<SupplierManageFile> supplierManageFileListPage(Page page, SupplierManageFile supplierManageFile) {
        return supplierManageFileMapper.supplierManageFileListPage(page, supplierManageFile);
    }
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/Notice.java
@@ -33,7 +33,7 @@
     * å…¬å‘Šç±»åž‹ï¼ˆ1放假通知 2设备维修通知)
     */
    @ApiModelProperty("公告类型(1放假通知 2设备维修通知)")
        private Integer type;
    private String type;
    /**
     * çŠ¶æ€ï¼ˆ0草稿 1发布 2已下线)
@@ -53,6 +53,7 @@
    @ApiModelProperty("优先级(1普通 2重要 3紧急)")
    private Integer priority;
    /**
     * è¿‡æœŸæ—¶é—´
     */
src/main/java/com/ruoyi/collaborativeApproval/service/impl/NoticeServiceImpl.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.collaborativeApproval.dto.NoticeDTO;
@@ -10,6 +11,7 @@
import com.ruoyi.collaborativeApproval.service.NoticeService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
@@ -40,17 +42,14 @@
    @Override
    public List<NoticeDTO> selectCount() {
        List<Notice> notices = noticeMapper.selectList(Wrappers.lambdaQuery(Notice.class).groupBy(Notice::getType));
        List<NoticeDTO> result = new ArrayList<>();
        NoticeDTO notice = new NoticeDTO();
        notice.setType(1);
        notice.setCount(noticeMapper.selectCount(new LambdaQueryWrapper<Notice>().eq(Notice::getType, 1)));
        result.add(notice);
        NoticeDTO notice1 = new NoticeDTO();
        notice1.setType(2);
        notice1.setCount(noticeMapper.selectCount(new LambdaQueryWrapper<Notice>().eq(Notice::getType, 2)));
        result.add(notice1);
        for (Notice notice : notices) {
            NoticeDTO notice1 = new NoticeDTO();
            BeanUtils.copyProperties(notice, notice1);
            notice1.setCount(noticeMapper.selectCount(new LambdaQueryWrapper<Notice>().eq(Notice::getType, notice.getType())));
            result.add(notice1);
        }
        return result;
    }
}
src/main/java/com/ruoyi/common/config/MybatisHandler.java
@@ -18,7 +18,6 @@
            tenantId = SecurityUtils.getLoginUser().getTenantId();
        } catch (Exception ignored) {
        }
        System.out.println("执行插入填充...");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updateTime",  LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "createUser", Integer.class, userId);
@@ -36,4 +35,4 @@
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // èµ·å§‹ç‰ˆæœ¬ 3.3.0(推荐)
        this.strictUpdateFill(metaObject, "updateUser", Integer.class, userId);
    }
}
}
src/main/java/com/ruoyi/common/utils/OrderUtils.java
@@ -51,5 +51,6 @@
        // æ‰§è¡ŒæŸ¥è¯¢
        Long aLong = mapper.selectCount(queryWrapper);
        // æ‹¼æŽ¥è®¢å•编号 preFix + æ—¶é—´ï¼ˆyyyyMMdd) + è®¢å•数量(001)
        return preFix + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE).replaceAll("-", "") + String.format("%03d", (aLong + 1));}
        return preFix + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE).replaceAll("-", "") + String.format("%03d", (aLong + 1));
    }
}
src/main/java/com/ruoyi/common/vo/FileVo.java
@@ -29,5 +29,5 @@
    @ApiModelProperty(value = "修改用户")
    private Integer updateUser;
    private Integer id;
    private Long id;
}
src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java
@@ -1,5 +1,6 @@
package com.ruoyi.compensationperformance.controller;
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.ruoyi.common.utils.poi.ExcelUtil;
@@ -9,16 +10,23 @@
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.purchase.dto.PaymentRegistrationDto;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import com.ruoyi.staff.pojo.StaffOnJob;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author :yys
@@ -76,5 +84,31 @@
        util.exportExcel(response, list, "导出薪资管理列表");
    }
    @Log(title = "下载薪资管理列表模板", businessType = BusinessType.EXPORT)
    @PostMapping("/exportTemplate")
    public void exportTemplate(HttpServletResponse response) {
        List<CompensationPerformance> list = new ArrayList<>();
        ExcelUtil<CompensationPerformance> util = new ExcelUtil<>(CompensationPerformance.class);
        util.exportExcel(response, list, "下载薪资管理列表模板");
    }
    @Autowired
    private SysUserMapper sysUserMapper;
    @Log(title = "导入薪资管理列表", businessType = BusinessType.IMPORT)
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file) throws Exception {
        ExcelUtil<CompensationPerformance> util = new ExcelUtil<>(CompensationPerformance.class);
        List<CompensationPerformance> list = util.importExcel(file.getInputStream());
        list.forEach(item->{
            SysUser staffOnJob = sysUserMapper.selectUserByNickName(item.getName());
            if(staffOnJob!=null){
                item.setStaffId(staffOnJob.getUserId());
            }
        });
        boolean b = compensationPerformanceService.saveBatch(list);
        return AjaxResult.success(b);
    }
}
src/main/java/com/ruoyi/compensationperformance/pojo/CompensationPerformance.java
@@ -28,9 +28,9 @@
    private Long id;
    /**
     * å‘˜å·¥id
     * ç”¨æˆ·id
     */
    @ApiModelProperty("员工id")
    @ApiModelProperty("用户id")
    private Long staffId;
    /**
@@ -61,14 +61,14 @@
     * åº”出勤天数
     */
    @ApiModelProperty("应出勤天数")
    @Excel(name = "应出勤天数")
//    @Excel(name = "应出勤天数")
    private BigDecimal shouldAttendedNum;
    /**
     * å®žé™…出勤天数
     */
    @ApiModelProperty("实际出勤天数")
    @Excel(name = "实际出勤天数")
//    @Excel(name = "实际出勤天数")
    private BigDecimal actualAttendedNum;
@@ -76,21 +76,21 @@
     * åŸºæœ¬å·¥èµ„
     */
    @ApiModelProperty("基本工资")
    @Excel(name = "基本工资")
//    @Excel(name = "基本工资")
    private BigDecimal basicSalary;
    /**
     * å²—位工资
     */
    @ApiModelProperty("岗位工资")
    @Excel(name = "岗位工资")
//    @Excel(name = "岗位工资")
    private BigDecimal postSalary;
    /**
     * å…¥ç¦»èŒç¼ºå‹¤æ‰£æ¬¾
     */
    @ApiModelProperty("入离职缺勤扣款")
    @Excel(name = "入离职缺勤扣款")
//    @Excel(name = "入离职缺勤扣款")
    private BigDecimal deductionAbsenteeism;
@@ -98,34 +98,34 @@
     * ç—…假扣款
     */
    @ApiModelProperty("病假扣款")
    @Excel(name = "病假扣款")
//    @Excel(name = "病假扣款")
    private BigDecimal sickLeaveDeductions;
    /**
     * äº‹å‡æ‰£æ¬¾
     */
    @ApiModelProperty("事假扣款")
    @Excel(name = "事假扣款")
//    @Excel(name = "事假扣款")
    private BigDecimal deductionPersonalLeave;
    /**
     * å¿˜è®°æ‰“卡扣款
     */
    @ApiModelProperty("忘记打卡扣款")
    @Excel(name = "忘记打卡扣款")
//    @Excel(name = "忘记打卡扣款")
    private BigDecimal forgetClockDeduct;
    /**
     * ç»©æ•ˆå¾—分
     */
    @ApiModelProperty("绩效得分")
    @Excel(name = "绩效得分")
//    @Excel(name = "绩效得分")
    private BigDecimal performanceScore;
    /**
     * ç»©æ•ˆå·¥èµ„
     */
    @ApiModelProperty("绩效工资")
    @Excel(name = "绩效工资")
//    @Excel(name = "绩效工资")
    private BigDecimal performancePay;
@@ -133,67 +133,67 @@
     * åº”发合计
     */
    @ApiModelProperty("应发合计")
    @Excel(name = "应发合计")
//    @Excel(name = "应发合计")
    private BigDecimal payableWages;
    /**
     * ç¤¾ä¿ä¸ªäºº
     */
    @ApiModelProperty("社保个人")
    @Excel(name = "社保个人")
//    @Excel(name = "社保个人")
    private BigDecimal socialSecurityIndividuals;
    /**
     * ç¤¾ä¿å…¬å¸
     */
    @ApiModelProperty("社保公司")
    @Excel(name = "社保公司")
//    @Excel(name = "社保公司")
    private BigDecimal socialSecurityCompanies;
    /**
     * ç¤¾ä¿åˆè®¡
     */
    @ApiModelProperty("社保合计")
    @Excel(name = "社保合计")
//    @Excel(name = "社保合计")
    private BigDecimal socialSecurityTotal;
    /**
     * å…¬ç§¯é‡‘合计
     */
    @ApiModelProperty("公积金合计")
    @Excel(name = "公积金合计")
//    @Excel(name = "公积金合计")
    private BigDecimal providentFundTotal;
    /**
     * å…¬ç§¯é‡‘公司
     */
    @ApiModelProperty("公积金公司")
    @Excel(name = "公积金公司")
//    @Excel(name = "公积金公司")
    private BigDecimal providentFundCompany;
    /**
     * å…¬ç§¯é‡‘个人
     */
    @ApiModelProperty("公积金个人")
    @Excel(name = "公积金个人")
//    @Excel(name = "公积金个人")
    private BigDecimal providentFundIndividuals;
    /**
     * åº”税工资
     */
    @ApiModelProperty("应税工资")
    @Excel(name = "应税工资")
//    @Excel(name = "应税工资")
    private BigDecimal taxableWaget;
    /**
     * ä¸ªäººæ‰€å¾—税
     */
    @ApiModelProperty("个人所得税")
    @Excel(name = "个人所得税")
//    @Excel(name = "个人所得税")
    private BigDecimal personalIncomeTax;
    /**
     * å®žå‘工资
     */
    @ApiModelProperty("实发工资")
    @Excel(name = "实发工资")
    @Excel(name = "实发工资", width = 30)
    private BigDecimal actualWages;
    /**
src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
@@ -84,7 +84,14 @@
    public void export(HttpServletResponse response, Long[] ids) {
         deviceLedgerService.export(response, ids);
    }
    /**
     *
     */
    @GetMapping("/report/forms")
    @ApiOperation("查询设备台账图表数据")
    public AjaxResult report() {
        return AjaxResult.success(deviceLedgerService.report());
    }
    @PostMapping("import")
    @ApiModelProperty("导入设备台账")
    public AjaxResult importData(MultipartFile file) throws IOException {
src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
@@ -68,7 +68,6 @@
    @PostMapping ("maintenance")
    @ApiModelProperty("修改设备保养")
    public AjaxResult maintenance(@RequestBody DeviceMaintenance deviceMaintenance) {
        deviceMaintenance.setStatus(1);
        return deviceMaintenanceService.updateDeviceDeviceMaintenance(deviceMaintenance);
    }
src/main/java/com/ruoyi/device/dto/DeviceAssetInfoDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.device.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
 * è®¾å¤‡èµ„产信息Dto-资产报表
 */
@Data
public class DeviceAssetInfoDto {
    /**
     * è®¾å¤‡æ€»æ•°
     */
    private Integer totalEquipment;
    /**
     * èµ„产原值
     */
    private BigDecimal totalOriginalValue;
    /**
     * ç´¯è®¡æŠ˜æ—§
     */
    private BigDecimal totalDepreciation;
    /**
     * å‡€å€¼
     */
    private BigDecimal totalNetValue;
}
src/main/java/com/ruoyi/device/dto/DeviceLedgerDto.java
@@ -37,6 +37,19 @@
    private String deviceModel;
    /**
     * è®¾å¤‡å“ç‰Œ
     */
    @ApiModelProperty("设备品牌")
    private String deviceBrand;
    /**
     * å­˜æ”¾ä½ç½®
     */
    @ApiModelProperty("存放位置")
    private String storageLocation;
    /**
     * ä¾›åº”商名称
     */
    private String supplierName;
src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -14,7 +14,6 @@
    @ApiModelProperty("设备保养id")
    private Long id;
    @ApiModelProperty("设备保养金额")
@@ -45,9 +44,9 @@
    private String maintenanceActuallyTimeReq;
    @ApiModelProperty("保养结果 0 ç»´ä¿® 1 å®Œå¥½")
    private Integer maintenanceResult;
    private String maintenanceResult;
    @ApiModelProperty("状态 0 å¾…保养 1 å®Œç»“")
    @ApiModelProperty("状态 0 å¾…保养 1 å®Œç»“ 2 å¤±è´¥")
    private Integer status;
    @ApiModelProperty("创建时间")
src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -72,7 +73,7 @@
    @ApiModelProperty("租户id")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty("维修价格")
    private String maintenancePrice;
}
src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java
@@ -43,7 +43,7 @@
    @Excel(name = "保养结果")
    private String maintenanceResult;
    @ApiModelProperty("状态 0 å¾…保养 1 å®Œç»“")
    @ApiModelProperty("状态 0 å¾…保养 1 å®Œç»“ 2 å¤±è´¥")
    @Excel(name = "状态")
    private String status;
src/main/java/com/ruoyi/device/pojo/DeviceLedger.java
@@ -41,6 +41,18 @@
    private String deviceModel;
    /**
     * è®¾å¤‡å“ç‰Œ
     */
    @ApiModelProperty("设备品牌")
    private String deviceBrand;
    /**
     * å­˜æ”¾ä½ç½®
     */
    @ApiModelProperty("存放位置")
    private String storageLocation;
    /**
     * ä¾›åº”商名称
     */
    private String supplierName;
src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -45,9 +45,9 @@
    private LocalDateTime maintenanceActuallyTime;
    @ApiModelProperty("保养结果 0 ç»´ä¿® 1 å®Œå¥½")
    private Integer maintenanceResult;
    private String maintenanceResult;
    @ApiModelProperty("状态 0 å¾…保养 1 å®Œç»“")
    @ApiModelProperty("状态 0 å¾…保养 1 å®Œç»“ 2 å¤±è´¥")
    private Integer status;
    @ApiModelProperty("创建时间")
src/main/java/com/ruoyi/device/service/IDeviceLedgerService.java
@@ -3,6 +3,7 @@
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.device.dto.DeviceAssetInfoDto;
import com.ruoyi.device.dto.DeviceLedgerDto;
import com.ruoyi.device.pojo.DeviceLedger;
import com.ruoyi.framework.web.domain.AjaxResult;
@@ -22,4 +23,5 @@
    void export(HttpServletResponse response, Long[] ids);
    Boolean importData(MultipartFile file) throws IOException;
    DeviceAssetInfoDto report();
}
src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
@@ -8,6 +8,7 @@
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.dto.DeviceAssetInfoDto;
import com.ruoyi.device.dto.DeviceLedgerDto;
import com.ruoyi.device.execl.DeviceLedgerExeclDto;
import com.ruoyi.device.mapper.DeviceLedgerMapper;
@@ -24,6 +25,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Arrays;
@@ -47,11 +49,11 @@
    @Override
    public AjaxResult saveDeviceLedger(DeviceLedger deviceLedger) {
//        LambdaQueryWrapper<DeviceLedger> deviceLedgerLambdaQueryWrapper = new LambdaQueryWrapper<>();
//        deviceLedgerLambdaQueryWrapper.eq(DeviceLedger::getDeviceModel,deviceLedger.getDeviceModel());
//        if (this.count(deviceLedgerLambdaQueryWrapper) > 0) {
//            return AjaxResult.error("设备型号已存在");
//        }
        LambdaQueryWrapper<DeviceLedger> deviceLedgerLambdaQueryWrapper = new LambdaQueryWrapper<>();
        deviceLedgerLambdaQueryWrapper.eq(DeviceLedger::getDeviceName,deviceLedger.getDeviceName());
        if (this.count(deviceLedgerLambdaQueryWrapper) > 0) {
            return AjaxResult.error("设备名称已存在");
        }
        boolean save = this.save(deviceLedger);
        if (save){
            return AjaxResult.success();
@@ -119,4 +121,14 @@
        return true;
    }
    @Override
    public DeviceAssetInfoDto report() {
        List<DeviceLedger> list = deviceLedgerMapper.selectList(null);
        DeviceAssetInfoDto deviceAssetInfoDto = new DeviceAssetInfoDto();
        deviceAssetInfoDto.setTotalEquipment(list.stream().map(DeviceLedger::getNumber).reduce(BigDecimal.ZERO, BigDecimal::add).intValue());
        deviceAssetInfoDto.setTotalOriginalValue(list.stream().map(DeviceLedger::getTaxIncludingPriceTotal).reduce(BigDecimal.ZERO, BigDecimal::add));
        deviceAssetInfoDto.setTotalNetValue(list.stream().map(DeviceLedger::getUnTaxIncludingPriceTotal).reduce(BigDecimal.ZERO, BigDecimal::add));
        deviceAssetInfoDto.setTotalDepreciation(deviceAssetInfoDto.getTotalOriginalValue().subtract(deviceAssetInfoDto.getTotalNetValue()));
        return deviceAssetInfoDto;
    }
}
src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -65,9 +65,8 @@
        supplierManageList.forEach(deviceMaintenance -> {
            DeviceMaintenanceExeclDto deviceRepairExeclDto = new DeviceMaintenanceExeclDto();
            BeanUtils.copyProperties(deviceMaintenance,deviceRepairExeclDto);
            deviceRepairExeclDto.setStatus(deviceMaintenance.getStatus() == 0 ? "待维修" : "完结");
            deviceRepairExeclDto.setMaintenanceResult(deviceMaintenance.getMaintenanceResult() != null && deviceMaintenance.getMaintenanceResult() == 0 ? "ç»´ä¿®" : "完好");
            deviceRepairExeclDto.setStatus(deviceMaintenance.getStatus() == 0 ? "待维修" : deviceMaintenance.getStatus() == 1 ? "完结" : "失败");
//            deviceRepairExeclDto.setMaintenanceResult(deviceMaintenance.getMaintenanceResult() != null && deviceMaintenance.getMaintenanceResult() == 0 ? "ç»´ä¿®" : "完好");
            deviceLedgerExeclDtos.add(deviceRepairExeclDto);
        });
        ExcelUtil<DeviceMaintenanceExeclDto> util = new ExcelUtil<DeviceMaintenanceExeclDto>(DeviceMaintenanceExeclDto.class);
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -89,7 +89,7 @@
            supplierManageList.stream().forEach(deviceRepair -> {
                DeviceRepairExeclDto deviceRepairExeclDto = new DeviceRepairExeclDto();
                BeanUtils.copyProperties(deviceRepair,deviceRepairExeclDto);
                deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "待维修" : "完结");
                deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "待维修" : deviceRepair.getStatus() == 1 ? "完结" : "失败");
                deviceLedgerExeclDtos.add(deviceRepairExeclDto);
            });
@@ -105,7 +105,7 @@
            supplierManageList.stream().forEach(deviceRepair -> {
                DeviceRepairExeclDto deviceRepairExeclDto = new DeviceRepairExeclDto();
                BeanUtils.copyProperties(deviceRepair,deviceRepairExeclDto);
                deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "待维修" : "完结");
                deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "待维修" : deviceRepair.getStatus() == 1 ? "完结" : "失败");
                deviceLedgerExeclDtos.add(deviceRepairExeclDto);
            });
src/main/java/com/ruoyi/dto/WordDateDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ruoyi.dto;
import com.ruoyi.staff.pojo.StaffOnJob;
import lombok.Data;
/**
 * @author :yys
 * @date : 2025/11/5 14:34
 */
@Data
public class WordDateDto extends StaffOnJob {
    // åˆåŒæ—¥æœŸç›¸å…³
    private String qyear;       // ç­¾è®¢æ—¥æœŸ-å¹´
    private String qmoth;       // ç­¾è®¢æ—¥æœŸ-月(注意原文档拼写:qmoth=month)
    private String qday;        // ç­¾è®¢æ—¥æœŸ-日
    private String syear = "";       // åˆåŒå¼€å§‹å¹´
    private String smoth = "";       // åˆåŒå¼€å§‹æœˆ
    private String sday = "";        // åˆåŒå¼€å§‹æ—¥
    private String eyear = "";       // åˆåŒç»“束年(仅A类型需要)
    private String emoth = "";       // åˆåŒç»“束月(仅A类型需要)
    private String eday = "";        // åˆåŒç»“束日(仅A类型需要)
    // è¯•用期相关
    private String styear = "";      // è¯•用期开始年
    private String stmoth = "";      // è¯•用期开始月
    private String stday = "";       // è¯•用期开始日
    private String seyear = "";      // è¯•用期结束年
    private String semoth = "";      // è¯•用期结束月
    private String seday = "";       // è¯•用期结束日
    private String bsyear = "";       // åˆåŒå¼€å§‹å¹´
    private String bsmoth = "";       // åˆåŒå¼€å§‹æœˆ
    private String bsday = "";        // åˆåŒå¼€å§‹æ—¥
    // è¯•用期相关
    private String bstyear = "";      // è¯•用期开始年
    private String bstmoth = "";      // è¯•用期开始月
    private String bstday = "";       // è¯•用期开始日
    private String bseyear = "";      // è¯•用期结束年
    private String bsemoth = "";      // è¯•用期结束月
    private String bseday = "";       // è¯•用期结束日
    private String csyear = "";       // åˆåŒå¼€å§‹å¹´
    private String csmoth = "";       // åˆåŒå¼€å§‹æœˆ
    private String csday = "";        // åˆåŒå¼€å§‹æ—¥
}
src/main/java/com/ruoyi/home/dto/ProductionProgressDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.home.dto;
import com.ruoyi.production.dto.ProductOrderDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel
public class ProductionProgressDto {
    @ApiModelProperty("总订单数")
    private Integer totalOrderCount;
    @ApiModelProperty("已完成订单数")
    private Integer completedOrderCount;
    @ApiModelProperty("未完成订单数")
    private Integer uncompletedOrderCount;
    @ApiModelProperty("总体完成进度")
    private BigDecimal completedProgressCount;
    @ApiModelProperty("订单详情")
    private List<ProductOrderDto> completedOrderDetails;
}
src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
@@ -89,4 +89,6 @@
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @TableField(exist = false)
    private String dateStr;
}
src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java
@@ -83,14 +83,17 @@
    @ApiModelProperty(value = "软删除标志,0=未删除,1=已删除")
    private Integer deleted;
    @TableField(exist = false)
    private String dateStr;
    @ApiModelProperty(value = "创建该记录的用户")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "记录创建时间")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
//    @JsonFormat(pattern = "yyyy-MM-dd")
//    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "最后修改该记录的用户")
src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
@@ -25,6 +25,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -151,6 +152,8 @@
                dto.setInspector(inspectorNames);
            }
            dto.setDateStr(inspectionTask.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            // åˆå§‹åŒ–三个附件列表
            dto.setBeforeProduction(new ArrayList<>());
            dto.setAfterProduction(new ArrayList<>());
src/main/java/com/ruoyi/inspectiontask/service/impl/QuartzConfig.java
@@ -1,5 +1,6 @@
package com.ruoyi.inspectiontask.service.impl;
import org.quartz.*;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
@@ -7,13 +8,21 @@
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
import javax.sql.DataSource;
@Configuration
public class QuartzConfig {
    @Autowired
    private ApplicationContext applicationContext;
    // å‡è®¾å·²é…ç½®åä¸ºdataSource的数据源Bean
    @Autowired
    private DataSource dataSource;
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
@@ -24,10 +33,17 @@
        jobFactory.setApplicationContext(applicationContext);
        schedulerFactory.setJobFactory(jobFactory);
        // åœ¨schedulerFactoryBean()方法中添加
        schedulerFactory.setDataSource(dataSource);
        // å…¶ä»–配置...
        return schedulerFactory;
    }
    @Bean
    public Scheduler scheduler() {
        return schedulerFactoryBean().getScheduler();
    }
    // è‡ªå®šä¹‰JobFactory,支持自动注入
    public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory
            implements ApplicationContextAware {
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
@@ -13,6 +13,7 @@
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.io.Serializable;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.LocalTime;
@@ -23,7 +24,8 @@
@Component
@DisallowConcurrentExecution // ç¦æ­¢å¹¶å‘执行同一个Job
public class TimingTaskJob implements Job {
public class TimingTaskJob implements Job, Serializable {
    private static final long serialVersionUID = 1L; // å¿…须定义序列化ID
    @Autowired
    private TimingTaskMapper timingTaskMapper;
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -39,14 +39,28 @@
            throw new SchedulerException("Existing trigger is not a CronTrigger");
        }
        // æž„建新触发器
        Trigger newTrigger = TriggerBuilder.newTrigger()
                .withIdentity(triggerKey)
                .withDescription(task.getTaskName())
                .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task)))
                .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()))
                .forJob(oldTrigger.getJobKey())
        // 3. æž„建CronTrigger,确保持久化配置
        CronTrigger newTrigger = TriggerBuilder.newTrigger()
                .withIdentity(triggerKey)                // å”¯ä¸€æ ‡è¯†ï¼Œç”¨äºŽæŒä¹…化存储
                .withDescription(task.getTaskName() + "_TRIGGER") // è§¦å‘器描述
                .forJob(oldTrigger.getJobKey())                       // å…³è”对应的Job
                .withSchedule(CronScheduleBuilder
                        .cronSchedule(convertToCronExpression(task)) // é”™è¿‡æ‰§è¡Œæ—¶çš„策略(根据业务调整)
                )
                // 4. è®¾ç½®å¼€å§‹æ—¶é—´ï¼ˆè‹¥ä¸ºnull则立即生效)
                .startAt(task.getNextExecutionTime() != null
                        ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                        : new Date())
                .build();
        // æž„建新触发器
//        Trigger newTrigger = TriggerBuilder.newTrigger()
//                .withIdentity(triggerKey)
//                .withDescription(task.getTaskName())
//                .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task)))
//                .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()))
//                .forJob(oldTrigger.getJobKey())
//                .build();
        scheduler.rescheduleJob(triggerKey, newTrigger);
    }
@@ -76,34 +90,47 @@
    }
    private JobDetail buildJobDetail(TimingTask task) {
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("taskId", task.getId());
        // 1. æž„建唯一JobKey(基于任务ID,确保重启后能识别)
        JobKey jobKey = new JobKey("timingTask_" + task.getId());
        // 2. å°è£…任务数据(仅使用基本类型,确保可序列化)
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("taskId", task.getId());           // ä»»åŠ¡ID(Long,可序列化)
        jobDataMap.put("taskName", task.getTaskName());   // ä»»åŠ¡åç§°ï¼ˆString,可序列化)
        jobDataMap.put("taskType", task.getFrequencyType()); // ä»»åŠ¡ç±»åž‹ï¼ˆString)
        // æŒ‰éœ€æ·»åŠ å…¶ä»–å¿…è¦çš„åŸºæœ¬ç±»åž‹å‚æ•°
        // 3. æž„建JobDetail,设置持久化相关属性
        return JobBuilder.newJob(TimingTaskJob.class)
                .withIdentity("timingTask_" + task.getId())
                .withDescription(task.getTaskName())
                .usingJobData(jobDataMap)
                .storeDurably()
                .withIdentity(jobKey)                    // å”¯ä¸€æ ‡è¯†ï¼Œç”¨äºŽæŒä¹…化存储
                .withDescription(task.getTaskName())     // ä»»åŠ¡æè¿°ï¼Œå­˜å…¥æ•°æ®åº“
                .usingJobData(jobDataMap)                // ç»‘定任务数据
                .storeDurably(true)                          // å³ä½¿æ²¡æœ‰è§¦å‘器关联也持久化保存
                .requestRecovery(true)                   // å½“调度器崩溃后恢复时,重新执行未完成的任务
                .build();
    }
    private Trigger buildJobTrigger(TimingTask task, JobDetail jobDetail) {
        // 1. æž„建唯一TriggerKey(基于任务ID)
        TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId());
        // 2. ç”ŸæˆCron表达式(原逻辑不变)
        String cronExpression = convertToCronExpression(task);
            TriggerBuilder<CronTrigger> triggerBuilder = TriggerBuilder.newTrigger()
                .withIdentity("trigger_" + task.getId())
                .withDescription(task.getTaskName())
                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression));
        if (jobDetail != null) {
            triggerBuilder.forJob(jobDetail);
        }
        if (task.getNextExecutionTime() != null) {
            triggerBuilder.startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()));
        }
        return triggerBuilder.build();
        // 3. æž„建CronTrigger,确保持久化配置
        return TriggerBuilder.newTrigger()
                .withIdentity(triggerKey)                // å”¯ä¸€æ ‡è¯†ï¼Œç”¨äºŽæŒä¹…化存储
                .withDescription(task.getTaskName() + "_TRIGGER") // è§¦å‘器描述
                .forJob(jobDetail)                       // å…³è”对应的Job
                .withSchedule(CronScheduleBuilder
                        .cronSchedule(cronExpression)
                        .withMisfireHandlingInstructionDoNothing() // é”™è¿‡æ‰§è¡Œæ—¶çš„策略(根据业务调整)
                )
                // 4. è®¾ç½®å¼€å§‹æ—¶é—´ï¼ˆè‹¥ä¸ºnull则立即生效)
                .startAt(task.getNextExecutionTime() != null
                        ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                        : new Date())
                .build();
    }
    private String convertToCronExpression(TimingTask task) {
        // å‚数校验
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -66,6 +66,7 @@
        // æ”¶é›†å·¡æ£€äººID(多个ID以逗号分隔)
        taskPage.getRecords().forEach(task -> {
            task.setDateStr(task.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            if (StringUtils.isNotBlank(task.getInspectorIds())) {
                Arrays.stream(task.getInspectorIds().split(","))
                        .filter(StringUtils::isNotBlank)
@@ -118,7 +119,16 @@
    public int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException {
        TimingTask timingTask = new TimingTask();
        BeanUtils.copyProperties(timingTaskDto, timingTask);
        // 1. è§£æžå­—符串为 LocalDate(只包含年月日)
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate localDate = LocalDate.parse(timingTaskDto.getDateStr(), formatter);
        // 2. èŽ·å–å½“å‰ç³»ç»Ÿçš„ LocalTime(包含时分秒)
        LocalTime currentTime = LocalTime.now();
        // 3. åˆå¹¶ LocalDate å’Œå½“前 LocalTime ä¸º LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.of(localDate, currentTime);
        timingTask.setCreateTime(localDateTime);
        // è®¾ç½®åˆ›å»ºäººä¿¡æ¯å’Œé»˜è®¤å€¼
        if (Objects.isNull(timingTaskDto.getId())) {
            timingTask.setRegistrationDate(LocalDate.now());
@@ -127,7 +137,6 @@
            // è®¡ç®—首次执行时间
            LocalDateTime firstExecutionTime = calculateFirstExecutionTime(timingTask);
            timingTask.setNextExecutionTime(firstExecutionTime);
            int result = timingTaskMapper.insert(timingTask);
            if (result > 0) {
                // æ–°å¢žæˆåŠŸåŽæ·»åŠ åˆ°è°ƒåº¦å™¨
@@ -135,6 +144,8 @@
            }
            return result;
        } else {
            int result = timingTaskMapper.updateById(timingTask);
            if (result > 0) {
                // æ›´æ–°æˆåŠŸåŽé‡æ–°è°ƒåº¦ä»»åŠ¡
src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerRecordController.java
@@ -8,6 +8,7 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedgerRecord;
import com.ruoyi.measuringinstrumentledger.service.MeasuringInstrumentLedgerRecordService;
import io.jsonwebtoken.lang.Collections;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -16,6 +17,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
 * @author :yys
@@ -50,6 +52,14 @@
        return AjaxResult.error();
    }
    @DeleteMapping("/delete")
    @ApiOperation("计量器具台账记录-删除")
    @Log(title = "计量器具台账记录-删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(Collections.isEmpty(ids)) return AjaxResult.error("请选择要删除的数据");
        return AjaxResult.success(measuringInstrumentLedgerRecordService.removeBatchByIds(ids));
    }
    /**
     * å¯¼å‡ºè®¡é‡å™¨å…·å°è´¦
     */
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.ruoyi.procurementrecord.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.dto.*;
import com.ruoyi.procurementrecord.mapper.ProcurementExceptionRecordMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementExceptionRecord;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/7/7 14:32
 */
@RestController
@Api(tags = "采购异常记录")
@RequestMapping("/procurementExceptionRecord")
public class ProcurementExceptionRecordController extends BaseController {
    @Autowired
    private ProcurementExceptionRecordMapper procurementExceptionRecordMapper;
    @PostMapping("/add")
    @Transactional
    public AjaxResult add(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
        return AjaxResult.success(procurementExceptionRecordMapper.insert(procurementExceptionRecord));
    }
    @PostMapping("/update")
    @Transactional
    public AjaxResult updatePro(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
        return AjaxResult.success(procurementExceptionRecordMapper.updateById(procurementExceptionRecord));
    }
}
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
@@ -38,6 +40,18 @@
    private ProcurementRecordService procurementRecordService;
    /**
     * é€šè¿‡é”€å”®äº§å“id获取入库数量
     * @param salesProductId
     * @return
     */
    @GetMapping("/getProcurementAmount")
    @ApiOperation(value = "通过销售产品id获取入库数量")
    public AjaxResult getProcurementAmount(@RequestParam("salesProductId") Long salesProductId) {
        return AjaxResult.success(procurementRecordService.getProcurementAmount(salesProductId));
    }
    @GetMapping("/productlist")
    @Log(title = "采购入库-入库管理-新增入库查询", businessType = BusinessType.OTHER)
    public AjaxResult list(ProcurementDto procurementDto) {
@@ -68,7 +82,7 @@
        return procurementRecordService.updateCustom(customStorage);
    }
    @DeleteMapping("/deleteCustom")
    @Delete("/delteCustom")
    @Log(title = "自定义入库-入库管理-删除入库", businessType = BusinessType.DELETE)
    @Transactional
    public AjaxResult deleteCustom(@RequestBody List<Long> ids) {
@@ -89,12 +103,7 @@
        return AjaxResult.success(procurementRecordService.updateManagement(procurementDto));
    }
    @PostMapping("/updateManagementByCustom")
    @Log(title = "自定义入库-库存台账-修改", businessType = BusinessType.UPDATE)
    @Transactional
    public AjaxResult updateManagementByCustom(@RequestBody ProcurementManagementUpdateDto procurementDto) {
        return AjaxResult.success(procurementRecordService.updateManagementByCustom(procurementDto));
    }
    @GetMapping("/detailManagementByCustom")
    @ApiOperation(value = "自定义入库-详情")
@@ -125,12 +134,24 @@
        IPage<ProcurementPageDto> result = procurementRecordService.listPage(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listReport")
    @ApiOperation(value = "查询库存图表数据")
    public AjaxResult listReport() {
        return AjaxResult.success(procurementRecordService.getReportList());
    }
    @GetMapping("/listPageByProduction")
    @Log(title = "生产入库-入库管理-入库查询", businessType = BusinessType.OTHER)
    @ApiOperation(value = "入库查询")
    public AjaxResult listPageByProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDto> result = procurementRecordService.listPageByProduction(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageByProductProduction")
    @Log(title = "生产入库-入库管理-生产入库查询", businessType = BusinessType.OTHER)
    @ApiOperation(value = "入库查询")
    public AjaxResult listPageByProductProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDto> result = procurementRecordService.listPageByProductProduction(page, procurementDto);
        return AjaxResult.success(result);
    }
@@ -222,35 +243,16 @@
     * @param response
     */
    @PostMapping("/exportTwo")
    public void exportTwo(HttpServletResponse response,@RequestBody List<CustomStorage> customStorage) {
        if(CollectionUtils.isEmpty(customStorage)){
            customStorage = customStorageMapper.selectList(null);
        }
        for (CustomStorage storage : customStorage) {
            // nginx å‰ç«¯è®¿é—®å›¾ç‰‡
            storage.setUrl("http://114.132.189.42:9044"+storage.getUrl());
        }
    public void exportTwo(HttpServletResponse response) {
        List<CustomStorage> customStorages = customStorageMapper.selectList(null);
        ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
        util.exportExcel(response, customStorage, "入库台账");
        util.exportExcel(response, customStorages, "入库台账");
    }
    /**
     * å…¥åº“,出库管理自定义导出,保存文件到本地返回路径
     * @param customStorage
     */
    @PostMapping("/exportTwoSave")
    public AjaxResult exportTwoSave(@RequestBody List<CustomStorage> customStorage) {
        if(CollectionUtils.isEmpty(customStorage)){
            customStorage = customStorageMapper.selectList(null);
        }
        for (CustomStorage storage : customStorage) {
            // nginx å‰ç«¯è®¿é—®å›¾ç‰‡
            storage.setUrl("http://114.132.189.42:9044" + storage.getUrl());
        }
        ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
        return util.exportExcel(customStorage,"入库台账" , "入库台账");
    @GetMapping("/listPageProductionStock")
    @Log(title = "库存管理-成品库存", businessType = BusinessType.OTHER)
    public AjaxResult listPageProductionStock(Page page) {
        IPage<ProductModel> result = procurementRecordService.listPageProductionStock(page);
        return AjaxResult.success(result);
    }
}
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
@@ -52,6 +52,13 @@
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageBySemiProduct")
    @Log(title = "生产出库-出库台账-出库查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageBySemiProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
        IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPageBySemiProduct(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageByCustom")
    @Log(title = "自定义出库-出库台账-出库查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
@@ -85,7 +92,7 @@
    public void exportOne(HttpServletResponse response) {
        List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.listOne();
        ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
        util.exportExcel(response, list, "采购出库台账");
        util.exportExcel(response, list, "生产出库台账");
    }
    /**
@@ -96,7 +103,7 @@
    public void exportTwo(HttpServletResponse response) {
        List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.listTwo();
        ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
        util.exportExcel(response, list, "成品出库台账");
        util.exportExcel(response, list, "生产出库台账");
    }
}
src/main/java/com/ruoyi/procurementrecord/dto/Details.java
@@ -28,4 +28,5 @@
     * ç¾Žå…ƒæ¯ä»¶
     */
    private BigDecimal dollarPrice;
    private Long productModelId; // åŸºç¡€äº§å“id
}
src/main/java/com/ruoyi/procurementrecord/dto/InventoryInformationDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.procurementrecord.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
 * å­˜è´§æ ¸ç®—信息Dto-资产报表
 */
@Data
public class InventoryInformationDto {
    /**
     * æ€»åº“存数量
     */
    private Integer totalInventoryCount;
    /**
     * æ€»åº“存金额
     */
    private BigDecimal totalInventoryValue;
    /**
     * åº“存变动数量
     */
    private Integer inventoryChangeCount;
    /**
     * åº“存变动金额
     */
    private BigDecimal inventoryChangeValue;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
@@ -22,5 +22,8 @@
    private Integer type;
    private String typeName;
    private Integer purchaseLedgerId;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -54,7 +54,7 @@
    @Excel(name = "客户名称")
    private String customerName;
    private String salesLedgerProductId;
    private Long salesLedgerProductId;
    /**
     * å‡ºå…¥åº“数量
@@ -120,6 +120,11 @@
     */
    @Excel(name = "产品大类")
    private String productCategory;
     /**
     * äº§å“id
     */
    @Excel(name = "产品id")
    private Long productId;
    /**
     * è§„格型号
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -51,7 +51,9 @@
     */
    private String customerName;
    private String salesLedgerProductId;
    private Long salesLedgerProductId;
    /**
     * å‡ºå…¥åº“数量
@@ -133,6 +135,11 @@
     */
    @Excel(name = "产品大类")
    private String productCategory;
     /**
     * äº§å“id
     */
    @Excel(name = "产品id")
    private Long productId;
    /**
     * è§„格型号
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
@@ -24,4 +24,6 @@
     */
    private Integer type;
    private Long productModelId;// åŸºç¡€äº§å“ID
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
@@ -6,6 +6,7 @@
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementExceptionRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.procurementrecord.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementExceptionRecord;
public interface ProcurementExceptionRecordMapper extends BaseMapper<ProcurementExceptionRecord> {
}
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
@@ -9,6 +9,7 @@
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -39,4 +40,13 @@
    IPage<ProcurementPageDto> listPageByProduction(Page page, @Param("req") ProcurementPageDto procurementDto);
    IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, @Param("req") ProcurementPageDto procurementDto);
    IPage<ProcurementPageDtoCopy> listPagePRS(Page page, @Param("req") ProcurementPageDto procurementDto);
    BigDecimal getSumQuantity(@Param("productModelId") Long productModelId);
    IPage<ProcurementPageDto> listPageByProductProduction(Page page, @Param("req") ProcurementPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
@@ -7,6 +7,7 @@
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -26,4 +27,10 @@
    IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
    IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
    BigDecimal getSumQuantity(@Param("productModelId") Long productModelId);
    ProcurementRecordOut selectCode(@Param("format") String format);
    IPage<ProcurementRecordOutPageDto> listPageBySemiProduct(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
@@ -37,41 +37,59 @@
    @Excel(name = "入库时间", width = 30, dateFormat = "yyyy-MM-dd")
    private Date inboundDate;
    /**
     * ç¼–号
     */
    @Excel(name = "编号")
    private String code;
    @TableField(exist = false)
    private String timeStr;
    /**
     * å¾…出库数量
     */
    @Excel(name = "待出库数量")
    @TableField(exist = false)
    private BigDecimal inboundNum0;
    /**
     * å‡ºåº“数量
     */
    @Excel(name = "出库数量")
    @TableField(exist = false)
    private BigDecimal totalInboundNum = BigDecimal.ZERO;
    // ç‰©å“ç±»åž‹
//    @Excel(name = "物品类型")
    @Excel(name = "物品类型")
    private String itemType;
    // å…¥åº“批次
//    @Excel(name = "入库批次")
    @Excel(name = "入库批次")
    private String inboundBatches;
    // å…¥åº“数量
    @Excel(name = "入库数量")
    private BigDecimal inboundNum;
    // ä¾›åº”商名称
//    @Excel(name = "供应商名称")
    @Excel(name = "供应商名称")
    private String supplierName;
    // äº§å“å¤§ç±»
    @Excel(name = "产品名称")
    @Excel(name = "产品大类")
    private String productCategory;
    // è§„格型号
    @Excel(name = "产品高度")
    @Excel(name = "规格型号")
    private String specificationModel;
    // å•位
//    @Excel(name = "单位")
    @Excel(name = "单位")
    private String unit;
    // å«ç¨Žå•ä»·
    @Excel(name = "单价(元)/ä»¶")
    @Excel(name = "含税单价")
    private BigDecimal taxInclusiveUnitPrice;
    // å«ç¨Žæ€»ä»·
//    @Excel(name = "含税总价")
    @Excel(name = "含税总价")
    private BigDecimal taxInclusiveTotalPrice;
    // ç¨Žçއ(%)
//    @Excel(name = "税率(%)")
    @Excel(name = "税率(%)")
    private BigDecimal taxRate;
    // ä¸å«ç¨Žæ€»ä»·
//    @Excel(name = "不含税总价")
    @Excel(name = "不含税总价")
    private BigDecimal taxExclusiveTotalPrice;
    /**
     * å…¥åº“用户
@@ -102,8 +120,8 @@
     * å…¥åº“æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
//    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
//    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime createTime;
    /**
@@ -116,8 +134,8 @@
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
@@ -140,4 +158,5 @@
     */
    @Excel(name = "单价(美元)/ä»¶")
    private BigDecimal dollarPrice;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementExceptionRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.ruoyi.procurementrecord.pojo;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Builder;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@TableName("procurement_exception_record")
@Data
@Builder
public class ProcurementExceptionRecord {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * é‡‡è´­å°è´¦id
     */
    private Integer purchaseLedgerId;
    /**
     * å¼‚常描述
     */
    private String exceptionReason;
    /**
     * å¼‚常数量
     */
    private BigDecimal exceptionNum;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹è€…
     */
    private Long updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -89,4 +89,9 @@
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * äº§å“ID
     */
    private Long productModelId;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -97,6 +97,11 @@
    private Long tenantId;
    /**
     * äº§å“ID
     */
    private Long productModelId;
    /**
     * æ¯ç®±æ•°é‡
     */
    private Integer boxNum;
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java
@@ -27,4 +27,6 @@
    IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto);
    IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto);
    IPage<ProcurementRecordOutPageDto> listPageBySemiProduct(Page page, ProcurementRecordOutPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -3,12 +3,14 @@
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.basic.pojo.ProductModel;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.dto.*;
import com.ruoyi.procurementrecord.pojo.CustomStorage;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@@ -55,7 +57,10 @@
    int updateManagementByCustom(ProcurementManagementUpdateDto procurementDto);
    CustomStorage detailManagementByCustom(ProcurementManagementUpdateDto procurementDto);
    BigDecimal getProcurementAmount(Long salesProductId);
    InventoryInformationDto getReportList();
    ProcurementPageDto detail(ProcurementUpdateDto procurementDto);
    IPage<ProductModel> listPageProductionStock(Page page);
    IPage<ProcurementPageDto> listPageByProductProduction(Page page, ProcurementPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -10,7 +10,6 @@
import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
@@ -22,7 +21,6 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@@ -71,7 +69,7 @@
        Long aLong = procurementRecordOutMapper.selectCount(procurementRecordLambdaQueryWrapper);
        ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
                .procurementRecordStorageId(procurementRecordOutAdd.getId())
                .code("LS" + dateFormat.format(now) + String.format("%03d", aLong1 + 1))
                .code("SC" + dateFormat.format(now) + String.format("%03d", aLong1 + 1))
                .salesLedgerProductId(procurementRecordOutAdd.getSalesLedgerProductId())
                .inboundBatches(aLong.equals(0L) ? "第1批次" : "第"+ (aLong + 1) + "批次")
                .inboundNum(new BigDecimal(procurementRecordOutAdd.getQuantity()))
@@ -80,7 +78,8 @@
                .createUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
                .createBy(sysUser.getNickName())
                .updateUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
                .updateTime(LocalDateTime.now());
                .updateTime(LocalDateTime.now())
                .productModelId(procurementRecordOutAdd.getProductModelId());
        this.save(procurementRecordOut.build());
        return 0;
    }
@@ -120,4 +119,9 @@
    public IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
        return procurementRecordOutMapper.listPageByCustom(page, procurementDto);
    }
    @Override
    public IPage<ProcurementRecordOutPageDto> listPageBySemiProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
        return procurementRecordOutMapper.listPageBySemiProduct(page, procurementDto);
    }
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -4,6 +4,9 @@
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.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
@@ -13,9 +16,10 @@
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.CustomStorage;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
@@ -29,7 +33,6 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
@@ -49,6 +52,8 @@
    private final ProcurementRecordOutMapper procurementRecordOutMapper;
    private final SalesLedgerProductMapper salesLedgerProductMapper;
    private final StockUtils stockUtils;
    private final ProductModelMapper productModelMapper;
    @Override
    public List<ProcurementDto> listProcurementBySalesLedgerId(ProcurementDto procurementDto) {
@@ -273,7 +278,7 @@
    @Override
    public void exportCopyTwo(HttpServletResponse response,Integer type) {
        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        customStorageLambdaQueryWrapper.groupBy(CustomStorage::getProductCategory, CustomStorage::getSpecificationModel);
        customStorageLambdaQueryWrapper.groupBy(CustomStorage::getSupplierName, CustomStorage::getProductCategory, CustomStorage::getSpecificationModel);
        List<CustomStorage> list = customStorageMapper.selectList(customStorageLambdaQueryWrapper);
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
@@ -285,6 +290,7 @@
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
@@ -415,6 +421,68 @@
    }
    @Override
    public InventoryInformationDto getReportList() {
        InventoryInformationDto inventoryInformationDto = new InventoryInformationDto();
        IPage<ProcurementPageDto> procurementPageDtoIPage = this.listPage(new Page<>(1, -1), new ProcurementPageDto());
        if(CollectionUtils.isEmpty(procurementPageDtoIPage.getRecords())){
            return inventoryInformationDto;
        }
        // è®¡ç®—总库存数量
        inventoryInformationDto.setTotalInventoryCount(procurementPageDtoIPage.getRecords().stream()
                .map(ProcurementPageDto::getInboundNum0)
                .reduce(BigDecimal.ZERO, BigDecimal::add)
                .intValue());
        // è®¡ç®—总库存金额-ProcurementPageDto里每个对象的inboundNum0值和taxInclusiveUnitPrice的乘积,之后相加得到总库存金额
        BigDecimal totalInventoryValue = procurementPageDtoIPage.getRecords().stream()
                // è¿‡æ»¤ç©ºå¯¹è±¡ï¼Œé¿å…NPE
                .filter(Objects::nonNull)
                // å¤„理每个对象的空值:null转为0
                .map(dto -> {
                    // å…¥åº“数量:null â†’ 0
                    BigDecimal inboundNum0 = Optional.ofNullable(dto.getInboundNum0()).orElse(BigDecimal.ZERO);
                    // å«ç¨Žå•价:null â†’ 0
                    BigDecimal taxInclusiveUnitPrice = Optional.ofNullable(dto.getTaxInclusiveUnitPrice()).orElse(BigDecimal.ZERO);
                    // è®¡ç®—单个对象的库存金额:数量 Ã— å«ç¨Žå•ä»·
                    return inboundNum0.multiply(taxInclusiveUnitPrice);
                })
                // æ‰€æœ‰å•个金额求和,初始值为0
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // è®¾ç½®æ€»åº“存金额
        inventoryInformationDto.setTotalInventoryValue(totalInventoryValue);
        // è®¡ç®—库存变动数量-ProcurementPageDto里每个对象的inboundNum值和inboundNum0值的差值,之后相加得到库存变动数量
        inventoryInformationDto.setInventoryChangeCount(procurementPageDtoIPage.getRecords().stream()
                // è¿‡æ»¤ç©ºå¯¹è±¡ï¼Œé¿å…NPE
                .filter(Objects::nonNull)
                // å¤„理每个对象的空值:null转为0
                .map(dto -> {
                    // å…¥åº“数量:null â†’ 0
                    BigDecimal inboundNum = Optional.ofNullable(dto.getInboundNum()).orElse(BigDecimal.ZERO);
                    // å¾…出库数量:null â†’ 0
                    BigDecimal inboundNum0 = Optional.ofNullable(dto.getInboundNum0()).orElse(BigDecimal.ZERO);
                    // è®¡ç®—单个对象的库存变动数量:数量 - å¾…出库数量
                    return inboundNum.subtract(inboundNum0);
                })
                // æ‰€æœ‰å•个变动数量求和,初始值为0
                .reduce(BigDecimal.ZERO, BigDecimal::add)
                .intValue());
        // è®¡ç®—库存变动金额ProcurementPageDto里每个对象的taxInclusiveTotalPrice值的和
        BigDecimal inventoryChangeValue = procurementPageDtoIPage.getRecords().stream()
                // è¿‡æ»¤ç©ºå¯¹è±¡ï¼Œé¿å…NPE
                .filter(Objects::nonNull)
                // å¤„理每个对象的空值:null转为0
                .map(dto -> {
                    // å«ç¨Žæ€»ä»·ï¼šnull â†’ 0
                    BigDecimal taxInclusiveTotalPrice = Optional.ofNullable(dto.getTaxInclusiveTotalPrice()).orElse(BigDecimal.ZERO);
                    // è®¡ç®—单个对象的入库库存金额:含税总价
                    return taxInclusiveTotalPrice;
                })
                // æ‰€æœ‰å•个变动金额求和,初始值为0
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // è®¾ç½®åº“存变动金额
        inventoryInformationDto.setInventoryChangeValue(inventoryChangeValue.subtract(totalInventoryValue));
        return inventoryInformationDto;
    }
    @Override
    public IPage<ProcurementPageDto> listPageByProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDto> procurementPageDtoIPage = procurementRecordMapper.listPageByProduction(page, procurementDto);
        List<ProcurementPageDto> procurementPageDtos = procurementPageDtoIPage.getRecords();
@@ -467,6 +535,7 @@
            Long aLong = customStorageMapper.selectCount(null);
            item.setInboundBatches(aLong.equals(0L) ? "第1批次(自定义入库)" : "第"+ (aLong + 1) + "批次(自定义入库)" );
            item.setCreateBy(loginUser.getNickName());
            item.setCode(OrderUtils.countTodayByCreateTime(customStorageMapper, ""));
            customStorageMapper.insert(item);
        });
        return AjaxResult.success("自定义入库成功");
@@ -529,57 +598,108 @@
    @Override
    public IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopyByProduction(page, procurementDto);
        IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPagePRS(page, procurementDto);
        List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords();
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtoCopyList.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            return procurementPageDtoCopyIPage;
        }
        // 1. æŸ¥è¯¢é‡‡è´­è®°å½•已入库的出库记录(按storageId分组)
        LambdaQueryWrapper<ProcurementRecordOut> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        List<ProcurementRecordOut> recordOutList = procurementRecordOutMapper.selectList(queryWrapper);
        // 2. æŒ‰SalesLedgerProductId分组,统计每个id对应的已出库数量总和-已出库数量
        Map<Integer, BigDecimal> storageIdToTotalOutNumMap = recordOutList.stream()
                .collect(Collectors.groupingBy(
                        ProcurementRecordOut::getSalesLedgerProductId,
                        Collectors.reducing(
                                BigDecimal.ZERO,
                                ProcurementRecordOut::getInboundNum,
                                (a, b) -> a.add(b == null ? BigDecimal.ZERO : b)
                        )
                ));
        // 2. procurementPageDtoCopyList按SalesLedgerProductId分组,统计每个id对应的已出库数量总和-入库库数量
        Map<Long, BigDecimal> storageIdToTotalintNumMap = procurementPageDtoCopyList.stream()
                .collect(Collectors.groupingBy(
                        ProcurementPageDtoCopy::getSalesLedgerProductId,
                        Collectors.reducing(
                                BigDecimal.ZERO,
                                ProcurementPageDtoCopy::getInboundNum,
                                (a, b) -> a.add(b == null ? BigDecimal.ZERO : b)
                        )
                ));
        // 3. å¾ªçŽ¯ç»™dto赋值
        for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
            List<Long> longs = listCopyIds(dto.getIds());
            LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
            procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, longs);
            procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, 2);
            List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
            if(CollectionUtils.isEmpty(procurementRecords)){
                dto.setInboundNum0(dto.getInboundNum());
                dto.setTotalInboundNum(BigDecimal.ZERO);
                return procurementPageDtoCopyIPage;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = procurementRecords.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å‡ºåº“数量 = æ€»æ•°é‡ - å¾…出库数量
            Integer storageId = dto.getId();
            Integer salesLedgerProductId = Integer.valueOf(Math.toIntExact(dto.getSalesLedgerProductId()));
            // èŽ·å–å½“å‰salesLedgerProductId对应的已出库总数(默认0)
            BigDecimal totalInboundNum = storageIdToTotalOutNumMap.getOrDefault(salesLedgerProductId, BigDecimal.ZERO);
            // å·²å‡ºåº“数量
            dto.setTotalInboundNum(totalInboundNum);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
            // åº“存价值
            if(dto.getUnitPrice() != null){
                dto.setTotalPrice(dto.getTotalInboundNum().multiply(dto.getUnitPrice()));
            }
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量(总数量空值则默认0)
//            BigDecimal totalNum = dto.getInboundNum() == null ? BigDecimal.ZERO : dto.getInboundNum();
            BigDecimal totalNum = storageIdToTotalintNumMap.getOrDefault(salesLedgerProductId, BigDecimal.ZERO);
            dto.setInboundNum(totalNum);
            dto.setInboundNum0(totalNum.subtract(totalInboundNum));
            // åº“存价值 = å·²å‡ºåº“数量 * å•价(单价空值则默认0)
            BigDecimal unitPrice = dto.getUnitPrice() == null ? BigDecimal.ZERO : dto.getUnitPrice();
            dto.setTotalPrice(totalInboundNum.multiply(unitPrice));
        }
        return procurementPageDtoCopyIPage;
    }
    @Override
    public IPage<CustomStorage> listPageCopyByCustom(Page page, CustomStorage customStorage) {
//        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
//        customStorageLambdaQueryWrapper.groupBy(CustomStorage::getProductCategory, CustomStorage::getSpecificationModel,CustomStorage::getTaxInclusiveUnitPrice);
//        if(customStorage != null){
//            if(!StringUtils.isEmpty(customStorage.getSupplierName())){
//                customStorageLambdaQueryWrapper.like(CustomStorage::getSupplierName, customStorage.getSupplierName());
//            }
//            // ç­›é€‰å…¥åº“æ—¶é—´
//            if(customStorage.getInboundDate() != null){
//                customStorageLambdaQueryWrapper.eq(CustomStorage::getInboundDate, customStorage.getInboundDate());
//            }
//            if(!StringUtils.isEmpty(customStorage.getProductCategory())){
//                customStorageLambdaQueryWrapper.like(CustomStorage::getProductCategory, customStorage.getProductCategory());
//            }
//        }
//        customStorageLambdaQueryWrapper.orderByDesc(CustomStorage::getInboundDate);
        IPage<CustomStorage> pageList = customStorageMapper.listPageCopyByCustom(page, customStorage);
        List<CustomStorage> procurementPageDtoCopyList = pageList.getRecords();
        List<CustomStorage> procurementPageDtoCopyList = pageList.getRecords();
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtoCopyList.stream().map(CustomStorage::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            return pageList;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, 3);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return pageList;
        }
        for (CustomStorage dto : procurementPageDtoCopyList) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<Long> longs = listCopyIds(dto.getIds());
            LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
            procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, longs);
            procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, 3);
            List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
            if(CollectionUtils.isEmpty(procurementRecords)){
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                dto.setTotalInboundNum(BigDecimal.ZERO);
                return pageList;
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = procurementRecords.stream()
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å‡ºåº“数量 = æ€»æ•°é‡ - å¾…出库数量
@@ -621,26 +741,17 @@
    }
    @Override
    public CustomStorage detailManagementByCustom(ProcurementManagementUpdateDto procurementDto) {
        if(procurementDto == null) return null;
        return customStorageMapper.selectById(procurementDto.getId());
    }
    @Override
    public ProcurementPageDto detail(ProcurementUpdateDto procurementDto) {
        ProcurementPageDto procurementPageDto = new ProcurementPageDto();
        if(procurementDto == null) return procurementPageDto;
        ProcurementRecordStorage procurementRecordStorage = procurementRecordMapper.selectById(procurementDto.getId());
        if(procurementRecordStorage == null) return procurementPageDto;
        BeanUtils.copyProperties(procurementRecordStorage, procurementPageDto);
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(procurementRecordStorage.getSalesLedgerProductId());
        if(salesLedgerProduct != null){
            procurementPageDto.setProductCategory(salesLedgerProduct.getProductCategory());
            procurementPageDto.setSpecificationModel(salesLedgerProduct.getSpecificationModel());
            procurementPageDto.setUnit(salesLedgerProduct.getUnit());
            procurementPageDto.setTaxInclusiveUnitPrice(salesLedgerProduct.getTaxInclusiveUnitPrice());
    public BigDecimal getProcurementAmount(Long salesProductId) {
        LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordStorageLambdaQueryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, salesProductId)
                .eq(ProcurementRecordStorage::getType, 2);
        List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordMapper.selectList(procurementRecordStorageLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecordStorages)){
            return BigDecimal.ZERO;
        }
        return procurementPageDto;
        return procurementRecordStorages.stream()
                .map(ProcurementRecordStorage::getInboundNum)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
    @Override
@@ -669,8 +780,18 @@
                    .cartonSpecifications(detail.getCartonSpecifications())
                    .dollarPrice(detail.getDollarPrice())
                    .updateUser(loginUser.getUserId())
                    .createBy(procurementDto.getNickName());
                    .createBy(procurementDto.getNickName())
                    .productModelId(detail.getProductModelId());
            this.save(procurementRecordBuilder.build());
            // å…¥åº“成功减掉采购数量
//            LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>();
//            salesLedgerProductLambdaQueryWrapper.eq(SalesLedgerProduct::getId, detail.getId());
//            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectOne(salesLedgerProductLambdaQueryWrapper);
//            if(salesLedgerProduct == null){
//               throw new RuntimeException("未找到该商品");
//            }
//            salesLedgerProduct.setQuantity(salesLedgerProduct.getQuantity().subtract(detail.getInboundQuantity()));
//            salesLedgerProductMapper.updateById(salesLedgerProduct);
        }
        return 1;
    }
@@ -728,16 +849,30 @@
    public IPage<ProcurementPageDtoCopy> listPageCopy(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopy(page, procurementDto);
        List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords();
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtoCopyList.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            return procurementPageDtoCopyIPage;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType,1);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return procurementPageDtoCopyIPage;
        }
        for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
            List<Long> longs = listCopyIds(dto.getIds());
            LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
            procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, longs);
            procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType,1);
            List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
            if(CollectionUtils.isEmpty(procurementRecords)){
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()) && ProcurementRecordOut.getType().equals(1))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                dto.setTotalInboundNum(BigDecimal.ZERO);
                return procurementPageDtoCopyIPage;
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = procurementRecords.stream()
@@ -754,5 +889,22 @@
        }
        return procurementPageDtoCopyIPage;
    }
    @Override
    public IPage<ProductModel> listPageProductionStock(Page page) {
        ProductModel productModel = new ProductModel();
        IPage<ProductModel> iPage = productModelMapper.listPageProductModel(page, productModel);
        iPage.getRecords().forEach(item -> {
            item.setInboundNum(stockUtils.getStockQuantity(item.getId()).get("inboundNum"));
            item.setOutboundNum(stockUtils.getStockQuantity(item.getId()).get("outboundNum"));
            item.setStockQuantity(stockUtils.getStockQuantity(item.getId()).get("stockQuantity"));
        });
        return iPage;
    }
    @Override
    public IPage<ProcurementPageDto> listPageByProductProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDto> procurementPageDtoIPage = procurementRecordMapper.listPageByProductProduction(page, procurementDto);
        return procurementPageDtoIPage;
    }
}
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.procurementrecord.utils;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
@Component
@RequiredArgsConstructor
public class StockUtils {
    private final ProcurementRecordOutMapper procurementRecordOutMapper;
    private final ProcurementRecordMapper procurementRecordMapper;
    // èŽ·å–å•†å“å…¥åº“æ•°é‡,出库数量,剩余库存
    public Map<String, BigDecimal> getStockQuantity(Long productModelId) {
        // å…¥åº“数量
        BigDecimal sumQuantity = procurementRecordMapper.getSumQuantity(productModelId);
        // å‡ºåº“数量
        BigDecimal outQuantity = procurementRecordOutMapper.getSumQuantity(productModelId);
        // å‰©ä½™åº“å­˜
        BigDecimal stockQuantity = outQuantity.compareTo(sumQuantity) > 0 ? BigDecimal.ZERO : sumQuantity.subtract(outQuantity);
        Map<String, BigDecimal> stockMap = new HashMap<>();
        stockMap.put("inboundNum", sumQuantity);
        stockMap.put("outboundNum", outQuantity);
        stockMap.put("stockQuantity", stockQuantity);
        return stockMap;
    }
}
src/main/java/com/ruoyi/production/controller/ProcessRouteController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.service.ProcessRouteItemService;
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 java.util.Arrays;
@RestController
@RequestMapping("processRoute")
@Api(tags = "工艺路线")
public class ProcessRouteController {
    @Autowired
    private ProcessRouteService processRouteService;
    @Autowired
    private ProcessRouteItemService processRouteItemService;
    @GetMapping("page")
    @ApiOperation("分页查询")
    public R page(Page<ProcessRouteDto>  page, ProcessRouteDto processRouteDto) {
        return R.ok(processRouteService.pageProcessRouteDto(page, processRouteDto));
    }
    @ApiOperation("新增工艺路线")
    @PostMapping ()
    public R add(@RequestBody  ProcessRoute processRoute) {
        return R.ok(processRouteService.saveProcessRoute(processRoute));
    }
    @ApiOperation("修改工艺路线")
    @PutMapping ()
    public R update(@RequestBody  ProcessRoute processRoute) {
        return R.ok(processRouteService.updateById(processRoute));
    }
    @ApiOperation("删除工艺路线")
    @DeleteMapping("/{ids}")
    public R delete(@PathVariable("ids") Long[] ids) {
        //删除工艺路线详情
        processRouteItemService.remove(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId,Arrays.asList(ids)));
        return R.ok(processRouteService.removeBatchByIds(Arrays.asList(ids)));
    }
}
src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.framework.web.domain.R;
import com.ruoyi.production.dto.ProcessRouteItemDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.service.ProcessRouteItemService;
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;
@RestController
@RequestMapping("processRouteItem")
@Api(tags = "工艺路线明细")
public class ProcessRouteItemController {
    @Autowired
    private ProcessRouteItemService processRouteItemService;
    @GetMapping("list")
    public R listProcessRouteItemDto(ProcessRouteItemDto processRouteItemDto) {
        return R.ok(processRouteItemService.listProcessRouteItemDto(processRouteItemDto));
    }
    @PostMapping ()
    @ApiOperation("新增修改")
    public R addOrUpdate(@RequestBody ProcessRouteItem processRouteItem) {
        return R.ok(processRouteItemService.saveOrUpdate(processRouteItem));
    }
    @PostMapping ("/sort")
    @ApiOperation("排序")
    public R sort(@RequestBody ProcessRouteItem processRouteItem) {
        return R.ok(processRouteItemService.sort(processRouteItem));
    }
    @ApiOperation("删除工艺路线明细")
    @DeleteMapping("/batchDelete/{id}")
    @Log(title = "删除", businessType = BusinessType.DELETE)
    public AjaxResult batchDelete(@PathVariable("id") Long id) {
        return AjaxResult.success(processRouteItemService.batchDelete(id));
    }
}
src/main/java/com/ruoyi/production/controller/ProductBomController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.production.dto.ProductBomDto;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProductBom;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.service.ProcessRouteService;
import com.ruoyi.production.service.ProductBomService;
import com.ruoyi.production.service.ProductProcessService;
import io.swagger.annotations.ApiModelProperty;
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.List;
/**
 * <p>
 * BOM主表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 09:59:27
 */
@RestController
@RequestMapping("/productBom")
public class ProductBomController {
    @Autowired
    private ProductBomService productBomService;
    @Autowired
    private ProcessRouteService processRouteService;
    @GetMapping("/listPage")
    @Log(title = "BOM-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("BOM-分页查询")
    public AjaxResult listPage(Page page, ProductBomDto productBomDto) {
        IPage<ProductBomDto> listPage = productBomService.listPage(page, productBomDto);
        return AjaxResult.success(listPage);
    }
    @ApiModelProperty("新增BOM")
    @PostMapping("/add")
    @Log(title = "新增", businessType = BusinessType.INSERT)
    public AjaxResult add( @RequestBody ProductBom productBom) {
        return productBomService.add(productBom);
    }
    @ApiOperation("更新BOM")
    @Log(title = "修改", businessType = BusinessType.UPDATE)
    @PutMapping("/update")
    public AjaxResult update(@RequestBody ProductBom productBom) {
        return AjaxResult.success(productBomService.updateById(productBom));
    }
    @ApiOperation("删除BOM")
    @DeleteMapping("/batchDelete")
    @Log(title = "删除", businessType = BusinessType.DELETE)
    public AjaxResult batchDelete(@RequestBody List<Integer> ids) {
        List<ProcessRoute> list = processRouteService.list(Wrappers.<ProcessRoute>lambdaQuery().in(ProcessRoute::getBomId, ids));
        if (list.size()>0){
            return AjaxResult.error("该BOM已经存在对应的工艺路线,无法进行删除");
        }
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
        }
        return AjaxResult.success(productBomService.removeBatchByIds(ids));
    }
    @GetMapping("/getByModel")
    @Log(title = "BOM-根据选择的规格型号id查询存在的bom", businessType = BusinessType.OTHER)
    @ApiOperation("BOM-根据选择的规格型号id查询存在的bom")
    public AjaxResult getByModel(Long productModelId) {
        List<ProductBom> productBoms = productBomService.list(Wrappers.<ProductBom>lambdaQuery().eq(ProductBom::getProductModelId, productModelId));
        return AjaxResult.success(productBoms);
    }
}
src/main/java/com/ruoyi/production/controller/ProductOrderController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.service.ProductOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RequestMapping("productOrder")
@RestController
@Api(tags = "生产订单")
public class ProductOrderController {
    @Autowired
    private ProductOrderService productOrderService;
    @ApiOperation("分页查询")
    @GetMapping("page")
    public R page(ProductOrderDto productOrder, Page page) {
        return R.ok(productOrderService.pageProductOrder(page, productOrder));
    }
    @ApiOperation("绑定工艺路线")
    @PostMapping("/bindingRoute")
    public R bindingRoute(@RequestBody ProductOrder productOrder) {
        return R.ok(productOrderService.bindingRoute(productOrder));
    }
    @ApiOperation("查询规格型号对应的工艺路线")
    @GetMapping("/listProcessRoute")
    public R listProcessRoute(Long productModelId) {
        return R.ok(productOrderService.listProcessRoute(productModelId));
    }
    /**
     * å¯¼å‡ºç”Ÿäº§è®¢å•
     */
    @Log(title = "生产订单", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ProductOrderDto productOrderDto) {
        List<ProductOrderDto> list;
        list = productOrderService.pageProductOrder(new Page<>(1, -1), productOrderDto).getRecords();
        ExcelUtil<ProductOrderDto> util = new ExcelUtil<ProductOrderDto>(ProductOrderDto.class);
        util.exportExcel(response, list, "生产订单数据");
    }
    @ApiOperation("查询生产订单对应的BOM")
    @GetMapping("/listProcessBom")
    public R listProcessBom(Long orderId) {
        return R.ok(productOrderService.listProcessBom(orderId));
    }
}
src/main/java/com/ruoyi/production/controller/ProductProcessController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.oA.pojo.OaProject;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.service.impl.ProductProcessServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@Api(tags = "工序")
@RequestMapping("/productProcess")
public class ProductProcessController extends BaseController {
    @Autowired
    private ProductProcessServiceImpl productProcessService;
    @GetMapping("/listPage")
    @Log(title = "工序-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("工序-分页查询")
    public AjaxResult listPage(Page page, ProductProcessDto productProcessDto) {
        IPage<ProductProcessDto> listPage = productProcessService.listPage(page, productProcessDto);
        return AjaxResult.success(listPage);
    }
    @ApiModelProperty("新增工序")
    @PostMapping()
    @Log(title = "新增", businessType = BusinessType.INSERT)
    public AjaxResult add( @RequestBody ProductProcessDto productProcessDto) {
        return productProcessService.add(productProcessDto);
    }
    @ApiOperation("更新工序")
    @Log(title = "修改", businessType = BusinessType.UPDATE)
    @PutMapping("/update")
    public AjaxResult update(@RequestBody ProductProcess productProcess) {
        return AjaxResult.success(productProcessService.updateById(productProcess));
    }
    @ApiOperation("删除工序")
    @DeleteMapping("/batchDelete")
    @Log(title = "删除", businessType = BusinessType.DELETE)
    public AjaxResult batchDelete(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
        }
        return AjaxResult.success(productProcessService.removeBatchByIds(ids));
    }
    @ApiOperation("查询所有工序")
    @GetMapping("/list")
    public AjaxResult list() {
        return AjaxResult.success(productProcessService.list());
        }
    /**
     * å¯¼å…¥å·¥åº
     */
    @Log(title = "工序", businessType = BusinessType.IMPORT)
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file) throws Exception {
        return productProcessService.importData(file);
    }
    @PostMapping("/downloadTemplate")
    @Log(title = "工序-下载模板", businessType = BusinessType.EXPORT)
    public void downloadTemplate(HttpServletResponse response) {
        ExcelUtil<ProductProcess> util = new ExcelUtil<ProductProcess>(ProductProcess.class);
        util.importTemplateExcel(response, "工序模板");
    }
}
src/main/java/com/ruoyi/production/controller/ProductProcessRouteController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.production.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 02:51:09
 */
@RestController
@RequestMapping("/productProcessRoute")
public class ProductProcessRouteController {
}
src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductProcessRouteItemDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductProcessRouteItemService;
import com.ruoyi.production.service.ProductProcessRouteService;
import com.ruoyi.production.service.ProductWorkOrderService;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@RequestMapping("/productProcessRoute")
@RestController
@AllArgsConstructor
@Api(tags = "生产工艺路线")
public class ProductProcessRouteItemController {
    private ProductProcessRouteItemService productProcessRouteItemService;
    private ProductProcessRouteService productProcessRouteService;
    @GetMapping("list")
    @ApiOperation("根据Id查询工艺路线子表")
    public R list(Long orderId) {
        return R.ok(productProcessRouteItemService.listItem(orderId));
    }
    @GetMapping("listMain")
    @ApiOperation("根据Id查询工艺路线主表")
    public R listMain(Long orderId) {
        return R.ok(productProcessRouteService.listMain(orderId));
    }
    @PostMapping("/addRouteItem")
    @ApiOperation("新增生产订单的工艺路线详情")
    public R addRouteItem(@RequestBody ProductProcessRouteItem productProcessRouteItem) {
        return productProcessRouteItemService.addRouteItem(productProcessRouteItem);
    }
    @PostMapping("/updateRouteItem")
    @ApiOperation("修改生产订单的工艺路线详情")
    public R updateRouteItem(@RequestBody ProductProcessRouteItem productProcessRouteItem) {
        return R.ok(productProcessRouteItemService.updateById(productProcessRouteItem));
    }
    @DeleteMapping("/deleteRouteItem/{id}")
    @ApiOperation("删除生产工艺路线")
    public R deleteRouteItem(@PathVariable("id") Long id) {
        return productProcessRouteItemService.deleteRouteItem(id);
    }
    @PostMapping ("/sortRouteItem")
    @ApiOperation("排序")
    public R sortRouteItem(@RequestBody ProductProcessRouteItem productProcessRouteItem) {
        return R.ok(productProcessRouteItemService.sortRouteItem(productProcessRouteItem));
    }
}
src/main/java/com/ruoyi/production/controller/ProductStructureController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.framework.web.domain.R;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.pojo.ProductStructure;
import com.ruoyi.production.service.ProductStructureService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
@RequestMapping("productStructure")
@RestController
@Api(tags = "BOM")
public class ProductStructureController {
    @Autowired
    private ProductStructureService productStructureService;
    @ApiOperation("新增BOM")
    @PostMapping()
    public R addOrUpdate(@RequestBody ProductStructureDto productStructureDto){
        return R.ok(productStructureService.addProductStructureDto(productStructureDto));
    }
    @ApiOperation("BOM查看详情")
    @GetMapping("/listBybomId/{bomId}")
    public R listBybomId( @PathVariable("bomId") Long bomId){
        return R.ok(productStructureService.listBybomId(bomId));
    }
}
src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductWorkOrderDto;
import com.ruoyi.production.service.ProductWorkOrderService;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RestController
@AllArgsConstructor
@RequestMapping("/productWorkOrder")
public class ProductWorkOrderController {
    private ProductWorkOrderService productWorkOrderservice;
    /**
     * äº§å“å·¥å•实体类分页查询
     */
    @ApiOperation("产品工单实体类分页查询")
    @GetMapping("/page")
    public R page(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
        return R.ok(productWorkOrderservice.listPage(page, productWorkOrder));
    }
    /**
     * äº§å“å·¥å•æ›´æ–°
     */
    @ApiOperation("产品工单更新")
    @PostMapping ("/updateProductWorkOrder")
    public R updateProductWorkOrder(@RequestBody ProductWorkOrderDto productWorkOrderDto) {
        return R.ok(productWorkOrderservice.updateProductWorkOrder(productWorkOrderDto));
    }
}
src/main/java/com/ruoyi/production/controller/ProductionProductInputController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductionProductInputDto;
import com.ruoyi.production.service.ProductionProductInputService;
import io.swagger.annotations.Api;
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;
@RequestMapping("productionProductInput")
@RestController
@Api(value = "生产投入")
public class ProductionProductInputController {
    @Autowired
    private ProductionProductInputService productionProductInputService;
    @GetMapping("listPage")
    public R page(Page<ProductionProductInputDto> page, ProductionProductInputDto productionProductInputDto) {
        return R.ok(productionProductInputService.listPageProductionProductInputDto(page, productionProductInputDto));
    }
}
src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductProcessRouteItemDto;
import com.ruoyi.production.dto.ProductionProductMainDto;
import com.ruoyi.production.service.ProductionProductMainService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
@RequestMapping("productionProductMain")
@RestController
@Api(value = "生产报工")
public class ProductionProductMainController {
    @Autowired
    private ProductionProductMainService productionProductMainService;
    /**
     * æŠ¥å·¥æŸ¥è¯¢
     * @param page
     * @param productionProductMainDto
     * @return
     */
    @GetMapping("listPage")
    public R page(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto) {
        return R.ok(productionProductMainService.listPageProductionProductMainDto(page, productionProductMainDto));
    }
    /**
     * æŠ¥å·¥æ–°å¢žæ›´æ–°
     * @param productionProductMainDto
     * @return
     */
    @PostMapping("addProductMain")
    public R addProductMain(@RequestBody ProductionProductMainDto productionProductMainDto) {
        return R.ok(productionProductMainService.addProductMain(productionProductMainDto));
    }
    @ApiOperation("删除报工")
    @DeleteMapping("/delete")
    @Transactional(rollbackFor = Exception.class)
    public R delete(@RequestBody ProductionProductMainDto productionProductMainDto) {
        return R.ok(productionProductMainService.removeProductMain(productionProductMainDto));
    }
}
src/main/java/com/ruoyi/production/controller/ProductionProductOutputController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductionProductInputDto;
import com.ruoyi.production.dto.ProductionProductOutputDto;
import com.ruoyi.production.service.ProductionProductInputService;
import com.ruoyi.production.service.ProductionProductOutputService;
import io.swagger.annotations.Api;
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;
@RequestMapping("productionProductOutput")
@RestController
@Api(value = "生产产出")
public class ProductionProductOutputController {
    @Autowired
    private ProductionProductOutputService productionProductOutputService;
    @GetMapping("listPage")
    public R page(Page<ProductionProductOutputDto> page, ProductionProductOutputDto productionProductOutputDto) {
        return R.ok(productionProductOutputService.listPageProductionProductOutputDto(page, productionProductOutputDto));
    }
}
src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java
@@ -1,5 +1,6 @@
package com.ruoyi.production.controller;
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.ruoyi.common.utils.poi.ExcelUtil;
@@ -12,14 +13,22 @@
import com.ruoyi.production.dto.ProductionDispatchAddDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
import com.ruoyi.production.mapper.SpeculativeTradingInfoMapper;
import com.ruoyi.production.pojo.SpeculativeTradingInfo;
import com.ruoyi.production.service.impl.SalesLedgerSchedulingServiceImpl;
import com.ruoyi.sales.mapper.LossMapper;
import com.ruoyi.sales.pojo.Loss;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
/**
@@ -33,6 +42,70 @@
    @Autowired
    private SalesLedgerSchedulingServiceImpl salesLedgerSchedulingService;
    @Autowired
    private SpeculativeTradingInfoMapper speculativeTradingInfoMapper;
    @Autowired
    private LossMapper lossMapper;
    @GetMapping("/loss")
    @Log(title = "生产管理-生产派工-损耗率", businessType = BusinessType.OTHER)
    @ApiOperation("生产管理-生产派工-损耗率")
    public AjaxResult loss() {
        return AjaxResult.success(lossMapper.selectOne(new LambdaQueryWrapper<Loss>().last("limit 1")));
    }
    @PostMapping("/addLoss")
    @Log(title = "生产管理-生产派工-添加损耗率", businessType = BusinessType.INSERT)
    @ApiOperation("生产管理-生产派工-添加损耗率")
    public AjaxResult addLoss(@RequestBody Loss loss) {
        lossMapper.insert(loss);
        return AjaxResult.success("添加损耗率成功");
    }
    @PostMapping("/updateLoss")
    @Log(title = "生产管理-生产派工-修改损耗率", businessType = BusinessType.UPDATE)
    @ApiOperation("生产管理-生产派工-修改损耗率")
    public AjaxResult updateLoss(@RequestBody Loss loss) {
        lossMapper.updateById(loss);
        return AjaxResult.success("修改损耗率成功");
    }
    @GetMapping("/list")
    @Log(title = "生产管理-生产派工-炒机信息", businessType = BusinessType.OTHER)
    @ApiOperation("生产管理-生产派工-炒机信息")
    public AjaxResult list() {
        List<SpeculativeTradingInfo> result = speculativeTradingInfoMapper.selectList(null);
        result.forEach(item -> {
            item.setCurrentWorkLoad(salesLedgerSchedulingService.getSchedulingNumBySpeculativeTradingName(item.getName()).divide(new BigDecimal(1000),2, RoundingMode.CEILING));
            item.setVacant(item.getWorkLoad().subtract(item.getCurrentWorkLoad()).setScale(2, RoundingMode.HALF_UP)); //保留两位小数
        });
        return AjaxResult.success(result);
    }
    @PostMapping("/addSpeculatTrading")
    @Log(title = "生产管理-生产派工-添加炒机信息", businessType = BusinessType.INSERT)
    @ApiOperation("生产管理-生产派工-添加炒机信息")
    public AjaxResult addSpeculatTrading(@RequestBody List<SpeculativeTradingInfo> speculativeTradingInfo) {
        if(CollectionUtils.isEmpty(speculativeTradingInfo)) return AjaxResult.error("数据组不能为空");
        speculativeTradingInfo.forEach(item -> {
            speculativeTradingInfoMapper.insert(item);
        });
        return AjaxResult.success("添加炒机信息成功");
    }
    @PostMapping("/updateSpeculatTrading")
    @Log(title = "生产管理-生产派工-修改炒机信息", businessType = BusinessType.UPDATE)
    @ApiOperation("生产管理-生产派工-修改炒机信息")
    public AjaxResult updateSpeculatTrading(@RequestBody List<SpeculativeTradingInfo> speculativeTradingInfo) {
        if(CollectionUtils.isEmpty(speculativeTradingInfo)) return AjaxResult.error("数据组不能为空");
        speculativeTradingInfo.forEach(item -> {
            speculativeTradingInfoMapper.updateById(item);
        });
        return AjaxResult.success("修改炒机信息成功");
    }
    @GetMapping("/listPage")
@@ -69,7 +142,18 @@
    @ApiOperation("生产管理-生产订单-生产派工")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult productionDispatch(@RequestBody ProductionDispatchAddDto productionDispatchAddDto) {
        int result = salesLedgerSchedulingService.productionDispatch(productionDispatchAddDto);
        List<ProductionDispatchAddDto> productionDispatchAddDtoList = new ArrayList<>();
        productionDispatchAddDtoList.add(productionDispatchAddDto);
        String result = salesLedgerSchedulingService.productionDispatch(productionDispatchAddDtoList);
        return AjaxResult.success(result);
    }
    @PostMapping("/productionDispatchList")
    @Log(title = "生产管理-生产订单-自动派工", businessType = BusinessType.INSERT)
    @ApiOperation("生产管理-生产订单-自动派工")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult productionDispatchList(@RequestBody List<ProductionDispatchAddDto> productionDispatchAddDto) {
        String result = salesLedgerSchedulingService.productionDispatch(productionDispatchAddDto);
        return AjaxResult.success(result);
    }
src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProcessRoute;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ProcessRouteDto extends ProcessRoute {
    private Long productId;
    private String productName;
    @ApiModelProperty("规格")
    private String model;
    private String bomNo;
}
src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProcessRouteItem;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class ProcessRouteItemDto extends ProcessRouteItem {
    @ApiModelProperty(value = "工序名称")
    private String processName;
    @ApiModelProperty(value = "工艺路线名称")
    private String routeName;
    @ApiModelProperty(value = "生产炒机")
    private String speculativeTradingName;
    @ApiModelProperty(value = "产品名称")
    private String productName;
    @ApiModelProperty(value = "单位")
    private String unit;
    private Long productId;
    private String model;
}
src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java
@@ -30,7 +30,6 @@
    @ApiModelProperty(value = "排产数量")
    private BigDecimal schedulingNum;
    /**
     * å·¥æ—¶å®šé¢
     */
@@ -38,15 +37,47 @@
    private BigDecimal workHours;
    /**
     * äº§çº¿
     */
    @ApiModelProperty(value = "产线")
    private String productionLine;
    /**
     * å·¥åº
     */
    @ApiModelProperty(value = "工序")
    private String process;
    /**
     * æŽ’产日期
     */
    @ApiModelProperty(value = "排产日期")
    private String schedulingDate;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * æŸè€—
     */
    @ApiModelProperty(value = "损耗")
    private String loss;
    /**
     * å£å‘³åˆ†ç±»
     */
    @ApiModelProperty(value = "口味分类")
    private String type;
    /**
     * é¢†ç”¨
     */
    @ApiModelProperty(value = "领用")
    private String receive;
}
src/main/java/com/ruoyi/production/dto/ProductBomDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductBom;
import lombok.Data;
import java.util.List;
//分页查询回显数据
@Data
public class ProductBomDto extends ProductBom {
    //产品名称
    private String productName;
    //产品规格型号
    private String productModelName;
}
src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.ruoyi.production.dto;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.production.pojo.ProductOrder;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ExcelIgnoreUnannotated
public class ProductOrderDto extends ProductOrder {
    @ApiModelProperty(value = "销售合同号")
    @Excel(name = "销售合同号")
    private String salesContractNo;
    @ApiModelProperty(value = "项目名")
    @Excel(name = "项目名")
    private String projectName;
    @ApiModelProperty(value = "客户名称")
    @Excel(name = "客户名称")
    private String customerName;
    @ApiModelProperty(value = "产品名称")
    @Excel(name = "产品名称")
    private String productCategory;
    @ApiModelProperty(value = "规格")
    @Excel(name = "规格")
    private String specificationModel;
    @ApiModelProperty(value = "工艺路线编号")
    @Excel(name = "工艺路线编号")
    private String processRouteCode;
    @ApiModelProperty(value = "完成状态")
    @Excel(name = "完成状态")
    private BigDecimal completionStatus;
    @ApiModelProperty(value = "BOM编号")
    @Excel(name = "BOM编号")
    private String bomNo;
}
src/main/java/com/ruoyi/production/dto/ProductProcessDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductProcess;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel
public class ProductProcessDto extends ProductProcess {
}
src/main/java/com/ruoyi/production/dto/ProductProcessRouteItemDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class ProductProcessRouteItemDto extends ProductProcessRouteItem {
    @ApiModelProperty(value = "工序名称")
    private String processName;
    @ApiModelProperty(value = "产品名称")
    private String productCategory;
    @ApiModelProperty(value = "单位")
    private String unit;
    private Long productId;
    private String productName;
    private String model;
}
src/main/java/com/ruoyi/production/dto/ProductStructureDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductStructure;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class ProductStructureDto extends ProductStructure {
    @ApiModelProperty(value = "工艺名称")
    private String processName;
    @ApiModelProperty(value = "产品名称")
    private String productName;
    @ApiModelProperty(value = "产品id")
    private Long productId;
    private String model;
    private List<ProductStructure> productStructureList;
}
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.production.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.production.pojo.ProductWorkOrder;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
@EqualsAndHashCode(callSuper = true)
@Data
public class ProductWorkOrderDto extends ProductWorkOrder {
    //产品名称
    @ApiModelProperty(value = "产品名称")
    private String productName;
    //规格
    @ApiModelProperty(value = "规格")
    private String model;
    //工序
    @ApiModelProperty(value = "工序")
    private String processName;
    //单位
    @ApiModelProperty(value = "单位")
    private String unit;
    //生产订单号
    @ApiModelProperty(value = "生产订单号")
    private String productOrderNpsNo;
    @ApiModelProperty(value = "完成进度")
    private BigDecimal completionStatus;
}
src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.production.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -38,4 +39,19 @@
    @ApiModelProperty(value = "排产日期")
    private String schedulingDate;
    /**
     * ç”Ÿäº§ç‚’机
     */
    private String speculativeTradingName;
    /**
     * äº§çº¿
     */
    @ApiModelProperty(value = "产线")
    private String productionLine;
    /**
     * è§„格型号
     */
    private String specificationModel;
}
src/main/java/com/ruoyi/production/dto/ProductionProductInputDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductionProductInput;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ProductionProductInputDto extends ProductionProductInput {
    @ApiModelProperty(value = "报工单号")
    private String productNo;
    @ApiModelProperty(value = "产品型号")
    private String model;
}
src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductionProductMain;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class ProductionProductMainDto extends ProductionProductMain {
    @ApiModelProperty(value = "工单编号")
    private String workOrderNo;
    @ApiModelProperty(value = "工单状态")
    private String workOrderStatus;
    @ApiModelProperty(value = "报工人员昵称")
    private String nickName;
    @ApiModelProperty(value = "报工数量")
    private BigDecimal quantity;
    @ApiModelProperty(value = "是否报工")
    private boolean reportWork;
    @ApiModelProperty(value = "报工id")
    private Long productMainId;
}
src/main/java/com/ruoyi/production/dto/ProductionProductOutputDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductionProductInput;
import com.ruoyi.production.pojo.ProductionProductOutput;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ProductionProductOutputDto extends ProductionProductOutput {
    @ApiModelProperty(value = "报工单号")
    private String productNo;
    @ApiModelProperty(value = "产品型号")
    private String model;
}
src/main/java/com/ruoyi/production/dto/ProductionReportDto.java
@@ -38,4 +38,16 @@
    @ApiModelProperty(value = "生产日期")
    private String schedulingDate;
    /**
     * å…¥åº“单价
     */
    @ApiModelProperty(value = "入库单价")
    private BigDecimal unitPrice;
    /**
     * å…¥åº“总价
     */
    @ApiModelProperty(value = "入库总价")
    private BigDecimal totalPrice;
}
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java
@@ -27,6 +27,15 @@
    @ApiModelProperty(value = "销售台账ID")
    private Long salesLedgerId;
    @ApiModelProperty(value = "生产总量(单位kg)")
    private BigDecimal totalProduction;
    /**
     * ç”Ÿäº§ç‚’机
     */
    @Excel(name = "生产炒机")
    private String speculativeTradingName;
    /**
     * é”€å”®åˆåŒå·
     */
@@ -116,6 +125,9 @@
    @Excel(name = "状态")
    private String status;
    @Excel(name = "进度")
    private BigDecimal progress;
    @ApiModelProperty(value = "租户ID")
    private Long tenantId;
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java
@@ -23,9 +23,22 @@
    @ApiModelProperty(value = "销售产品ID")
    private Long salesLedgerProductId;
    @ApiModelProperty(value = "生产总量(单位kg)")
    private BigDecimal totalProduction;
    @ApiModelProperty(value = "销售台账ID")
    private Long salesLedgerId;
    /**
     * ç”Ÿäº§ç‚’机
     */
    @Excel(name = "生产炒机")
    private String speculativeTradingName;
    @ApiModelProperty(value = "产线")
    @Excel(name = "产线")
    private String productionLine;
    @ApiModelProperty(value = "开始时间")
    private String entryDateStart;
src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java
@@ -65,6 +65,14 @@
    @ApiModelProperty(value = "工序")
    @Excel(name = "工序")
    private String process;
    /**
     * äº§çº¿
     */
    @ApiModelProperty(value = "产线")
    @Excel(name = "产线")
    private String productionLine;
    /**
     * æŽ’产日期
     */
@@ -86,5 +94,40 @@
    @Excel(name = "状态", readConverterExp = "1=待生产,2=生产中,3=已报工")
    private String statusName;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    @Excel(name = "备注")
    private String remark;
    /**
     * æŸè€—
     */
    @ApiModelProperty(value = "损耗")
    @Excel(name = "损耗")
    private String loss;
    /**
     * ç»‘定机器
     */
    @ApiModelProperty(value = "绑定机器")
    @Excel(name = "绑定机器")
    private String speculativeTradingName;
    /**
     * å£å‘³åˆ†ç±»
     */
    @ApiModelProperty(value = "口味分类")
    @Excel(name = "口味分类")
    private String type;
    /**
     * é¢†ç”¨
     */
    @ApiModelProperty(value = "领用")
    @Excel(name = "领用")
    private String receive;
}
src/main/java/com/ruoyi/production/mapper/ProcessRouteItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.production.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.production.dto.ProcessRouteItemDto;
import com.ruoyi.production.pojo.ProcessRouteItem;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ProcessRouteItemMapper  extends BaseMapper<ProcessRouteItem> {
    List<ProcessRouteItemDto> listProcessRouteItemDto(@Param("c") ProcessRouteItemDto processRouteItemDto);
}
src/main/java/com/ruoyi/production/mapper/ProcessRouteMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.production.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.production.dto.ProcessRouteDto;
import com.ruoyi.production.pojo.ProcessRoute;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface ProcessRouteMapper extends BaseMapper<ProcessRoute> {
    IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page,@Param("c") ProcessRouteDto processRouteDto);
}
src/main/java/com/ruoyi/production/mapper/ProductBomMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.production.dto.ProductBomDto;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.pojo.ProductBom;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * BOM主表 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 09:59:27
 */
@Mapper
public interface ProductBomMapper extends BaseMapper<ProductBom> {
    IPage<ProductBomDto> listPage(Page page, @Param("c") ProductBomDto productBomDto);
    ProductBomDto getById(@Param("bomId") Long bomId);
}
src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.production.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.production.dto.ProductBomDto;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProductOrder;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ProductOrderMapper extends BaseMapper<ProductOrder> {
    IPage<ProductOrderDto> pageProductOrder(Page page, @Param("c") ProductOrderDto productOrder);
    /**
     * æ ¹æ®è®¢å•ID查询工单报工
     */
     ProductOrderDto productMainByOrderId(@Param("c") ProductOrder productOrder);
    List<ProcessRoute> listProcessRoute(@Param("productModelId") Long productModelId);
    List<ProductStructureDto> listProcessBom(@Param("orderId") Long orderId);
}
src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.production.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.production.dto.ProductProcessDto;
import com.ruoyi.production.pojo.ProductProcess;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface ProductProcessMapper extends BaseMapper<ProductProcess> {
    IPage<ProductProcessDto> listPage(Page page,@Param("productProcessDto") ProductProcessDto productProcessDto);
}
src/main/java/com/ruoyi/production/mapper/ProductProcessRouteItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.dto.ProductProcessRouteItemDto;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ProductProcessRouteItemMapper extends BaseMapper<ProductProcessRouteItem> {
    List<ProductProcessRouteItemDto> listItem(@Param("orderId") Long orderId);
}
src/main/java/com/ruoyi/production/mapper/ProductProcessRouteMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.production.mapper;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.pojo.ProductProcessRoute;
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-01-15 02:51:09
 */
@Mapper
public interface ProductProcessRouteMapper extends BaseMapper<ProductProcessRoute> {
    ProcessRouteDto listMain(@Param("orderId") Long orderId);
}
src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.production.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.production.dto.ProductStructureDto;
import com.ruoyi.production.pojo.ProductStructure;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ProductStructureMapper  extends BaseMapper<ProductStructure> {
    List<ProductStructureDto> listBybomId(@Param("bomId") Long bomId);
    List<ProductStructureDto> listByproductModelId(@Param("productModelId") Long productModelId);
}
src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.production.dto.ProductWorkOrderDto;
import com.ruoyi.production.pojo.ProductWorkOrder;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
@Mapper
public interface ProductWorkOrderMapper extends BaseMapper<ProductWorkOrder> {
    IPage<ProductWorkOrderDto> pageProductWorkOrder(Page<ProductWorkOrderDto> page, @Param("c") ProductWorkOrderDto productWorkOrder);
    int updatePlanQuantity(Map<String, Object> params);
    /**
     * å›žæ»šå·¥å•计划数量:从production_product_output取quantity加回plan_quantity
     * @param productMainId
     * @return
     */
    int rollbackPlanQuantity(@Param("productMainId") Long productMainId);
    List<ProductWorkOrderDto> selectProductWorkOrderDtoList();
}
src/main/java/com/ruoyi/production/mapper/ProductionProductInputMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.production.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.production.dto.ProductionProductInputDto;
import com.ruoyi.production.pojo.ProductionProductInput;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ProductionProductInputMapper extends BaseMapper<ProductionProductInput> {
    IPage<ProductionProductInputDto> listPageProductionProductInputDto(Page page, @Param("c") ProductionProductInputDto productionProductInputDto);
    /**
     * æ ¹æ®ç”Ÿäº§ä¸»è¡¨ID批量删除投入表数据
     */
    int deleteByProductMainIds(@Param("productMainIds") List<Long> productMainIds);
}
src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.production.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.production.dto.ProductionProductMainDto;
import com.ruoyi.production.pojo.ProductionProductMain;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ProductionProductMainMapper extends BaseMapper<ProductionProductMain> {
    IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, @Param("c") ProductionProductMainDto productionProductMainDto);
    /**
     * æ ¹æ®å·¥å•ID批量删除生产主表数据
     */
    int deleteByWorkOrderIds(@Param("workOrderIds") List<Long> workOrderIds);
}
src/main/java/com/ruoyi/production/mapper/ProductionProductOutputMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.production.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.production.dto.ProductionProductOutputDto;
import com.ruoyi.production.pojo.ProductionProductOutput;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ProductionProductOutputMapper extends BaseMapper<ProductionProductOutput> {
    IPage<ProductionProductOutputDto> listPageProductionProductOutputDto(Page page, @Param("c") ProductionProductOutputDto productionProductOutputDto);
    /**
     * æ ¹æ®ç”Ÿäº§ä¸»è¡¨ID批量删除产出表数据
     */
    int deleteByProductMainIds(@Param("productMainIds") List<Long> productMainIds);
}
src/main/java/com/ruoyi/production/mapper/SpeculativeTradingInfoMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.pojo.SpeculativeTradingInfo;
/**
 * @author :yys
 * @date : 2025/11/11 15:40
 */
public interface SpeculativeTradingInfoMapper extends BaseMapper<SpeculativeTradingInfo> {
}
src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@TableName("process_route")
@Data
@ApiModel(value = "processRoute", description = "工艺路线主表")
public class ProcessRoute {
    @ApiModelProperty(value = "序号")
    private Long id;
    @ApiModelProperty(value = "产品ID")
    //product_model
    private Long productModelId;
    @ApiModelProperty(value = "描述")
    private String description;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "工艺路线编码")
    private String processRouteCode;
    @ApiModelProperty(value = "BOM的ID")
    private Long bomId;
}
src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("process_route_item")
@ApiModel(value = "processRouteItem", description = "工艺路线子表")
public class ProcessRouteItem {
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "工艺路线id")
    private Long routeId;
    @ApiModelProperty(value = "工序id")
    private Long processId;
    @ApiModelProperty(value ="产品id")
    private Long productModelId;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value ="拖动排序")
    private Integer dragSort;
}
src/main/java/com/ruoyi/production/pojo/ProductBom.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.production.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 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>
 * BOM主表
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 09:59:27
 */
@Getter
@Setter
@TableName("product_bom")
@ApiModel(value = "ProductBom对象", description = "BOM主表")
public class ProductBom implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("bom编号")
    private String bomNo;
    @ApiModelProperty("产品规格id")
    private Long productModelId;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("版本号")
    private String version;
    @ApiModelProperty("创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("创建者")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    @ApiModelProperty("更新者")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    @ApiModelProperty("租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/production/pojo/ProductOrder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@TableName("product_order")
public class ProductOrder  implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * é”€å”®å°è´¦id
     */
    @ApiModelProperty(value = "销售台账id")
    private Long salesLedgerId;
    /**
     * é”€å”®å°è´¦äº§å“id(sales_ledger_product)
     */
    @ApiModelProperty(value = "销售台账产品id")
    private Long productModelId;
    /**
     * å·¥è‰ºè·¯çº¿id
     */
    @ApiModelProperty(value = "工艺路线id")
    private Long routeId;
    /**
     * ç”Ÿäº§è®¢å•号
     */
    @ApiModelProperty(value = "生产订单号")
    @Excel(name = "生产订单号")
    private String npsNo;
    /**
     * ç§Ÿæˆ·id
     */
    @ApiModelProperty(value = "租户id")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    //创建时间
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "创建时间")
    private LocalDateTime createTime;
    //修改时间
    @ApiModelProperty(value = "修改时间")
    @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(value = "需求数量")
    @Excel(name = "需求数量")
    private BigDecimal quantity;
    /**
     * å®Œæˆæ•°é‡
     */
    @ApiModelProperty(value = "完成数量")
    @Excel(name = "完成数量")
    private BigDecimal completeQuantity;
    @Excel(name = "开始时间")
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束时间")
    @Excel(name = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;
}
src/main/java/com/ruoyi/production/pojo/ProductProcess.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.production.pojo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@TableName("product_process")
@Data
@ExcelIgnoreUnannotated
@ApiModel(value = "productProcess", description = "工序表")
public class ProductProcess implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * å·¥åºåç§°
     */
    @Excel(name = "工序名称")
    private String name;
    /**
     * å·¥åºç¼–号
     */
    @Excel(name = "工序编号")
    private String no;
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "备注")
    private String remark;
    /**
     * å·¥èµ„定额
     */
    @Excel(name = "工资定额")
    private BigDecimal salaryQuota;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.production.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-01-15 02:51:09
 */
@Getter
@Setter
@TableName("product_process_route")
@ApiModel(value = "ProductProcessRoute对象", description = "")
public class ProductProcessRoute implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("产品id")
    //product_model
    private Long productModelId;
    @ApiModelProperty("描述")
    private String description;
    @ApiModelProperty("租户id")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty("录入时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("关联bom的id")
    private Long bomId;
    @ApiModelProperty("工艺路线编码")
    private String processRouteCode;
    @ApiModelProperty("生产订单的id")
    private Long productOrderId;
}
src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("product_process_route_item")
public class ProductProcessRouteItem {
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "生产订单id(product_order_id)")
    private Long productOrderId;
    @ApiModelProperty(value = "生产订单的工艺路线id(product_process_route)")
    private Long productRouteId;
    @ApiModelProperty(value = "工序id")
    private Long processId;
    @ApiModelProperty(value ="产品id")
    private Long productModelId;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value ="拖动排序")
    private Integer dragSort;
}
src/main/java/com/ruoyi/production/pojo/ProductStructure.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.math.BigDecimal;
@TableName("product_structure")
@Data
@ApiModel(value = "ProductStructure", description = "BOM子表")
public class ProductStructure {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * äº§å“åç§°
     */
    private Long productModelId;
    /**
     * å·¥åºid
     */
    private Long processId;
    /**
     * å•位产出需要数量
     */
    private BigDecimal unitQuantity;
    /**
     * éœ€æ±‚数量
     */
    private BigDecimal demandedQuantity;
    /**
     * å•位
     */
    private String unit;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * å…³è”BOMid
     */
    private Long bomId;
}
src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * äº§å“å·¥å•实体类
 * å¯¹åº”数据库表:product_work_order
 */
@Data
@TableName("product_work_order")
public class ProductWorkOrder implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®id
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * å·¥è‰ºè·¯çº¿é¡¹ç›®id
     */
    @ApiModelProperty(value = "工艺路线项目id")
    private Long productProcessRouteItemId;
    /**
     * ç”Ÿäº§è®¢å•id
     */
    @ApiModelProperty(value = "生产订单id")
    private Long productOrderId;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @ApiModelProperty(value = "修改时间")
    @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(value = "工单编号")
    private String workOrderNo;
    /**
     * çŠ¶æ€  1 å¾…确认  2 å¾…生产 3生产中 4已完成
     */
    @ApiModelProperty(value = "状态  1 å¾…确认  2 å¾…生产 3生产中 4已完成")
    private Integer status;
    /**
     * ç§Ÿæˆ·id
     */
    @ApiModelProperty(value = "租户id")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * è®¡åˆ’开始时间
     */
    @ApiModelProperty(value = "计划开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate planStartTime;
    /**
     * è®¡åˆ’结束时间
     */
    @ApiModelProperty(value = "计划结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate planEndTime;
    /**
     * å®žé™…开始时间
     */
    @ApiModelProperty(value = "实际开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate actualStartTime;
    /**
     * å®žé™…结束时间
     */
    @ApiModelProperty(value = "实际结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate actualEndTime;
    /**
     * éœ€æ±‚量
     */
    @ApiModelProperty(value = "需求数量")
    private BigDecimal planQuantity;
    /**
     * å®Œæˆæ•°é‡
     */
    @ApiModelProperty(value = "完成数量")
    private BigDecimal completeQuantity;
}
src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@TableName("production_product_input")
public class ProductionProductInput {
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "报工id")
    private Long productMainId;
    @ApiModelProperty(value = "产品id")
    private Long productModelId;
    @ApiModelProperty(value = "数量")
    private BigDecimal quantity;
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("production_product_main")
public class ProductionProductMain {
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "报工单号")
    private String productNo;
    @ApiModelProperty(value = "报工人员id")
    private Long userId;
    @ApiModelProperty(value = "报工人员")
    private String userName;
    @ApiModelProperty(value = "生产项目id")
    private Long productProcessRouteItemId;
    @ApiModelProperty(value = "工单id")
    private Long workOrderId;
    @ApiModelProperty(value = "报工状态")
    private Integer status;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@TableName("production_product_output")
public class ProductionProductOutput {
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "报工id")
    private Long productMainId;
    @ApiModelProperty(value = "产品id")
    private Long productModelId;
    @ApiModelProperty(value = "数量")
    private BigDecimal quantity;
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java
@@ -1,6 +1,7 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Builder;
import lombok.Data;
@@ -38,6 +39,16 @@
    private Long schedulingUserId;
    /**
     * ç”Ÿäº§ç‚’机
     */
    private String speculativeTradingName;
    /**
     * äº§çº¿
     */
    private String productionLine;
    /**
     * æ´¾å·¥äººåç§°
     */
    private String schedulingUserName;
src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java
@@ -1,6 +1,7 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
@@ -67,6 +68,12 @@
     * å·¥åº
     */
    private String process;
    /**
     * äº§çº¿
     */
    private String productionLine;
    /**
     * æŽ’产日期
     */
@@ -78,6 +85,26 @@
    private Integer status;
    /**
     * å¤‡æ³¨
     */
    private String remark;
    /**
     * æŸè€—
     */
    private String loss;
    /**
     * å£å‘³åˆ†ç±»
     */
    private String type;
    /**
     * é¢†ç”¨
     */
    private String receive;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
src/main/java/com/ruoyi/production/pojo/SpeculativeTradingInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * @author :yys
 * @date : 2025/11/11 15:38
 */
@TableName("speculative_trading_info")
@Data
public class SpeculativeTradingInfo {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * ç‚’机名称
     */
    private String name;
    /**
     * ç‚’机工作量(单位kg)
     */
    private BigDecimal workLoad;
    /**
     * æŽ’序
     */
    private Integer sort;
    /**
     * ç‚’机正在工作量(单位kg)
     */
    @TableField(exist = false)
    private BigDecimal currentWorkLoad;
    /**
     * ç‚’机空余工作量(单位kg)
     */
    @TableField(exist = false)
    private BigDecimal vacant;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹è€…
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/production/service/ProcessRouteItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.production.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.framework.web.domain.R;
import com.ruoyi.production.dto.ProcessRouteItemDto;
import com.ruoyi.production.pojo.ProcessRouteItem;
import java.util.List;
public interface ProcessRouteItemService extends IService<ProcessRouteItem> {
    List<ProcessRouteItemDto> listProcessRouteItemDto( ProcessRouteItemDto processRouteItemDto);
    int sort(ProcessRouteItem processRouteItem);
    String batchDelete(Long id);
}
src/main/java/com/ruoyi/production/service/ProcessRouteService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.production.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.production.dto.ProcessRouteDto;
import com.ruoyi.production.pojo.ProcessRoute;
import io.swagger.models.auth.In;
public interface ProcessRouteService extends IService<ProcessRoute> {
    IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto);
    Integer saveProcessRoute(ProcessRoute processRoute);
}
src/main/java/com/ruoyi/production/service/ProductBomService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductBomDto;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.pojo.ProductBom;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * BOM主表 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 09:59:27
 */
public interface ProductBomService extends IService<ProductBom> {
    IPage<ProductBomDto> listPage(Page page, ProductBomDto productBomDto);
    AjaxResult add(ProductBom productBom);
}
src/main/java/com/ruoyi/production/service/ProductOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.production.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.production.dto.ProductBomDto;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProductOrder;
import java.util.List;
public interface ProductOrderService extends IService<ProductOrder> {
    IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder);
    int bindingRoute(ProductOrder productOrder);
    List<ProcessRoute> listProcessRoute(Long productModelId);
    List<ProductStructureDto> listProcessBom(Long orderId);
}
src/main/java/com/ruoyi/production/service/ProductProcessRouteItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductProcessRouteItemDto;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import java.util.List;
public interface ProductProcessRouteItemService extends IService<ProductProcessRouteItem> {
    List<ProductProcessRouteItemDto> listItem(Long orderId);
    R deleteRouteItem(Long id);
    R addRouteItem(ProductProcessRouteItem productProcessRouteItem);
    int sortRouteItem(ProductProcessRouteItem productProcessRouteItem);
}
src/main/java/com/ruoyi/production/service/ProductProcessRouteService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.production.service;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.pojo.ProductProcessRoute;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 02:51:09
 */
public interface ProductProcessRouteService extends IService<ProductProcessRoute> {
    ProcessRouteDto listMain(Long orderId);
}
src/main/java/com/ruoyi/production/service/ProductProcessService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.production.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.device.pojo.DeviceRepair;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.*;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.pojo.SalesLedgerScheduling;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/7/21 14:39
 */
public interface ProductProcessService extends IService<ProductProcess> {
    IPage<ProductProcessDto> listPage(Page page, ProductProcessDto productProcessDto);
    AjaxResult add(ProductProcessDto productProcessDto);
    AjaxResult importData(MultipartFile file);
}
src/main/java/com/ruoyi/production/service/ProductStructureService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.dto.ProductModelDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.pojo.ProductStructure;
import java.util.List;
public interface ProductStructureService extends IService<ProductStructure> {
    Boolean addProductStructureDto(ProductStructureDto productStructureDto);
    List<ProductStructureDto> listBybomId(Long bomId);
}
src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.production.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.production.dto.ProductWorkOrderDto;
import com.ruoyi.production.pojo.ProductWorkOrder;
public interface ProductWorkOrderService extends IService<ProductWorkOrder>{
    IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder);
    int updateProductWorkOrder(ProductWorkOrderDto productWorkOrderDto);
}
src/main/java/com/ruoyi/production/service/ProductionProductInputService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.production.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.production.dto.ProductionProductInputDto;
import com.ruoyi.production.pojo.ProductionProductInput;
public interface ProductionProductInputService extends IService<ProductionProductInput> {
    IPage<ProductionProductInputDto> listPageProductionProductInputDto(Page page, ProductionProductInputDto productionProductInputDto);
}
src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.production.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.production.dto.ProcessRouteItemDto;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.dto.ProductionProductMainDto;
import com.ruoyi.production.pojo.ProductionProductMain;
import java.util.List;
public interface ProductionProductMainService extends IService<ProductionProductMain> {
    IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, ProductionProductMainDto productionProductMainDto);
    Boolean addProductMain(ProductionProductMainDto productionProductMainDto);
    Boolean removeProductMain(ProductionProductMainDto productionProductMainDto);
}
src/main/java/com/ruoyi/production/service/ProductionProductOutputService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.production.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.production.dto.ProductionProductOutputDto;
import com.ruoyi.production.pojo.ProductionProductOutput;
public interface ProductionProductOutputService extends IService<ProductionProductOutput> {
    IPage<ProductionProductOutputDto> listPageProductionProductOutputDto(Page page, ProductionProductOutputDto productionProductOutputDto);
}
src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java
@@ -22,7 +22,7 @@
    void export(HttpServletResponse response);
    int productionDispatch(ProductionDispatchAddDto productionDispatchAddDto);
    String productionDispatch(List<ProductionDispatchAddDto> productionDispatchAddDto);
    IPage<SalesLedgerSchedulingProcessDto> listPageProcess(Page page, SalesLedgerSchedulingProcessDto salesLedgerSchedulingDto);
src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.dto.ProcessRouteItemDto;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.service.ProcessRouteItemService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class ProcessRouteItemServiceImpl extends ServiceImpl<ProcessRouteItemMapper, ProcessRouteItem> implements ProcessRouteItemService {
    @Autowired
    private  ProcessRouteItemMapper processRouteItemMapper;
    @Override
    public List<ProcessRouteItemDto> listProcessRouteItemDto(ProcessRouteItemDto processRouteItemDto) {
        return processRouteItemMapper.listProcessRouteItemDto( processRouteItemDto);
    }
    //排序
    @Override
    public int sort(ProcessRouteItem processRouteItem) {
        //查询被改动的这条数据
        ProcessRouteItem oldProcessRouteItem = processRouteItemMapper.selectById(processRouteItem.getId());
        //查询该工艺路线的所有工序并按照顺序排序
        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(Wrappers.<ProcessRouteItem>lambdaQuery()
                .eq(ProcessRouteItem::getRouteId, oldProcessRouteItem.getRouteId())
                .orderByAsc(ProcessRouteItem::getDragSort));
        // èŽ·å–ç›®æ ‡ä½ç½®ï¼ˆç§»åŠ¨åˆ°ç¬¬å‡ ä¸ªä¹‹åŽï¼‰
        Integer targetPosition = processRouteItem.getDragSort();
        if (targetPosition != null && targetPosition >= 0) {
            // ç§»åŠ¨å…ƒç´ åˆ°æ–°çš„ä½ç½®
            processRouteItems.remove(oldProcessRouteItem);
            processRouteItems.add(targetPosition-1, oldProcessRouteItem);
            // æ›´æ–°æ‰€æœ‰å—影响的排序字段
            for (int i = 0; i < processRouteItems.size(); i++) {
                ProcessRouteItem item = processRouteItems.get(i);
                if (!item.getId().equals(oldProcessRouteItem.getId())) {
                    // æ£€æŸ¥æ˜¯å¦éœ€è¦æ›´æ–°æŽ’序值
                    if (item.getDragSort() != i+1) {
                        item.setDragSort(i+1);
                        processRouteItemMapper.updateById(item);
                    }
                } else {
                    // æ›´æ–°åŽŸè®°å½•çš„æ–°æŽ’åºä½ç½®
                    oldProcessRouteItem.setDragSort(targetPosition);
                    processRouteItemMapper.updateById(oldProcessRouteItem);
                }
            }
            return 1;
        }
        return 0;
    }
    @Override
    public String batchDelete(Long id) {
        // æŸ¥è¯¢è¦åˆ é™¤çš„æ•°æ®
        ProcessRouteItem deleteProcessRouteItem = processRouteItemMapper.selectById(id);
        if (deleteProcessRouteItem == null) {
            return "删除失败,未找到对应数据";
        }
        Long routeId = deleteProcessRouteItem.getRouteId();
        // åˆ é™¤æŒ‡å®šæ•°æ®
        processRouteItemMapper.deleteById(id);
        // æŸ¥è¯¢è¯¥å·¥è‰ºè·¯çº¿çš„æ‰€æœ‰å·¥åºå¹¶æŒ‰ç…§é¡ºåºæŽ’序
        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(Wrappers.<ProcessRouteItem>lambdaQuery()
                .eq(ProcessRouteItem::getRouteId, routeId)
                .orderByAsc(ProcessRouteItem::getDragSort));
        // é‡æ–°è®¾ç½®æŽ’序值,使序号连续
        for (int i = 0; i < processRouteItems.size(); i++) {
            ProcessRouteItem item = processRouteItems.get(i);
            if (!item.getDragSort().equals(i+1)) {
                item.setDragSort(i+1);
                processRouteItemMapper.updateById(item);
            }
        }
        return "删除成功";
    }
}
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.production.service.impl;
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.production.dto.ProcessRouteDto;
import com.ruoyi.production.mapper.ProcessRouteMapper;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.service.ProcessRouteService;
import lombok.AllArgsConstructor;
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.time.LocalDate;
import java.time.format.DateTimeFormatter;
@Service
@AllArgsConstructor
@Slf4j
public class ProcessRouteServiceImpl extends ServiceImpl<ProcessRouteMapper, ProcessRoute> implements ProcessRouteService {
    @Autowired
    private ProcessRouteMapper processRouteMapper;
    @Override
    public IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) {
        return processRouteMapper.pageProcessRouteDto(page, processRouteDto);
    }
    @Override
    public Integer saveProcessRoute(ProcessRoute processRoute) {
        this.save(processRoute);
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String idStr = String.format("%06d", processRoute.getId());
        String newProductCode = "GYLX" + dateStr + idStr;
        // æ›´æ–°æ•°æ®åº“中的productCode
        processRoute.setProcessRouteCode(newProductCode);
        return processRouteMapper.updateById(processRoute);
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductBomDto;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.pojo.ProductBom;
import com.ruoyi.production.mapper.ProductBomMapper;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.service.ProductBomService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * <p>
 * BOM主表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 09:59:27
 */
@Service
public class ProductBomServiceImpl extends ServiceImpl<ProductBomMapper, ProductBom> implements ProductBomService {
    @Autowired
    private ProductBomMapper productBomMapper;
    @Override
    public IPage<ProductBomDto> listPage(Page page, ProductBomDto productBomDto) {
        return productBomMapper.listPage(page,productBomDto);
    }
    @Override
    public AjaxResult add(ProductBom productBom) {
        boolean save = productBomMapper.insert(productBom) > 0;
        if (save) {
            // æ ¹æ®id生成no字段:GX + 8位数字(不足8位前面补0)
            String no = "BM." + String.format("%05d", productBom.getId());
            productBom.setBomNo(no);
            productBomMapper.updateById(productBom);
            return AjaxResult.success();
        }
        return AjaxResult.error();
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
package com.ruoyi.production.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.production.dto.ProductBomDto;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProcessRouteService;
import com.ruoyi.production.service.ProductOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Service
public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, ProductOrder> implements ProductOrderService {
    @Autowired
    private ProductOrderMapper productOrderMapper;
    @Autowired
    private ProcessRouteMapper processRouteMapper;
    @Autowired
    private ProductProcessRouteMapper productProcessRouteMapper;
    @Autowired
    private ProcessRouteItemMapper processRouteItemMapper;
    @Autowired
    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
    @Autowired
    private ProductWorkOrderMapper productWorkOrderMapper;
    @Override
    public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
        return productOrderMapper.pageProductOrder(page, productOrder);
    }
    @Override
    public int bindingRoute(ProductOrder productOrder) {
        //新增生产订单下的工艺路线主表
        ProcessRoute processRoute = processRouteMapper.selectById(productOrder.getRouteId());
        ProductProcessRoute productProcessRoute = new ProductProcessRoute();
        productProcessRoute.setProductModelId(processRoute.getProductModelId());
        productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
        productProcessRoute.setProductOrderId(productOrder.getId());
        productProcessRoute.setBomId(processRoute.getBomId());
        productProcessRouteMapper.insert(productProcessRoute);
        //新增生产订单下的工艺路线子表
        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
        // ç”Ÿæˆå½“前日期的前缀:年月日
        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        for (ProcessRouteItem processRouteItem : processRouteItems) {
            ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
            productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
            productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
            productProcessRouteItem.setProductOrderId(productOrder.getId());
            productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
            int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
            if (insert > 0) {
                // æŸ¥è¯¢ä»Šæ—¥å·²å­˜åœ¨çš„æœ€å¤§å·¥å•号
                QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
                queryWrapper.likeRight("work_order_no", datePrefix)
                        .orderByDesc("work_order_no")
                        .last("LIMIT 1");
                ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
                int sequenceNumber = 1; // é»˜è®¤åºå·
                if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                    String lastNo = lastWorkOrder.getWorkOrderNo().toString();
                    if (lastNo.startsWith(datePrefix)) {
                        String seqStr = lastNo.substring(datePrefix.length());
                        try {
                            sequenceNumber = Integer.parseInt(seqStr) + 1;
                        } catch (NumberFormatException e) {
                            sequenceNumber = 1;
                        }
                    }
                }
                // ç”Ÿæˆå®Œæ•´çš„工单号
                String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber);
                ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                productWorkOrder.setProductOrderId(productOrder.getId());
                productWorkOrder.setPlanQuantity(productOrder.getQuantity());
                productWorkOrder.setWorkOrderNo(workOrderNoStr);
                productWorkOrder.setStatus(1);
                productWorkOrderMapper.insert(productWorkOrder);
            }
        }
        return productOrderMapper.updateById(productOrder);
    }
    @Override
    public List<ProcessRoute> listProcessRoute(Long productModelId) {
        return productOrderMapper.listProcessRoute(productModelId);
    }
    @Override
    public List<ProductStructureDto> listProcessBom(Long orderId) {
        return productOrderMapper.listProcessBom(orderId);
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,206 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductProcessRouteItemDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductProcessRouteItemService;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import lombok.AllArgsConstructor;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@Transactional(rollbackFor = Exception.class)
@AllArgsConstructor
public class ProductProcessRouteItemServiceImpl extends ServiceImpl<ProductProcessRouteItemMapper, ProductProcessRouteItem> implements ProductProcessRouteItemService {
    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
    private ProductionProductMainMapper productionProductMainMapper;
    private ProductionProductInputMapper productionProductInputMapper;
    private ProductionProductOutputMapper productionProductOutputMapper;
    private QualityInspectMapper qualityInspectMapper;
    private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
    private ProductWorkOrderMapper productWorkOrderMapper;
    private ProductOrderMapper productOrderMapper;
    private ProductProcessRouteMapper productProcessRouteMapper;
    private SalesLedgerProductMapper salesLedgerProductMapper;
    @Override
    public List<ProductProcessRouteItemDto> listItem(Long orderId) {
        return productProcessRouteItemMapper.listItem(orderId);
    }
    @Override
    public R deleteRouteItem(Long id) {
        Long routeItemId = id;
        try {
            // æŸ¥è¯¢å·¥å•
            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectOne(
                    new LambdaQueryWrapper<ProductWorkOrder>()
                            .eq(ProductWorkOrder::getProductProcessRouteItemId, routeItemId)
                            .last("LIMIT 1")
            );
            if (productWorkOrder == null) {
                throw new RuntimeException("删除失败:未找到关联的生产工单");
            }
            Long workOrderId = productWorkOrder.getId();
            Long productOrderId = productWorkOrder.getProductOrderId();
            // æŸ¥è¯¢ç”Ÿäº§ä¸»è¡¨
            List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(
                    new LambdaQueryWrapper<ProductionProductMain>()
                            .eq(ProductionProductMain::getWorkOrderId, workOrderId)
            );
            if (!productionProductMains.isEmpty()) {
                // æ‰¹é‡åˆ é™¤å­è¡¨
                for (ProductionProductMain main : productionProductMains) {
                    Long mainId = main.getId();
                    // åˆ é™¤æŠ•å…¥
                    productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
                            .eq(ProductionProductInput::getProductMainId, mainId));
                    // åˆ é™¤äº§å‡º
                    productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
                            .eq(ProductionProductOutput::getProductMainId, mainId));
                    // åˆ é™¤è´¨æ£€
                    qualityInspectMapper.delete(new LambdaQueryWrapper<QualityInspect>()
                            .eq(QualityInspect::getProductMainId, mainId));
                }
            }
            //  åˆ é™¤æŠ¥å·¥ï¼ˆç”Ÿäº§ä¸»è¡¨ï¼‰
            productionProductMainMapper.delete(new LambdaQueryWrapper<ProductionProductMain>()
                    .eq(ProductionProductMain::getWorkOrderId, workOrderId));
            // æŸ¥è¯¢è®¢å• + åˆ é™¤æ ¸ç®—
            ProductOrder productOrder = productOrderMapper.selectById(productOrderId);
            if (productOrder != null && productOrder.getSalesLedgerId() != null) {
                salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
                        .eq(SalesLedgerProductionAccounting::getSalesLedgerId, productOrder.getSalesLedgerId()));
            }
            // åˆ é™¤å…³è”工单
            productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
                    .eq(ProductWorkOrder::getProductProcessRouteItemId, routeItemId));
            // åˆ é™¤ä¸»è¡¨æ•°æ®
            ProductProcessRouteItem deleteProductProcessRouteItem = productProcessRouteItemMapper.selectById(routeItemId);
            Long productRouteId = deleteProductProcessRouteItem.getProductRouteId();
            // åˆ é™¤æŒ‡å®šæ•°æ®
            productProcessRouteItemMapper.deleteById(id);
            // æŸ¥è¯¢è¯¥å·¥è‰ºè·¯çº¿çš„æ‰€æœ‰å·¥åºå¹¶æŒ‰ç…§é¡ºåºæŽ’序
            List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery()
                    .eq(ProductProcessRouteItem::getProductRouteId, productRouteId)
                    .orderByAsc(ProductProcessRouteItem::getDragSort));
            // é‡æ–°è®¾ç½®æŽ’序值,使序号连续
            for (int i = 0; i < productProcessRouteItems.size(); i++) {
                ProductProcessRouteItem item = productProcessRouteItems.get(i);
                if (!item.getDragSort().equals(i + 1)) {
                    item.setDragSort(i + 1);
                    productProcessRouteItemMapper.updateById(item);
                }
            }
            return R.ok();
        } catch (Exception e) {
            throw new RuntimeException("删除生产工艺路线失败:" + e.getMessage());
        }
    }
    @Override
    public R addRouteItem(ProductProcessRouteItem productProcessRouteItem) {
        ProductOrder productOrder = productOrderMapper.selectById(productProcessRouteItem.getProductOrderId());
        int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
        // ç”Ÿæˆå½“前日期的前缀:年月日
        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        if (insert > 0) {
            // æŸ¥è¯¢ä»Šæ—¥å·²å­˜åœ¨çš„æœ€å¤§å·¥å•号
            QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
            queryWrapper.likeRight("work_order_no", datePrefix)
                    .orderByDesc("work_order_no")
                    .last("LIMIT 1");
            ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
            int sequenceNumber = 1; // é»˜è®¤åºå·
            if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                String lastNo = lastWorkOrder.getWorkOrderNo().toString();
                if (lastNo.startsWith(datePrefix)) {
                    String seqStr = lastNo.substring(datePrefix.length());
                    try {
                        sequenceNumber = Integer.parseInt(seqStr) + 1;
                    } catch (NumberFormatException e) {
                        sequenceNumber = 1;
                    }
                }
            }
            // ç”Ÿæˆå®Œæ•´çš„工单号
            String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber);
            ProductWorkOrder productWorkOrder = new ProductWorkOrder();
            productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
            productWorkOrder.setProductOrderId(productProcessRouteItem.getProductOrderId());
            productWorkOrder.setPlanQuantity(productOrder.getQuantity());
            productWorkOrder.setWorkOrderNo(workOrderNoStr);
            productWorkOrder.setStatus(1);
            productWorkOrderMapper.insert(productWorkOrder);
        }
        return R.ok();
    }
    @Override
    public int sortRouteItem(ProductProcessRouteItem productProcessRouteItem) {
        //查询被改动的这条数据
        ProductProcessRouteItem oldProductProcessRouteItem = productProcessRouteItemMapper.selectById(productProcessRouteItem.getId());
        //查询该工艺路线的所有工序并按照顺序排序
        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery()
                .eq(ProductProcessRouteItem::getProductRouteId, oldProductProcessRouteItem.getProductRouteId())
                .orderByAsc(ProductProcessRouteItem::getDragSort));
        // èŽ·å–ç›®æ ‡ä½ç½®ï¼ˆç§»åŠ¨åˆ°ç¬¬å‡ ä¸ªä¹‹åŽï¼‰
        Integer targetPosition = productProcessRouteItem.getDragSort();
        if (targetPosition != null && targetPosition >= 0) {
            // ç§»åŠ¨å…ƒç´ åˆ°æ–°çš„ä½ç½®
            productProcessRouteItems.remove(oldProductProcessRouteItem);
            productProcessRouteItems.add(targetPosition-1, oldProductProcessRouteItem);
            // æ›´æ–°æ‰€æœ‰å—影响的排序字段
            for (int i = 0; i < productProcessRouteItems.size(); i++) {
                ProductProcessRouteItem item = productProcessRouteItems.get(i);
                if (!item.getId().equals(oldProductProcessRouteItem.getId())) {
                    // æ£€æŸ¥æ˜¯å¦éœ€è¦æ›´æ–°æŽ’序值
                    if (item.getDragSort() != i+1) {
                        item.setDragSort(i+1);
                        productProcessRouteItemMapper.updateById(item);
                    }
                } else {
                    // æ›´æ–°åŽŸè®°å½•çš„æ–°æŽ’åºä½ç½®
                    oldProductProcessRouteItem.setDragSort(targetPosition);
                    productProcessRouteItemMapper.updateById(oldProductProcessRouteItem);
                }
            }
            return 1;
        }
        return 0;
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.production.service.impl;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.pojo.ProductProcessRoute;
import com.ruoyi.production.mapper.ProductProcessRouteMapper;
import com.ruoyi.production.service.ProductProcessRouteService;
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-01-15 02:51:09
 */
@Service
public class ProductProcessRouteServiceImpl extends ServiceImpl<ProductProcessRouteMapper, ProductProcessRoute> implements ProductProcessRouteService {
    @Autowired
    private ProductProcessRouteMapper productProcessRouteMapper;
    @Override
    public ProcessRouteDto listMain(Long orderId) {
        return productProcessRouteMapper.listMain(orderId);
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.mapper.ProductProcessMapper;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.service.ProductProcessService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@Service
public class ProductProcessServiceImpl extends ServiceImpl<ProductProcessMapper, ProductProcess> implements ProductProcessService {
    @Autowired
    private ProductProcessMapper productProcessMapper;
    @Override
    public IPage<ProductProcessDto> listPage(Page page, ProductProcessDto productProcessDto) {
        return productProcessMapper.listPage(page, productProcessDto);
    }
    @Override
    public AjaxResult add(ProductProcessDto productProcessDto) {
        ProductProcess productProcess = new ProductProcess();
        BeanUtils.copyProperties(productProcessDto,productProcess);
        boolean save = productProcessMapper.insert(productProcess) > 0;
        if (save && ObjectUtils.isNotNull(productProcessDto.getNo())) {
            // æ ¹æ®id生成no字段:GX + 8位数字(不足8位前面补0)
            String no = "GX" + String.format("%08d", productProcess.getId());
            productProcess.setNo(no);
            productProcessMapper.updateById(productProcess);
            return AjaxResult.success();
        }
        return AjaxResult.error();
    }
    @Override
    public AjaxResult importData(MultipartFile file) {
        try {
            ExcelUtil<ProductProcess> util = new ExcelUtil<ProductProcess>(ProductProcess.class);
            List<ProductProcess> productProcessList = util.importExcel(file.getInputStream());
            if(CollectionUtils.isEmpty(productProcessList)){
                return AjaxResult.warn("模板错误或导入数据为空");
            }
            this.saveOrUpdateBatch(productProcessList);
            return AjaxResult.success(true);
        }catch (Exception e){
            e.printStackTrace();
            return AjaxResult.error("导入失败");
        }
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.ProductModelDto;
import com.ruoyi.basic.dto.ProductTreeDto;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.ProductBomMapper;
import com.ruoyi.production.mapper.ProductStructureMapper;
import com.ruoyi.production.pojo.ProductStructure;
import com.ruoyi.production.service.ProductStructureService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@RequiredArgsConstructor
@Slf4j
public class ProductStructureServiceImpl extends ServiceImpl<ProductStructureMapper, ProductStructure> implements ProductStructureService {
    @Autowired
    private  ProductStructureMapper productStructureMapper;
    @Override
    public Boolean addProductStructureDto(ProductStructureDto productStructureDto) {
        this.remove(new QueryWrapper<ProductStructure>().lambda().eq(ProductStructure::getBomId, productStructureDto.getBomId()));
        productStructureDto.getProductStructureList().forEach(productStructure -> {
            productStructure.setBomId(productStructureDto.getBomId());
        });
        return this.saveBatch(productStructureDto.getProductStructureList());
    }
    @Override
    public List<ProductStructureDto> listBybomId(Long bomId) {
        List<ProductStructureDto> tree = productStructureMapper.listBybomId(bomId);
        return tree;
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.production.service.impl;
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.production.dto.ProductWorkOrderDto;
import com.ruoyi.production.mapper.ProductWorkOrderMapper;
import com.ruoyi.production.pojo.ProductWorkOrder;
import com.ruoyi.production.service.ProductWorkOrderService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class ProductWorkOrderServiceImpl extends ServiceImpl<ProductWorkOrderMapper, ProductWorkOrder> implements ProductWorkOrderService {
    private ProductWorkOrderMapper productWorkOrdermapper;
    @Override
    public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
        return productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
    }
    @Override
    public int updateProductWorkOrder(ProductWorkOrderDto productWorkOrderDto) {
        return productWorkOrdermapper.updateById(productWorkOrderDto);
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionProductInputServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.production.service.impl;
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.production.dto.ProductionProductInputDto;
import com.ruoyi.production.mapper.ProductionProductInputMapper;
import com.ruoyi.production.pojo.ProductionProductInput;
import com.ruoyi.production.service.ProductionProductInputService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@AllArgsConstructor
public class ProductionProductInputServiceImpl extends ServiceImpl<ProductionProductInputMapper, ProductionProductInput> implements ProductionProductInputService {
    @Autowired
    private ProductionProductInputMapper productionProductInputMapper;
    @Override
    public IPage<ProductionProductInputDto> listPageProductionProductInputDto(Page page, ProductionProductInputDto productionProductInputDto) {
        return productionProductInputMapper.listPageProductionProductInputDto(page, productionProductInputDto);
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,299 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
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.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.production.controller.ProductWorkOrderController;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.dto.ProductionProductMainDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductionProductMainService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityInspectParamMapper;
import com.ruoyi.quality.mapper.QualityTestStandardMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectParam;
import com.ruoyi.quality.pojo.QualityTestStandard;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.production.mapper.ProductionProductMainMapper;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@AllArgsConstructor
public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
    private final ProcurementRecordOutMapper procurementRecordOutMapper;
    private ProductionProductMainMapper productionProductMainMapper;
    private ProductWorkOrderController productWorkOrderController;
    private ProductWorkOrderMapper productWorkOrderMapper;
    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
    private ProductionProductOutputMapper productionProductOutputMapper;
    private ProcessRouteItemMapper processRouteItemMapper;
    private ProductModelMapper productModelMapper;
    private QualityInspectMapper qualityInspectMapper;
    private ProductProcessMapper productProcessMapper;
    private ProductMapper productMapper;
    private QualityTestStandardMapper qualityTestStandardMapper;
    private QualityInspectParamMapper qualityInspectParamMapper;
    private ProductStructureMapper productStructureMapper;
    private ProductionProductInputMapper productionProductInputMapper;
    private ProductOrderMapper productOrderMapper;
    private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
    private StockUtils stockUtils;
    @Override
    public IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, ProductionProductMainDto productionProductMainDto) {
        return productionProductMainMapper.listPageProductionProductMainDto(page, productionProductMainDto);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean addProductMain(ProductionProductMainDto dto) {
        if (dto == null) {
            throw new RuntimeException("参数不能为空");
        }
        SysUser user = SecurityUtils.getLoginUser().getUser();
        // æ–°å¢žé€»è¾‘
        ProductionProductMain productionProductMain = new ProductionProductMain();
        ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(dto.getProductProcessRouteItemId());
        if (productProcessRouteItem == null) {
            throw new RuntimeException("工艺路线项不存在");
        }
        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        QueryWrapper<ProductionProductMain> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("MAX(product_no) as maxNo")
                .likeRight("product_no", datePrefix);
        List<Map<String, Object>> resultList = productionProductMainMapper.selectMaps(queryWrapper);
        int sequenceNumber = 1;
        if (resultList != null && !resultList.isEmpty()) {
            Map<String, Object> result = resultList.get(0);
            if (result != null) {
                Object maxNoObj = result.get("maxNo");
                if (maxNoObj != null) {
                    String lastNo = maxNoObj.toString();
                    System.out.println("lastNo: " + lastNo);
                    if (lastNo.startsWith(datePrefix)) {
                        try {
                            String seqStr = lastNo.substring(datePrefix.length());
                            sequenceNumber = Integer.parseInt(seqStr) + 1;
                        } catch (NumberFormatException e) {
                            sequenceNumber = 1;
                        }
                    }
                }
            }
        }
        String productNo = String.format("%s%03d", datePrefix, sequenceNumber);
        productionProductMain.setProductNo(productNo);
        productionProductMain.setUserId(user.getUserId());
        productionProductMain.setProductProcessRouteItemId(dto.getProductProcessRouteItemId());
        productionProductMain.setWorkOrderId(dto.getWorkOrderId());
        productionProductMain.setStatus(0);
        // æ·»åŠ æŠ¥å·¥ä¸»è¡¨
        int insert = productionProductMainMapper.insert(productionProductMain);
        //更新工单
        if (insert > 0) {
            Map<String, Object> params = new HashMap<>();
            params.put("workOrderId", dto.getWorkOrderId());
            params.put("deductQuantity", dto.getQuantity());
            productWorkOrderMapper.updatePlanQuantity(params);
        }
        ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
        ProductModel productModel = productProcessRouteItem.getProductModelId() != null ?
                productModelMapper.selectById(productProcessRouteItem.getProductModelId()) : null;
        if (productModel != null) {
            Product product = productMapper.selectById(productModel.getProductId());
            int inspectType = "组装".equals(productProcess.getName()) ? 2 : 1;
            QualityInspect qualityInspect = new QualityInspect();
            qualityInspect.setProductId(product.getId());
            qualityInspect.setProductName(product.getProductName());
            qualityInspect.setModel(productModel.getModel());
            qualityInspect.setUnit(productModel.getUnit());
            qualityInspect.setQuantity(dto.getQuantity());
            qualityInspect.setProcess(productProcess.getName());
            qualityInspect.setInspectState(0);
            qualityInspect.setInspectType(inspectType);
            qualityInspect.setProductMainId(productionProductMain.getId());
            qualityInspect.setProductModelId(productModel.getId());
            qualityInspectMapper.insert(qualityInspect);
            qualityTestStandardMapper.selectList(
                    new LambdaQueryWrapper<QualityTestStandard>()
                            .eq(QualityTestStandard::getProductId, product.getId())
            ).forEach(standard -> {
                QualityInspectParam param = new QualityInspectParam();
                BeanUtils.copyProperties(standard, param);
                param.setId(null);
                param.setInspectId(qualityInspect.getId());
                qualityInspectParamMapper.insert(param);
            });
        }
        // æ·»åŠ æŠ•å…¥
        if (productModel != null) {
            List<ProductStructureDto> productStructureDtos = productStructureMapper.listByproductModelId(productModel.getId());
            for (ProductStructureDto productStructureDto : productStructureDtos) {
                ProductModel productModel1 = productModelMapper.selectById(productStructureDto.getProductModelId());
                Product product = productMapper.selectById(productModel1.getProductId());
                BigDecimal stockQuantity = stockUtils.getStockQuantity(productModel1.getId()).get("stockQuantity");
                if (!(stockQuantity.compareTo(BigDecimal.ZERO) > 0)) {
                    throw new RuntimeException(product.getProductName() + "库存为0");
                }
                if (stockQuantity.compareTo(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())) < 0) {
                    throw new RuntimeException(product.getProductName() + "库存不足");
                }
                ProductionProductInput productionProductInput = new ProductionProductInput();
                productionProductInput.setProductModelId(productStructureDto.getProductModelId());
                productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
                productionProductInput.setProductMainId(productionProductMain.getId());
                productionProductInputMapper.insert(productionProductInput);
                DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
                LocalDate now = LocalDate.now();
                ProcurementRecordOut procurementRecordOut1 = procurementRecordOutMapper.selectCode(dateFormat.format(now));
                Long aLong = procurementRecordOut1 == null ? 1L : Long.valueOf(procurementRecordOut1.getCode().split("LS"+dateFormat.format(now))[1]);
                //添加出库处理
                ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
                        .procurementRecordStorageId(0)
                        .code("LS" + dateFormat.format(now) + String.format("%03d", aLong + 1))
                        .salesLedgerProductId(0)
                        .inboundBatches(aLong.equals(0L) ? "第1批次" : "第"+ (aLong + 1) + "批次")
                        .inboundNum(productionProductInput.getQuantity())
                        .type(4)
                        .createTime(LocalDateTime.now())
                        .createUser(user.getUserId())
                        .createBy(user.getNickName())
                        .updateUser(user.getUserId())
                        .updateTime(LocalDateTime.now())
                        .productModelId(productModel1.getId());
                procurementRecordOutMapper.insert(procurementRecordOut.build());
            }
        }
        // æ·»åŠ äº§å‡º
        ProductionProductOutput productionProductOutput = new ProductionProductOutput();
        productionProductOutput.setProductMainId(productionProductMain.getId());
        productionProductOutput.setProductModelId(productProcessRouteItem.getProductModelId());
        productionProductOutput.setQuantity(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO);
        productionProductOutputMapper.insert(productionProductOutput);
        // èŽ·å–ç”Ÿäº§è®¢å•
        ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
        List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(new QueryWrapper<ProductionProductMain>().lambda().eq(ProductionProductMain::getWorkOrderId, dto.getWorkOrderId()));
        if (productionProductMains.isEmpty()) {
            productWorkOrder.setActualStartTime(LocalDate.now());
        }
        ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
        if (productOrder == null) {
            throw new RuntimeException("生产订单不存在");
        }
        // æ·»åŠ ç”Ÿäº§æ ¸ç®—
        SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
                .salesLedgerWorkId(productionProductMain.getId())
                .salesLedgerSchedulingId(0L)
                .salesLedgerId(productOrder.getSalesLedgerId())
                .salesLedgerProductId(productOrder.getProductModelId())
                .schedulingUserId(user.getUserId())
                .schedulingUserName(user.getNickName())
                .finishedNum(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO)
                .workHours(productProcess.getSalaryQuota())
                .process(productProcess.getName())
                .schedulingDate(LocalDate.now())
                .tenantId(dto.getTenantId())
                .build();
        salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting);
        return true;
    }
    @Override
    @Transactional
    public Boolean removeProductMain(ProductionProductMainDto dto) {
        Long id = dto.getId();
        // æ›´æ–°å·¥å•
        productWorkOrderMapper.rollbackPlanQuantity(id);
        // åˆ é™¤è´¨æ£€å‚数和质检记录
        qualityInspectMapper.selectList(
                new LambdaQueryWrapper<QualityInspect>()
                        .eq(QualityInspect::getProductMainId, id)
        ).forEach(q -> {
            qualityInspectParamMapper.delete(
                    new LambdaQueryWrapper<QualityInspectParam>()
                            .eq(QualityInspectParam::getInspectId, q.getId()));
            qualityInspectMapper.deleteById(q.getId());
        });
        // åˆ é™¤äº§å‡ºè®°å½•
        productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
                .eq(ProductionProductOutput::getProductMainId, id)
        );
        // åˆ é™¤å…³è”的核算数据
        salesLedgerProductionAccountingMapper.delete(
                new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
                        .eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, id)
        );
        // åˆ é™¤ä¸»è¡¨
        return productionProductMainMapper.deleteById(id) > 0;
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionProductOutputServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.production.service.impl;
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.production.dto.ProductionProductOutputDto;
import com.ruoyi.production.mapper.ProductionProductOutputMapper;
import com.ruoyi.production.pojo.ProductionProductOutput;
import com.ruoyi.production.service.ProductionProductOutputService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@AllArgsConstructor
public class ProductionProductOutputServiceImpl extends ServiceImpl<ProductionProductOutputMapper, ProductionProductOutput> implements ProductionProductOutputService {
    @Autowired
    private ProductionProductOutputMapper productionProductOutputMapper;
    @Override
    public IPage<ProductionProductOutputDto> listPageProductionProductOutputDto(Page page, ProductionProductOutputDto productionProductOutputDto) {
        return productionProductOutputMapper.listPageProductionProductOutputDto(page, productionProductOutputDto);
    }
}
src/main/java/com/ruoyi/production/service/impl/SalesLedgerProductionAccountingServiceImpl.java
@@ -22,6 +22,8 @@
import java.util.Set;
import java.util.stream.Collectors;
import java.math.BigDecimal;
/**
 * @author :yys
 * @date : 2025/7/21 14:41
@@ -36,9 +38,29 @@
    @Override
    public IPage<SalesLedgerProductionAccountingDto> listPage(Page page, SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto) {
        IPage<SalesLedgerProductionAccountingDto> list = salesLedgerProductionAccountingMapper.listPage(page, salesLedgerProductionAccountingDto);
        list.getRecords().forEach(item -> {
            String[] split = item.getSpecificationModel().split("\\*");
            if(split.length == 2 && isNumeric(split[1])){
                // è®¡ç®—工资 = å·¥æ—¶å®šé¢ * æ•°é‡ * è§„æ ¼
                item.setWages(item.getWages().multiply(new BigDecimal(split[1])));
            }
        });
        return list;
    }
    public static boolean isNumeric(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        // éåŽ†å­—ç¬¦ä¸²çš„æ¯ä¸ªå­—ç¬¦ï¼Œæ£€æŸ¥æ˜¯å¦ä¸ºæ•°å­—
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }
    @Override
    public void export(HttpServletResponse response) {
        Page page =  new Page(-1,-1);
src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
@@ -4,29 +4,42 @@
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.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.production.dto.*;
import com.ruoyi.production.mapper.SalesLedgerSchedulingMapper;
import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
import com.ruoyi.production.mapper.SpeculativeTradingInfoMapper;
import com.ruoyi.production.pojo.SalesLedgerScheduling;
import com.ruoyi.production.pojo.SalesLedgerWork;
import com.ruoyi.production.pojo.SpeculativeTradingInfo;
import com.ruoyi.production.service.SalesLedgerSchedulingService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.sales.mapper.LossMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.Loss;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
@@ -45,7 +58,7 @@
    @Override
    public IPage<SalesLedgerSchedulingDto> listPage(Page page, SalesLedgerSchedulingDto salesLedgerSchedulingDto) {
        IPage<SalesLedgerSchedulingDto> list = salesLedgerSchedulingMapper.listPage(page, salesLedgerSchedulingDto);
        if(list.getTotal() == 0){
        if(CollectionUtils.isEmpty(list.getRecords())){
            return list;
        }
        Set<Long> collect = list.getRecords().stream().map(SalesLedgerSchedulingDto::getSalesLedgerProductId).collect(Collectors.toSet());
@@ -60,6 +73,16 @@
                    .filter(j -> j.getSalesLedgerProductId().equals(i.getSalesLedgerProductId()))
                    .map(SalesLedgerWork::getFinishedNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add));
            // è®¡ç®—生产总量 = è§„æ ¼ * æ•°é‡ / 1000
            String[] split = i.getSpecificationModel().split("\\*");
            if(split.length == 2 && isNumeric(split[0]) && isNumeric(split[1])){
                BigDecimal multiply = new BigDecimal(split[0])
                        .multiply(new BigDecimal(split[1])
                                .multiply(i.getQuantity()).divide(new BigDecimal(1000),2, RoundingMode.CEILING));
                i.setTotalProduction(multiply);
            }
            // çŠ¶æ€ = æ•°é‡å’Œå®Œå·¥æ•°é‡æ¯”较
            if(i.getSuccessNum().compareTo(new BigDecimal(0)) == 0){
                i.setStatus("未开始");
@@ -68,8 +91,24 @@
            }else{
                i.setStatus("生产中");
            }
            // è¿›åº¦ä¿ç•™ä¸¤ä½å°æ•°
            i.setProgress(i.getSchedulingNum().divide(i.getQuantity(),4,RoundingMode.CEILING).multiply(new BigDecimal(100)));
        });
        return list;
    }
    public static boolean isNumeric(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        // éåŽ†å­—ç¬¦ä¸²çš„æ¯ä¸ªå­—ç¬¦ï¼Œæ£€æŸ¥æ˜¯å¦ä¸ºæ•°å­—
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }
    @Override
@@ -104,39 +143,182 @@
    private final SysUserMapper sysUserMapper;
    private final SpeculativeTradingInfoMapper speculativeTradingInfoMapper;
    @Override
    public int productionDispatch(ProductionDispatchAddDto productionDispatchAddDto) {
        SysUser sysUser = sysUserMapper.selectUserById(productionDispatchAddDto.getSchedulingUserId());
        if(sysUser == null) throw new RuntimeException("排产人不存在");
        SalesLedgerScheduling salesLedgerScheduling = SalesLedgerScheduling.builder()
                .salesLedgerId(productionDispatchAddDto.getSalesLedgerId())
                .salesLedgerProductId(productionDispatchAddDto.getSalesLedgerProductId())
                .schedulingUserId(productionDispatchAddDto.getSchedulingUserId())
                .schedulingUserName(sysUser.getNickName())
                .schedulingNum(productionDispatchAddDto.getSchedulingNum())
                .schedulingDate(LocalDate.parse(productionDispatchAddDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE))
                .status(1)
                .build();
        return salesLedgerSchedulingMapper.insert(salesLedgerScheduling);
    public String productionDispatch(List<ProductionDispatchAddDto> productionDispatchAddDtoList) {
        int i = 0;
        int successNum = 0;
        LoginUser loginUser = SecurityUtils.getLoginUser();
        for (ProductionDispatchAddDto productionDispatchAddDto : productionDispatchAddDtoList) {
            SysUser sysUser = sysUserMapper.selectUserById(productionDispatchAddDto.getSchedulingUserId() == null ? loginUser.getUser().getUserId() : productionDispatchAddDto.getSchedulingUserId());
            if(sysUser == null){
                i++;
                continue;
            }
            // èŽ·å–ç©ºä½™ç‚’æœº
            String[] split = productionDispatchAddDto.getSpeculativeTradingName().split(",");
            if(split != null && split.length == 0){
                i++;
                continue;
            }
            List<SpeculativeTradingInfo> speculativeTradingInfos = speculativeTradingInfoMapper.selectList(new LambdaQueryWrapper<SpeculativeTradingInfo>()
                    .in(SpeculativeTradingInfo::getName, Arrays.asList(split))
                    .orderByAsc(SpeculativeTradingInfo::getSort));
            if(CollectionUtils.isEmpty(speculativeTradingInfos)){
                i++;
                continue;
            }
            AtomicReference<String> name = new AtomicReference<>("");  //需要绑定的炒机
            //通过规格型号和排产数量计算本次生产产量
            String[] split1 = productionDispatchAddDto.getSpecificationModel().split("\\*");
            if(split1.length != 2){
                i++;
                continue;
            }
            // æœ¬æ¬¡ç”Ÿäº§äº§é‡
            BigDecimal productionNum = new BigDecimal(split1[0])
                    .multiply(new BigDecimal(split1[1]).multiply(productionDispatchAddDto.getSchedulingNum()));
            // å¤šä¸ªç‚’机情况
            if(speculativeTradingInfos.size() > 1){
                for (SpeculativeTradingInfo speculativeTradingInfo : speculativeTradingInfos) {
                    // èŽ·å–è¯¥ç‚’æœºæ­£åœ¨æŽ’äº§é‡
                    BigDecimal schedulingNumBySpeculativeTradingName = getSchedulingNumBySpeculativeTradingName(speculativeTradingInfo.getName());
                    // å¦‚果该炒机总量(单位kg需要乘1000) - æ­£åœ¨æŽ’产量 >=本次生产产量就分配此炒机
                    if(speculativeTradingInfo.getWorkLoad().multiply(new BigDecimal(1000)).subtract(schedulingNumBySpeculativeTradingName).compareTo(productionNum) >= 0){
                        name.set(speculativeTradingInfo.getName());
                        break;
                    }
                }
            }else{
                // å•个炒机情况
                name.set(speculativeTradingInfos.get(0).getName());
            }
            if(name.get().isEmpty()){
                i++;
                continue;
            }
            String productionLine = "";
            switch (name.get()){
                    case "炒机1":
                    productionLine = "产线1";
                    break;
                    case "炒机2":
                    productionLine = "产线2";
                    break;
                    case "炒机3":
                    productionLine = "产线3";
                    break;
                    case "炒机4":
                    productionLine = "产线4";
                    break;
            }
            SalesLedgerScheduling salesLedgerScheduling = SalesLedgerScheduling.builder()
                    .salesLedgerId(productionDispatchAddDto.getSalesLedgerId())
                    .salesLedgerProductId(productionDispatchAddDto.getSalesLedgerProductId())
                    .speculativeTradingName(name.get())
                    .productionLine(productionLine)
                    .schedulingUserId(sysUser.getUserId())
                    .schedulingUserName(sysUser.getNickName())
                    .schedulingNum(productionDispatchAddDto.getSchedulingNum())
                    .schedulingDate(productionDispatchAddDto.getSchedulingDate() == null ? LocalDate.now() : LocalDate.parse(productionDispatchAddDto.getSchedulingDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")))
                    .status(1)
                    .build();
            salesLedgerSchedulingMapper.insert(salesLedgerScheduling);
            successNum++;
        }
        return "派工成功数量" + successNum + ",失败数量" + i;
    }
    private final SalesLedgerProductMapper salesLedgerProductMapper;
    /**
     *通过炒机名称获取当天正在排产量
     * @return
     */
    public BigDecimal getSchedulingNumBySpeculativeTradingName(String speculativeTradingName){
        LambdaQueryWrapper<SalesLedgerScheduling> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SalesLedgerScheduling::getSpeculativeTradingName, speculativeTradingName)
                .eq(SalesLedgerScheduling::getSchedulingDate, LocalDate.now());
        List<SalesLedgerScheduling> salesLedgerSchedulings = salesLedgerSchedulingMapper.selectList(queryWrapper);
        if(CollectionUtils.isEmpty(salesLedgerSchedulings)){
            return BigDecimal.ZERO;
        }
        List<Long> collect = salesLedgerSchedulings.stream().map(SalesLedgerScheduling::getSalesLedgerProductId).collect(Collectors.toList());
        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
                .in(SalesLedgerProduct::getId, collect));
        if(CollectionUtils.isEmpty(salesLedgerProducts)) return BigDecimal.ZERO;
        AtomicInteger totalNum = new AtomicInteger(0); //总数
        salesLedgerSchedulings.forEach(item ->{
            List<SalesLedgerProduct> collect1 = salesLedgerProducts.stream()
                    .filter(j -> j.getId().equals(item.getSalesLedgerProductId()))
                    .collect(Collectors.toList());
            if(!CollectionUtils.isEmpty(collect1)){
                SalesLedgerProduct salesLedgerProduct = collect1.get(0);
                // æ ¹æ®äº§å“è§„æ ¼ * æŽ’产数量 èŽ·å–æœ¬æ¬¡ç”Ÿäº§äº§é‡å¹¶ç´¯è®¡
                String[] split = salesLedgerProduct.getSpecificationModel().split("\\*");
                BigDecimal productionNum = new BigDecimal(split[0])
                        .multiply(new BigDecimal(split[1]).multiply(item.getSchedulingNum()));
                totalNum.addAndGet(productionNum.intValue());
            }
        });
        // éœ€è¦ / æŸè€—率
        Loss loss = lossMapper.selectOne(new LambdaQueryWrapper<Loss>().last("limit 1"));
        BigDecimal lossNum = loss == null ? new BigDecimal(6) : loss.getRate(); //没有损耗率则默认为6
        return new BigDecimal(totalNum.get()).multiply(new BigDecimal(100)).divide(lossNum, 2,RoundingMode.HALF_UP);
    }
    private final LossMapper lossMapper;
    /**
     *通过批量炒机名称获取当天正在排产量
     * @return
     */
    public BigDecimal getSchedulingNumBySpeculativeTradingNameList(List<String> speculativeTradingName){
        LambdaQueryWrapper<SalesLedgerScheduling> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(SalesLedgerScheduling::getSpeculativeTradingName, speculativeTradingName)
                .eq(SalesLedgerScheduling::getSchedulingDate, LocalDate.now());
        List<SalesLedgerScheduling> salesLedgerSchedulings = salesLedgerSchedulingMapper.selectList(queryWrapper);
        if(CollectionUtils.isEmpty(salesLedgerSchedulings)){
            return BigDecimal.ZERO;
        }
        List<Long> collect = salesLedgerSchedulings.stream().map(SalesLedgerScheduling::getSalesLedgerProductId).collect(Collectors.toList());
        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
                .in(SalesLedgerProduct::getId, collect));
        if(CollectionUtils.isEmpty(salesLedgerProducts)) return BigDecimal.ZERO;
        AtomicInteger totalNum = new AtomicInteger(0); //总数
        salesLedgerSchedulings.forEach(item ->{
            List<SalesLedgerProduct> collect1 = salesLedgerProducts.stream()
                    .filter(j -> j.getId().equals(item.getSalesLedgerProductId()))
                    .collect(Collectors.toList());
            if(!CollectionUtils.isEmpty(collect1)){
                SalesLedgerProduct salesLedgerProduct = collect1.get(0);
                // æ ¹æ®äº§å“è§„æ ¼ * æŽ’产数量 èŽ·å–æœ¬æ¬¡ç”Ÿäº§äº§é‡å¹¶ç´¯è®¡
                String[] split = salesLedgerProduct.getSpecificationModel().split("\\*");
                BigDecimal productionNum = new BigDecimal(split[0])
                        .multiply(new BigDecimal(split[1]).multiply(item.getSchedulingNum()));
                totalNum.addAndGet(productionNum.intValue());
            }
        });
        return new BigDecimal(totalNum.get());
    }
    @Override
    public IPage<SalesLedgerSchedulingProcessDto> listPageProcess(Page page, SalesLedgerSchedulingProcessDto salesLedgerSchedulingDto) {
        IPage<SalesLedgerSchedulingProcessDto> list = salesLedgerSchedulingMapper.listPageProcess(page, salesLedgerSchedulingDto);
//        Set<Long> collect = list.getRecords().stream().map(SalesLedgerSchedulingProcessDto::getId).collect(Collectors.toSet());
//        if(CollectionUtils.isEmpty(collect)) return list;
//        LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
//        salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerSchedulingId, collect)
//                .ne(SalesLedgerWork::getStatus, 1);
//        List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
//        list.getRecords().forEach(i -> {
//            // èŽ·å–å®Œæˆæ•°é‡
//            i.setSuccessNum(salesLedgerWorks
//                    .stream()
//                    .filter(j -> j.getSalesLedgerSchedulingId().equals(i.getId()))
//                    .map(SalesLedgerWork::getFinishedNum)
//                    .reduce(BigDecimal.ZERO, BigDecimal::add));
//        });
        list.getRecords().forEach(i -> {
            // è®¡ç®—生产总量 = è§„æ ¼ * æ•°é‡ / 1000
            String[] split = i.getSpecificationModel().split("\\*");
            if(split.length == 2 && isNumeric(split[0]) && isNumeric(split[1])){
                BigDecimal multiply = new BigDecimal(split[0])
                        .multiply(new BigDecimal(split[1])
                                .multiply(i.getSuccessNum()).divide(new BigDecimal(1000),2, RoundingMode.CEILING));
                i.setTotalProduction(multiply);
            }
        });
        return list;
    }
@@ -161,10 +343,10 @@
            SysUser sysUser = sysUserMapper.selectUserById(processSchedulingDto.getSchedulingUserId());
            if(sysUser == null) throw new RuntimeException("排产人不存在");
            salesLedgerScheduling.setFinishedNum(salesLedgerScheduling.getFinishedNum().add(processSchedulingDto.getSchedulingNum()));
            LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
            salesLedgerWorkLambdaQueryWrapper.eq(SalesLedgerWork::getSalesLedgerSchedulingId, salesLedgerScheduling.getId())
                    .ne(SalesLedgerWork::getStatus, 1);
            List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
//            LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
//            salesLedgerWorkLambdaQueryWrapper.eq(SalesLedgerWork::getSalesLedgerSchedulingId, salesLedgerScheduling.getId())
//                    .ne(SalesLedgerWork::getStatus, 1);
//            List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
            if(salesLedgerScheduling.getSchedulingNum().compareTo(salesLedgerScheduling.getFinishedNum()) < 0){
                throw new RuntimeException("当前排产数量大于待排产数量,请仔细核对!");
            }
@@ -177,6 +359,11 @@
            SalesLedgerWork.SalesLedgerWorkBuilder salesLedgerWorkBuilder = SalesLedgerWork.builder()
                    .salesLedgerSchedulingId(salesLedgerScheduling.getId())
                    .salesLedgerId(salesLedgerScheduling.getSalesLedgerId())
                    .remark(processSchedulingDto.getRemark())
                    .productionLine(processSchedulingDto.getProductionLine())
                    .type(processSchedulingDto.getType())
                    .loss(processSchedulingDto.getLoss())
                    .receive(processSchedulingDto.getReceive())
                    .salesLedgerProductId(salesLedgerScheduling.getSalesLedgerProductId())
                    .schedulingUserId(salesLedgerScheduling.getSchedulingUserId())
                    .schedulingUserName(sysUser.getNickName())
src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java
@@ -4,7 +4,14 @@
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.SecurityUtils;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.dto.Details;
import com.ruoyi.procurementrecord.dto.ProcurementAddDto;
import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd;
import com.ruoyi.procurementrecord.service.impl.ProcurementRecordOutServiceImpl;
import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl;
import com.ruoyi.production.dto.ProductionReportDto;
import com.ruoyi.production.dto.SalesLedgerWorkDto;
import com.ruoyi.production.mapper.SalesLedgerProductionAccountingMapper;
@@ -15,14 +22,19 @@
import com.ruoyi.production.service.SalesLedgerWorkService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.sales.mapper.LossMapper;
import com.ruoyi.sales.pojo.Loss;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -39,13 +51,46 @@
    private final SysUserMapper sysUserMapper;
    private final LossMapper lossMapper;
    private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
    @Override
    public IPage<SalesLedgerWorkDto> listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto) {
        IPage<SalesLedgerWorkDto> iPage = salesLedgerWorkMapper.listPage(page, salesLedgerWorkDto);
        List<Loss> losses = lossMapper.selectList(null);
        if(!CollectionUtils.isEmpty(losses)){
            iPage.getRecords().forEach(item -> {
                String[] split = item.getSpecificationModel().split("\\*");
                if(split.length == 2 && isNumeric(split[1]) && isNumeric(split[0])){
                    // è®¡ç®—损耗(100000代表 æŸè€—çš„ 100 å’Œ å•位转换的1000)
                    BigDecimal divide = new BigDecimal(split[0])
                            .multiply(new BigDecimal(split[1]))
                            .multiply(item.getFinishedNum())
                            .multiply(losses.get(0).getRate())
                            .divide(new BigDecimal(100000), 2, RoundingMode.HALF_UP);
                    item.setLoss(divide.toString());
                }
            });
        }
        return iPage;
    }
    public static boolean isNumeric(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        // éåŽ†å­—ç¬¦ä¸²çš„æ¯ä¸ªå­—ç¬¦ï¼Œæ£€æŸ¥æ˜¯å¦ä¸ºæ•°å­—
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }
    private final ProcurementRecordServiceImpl procurementRecordService;
    @Override
    public int productionReport(ProductionReportDto productionReportDto) {
@@ -66,7 +111,7 @@
                .salesLedgerWorkId(salesLedgerWork.getId())
                .salesLedgerSchedulingId(salesLedgerWork.getSalesLedgerSchedulingId())
                .salesLedgerId(salesLedgerWork.getSalesLedgerId())
                .salesLedgerProductId(salesLedgerWork.getSalesLedgerProductId())
                .salesLedgerProductId((long)salesLedgerWork.getSalesLedgerProductId())
                .schedulingUserId(sysUser.getUserId())
                .schedulingUserName(sysUser.getNickName())
                .finishedNum(productionReportDto.getFinishedNum())
@@ -74,6 +119,22 @@
                .process(salesLedgerWork.getProcess())
                .schedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE));
        salesLedgerProductionAccountingMapper.insert(builder.build());
        // ç”Ÿäº§æŠ¥å·¥æˆåŠŸ -> å…¥åº“
        LoginUser loginUser = SecurityUtils.getLoginUser();
        ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
        procurementRecordOutAdd.setType(2);
        procurementRecordOutAdd.setTypeName("生产入库");
        procurementRecordOutAdd.setNickName(loginUser.getNickName());
        List<Details> details = new ArrayList<>();
        Details details1 = new Details();
        details1.setInboundQuantity(productionReportDto.getFinishedNum());
        details1.setId(Integer.parseInt(salesLedgerWork.getSalesLedgerProductId().toString()));
        details1.setUnitPrice(productionReportDto.getUnitPrice());
        details1.setTotalPrice(productionReportDto.getTotalPrice());
        details.add(details1);
        procurementRecordOutAdd.setDetails(details);
        procurementRecordService.add(procurementRecordOutAdd);
        return 0;
    }
src/main/java/com/ruoyi/project/monitor/service/impl/SysJobServiceImpl.java
@@ -37,7 +37,7 @@
    @PostConstruct
    public void init() throws SchedulerException, TaskException
    {
        scheduler.clear();
//        scheduler.clear();
        List<SysJob> jobList = jobMapper.selectJobAll();
        for (SysJob job : jobList)
        {
src/main/java/com/ruoyi/project/system/controller/SysUserController.java
@@ -5,6 +5,7 @@
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.project.system.domain.vo.SysUserDeptVo;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.project.system.service.*;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -67,6 +68,17 @@
        return getDataTable(list);
    }
    /**
     * èŽ·å–ç”¨æˆ·åˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:user:list')")
    @GetMapping("/listAll")
    public AjaxResult listAll(SysUser user)
    {
        List<SysUser> list = userService.selectUserList(user);
        return AjaxResult.success(list);
    }
    @Log(title = "用户管理", businessType = BusinessType.EXPORT)
    @PreAuthorize("@ss.hasPermi('system:user:export')")
    @PostMapping("/export")
src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
@@ -49,6 +49,14 @@
    public SysUser selectUserByUserName(String userName);
    /**
     * é€šè¿‡æ˜µç§°æŸ¥è¯¢ç”¨æˆ·
     *
     * @param nickName ç”¨æˆ·å
     * @return ç”¨æˆ·å¯¹è±¡ä¿¡æ¯
     */
    public SysUser selectUserByNickName(String nickName);
    /**
     * é€šè¿‡ç”¨æˆ·ID查询用户
     * 
     * @param userId ç”¨æˆ·ID
src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -1,5 +1,6 @@
package com.ruoyi.purchase.controller;
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.ruoyi.common.utils.poi.ExcelUtil;
@@ -11,14 +12,19 @@
import com.ruoyi.purchase.dto.PurchaseLedgerDto;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.service.IPurchaseLedgerService;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.service.ISalesLedgerProductService;
import com.ruoyi.sales.service.ISalesLedgerService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
/**
 * é‡‡è´­å°è´¦Controller
@@ -29,10 +35,12 @@
@RestController
@RequestMapping("/purchase/ledger")
@AllArgsConstructor
@Api(tags = "111")
public class PurchaseLedgerController extends BaseController {
    private IPurchaseLedgerService purchaseLedgerService;
    private ISalesLedgerService salesLedgerService;
    private ISalesLedgerProductService salesLedgerProductService;
    /**
     * æŸ¥è¯¢é‡‡è´­å°è´¦åˆ—表
@@ -77,7 +85,42 @@
    public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedgerDto purchaseLedgerDto) throws IOException {
        return toAjax(purchaseLedgerService.addOrEditPurchase(purchaseLedgerDto));
    }
    /**
     * æ–°å¢žé‡‡è´­æ¨¡æ¿
     */
    @PostMapping("/addPurchaseTemplate")
    public AjaxResult addPurchaseTemplate(@RequestBody PurchaseLedgerDto purchaseLedgerDto) throws IOException {
        return toAjax(purchaseLedgerService.addPurchaseTemplate(purchaseLedgerDto));
    }
    /**
     * æŸ¥è¯¢é‡‡è´­æ¨¡æ¿
     */
    @ApiOperation("/2222")
    @GetMapping("/getPurchaseTemplateList")
    public AjaxResult getPurchaseTemplateList() {
        PurchaseLedgerDto purchaseLedgerDto = new PurchaseLedgerDto();
        purchaseLedgerDto.setApprovalStatus(3);
        IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerService.selectPurchaseLedgerListPage(new Page(1, -1), purchaseLedgerDto);
        List<PurchaseLedgerDto> purchaseLedgers = purchaseLedgerDtoIPage.getRecords();
        purchaseLedgers.forEach(purchaseLedgerDto1 -> {
            LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedgerDto1.getId())
                    .eq(SalesLedgerProduct::getType, 2);
            List<SalesLedgerProduct> list = salesLedgerProductService.list(queryWrapper);
            if (!list.isEmpty()) {
                purchaseLedgerDto1.setProductData(list);
            }
        });
        return AjaxResult.success(purchaseLedgers);
    }
    /**
     * ä¿®æ”¹é‡‡è´­å°è´¦å®¡æ‰¹çŠ¶æ€
     */
    @PostMapping("/updateApprovalStatus")
    public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedger purchaseLedger){
        return toAjax(purchaseLedgerService.updateById(purchaseLedger));
    }
    /**
     * æŸ¥è¯¢é‡‡è´­å°è´¦å’Œäº§å“çˆ¶å­åˆ—表
     */
@@ -149,7 +192,15 @@
     */
    @GetMapping("/listPage")
    public AjaxResult listPage(Page page, PurchaseLedgerDto purchaseLedger) {
         return AjaxResult.success(purchaseLedgerService.selectPurchaseLedgerListPage(page ,purchaseLedger));
        IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerService.selectPurchaseLedgerListPage(page ,purchaseLedger);
        //过滤掉approvalStatus=3的记录
        purchaseLedgerDtoIPage.getRecords().removeIf(purchaseLedgerDto -> purchaseLedgerDto.getApprovalStatus() == 3);
        purchaseLedgerDtoIPage.getRecords().forEach(purchaseLedgerDto -> {
            if (purchaseLedgerDto.getUnReceiptPaymentAmount().compareTo(BigDecimal.ZERO) == 0) {
                purchaseLedgerDto.setUnReceiptPaymentAmount(purchaseLedgerDto.getContractAmount());
            }
        });
         return AjaxResult.success(purchaseLedgerDtoIPage);
    }
    @ApiOperation("生成采购序列号")
src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
@@ -26,6 +26,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.parameters.P;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -127,17 +128,22 @@
     */
    @Log(title = "来票登记", businessType = BusinessType.INSERT)
    @PostMapping("/addOrUpdateRegistration")
    public AjaxResult addOrUpdateRegistration(@RequestBody TicketRegistrationDto ticketRegistrationDto) throws IOException {
        return toAjax(ticketRegistrationService.addOrUpdateRegistration(ticketRegistrationDto));
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult addOrUpdateRegistration(@RequestBody List<TicketRegistrationDto> ticketRegistrationDto) throws IOException {
        if(CollectionUtils.isEmpty(ticketRegistrationDto)) return AjaxResult.error("请选择要保存的记录");
        for (TicketRegistrationDto ticketRegistrationDto1 : ticketRegistrationDto) {
            ticketRegistrationService.addOrUpdateRegistration(ticketRegistrationDto1);
        }
        return toAjax(1);
    }
    @GetMapping("/getProductRecordById")
    public AjaxResult getProductRecordById(Long id) {
        if (id == null) {
    @PostMapping("/getProductRecordById")
    public AjaxResult getProductRecordById(@RequestBody ProductRecordDto productRecordDto) {
        if (productRecordDto.getId() == null) {
            return AjaxResult.error("参数错误");
        }
        return AjaxResult.success(productRecordService.getProductRecordById(id));
        return AjaxResult.success(productRecordService.getProductRecordById(productRecordDto));
    }
    @ApiModelProperty("修改来票登记")
src/main/java/com/ruoyi/purchase/dto/ProductRecordDto.java
@@ -5,6 +5,7 @@
import com.ruoyi.sales.pojo.CommonFile;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@@ -28,12 +29,21 @@
    private String projectName;
    private Long issUerId;
    private String issUer;
    /**
     * åˆåŒé‡‘额(产品含税总价)
     */
    private BigDecimal contractAmount = BigDecimal.ZERO;
    //增值税
    private String invoiceAmount = "0";
    private String invoiceNumber = "0";
    private String unTicketsPrice = "0";
    /**
     * å·²æ¥ç¥¨é‡‘额(发票金额)
     */
    private BigDecimal invoiceTotal = BigDecimal.ZERO;
    private BigDecimal invoiceAmount = BigDecimal.ZERO;
    /**
     * å‘票号
     */
    private String invoiceNumber;
    private BigDecimal unTicketsPrice = BigDecimal.ZERO;
    private List<CommonFile> commonFiles;
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -40,6 +40,11 @@
     */
    @Excel(name = "供应商名称")
    private String supplierName;
     /**
     * æ˜¯å¦ç™½åå•
     */
    @Excel(name = "是否白名单")
    private Integer isWhite;
    /**
     * å½•入人姓名id
@@ -180,5 +185,10 @@
    @ApiModelProperty(value = "付款方式")
    private String paymentMethod;
    @ApiModelProperty("审批状态")
    private Integer approvalStatus;
    @ApiModelProperty(value = "模板名称")
    private String templateName;
    @ApiModelProperty(value = "审批人id")
    private Integer approverId;
}
src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.purchase.pojo.TicketRegistration;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
@@ -41,6 +42,14 @@
    private String salesContractNo;
    /**
     * å¼€ç¥¨æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate entryDate;
    /**
     * å®¢æˆ·åç§°
     */
    private String customerName;
@@ -54,6 +63,7 @@
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @TableField(exist = false)
    private LocalDate enterDate;
    /**
src/main/java/com/ruoyi/purchase/mapper/ProductRecordMapper.java
@@ -8,6 +8,8 @@
import com.ruoyi.purchase.pojo.ProductRecord;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * é‡‡è´­å°è´¦äº§å“å¼€ç¥¨è®°å½•Mapper接口
 *
@@ -18,5 +20,5 @@
    IPage<ProductRecordDto> productRecordPage(Page page, @Param("c") TicketRegistrationDto ticketRegistrationDto);
    ProductRecordDto getProductRecordById(Long id);
    List<ProductRecordDto> getProductRecordById(@Param("c") ProductRecordDto productRecordDto);
}
src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -148,10 +148,14 @@
    @TableField(exist = false)
    private Integer type;
    @ApiModelProperty(value = "付款方式")
    private String paymentMethod;
    @ApiModelProperty("审批状态")
    private Integer approvalStatus;
    @ApiModelProperty(value = "模板名称")
    private String templateName;
    @ApiModelProperty(value = "审批人id")
    private Integer approverId;
}
src/main/java/com/ruoyi/purchase/service/IProductRecordService.java
@@ -24,5 +24,5 @@
    AjaxResult updateRecord(ProductRecordDto productRecordDto);
    ProductRecordDto getProductRecordById(Long id);
    ProductRecordDto getProductRecordById(ProductRecordDto productRecordDto);
}
src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
@@ -39,4 +39,6 @@
    List<InvoiceRegistrationProduct> getProductBySalesNo(Long id);
    String getPurchaseNo();
    int addPurchaseTemplate(PurchaseLedgerDto purchaseLedgerDto) throws IOException;
}
src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java
@@ -10,8 +10,10 @@
import com.ruoyi.purchase.dto.TicketRegistrationDto;
import com.ruoyi.purchase.mapper.ProductRecordMapper;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.mapper.TicketRegistrationMapper;
import com.ruoyi.purchase.pojo.ProductRecord;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.pojo.TicketRegistration;
import com.ruoyi.purchase.service.IProductRecordService;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
@@ -70,6 +72,8 @@
        return productRecordDtoIPage;
    }
    private final TicketRegistrationMapper ticketRegistrationMapper;
    @Override
    public AjaxResult updateRecord(ProductRecordDto productRecordDto) {
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(productRecordDto.getSaleLedgerProjectId());
@@ -88,13 +92,28 @@
        BeanUtils.copyProperties(productRecordDto,productRecord);
        productRecord.setFutureTicketsAmount(productRecord.getFutureTickets().multiply(productRecord.getTaxInclusiveUnitPrice()));
        productRecordMapper.updateById(productRecord);
        // ä¿®æ”¹å‘票号
        TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(productRecord.getTicketRegistrationId());
        if(ticketRegistration != null){
            ticketRegistration.setInvoiceNumber(productRecordDto.getInvoiceNumber());
            ticketRegistrationMapper.updateById(ticketRegistration);
        }
        return AjaxResult.success("修改成功");
    }
    @Override
    public ProductRecordDto getProductRecordById(Long id) {
        ProductRecordDto productRecordDto = productRecordMapper.getProductRecordById(id);
        return productRecordDto;
     @Override
    public ProductRecordDto getProductRecordById(ProductRecordDto productRecordDto) {
        List<ProductRecordDto> productRecordDtoList = productRecordMapper.getProductRecordById(productRecordDto);
        if(productRecordDtoList != null && productRecordDtoList.size() > 0){
            ProductRecordDto productRecordDto1 = productRecordDtoList.get(productRecordDtoList.size() - 1);
            // è¿‡æ»¤å‡ºä¸Žä¼ å…¥çš„ productRecordDto ä¸»é”®ç›¸åŒçš„记录
            ProductRecordDto productRecordDto2 = productRecordDtoList.stream().filter(item ->
                            item.getId().equals(productRecordDto.getId()))
                    .findFirst().orElse(null);
            productRecordDto2.setFutureTickets(productRecordDto1.getFutureTickets());
            productRecordDto2.setFutureTicketsAmount(productRecordDto1.getFutureTicketsAmount());
            return productRecordDto2;
        }
        return null;
    }
}
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -27,13 +27,21 @@
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.purchase.dto.PurchaseLedgerDto;
import com.ruoyi.purchase.mapper.PaymentRegistrationMapper;
import com.ruoyi.purchase.mapper.ProductRecordMapper;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.mapper.TicketRegistrationMapper;
import com.ruoyi.purchase.pojo.PaymentRegistration;
import com.ruoyi.purchase.pojo.ProductRecord;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.pojo.TicketRegistration;
import com.ruoyi.purchase.service.IPurchaseLedgerService;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityInspectParamMapper;
import com.ruoyi.quality.mapper.QualityTestStandardMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectParam;
import com.ruoyi.quality.pojo.QualityTestStandard;
import com.ruoyi.sales.mapper.*;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
@@ -94,9 +102,14 @@
    private final ProductRecordMapper productRecordMapper;
    private final PaymentRegistrationMapper paymentRegistrationMapper;
    private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    private final StringRedisTemplate redisTemplate;
    private final QualityInspectMapper qualityInspectMapper;
    private final QualityTestStandardMapper qualityTestStandardMapper;
    private final QualityInspectParamMapper qualityInspectParamMapper;
    @Value("${file.upload-dir}")
    private String uploadDir;
@@ -109,7 +122,49 @@
        }
        return purchaseLedgerMapper.selectList(queryWrapper);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int addPurchaseTemplate(PurchaseLedgerDto purchaseLedgerDto)throws IOException {
        //录入人
        SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId());
        SupplierManage supplierManage = supplierManageMapper.selectById(purchaseLedgerDto.getSupplierId());
        PurchaseLedger purchaseLedger = new PurchaseLedger();
//        BeanUtils.copyProperties(purchaseLedger,purchaseLedgerDto);
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if(ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
            purchaseLedger.setTenantId(loginUser.getTenantId());
        }
        purchaseLedger.setPaymentMethod(purchaseLedgerDto.getPaymentMethod());
        purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
        purchaseLedger.setSupplierId(purchaseLedgerDto.getSupplierId());
        purchaseLedger.setTemplateName(purchaseLedgerDto.getTemplateName());
//        purchaseLedger.setSalesLedgerPId(purchaseLedgerDto.getSalesLedgerId());
        purchaseLedger.setApprovalStatus(3);
        purchaseLedger.setSupplierName(supplierManage.getSupplierName());
        purchaseLedger.setRecorderName(sysUser.getNickName());
        purchaseLedger.setPhoneNumber(sysUser.getPhonenumber());
        purchaseLedger.setPurchaseContractNumber(UUID.randomUUID().toString().replaceAll("-", ""));
        purchaseLedger.setEntryDate(Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()));
        int insert = purchaseLedgerMapper.insert(purchaseLedger);
        LambdaQueryWrapper<PurchaseLedger> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(PurchaseLedger::getSupplierName, purchaseLedger.getSupplierName())
                .eq(PurchaseLedger::getPurchaseContractNumber, purchaseLedger.getPurchaseContractNumber())
                .eq(PurchaseLedger::getApprovalStatus,3);
        PurchaseLedger purchaseLedger1 = purchaseLedgerMapper.selectOne(queryWrapper);
        if(ObjectUtils.isNotEmpty(purchaseLedgerDto.getProductData())) {
            // 4. å¤„理子表数据
            List<SalesLedgerProduct> salesLedgerProductList = purchaseLedgerDto.getProductData();
            salesLedgerProductList.forEach(salesLedgerProduct -> {
                salesLedgerProduct.setSalesLedgerId(purchaseLedger1.getId());
                salesLedgerProduct.setType(2);
            });
            salesLedgerProductList.forEach(salesLedgerProductMapper::insert);
        }
        return insert;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws IOException {
@@ -131,10 +186,11 @@
        PurchaseLedger purchaseLedger = new PurchaseLedger();
        BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if(ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
        if (ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
            purchaseLedger.setTenantId(loginUser.getTenantId());
        }
        purchaseLedger.setSalesContractNo(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getSalesContractNo() : null);
        purchaseLedger.setSalesContractNo(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getSalesContractNo() : "");
        purchaseLedger.setSalesLedgerId(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getId() : -1);
        purchaseLedger.setSupplierName(supplierManage.getSupplierName());
        purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
        purchaseLedger.setRecorderName(sysUser.getNickName());
@@ -181,7 +237,13 @@
        if (productList != null && !productList.isEmpty()) {
            handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType());
        }
        //新增原材料检验
        for (SalesLedgerProduct saleProduct : productList) {
            //是否推送质检,如果true就添加
            if (saleProduct.getIsChecked()) {
                addQualityInspect(purchaseLedger, saleProduct);
            }
        }
        // 5. è¿ç§»ä¸´æ—¶æ–‡ä»¶åˆ°æ­£å¼ç›®å½•
        if (purchaseLedgerDto.getTempFileIds() != null && !purchaseLedgerDto.getTempFileIds().isEmpty()) {
            migrateTempFilesToFormal(purchaseLedger.getId(), purchaseLedgerDto.getTempFileIds());
@@ -189,6 +251,33 @@
        return 1;
    }
    private void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) {
        QualityInspect qualityInspect = new QualityInspect();
        qualityInspect.setInspectType(0);
        qualityInspect.setSupplier(purchaseLedger.getSupplierName());
        qualityInspect.setPurchaseLedgerId(purchaseLedger.getId());
        qualityInspect.setProductId(saleProduct.getId());
        qualityInspect.setProductName(saleProduct.getProductCategory());
        qualityInspect.setModel(saleProduct.getSpecificationModel());
        qualityInspect.setProductModelId(saleProduct.getProductModelId());
        qualityInspect.setUnit(saleProduct.getUnit());
        qualityInspect.setQuantity(saleProduct.getQuantity());
        qualityInspectMapper.insert(qualityInspect);
        QualityTestStandard qualityTestStandard = new QualityTestStandard();
        qualityTestStandard.setProductId(saleProduct.getProductId());
        List<QualityTestStandard> qualityTestStandards = qualityTestStandardMapper.qualityTestStandardList(qualityTestStandard);
        for (QualityTestStandard qualityTestStandardDB : qualityTestStandards) {
            QualityInspectParam qualityInspectParam = new QualityInspectParam();
            qualityInspectParam.setInspectId(qualityInspect.getId());
            qualityInspectParam.setParameterItem(qualityTestStandardDB.getParameterItem());
            qualityInspectParam.setUnit(qualityTestStandardDB.getUnit());
            qualityInspectParam.setStandardValue(qualityTestStandardDB.getStandardValue());
            qualityInspectParam.setControlValue(qualityTestStandardDB.getControlValue());
            qualityInspectParamMapper.insert(qualityInspectParam);
        }
    }
    private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) {
        if (products == null || products.isEmpty()) {
@@ -257,6 +346,8 @@
                LocalDateTime localDateTime = entryDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
                salesLedgerProduct.setRegisterDate(localDateTime);
                salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
                salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
                salesLedgerProductMapper.insert(salesLedgerProduct);
            }
        }
@@ -349,6 +440,7 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deletePurchaseLedgerByIds(Long[] ids) {
        if (ids == null || ids.length == 0) {
           throw new BaseException("请选中至少一条数据");
@@ -360,12 +452,37 @@
        salesLedgerProductMapper.delete(queryWrapper);
        // æ‰¹é‡åˆ é™¤å…³è”的采购台账的来票登记
        LambdaQueryWrapper<TicketRegistration> ticketRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getSalesLedgerId,ids);
        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getPurchaseLedgerId,ids);
        ticketRegistrationMapper.delete(ticketRegistrationLambdaQueryWrapper);
        // æ‰¹é‡åˆ é™¤å…³è”的采购台账的来票登记记录
        LambdaQueryWrapper<ProductRecord> productRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        productRecordLambdaQueryWrapper.in(ProductRecord::getPurchaseLedgerId,ids);
        productRecordMapper.delete(productRecordLambdaQueryWrapper);
        // æ‰¹é‡åˆ é™¤ä»˜æ¬¾ç™»è®°
        LambdaQueryWrapper<PaymentRegistration> paymentRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
        paymentRegistrationLambdaQueryWrapper.in(PaymentRegistration::getPurchaseLedgerId, ids);
        paymentRegistrationMapper.delete(paymentRegistrationLambdaQueryWrapper);
        //批量删除检验标准
        LambdaQueryWrapper<QualityInspect> materialInspectLambdaQueryWrapper = new LambdaQueryWrapper<>();
        materialInspectLambdaQueryWrapper.in(QualityInspect::getPurchaseLedgerId, ids);
        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(materialInspectLambdaQueryWrapper);
        qualityInspects.stream().forEach(qualityInspect -> {
            if (ObjectUtils.isNotEmpty(qualityInspect.getInspectState())&&qualityInspect.getInspectState().equals(1)) {
                throw new BaseException("已提交的检验单不能删除");
            }
        });
        List<Long> inspectIds = qualityInspects.stream()
                .map(QualityInspect::getId)
                .collect(Collectors.toList());
        if (inspectIds.size() > 0) {
            LambdaQueryWrapper<QualityInspectParam> qualityStandardLambdaQueryWrapper = new LambdaQueryWrapper<>();
            qualityStandardLambdaQueryWrapper.in(QualityInspectParam::getInspectId, inspectIds);
            qualityInspectParamMapper.delete(qualityStandardLambdaQueryWrapper);
        }
        //批量删除原材料检验数据
        qualityInspectMapper.delete(materialInspectLambdaQueryWrapper);
        // æ‰¹é‡åˆ é™¤é‡‡è´­å°è´¦
        return purchaseLedgerMapper.deleteBatchIds(Arrays.asList(ids));
    }
@@ -386,7 +503,8 @@
        // 3.查询上传文件
        LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
        salesLedgerFileWrapper.eq(CommonFile::getCommonId, purchaseLedger.getId());
        salesLedgerFileWrapper.eq(CommonFile::getCommonId, purchaseLedger.getId())
                .eq(CommonFile::getType,FileNameType.PURCHASE.getValue());
        List<CommonFile> salesLedgerFiles = commonFileMapper.selectList(salesLedgerFileWrapper);
        // 4. è½¬æ¢ DTO
@@ -491,8 +609,8 @@
    @Override
    public List<InvoiceRegistrationProduct> getProductBySalesNo(Long id) {
        List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(new LambdaQueryWrapper<InvoiceRegistrationProduct>()
                        .select(InvoiceRegistrationProduct::getId, InvoiceRegistrationProduct::getProductCategory, InvoiceRegistrationProduct::getSpecificationModel,
                                InvoiceRegistrationProduct::getUnit, InvoiceRegistrationProduct::getQuantity)
                .select(InvoiceRegistrationProduct::getId, InvoiceRegistrationProduct::getProductCategory, InvoiceRegistrationProduct::getSpecificationModel,
                        InvoiceRegistrationProduct::getUnit, InvoiceRegistrationProduct::getQuantity)
                .eq(InvoiceRegistrationProduct::getSalesLedgerId, id));
        if (invoiceRegistrationProducts.isEmpty()) {
            return new ArrayList<>();
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -136,7 +136,7 @@
        BeanUtils.copyProperties(ticketRegistrationDto, ticketRegistration);
        ticketRegistration.setPurchaseContractNumber(purchaseLedger.getPurchaseContractNumber());
        ticketRegistration.setTenantId(purchaseLedger.getTenantId());
        ticketRegistration.setIssueDate(ticketRegistrationDto.getIssueDate());
        ticketRegistration.setIssueDate(ticketRegistrationDto.getEntryDate());
        ticketRegistration.setContractAmount(purchaseLedger.getContractAmount());
        ticketRegistration.setSalesLedgerId(purchaseLedger.getSalesLedgerId());
        ticketRegistration.setEnterDate(ticketRegistrationDto.getEnterDate());
@@ -166,11 +166,11 @@
                    productRecord.setSaleLedgerProjectId(salesLedgerProduct.getId());
                    productRecord.setId(null);
                    productRecord.setType("2");
                     insert = productRecordMapper.insert(productRecord);
                    insert += productRecordMapper.insert(productRecord);
                }
                if (insert <= 0) {
                    throw new RuntimeException("产品开票数都为0,请检查");
                }
            }
            if (insert <= 0) {
                throw new RuntimeException("产品开票数都为0,请检查");
            }
        }
        // è¿ç§»ä¸´æ—¶æ–‡ä»¶åˆ°æ­£å¼ç›®å½•
@@ -223,13 +223,7 @@
            Path formalFilePath = formalDirPath.resolve(formalFilename);
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
//                Files.move(
//                        Paths.get(tempFile.getTempPath()),
//                        formalFilePath,
//                        StandardCopyOption.REPLACE_EXISTING,
//                        StandardCopyOption.ATOMIC_MOVE
//                );
                // åŽŸå­ç§»åŠ¨å¤±è´¥ï¼Œä½¿ç”¨å¤åˆ¶+删除
                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
@@ -273,7 +267,7 @@
            // å°äºŽç­‰äºŽ0删除 ï¼Œå¤§äºŽ0修改
            if(subtract.compareTo(BigDecimal.ZERO) <= 0){
                ticketRegistrationMapper.deleteById(ticketRegistrations.get(0));
                // åˆ é™¤ä»˜æ¬¾æµæ°´
                // åˆ é™¤ä»˜æ¬¾æµæ°´è®°å½•
                paymentRegistrationMapper.delete(new LambdaQueryWrapper<PaymentRegistration>().eq(PaymentRegistration::getTicketRegistrationId, ticketRegistrations.get(0).getId()));
            }else if(subtract.compareTo(BigDecimal.ZERO) > 0){
                ticketRegistrations.get(0).setInvoiceAmount(subtract);
src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java
@@ -17,4 +17,9 @@
    IPage<QualityInspect> qualityInspectListPage(Page page, @Param("qualityInspect") QualityInspect qualityInspect);
    List<QualityInspect> qualityInspectExport(@Param("qualityInspect") QualityInspect qualityInspect);
    /**
     * æ ¹æ®ç”Ÿäº§ä¸»è¡¨ID批量删除过程检验
     */
    int deleteByProductMainIds(@Param("productMainIds") List<Long> productMainIds);
}
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -138,5 +138,15 @@
     */
    private Integer inspectState;
    private Long purchaseLedgerId;
    /**
     * æŠ¥å·¥id
     */
    private Long productMainId;
    private Long productModelId;
    //不合格现象
    private String defectivePhenomena;
}
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.quality.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
@@ -11,7 +12,13 @@
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.procurementrecord.dto.Details;
import com.ruoyi.procurementrecord.dto.ProcurementAddDto;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityInspectParamMapper;
@@ -23,6 +30,8 @@
import com.ruoyi.quality.pojo.QualityUnqualified;
import com.ruoyi.quality.service.IQualityInspectParamService;
import com.ruoyi.quality.service.IQualityInspectService;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
@@ -36,7 +45,10 @@
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
@@ -53,6 +65,10 @@
    private QualityTestStandardMapper qualityTestStandardMapper;
    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
    private SalesLedgerProductMapper salesLedgerProductMapper;
    private ProcurementRecordService procurementRecordService;
    @Override
    public int add(QualityInspectDto qualityInspectDto) {
@@ -91,6 +107,80 @@
            qualityUnqualified.setDefectivePhenomena(text+"这些指标中存在不合格");//不合格现象
            qualityUnqualifiedMapper.insert(qualityUnqualified);
        }
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (qualityInspect.getInspectType() == 0) {
            if ("合格".equals(qualityInspect.getCheckResult())) {
                ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
                procurementRecordOutAdd.setType(1);
                procurementRecordOutAdd.setTypeName("采购入库");
                procurementRecordOutAdd.setNickName(loginUser.getNickName());
                procurementRecordOutAdd.setPurchaseLedgerId(Math.toIntExact(qualityInspect.getPurchaseLedgerId()));
                if (qualityInspect.getPurchaseLedgerId() == null) {
                    throw new BaseException("请选择采购单");
                }
                SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(qualityInspect.getProductId());
                ArrayList<Details> detailss = new ArrayList<>();
                Details details = new Details();
                details.setId(Math.toIntExact(salesLedgerProduct.getId()));
                details.setInboundQuantity(qualityInspect.getQuantity());
                details.setWarnNum(salesLedgerProduct.getWarnNum());
                details.setUnitPrice(salesLedgerProduct.getTaxInclusiveUnitPrice());
                details.setTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice());
                details.setProductModelId(qualityInspect.getProductModelId());
                detailss.add( details);
                procurementRecordOutAdd.setDetails(detailss);
                procurementRecordService.add(procurementRecordOutAdd);
            }
        }else if (qualityInspect.getInspectType() == 1) {
            //查询UnitPrice/TotalPrice
            ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
            procurementRecordOutAdd.setType(2);
            procurementRecordOutAdd.setTypeName("生产入库");
            procurementRecordOutAdd.setNickName(loginUser.getNickName());
            List<Details> details = new ArrayList<>();
            Details details1 = new Details();
            details1.setInboundQuantity(qualityInspect.getQuantity());
            details1.setProductModelId(qualityInspect.getProductModelId());
            procurementRecordOutAdd.setDetails(details);
            ProcurementRecordStorage.ProcurementRecordStorageBuilder procurementRecordBuilder = ProcurementRecordStorage.builder()
                    .salesLedgerProductId(0)
                    .inboundBatches( "生产半成品入库")
                    .inboundNum(details1.getInboundQuantity())
                    .type(2)
                    .warnNum(new BigDecimal(0))
                    .unitPrice(new BigDecimal(0))
                    .totalPrice(new BigDecimal(0))
                    .createTime(LocalDateTime.now())
                    .createUser(loginUser.getUserId())
                    .updateTime(LocalDateTime.now())
                    .updateUser(loginUser.getUserId())
                    .createBy(procurementRecordOutAdd.getNickName())
                    .productModelId(details1.getProductModelId());
            procurementRecordService.save(procurementRecordBuilder.build());
        }else if (qualityInspect.getInspectType() == 2) {
            //查询UnitPrice/TotalPrice
            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectSalesLedgerProductByMainId(qualityInspect.getProductMainId());
            ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
            procurementRecordOutAdd.setType(2);
            procurementRecordOutAdd.setTypeName("生产入库");
            procurementRecordOutAdd.setNickName(loginUser.getNickName());
            List<Details> details = new ArrayList<>();
            Details details1 = new Details();
            details1.setInboundQuantity(qualityInspect.getQuantity());
            details1.setId(Math.toIntExact(salesLedgerProduct.getId()));
            details1.setUnitPrice(salesLedgerProduct.getTaxInclusiveUnitPrice());
            details1.setTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice());
            details1.setProductModelId(salesLedgerProduct.getProductModelId());
            details.add(details1);
            procurementRecordOutAdd.setDetails(details);
            procurementRecordService.add(procurementRecordOutAdd);
        }
        qualityInspect.setInspectState(1);//已提交
        return qualityInspectMapper.updateById(qualityInspect);
    }
src/main/java/com/ruoyi/sales/controller/InvoiceLedgerController.java
@@ -1,12 +1,16 @@
package com.ruoyi.sales.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.sales.dto.InvoiceLedgerDto;
import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
import com.ruoyi.sales.mapper.InvoiceLedgerFileMapper;
import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import com.ruoyi.sales.service.InvoiceLedgerService;
import io.jsonwebtoken.lang.Collections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -25,6 +29,9 @@
    @Autowired
    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    @Autowired
    private InvoiceLedgerFileMapper invoiceLedgerFileMapper;
    /**
     * å¼€ç¥¨å°è´¦æ–°å¢ž
@@ -70,6 +77,19 @@
    }
    /**
     * å¼€ç¥¨å°è´¦æ–‡ä»¶åˆ é™¤
     */
    @DeleteMapping("/delFile")
    @Log(title = "开票台账", businessType = BusinessType.DELETE)
    public AjaxResult invoiceLedgerDelFile(@RequestBody List<Integer> ids) {
        if(Collections.isEmpty(ids)) return AjaxResult.error("请选择要删除的文件");
        invoiceLedgerFileMapper.deleteBatchIds(ids);
        return AjaxResult.success();
    }
    /**
     * å¼€ç¥¨å°è´¦æ–‡ä»¶ä¸Šä¼ 
     * @param file
     * @return
src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java
@@ -1,12 +1,15 @@
package com.ruoyi.sales.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.dto.InvoiceRegistrationDto;
import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.service.InvoiceRegistrationService;
import io.jsonwebtoken.lang.Collections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
@@ -25,8 +28,14 @@
     * @return
     */
    @PostMapping("/save")
    public AjaxResult invoiceRegistrationSave(@RequestBody SalesLedgerDto salesLedgerDto) {
        invoiceRegistrationService.invoiceRegistrationSave(salesLedgerDto);
    @Log(title = "开票登记", businessType = com.ruoyi.framework.aspectj.lang.enums.BusinessType.INSERT)
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult invoiceRegistrationSave(@RequestBody List<SalesLedgerDto> salesLedgerDto) {
        if(Collections.isEmpty(salesLedgerDto)) return AjaxResult.error("请选择要保存的记录");
        salesLedgerDto.forEach(item ->{
            invoiceRegistrationService.invoiceRegistrationSave(item);
        });
        return AjaxResult.success();
    }
src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
@@ -183,6 +183,7 @@
            BeanUtils.copyProperties(receiptPaymentRecordDto, receiptPaymentRecordDto1);
            receiptPaymentRecordDto1.setInvoiceDate(Date.from(receiptPaymentRecordDto.getCreateTime().atZone(DEFAULT_ZONE_ID).toInstant()));
            receiptPaymentRecordDto1.setReceiptPaymentAmountTotal(receiptPaymentRecordDto.getReceiptPaymentAmount());
            BeanUtils.copyProperties(receiptPaymentRecordDto, receiptPaymentRecordDto1);
            receiptPaymentRecordDtos.add(receiptPaymentRecordDto1);
        });
        util.exportExcel(response, receiptPaymentRecordDtos, "导出回款流水列表");
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -206,7 +206,7 @@
        List<Long> salesLedgerIds = iPage.getRecords().stream().map(SalesLedger::getId).collect(Collectors.toList());
        List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds);
        if(CollectionUtils.isEmpty(invoiceLedgerDtoList)){
            invoiceLedgerDtoList = new ArrayList<>();
            return iPage;
        }
        // è®¡ç®—回款金额,待回款金额
        List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(new LambdaQueryWrapper<InvoiceRegistrationProduct>()
@@ -264,9 +264,10 @@
        if (ObjectUtils.isNotEmpty(salesLedgerDto.getStatus())) {
            if (salesLedgerDto.getStatus()) {
                iPage.getRecords().removeIf(salesLedger -> Objects.equals(salesLedger.getNoInvoiceAmountTotal(), new BigDecimal("0.00")));
                iPage.setTotal(iPage.getRecords().size());
            }
        }
        iPage.setTotal(iPage.getRecords().size());
        return iPage;
    }
}
src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -2,7 +2,13 @@
import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
import com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.service.ISalesLedgerProductService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -19,6 +25,7 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -33,7 +40,10 @@
{
    @Autowired
    private ISalesLedgerProductService salesLedgerProductService;
    @Autowired
    private ProcurementRecordService procurementRecordService;
    @Autowired
    private StockUtils stockUtils;
    /**
     * æŸ¥è¯¢äº§å“ä¿¡æ¯åˆ—表
     */
@@ -41,6 +51,26 @@
    public AjaxResult list(SalesLedgerProduct salesLedgerProduct)
    {
        List<SalesLedgerProduct> list = salesLedgerProductService.selectSalesLedgerProductList(salesLedgerProduct);
        list.forEach(item -> {
                if (item.getFutureTickets().compareTo(BigDecimal.ZERO) == 0) {
                    item.setFutureTickets(item.getQuantity());
                }
            if (item.getFutureTicketsAmount().compareTo(BigDecimal.ZERO) == 0) {
                item.setFutureTicketsAmount(item.getTaxInclusiveTotalPrice());
            }
//            ProcurementPageDto procurementDto = new ProcurementPageDto();
//            procurementDto.setSalesLedgerProductId(item.getId());
//            procurementDto.setProductCategory(item.getProductCategory());
//            IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopyByProduction(new Page<>(1,-1), procurementDto);
            BigDecimal stockQuantity = stockUtils.getStockQuantity(item.getProductModelId()).get("stockQuantity");
            if(stockQuantity != null) {
//                ProcurementPageDtoCopy procurementDtoCopy = result.getRecords().get(0);
                if (item.getQuantity().compareTo(stockQuantity) >= 0 && item.getApproveStatus() == 0) {
                    item.setApproveStatus(1);
                    salesLedgerProductService.addOrUpdateSalesLedgerProduct(item);
                }
            }
        });
        return AjaxResult.success(list);
    }
src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
package com.ruoyi.sales.controller;
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.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.dto.ProcurementAddDto;
import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.ShipmentApproval;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.ISalesLedgerProductService;
import com.ruoyi.sales.service.ShipmentApprovalService;
import com.ruoyi.sales.service.ShippingInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@RestController
@RequestMapping("/shipmentApproval")
@Api(tags = "发货审批管理")
public class ShipmentApprovalController extends BaseController {
    @Autowired
    private ShipmentApprovalService shipmentApprovalService;
    @Autowired
    private ShipmentApprovalMapper shipmentApprovalMapper;
    @Autowired
    private ISalesLedgerProductService salesLedgerProductService;
    @Autowired
    private ProcurementRecordOutService procurementRecordOutService;
    @Autowired
    private ProcurementRecordService procurementRecordStorageService;
    @GetMapping("/listPage")
    @ApiOperation("发货审批列表")
    public AjaxResult listPage(Page page, ShipmentApproval req) {
        IPage<ShipmentApproval> listPage = shipmentApprovalService.listPage(page,req);
        return AjaxResult.success(listPage);
    }
    @PostMapping("/update")
    @ApiOperation("发货审批,更新发货审批状态")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody ShipmentApproval req) {
        //  æŸ¥è¯¢å‘货审批
        ShipmentApproval shipmentApproval = shipmentApprovalMapper.selectById(req.getId());
        if (shipmentApproval == null) {
            return AjaxResult.error("发货审批不存在");
        }
        //  æ›´æ–°å‘货审批状态
        shipmentApproval.setApproveStatus(req.getApproveStatus());
        boolean update = shipmentApprovalService.updateById(shipmentApproval);
        if (!update) {
            //  äº‹åŠ¡å›žæ»š
            throw new ServiceException("发货审批更新失败");
        }
        //  æŸ¥è¯¢å…³è”的销售台账产品
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductService.getById(shipmentApproval.getSalesLedgerProductId());
        if (salesLedgerProduct == null) {
            //  æŠ›å¼‚常事务回滚
            throw new ServiceException("销售台账不存在,审批回滚");
        }
        //  åŒæ­¥æ›´æ–°é”€å”®å°è´¦äº§å“çš„审批状态
        salesLedgerProduct.setApproveStatus(req.getApproveStatus());
        salesLedgerProductService.updateById(salesLedgerProduct);
        //  å®¡æ‰¹é€šè¿‡
        if (req.getApproveStatus() == 3) {
            // æŸ¥è¯¢é‡‡è´­å…¥åº“记录
            LambdaQueryWrapper<ProcurementRecordStorage> lambdaQueryWrapper = new LambdaQueryWrapper<ProcurementRecordStorage>()
                    .eq(ProcurementRecordStorage::getSalesLedgerProductId, req.getSalesLedgerProductId());
            ProcurementRecordStorage procurementRecordStorage = procurementRecordStorageService.getOne(lambdaQueryWrapper);
            if (procurementRecordStorage == null) {
                // ä¿è¯å‰é¢çš„修改全部回滚
                throw new ServiceException("采购记录不存在,审批回滚");
            }
            //  ç”Ÿæˆå‡ºåº“记录
            ProcurementRecordOutAdd procurementRecordOutAdd = new ProcurementRecordOutAdd();
            procurementRecordOutAdd.setId(procurementRecordStorage.getId());
            procurementRecordOutAdd.setSalesLedgerProductId(Math.toIntExact(salesLedgerProduct.getId()));
            procurementRecordOutAdd.setType(2);
            procurementRecordOutAdd.setUserId(Math.toIntExact(getUserId()));
            procurementRecordOutAdd.setQuantity(salesLedgerProduct.getQuantity().toPlainString());
            procurementRecordOutAdd.setTime(LocalDate.now().toString());
            procurementRecordOutService.stockout(procurementRecordOutAdd);
        }
        return AjaxResult.success();
    }
    /**
     * å¯¼å‡ºå‘货信息管理
     */
    @PostMapping("/export")
    @ApiOperation("导出发货审批")
    public void export(HttpServletResponse response) {
        List<ShipmentApproval> list = shipmentApprovalService.list(null);
        ExcelUtil<ShipmentApproval> util = new ExcelUtil<ShipmentApproval>(ShipmentApproval.class);
        util.exportExcel(response, list, "发货审批");
    }
}
src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -1,5 +1,6 @@
package com.ruoyi.sales.controller;
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.ruoyi.common.utils.poi.ExcelUtil;
@@ -7,13 +8,20 @@
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.ShipmentApproval;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.ISalesLedgerProductService;
import com.ruoyi.sales.service.ISalesLedgerService;
import com.ruoyi.sales.service.ShippingInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
@@ -30,6 +38,10 @@
    @Autowired
    private ShippingInfoService shippingInfoService;
    @Autowired
    private ShipmentApprovalMapper shipmentApprovalMapper;
    @Autowired
    private ISalesLedgerProductService salesLedgerProductService;
    @GetMapping("/listPage")
@@ -41,8 +53,33 @@
    @PostMapping("/add")
    @ApiOperation("添加发货信息")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody ShippingInfo req) {
        LambdaQueryWrapper<ShippingInfo> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ShippingInfo::getSalesLedgerId, req.getSalesLedgerId());
        wrapper.eq(ShippingInfo::getSalesLedgerProductId, req.getSalesLedgerProductId());
        List<ShippingInfo> list = shippingInfoService.list(wrapper);
        if(!CollectionUtils.isEmpty(list)){
            return AjaxResult.error("发货信息已存在");
        }
        boolean save = shippingInfoService.save(req);
        if(save){
            ShippingInfo shippingInfo = shippingInfoService.getOne(wrapper);
            ShipmentApproval shipmentApproval = new ShipmentApproval();
            shipmentApproval.setSalesLedgerId(req.getSalesLedgerId());
            shipmentApproval.setSalesLedgerProductId(req.getSalesLedgerProductId());
            shipmentApproval.setApproveUserId(req.getApproverId());
            shipmentApproval.setApproveStatus(2);
            shipmentApproval.setShippingInfoId(shippingInfo.getId());
            shipmentApprovalMapper.insert(shipmentApproval);
            SalesLedgerProduct salesLedgerProduct = salesLedgerProductService.getById(req.getSalesLedgerProductId());
            if(salesLedgerProduct != null){
                salesLedgerProduct.setApproveStatus(2);
                salesLedgerProductService.updateById(salesLedgerProduct);
            }
        }
        return save ? AjaxResult.success() : AjaxResult.error();
    }
src/main/java/com/ruoyi/sales/dto/ReceiptPaymentRecordDto.java
@@ -9,6 +9,7 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
/**
@@ -30,7 +31,7 @@
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "登记日期",width = 30,dateFormat = "yyyy-MM-dd")
    @ApiModelProperty(value = "登记日期")
    private Date invoiceDate;
    private LocalDateTime createTime;
    @ApiModelProperty(value = "销售合同号")
    @Excel(name = "销售合同号")
@@ -38,7 +39,7 @@
    @ApiModelProperty(value = "回款金额")
    @Excel(name = "回款金额")
    private BigDecimal receiptPaymentAmountTotal;
    private BigDecimal receiptPaymentAmount;
    @ApiModelProperty(value = "项目名称")
    @Excel(name = "项目名称")
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -46,7 +46,7 @@
    private List<String> tempFileIds;
    private List<CommonFile> SalesLedgerFiles;
    private Integer Type;
    private Integer type;
    @ApiModelProperty(value = "签订日期")
    private LocalDate executionDate;
src/main/java/com/ruoyi/sales/mapper/LossMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.sales.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.sales.pojo.Loss;
/**
 * @author :yys
 * @date : 2025/11/13 16:17
 */
public interface LossMapper extends BaseMapper<Loss> {
}
src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -2,6 +2,9 @@
import com.ruoyi.common.config.MyBaseMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * äº§å“ä¿¡æ¯Mapper接口
@@ -10,4 +13,8 @@
 * @date 2025-05-08
 */
public interface SalesLedgerProductMapper extends MyBaseMapper<SalesLedgerProduct> {
    List<SalesLedgerProduct> selectSalesLedgerProductList(@Param("salesLedgerProduct") SalesLedgerProduct salesLedgerProduct);
    SalesLedgerProduct selectSalesLedgerProductByMainId(@Param("productMainId") Long productMainId);
}
src/main/java/com/ruoyi/sales/mapper/ShipmentApprovalMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.sales.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.sales.pojo.ShipmentApproval;
import com.ruoyi.sales.pojo.ShippingInfo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface ShipmentApprovalMapper extends BaseMapper<ShipmentApproval> {
    IPage<ShipmentApproval> listPage(Page page,@Param("req") ShipmentApproval req);
}
src/main/java/com/ruoyi/sales/pojo/InvoiceLedgerFile.java
@@ -10,6 +10,9 @@
@Data
public class InvoiceLedgerFile {
    @ApiModelProperty(value = "文件ID")
    private Long id;
    @ApiModelProperty(value = "文件名称")
    private String name;
src/main/java/com/ruoyi/sales/pojo/Loss.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.sales.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author :yys
 * @date : 2025/11/13 16:16
 */
@Data
@TableName("loss")
public class Loss {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    private BigDecimal rate;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -41,6 +41,21 @@
    private String customerContractNo;
    /**
     * å‘货车牌号
     */
    @Excel(name = "发货车牌号")
    @TableField(exist = false)
    private String shippingCarNumber;
    /**
     * å‘货日期
     */
    @Excel(name = "发货日期", width = 30, dateFormat = "yyyy-MM-dd")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date shippingDate;
    /**
     * é¡¹ç›®åç§°
     */
    @Excel(name = "项目名称")
@@ -125,5 +140,9 @@
    @ApiModelProperty(value = "付款方式")
    private String paymentMethod;
    @TableField(exist = false)
    @ApiModelProperty(value = "生产状态")
    private String productionStatus = "未开始";
}
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -9,8 +9,10 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * äº§å“ä¿¡æ¯å¯¹è±¡ sales_ledger_product
@@ -20,7 +22,7 @@
 */
@TableName("sales_ledger_product")
@Data
public class SalesLedgerProduct {
public class SalesLedgerProduct implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
@@ -103,22 +105,22 @@
    /**
     * æœ¬æ¬¡æ¥ç¥¨æ•°
     */
    private BigDecimal ticketsNum;
    private BigDecimal ticketsNum=BigDecimal.ZERO;
    /**
     * æœ¬æ¬¡æ¥ç¥¨é‡‘额(元)
     */
    private BigDecimal ticketsAmount;
    private BigDecimal ticketsAmount=BigDecimal.ZERO;
    /**
     * æœªæ¥ç¥¨æ•°
     */
    private BigDecimal futureTickets;
    private BigDecimal futureTickets=BigDecimal.ZERO;
    /**
     * æœªæ¥ç¥¨é‡‘额(元)
     */
    private BigDecimal futureTicketsAmount;
    private BigDecimal futureTicketsAmount=BigDecimal.ZERO;
    @ApiModelProperty(value = "开票数")
    private BigDecimal invoiceNum;
@@ -177,6 +179,33 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "登记日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime registerDate;
    /**
     * å‘货车牌号
     */
    @Excel(name = "发货车牌号")
    @TableField(exist = false)
    private String shippingCarNumber;
    /**
     * å‘货日期
     */
    @Excel(name = "发货日期", width = 30, dateFormat = "yyyy-MM-dd")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date shippingDate;
//    @TableField(exist = false)
//    @ApiModelProperty(value = "生产状态")
//    private String productionStatus = "未开始";
    /**
     * å‘货审批状态
     */
//    @TableField(exist = false)
    @ApiModelProperty(value = "审批状态:0未生产,1已生产,2待审核(审核中),3审核完成,4审核失败")
    private Integer approveStatus;
    @ApiModelProperty(value = "是否质检")
    private Boolean isChecked;
    /**
     * ç¾Žå…ƒ
src/main/java/com/ruoyi/sales/pojo/ShipmentApproval.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,352 @@
package com.ruoyi.sales.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Data
@TableName("shipment_approval")
public class ShipmentApproval {
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "发货信息id")
    private Long shippingInfoId;
    @ApiModelProperty(value = "销售台账id")
    private Long salesLedgerId;
    @ApiModelProperty(value = "销售报价产品表id")
    private Long salesLedgerProductId;
     @ApiModelProperty(value = "申请部门id")
    private Long approveDeptId;
    @ApiModelProperty(value = "申请部门名称")
    @Excel(name = "申请部门")
    private String approveDeptName;
     @ApiModelProperty(value = "审批用户id")
    private Integer approveUserId;
    @ApiModelProperty(value = "审批用户名称")
    @Excel(name = "审批用户")
    private String approveUserNames;
    /**
     * å®¡æ‰¹çŠ¶æ€
     */
    @ApiModelProperty(value = "审批状态:0未出库,1已出库,2待审核,3审核完成,4审核失败")
    @Excel(name = "审批状态", readConverterExp = "0=未出库,1=已出库,2=待审核,3=审核完成,4=审核失败")
    private Integer approveStatus;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Integer createUser;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "发货日期", width = 30, dateFormat = "yyyy-MM-dd")
    @TableField(exist = false)
    private Date shippingDate;
    @Excel(name = "发货车牌号")
    @TableField(exist = false)
    private String shippingCarNumber;
    /**
     * é¢„警数量
     */
    @TableField(exist = false)
    private BigDecimal warnNum;
    /**
     * äº§å“å¤§ç±»
     */
    @Excel(name = "产品大类")
    @TableField(exist = false)
    private String productCategory;
    /**
     * è§„格型号
     */
    @Excel(name = "规格型号")
    @TableField(exist = false)
    private String specificationModel;
    /**
     * å•位
     */
    @Excel(name = "单位")
    @TableField(exist = false)
    private String unit;
    /**
     * æ•°é‡
     */
    @Excel(name = "数量")
    @TableField(exist = false)
    private BigDecimal quantity;
    @Excel(name = "最低库存数量")
    @TableField(exist = false)
    private BigDecimal minStock;
    /**
     * ç¨Žçއ
     */
    @Excel(name = "税率")
    @TableField(exist = false)
    private BigDecimal taxRate;
    /**
     * å«ç¨Žå•ä»·
     */
    @Excel(name = "含税单价")
    @TableField(exist = false)
    private BigDecimal taxInclusiveUnitPrice;
    /**
     * å«ç¨Žæ€»ä»·
     */
    @Excel(name = "含税总价")
    @TableField(exist = false)
    private BigDecimal taxInclusiveTotalPrice;
    /**
     * ä¸å«ç¨Žæ€»ä»·
     */
    @Excel(name = "不含税总价")
    @TableField(exist = false)
    private BigDecimal taxExclusiveTotalPrice;
    /**
     * å‘票类型
     */
    @TableField(exist = false)
    private String invoiceType;
    /**
     * å°è´¦ç±»åž‹ 1.销售 2,采购
     */
    @TableField(exist = false)
    private Integer type;
    /**
     * æœ¬æ¬¡æ¥ç¥¨æ•°
     */
    @TableField(exist = false)
    private BigDecimal ticketsNum;
    /**
     * æœ¬æ¬¡æ¥ç¥¨é‡‘额(元)
     */
    @TableField(exist = false)
    private BigDecimal ticketsAmount;
    /**
     * æœªæ¥ç¥¨æ•°
     */
    @TableField(exist = false)
    private BigDecimal futureTickets;
    /**
     * æœªæ¥ç¥¨é‡‘额(元)
     */
    @TableField(exist = false)
    private BigDecimal futureTicketsAmount;
    @ApiModelProperty(value = "开票数")
    @TableField(exist = false)
    private BigDecimal invoiceNum;
    @ApiModelProperty(value = "未开票数")
    @TableField(exist = false)
    private BigDecimal noInvoiceNum;
    @ApiModelProperty(value = "开票金额")
    @TableField(exist = false)
    private BigDecimal invoiceAmount;
    @ApiModelProperty(value = "未开票金额")
    @TableField(exist = false)
    private BigDecimal noInvoiceAmount;
    @ApiModelProperty(value = "本次开票数")
    @TableField(exist = false)
    private BigDecimal currentInvoiceNum;
    @TableField(exist = false)
    @ApiModelProperty(value = "本次开票金额")
    private BigDecimal currentInvoiceAmount;
    /**
     *  äº§å“id
     */
    @TableField(exist = false)
    private Long productId;
    /**
     * äº§å“è§„æ ¼id
     */
    @TableField(exist = false)
    private Long productModelId;
    @ApiModelProperty(value = "初始未开票数")
    @TableField(exist = false)
    private BigDecimal originalNoInvoiceNum;
    @ApiModelProperty(value = "临时未开票数")
    @TableField(exist = false)
    private BigDecimal tempNoInvoiceNum;
    @ApiModelProperty(value = "临时未开票金额")
    @TableField(exist = false)
    private BigDecimal tempnoInvoiceAmount;
    @ApiModelProperty(value = "临时未来票数")
    @TableField(exist = false)
    private BigDecimal tempFutureTickets;
    @ApiModelProperty(value = "临时未来票金额")
    @TableField(exist = false)
    private BigDecimal tempFutureTicketsAmount;
    @ApiModelProperty("登记人")
    @TableField(exist = false)
    private String register;
    @ApiModelProperty("登记日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "登记日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @TableField(exist = false)
    private LocalDateTime registerDate;
    /**
     * é”€å”®åˆåŒå·
     */
    @Excel(name = "销售合同号")
    @TableField(exist = false)
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    @Excel(name = "客户合同号")
    @TableField(exist = false)
    private String customerContractNo;
    /**
     * é¡¹ç›®åç§°
     */
    @Excel(name = "项目名称")
    @TableField(exist = false)
    private String projectName;
    /**
     * å½•入日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @TableField(exist = false)
    private Date entryDate;
    /**
     * ä¸šåŠ¡å‘˜
     */
    @Excel(name = "业务员")
    @TableField(exist = false)
    private String salesman;
    @TableField(exist = false)
    private Long customerId;
    /**
     * å®¢æˆ·åç§°
     */
    @Excel(name = "客户名称")
    @TableField(exist = false)
    private String customerName;
    /**
     * å½•入人
     */
    @TableField(exist = false)
    private String entryPerson;
    @TableField(exist = false)
    @ApiModelProperty(value = "录入人")
    @Excel(name = "录入人")
    private String entryPersonName;
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "备注")
    @TableField(exist = false)
    private String remarks;
    /**
     * é™„件材料,存储文件名等相关信息
     */
    @TableField(exist = false)
    private String attachmentMaterials;
    /**
     * åˆåŒé‡‘额(产品含税总价)
     */
    @Excel(name = "合同金额")
    @TableField(exist = false)
    private BigDecimal contractAmount;
    @TableField(exist = false)
    @ApiModelProperty(value = "未开票金额(元)")
    @Excel(name = "未开票金额")
    private BigDecimal noInvoiceAmountTotal = BigDecimal.ZERO;
    @ApiModelProperty(value = "签订日期")
    @TableField(exist = false)
    private LocalDate executionDate;
    @TableField(exist = false)
    @ApiModelProperty(value = "已开票金额(元)")
    @Excel(name = "已开票金额")
    private BigDecimal invoiceTotal = BigDecimal.ZERO;
    @TableField(exist = false)
    @ApiModelProperty(value = "回款金额")
    private BigDecimal receiptPaymentAmountTotal = BigDecimal.ZERO;
    @TableField(exist = false)
    @ApiModelProperty(value = "待回款金额")
    private BigDecimal noReceiptAmount = BigDecimal.ZERO;
    @ApiModelProperty(value = "付款方式")
    @TableField(exist = false)
    private String paymentMethod;
    @TableField(exist = false)
    @ApiModelProperty(value = "生产状态")
    private String productionStatus = "未开始";
}
src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
@@ -23,7 +23,8 @@
    @ApiModelProperty(value = "销售台账id")
    private Long salesLedgerId;
    @ApiModelProperty(value = "销售报价产品表id")
    private Long salesLedgerProductId;
    @TableField(exist = false)
    @ApiModelProperty(value = "销售合同号")
    @Excel(name = "销售合同号")
@@ -64,5 +65,8 @@
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty(value = "审批人id")
    @TableField(exist = false)
    private Integer approverId;
}
src/main/java/com/ruoyi/sales/service/ShipmentApprovalService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.sales.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.sales.pojo.ShipmentApproval;
import com.ruoyi.sales.pojo.ShippingInfo;
public interface ShipmentApprovalService extends IService<ShipmentApproval>{
    IPage<ShipmentApproval> listPage(Page page, ShipmentApproval req);
}
src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java
@@ -381,55 +381,71 @@
    /**
     * å¤„理当月开票台账删除
     *
     * @param invoiceRegistrationProductId
     * @param invoiceRegistrationProduct
     */
    private void dealCurrentMonthDel(Integer invoiceRegistrationProductId,InvoiceRegistrationProduct invoiceRegistrationProduct){
    private void dealCurrentMonthDel(Integer invoiceRegistrationProductId, InvoiceRegistrationProduct invoiceRegistrationProduct) {
        // åˆ é™¤å¼€ç¥¨å°è´¦
        QueryWrapper<InvoiceLedger> delMapper = new QueryWrapper<>();
        delMapper.eq("invoice_registration_product_id", invoiceRegistrationProductId);
        invoiceLedgerMapper.delete(delMapper);
        // åˆ é™¤å¼€ç¥¨ç™»è®°å¹¶å›žæ»š
        QueryWrapper<InvoiceLedger> delLedgerWrapper = new QueryWrapper<>();
        delLedgerWrapper.eq("invoice_registration_product_id", invoiceRegistrationProductId);
        invoiceLedgerMapper.delete(delLedgerWrapper);
        // æŸ¥è¯¢å½“前产品下的所有开票登记
        QueryWrapper<InvoiceRegistrationProduct> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("sales_ledger_id", invoiceRegistrationProduct.getSalesLedgerId());
        queryWrapper.eq("sales_ledger_product_id", invoiceRegistrationProduct.getSalesLedgerProductId());
        queryWrapper.orderByAsc("create_time");
        List<InvoiceRegistrationProduct> invoiceRegistrationProductList = invoiceRegistrationProductMapper.selectList(queryWrapper);
//        InvoiceRegistrationProduct invoiceRegistrationProduct = invoiceRegistrationProductMapper.selectById(invoiceRegistrationProductId);
        int index =  -1;
        for (int i = 0; i < invoiceRegistrationProductList.size(); i++) {
            InvoiceRegistrationProduct currentInvoiceRegProduct = invoiceRegistrationProductList.get(i);
            if(invoiceRegistrationProduct.getId().equals(currentInvoiceRegProduct.getId())){
        List<InvoiceRegistrationProduct> allList = invoiceRegistrationProductMapper.selectList(queryWrapper);
        int index = -1;
        for (int i = 0; i < allList.size(); i++) {
            if (invoiceRegistrationProductId.equals(allList.get(i).getId())) {
                index = i;
                break;
            }
        }
        if(index == -1){
        if (index == -1) {
            return;
        }
        for (int i = index + 1; i < invoiceRegistrationProductList.size(); i++) {
            InvoiceRegistrationProduct currentInvoiceRegProduct = invoiceRegistrationProductList.get(i);
            // å›žæ»šæœªå¼€ç¥¨æ•°/未开票金额
            BigDecimal noInvoiceAmount = currentInvoiceRegProduct.getNoInvoiceAmount().add(invoiceRegistrationProduct.getInvoiceAmount());
            BigDecimal noInvoiceNum = currentInvoiceRegProduct.getNoInvoiceNum().add(invoiceRegistrationProduct.getInvoiceNum());
            currentInvoiceRegProduct.setNoInvoiceAmount(noInvoiceAmount);
            currentInvoiceRegProduct.setNoInvoiceNum(noInvoiceNum);
            invoiceRegistrationProductMapper.updateById(currentInvoiceRegProduct);
        for (int i = index + 1; i < allList.size(); i++) {
            InvoiceRegistrationProduct current = allList.get(i);
            current.setNoInvoiceNum(current.getNoInvoiceNum().add(invoiceRegistrationProduct.getInvoiceNum()));
            current.setNoInvoiceAmount(current.getNoInvoiceAmount().add(invoiceRegistrationProduct.getInvoiceAmount()));
            invoiceRegistrationProductMapper.updateById(current);
        }
        // åˆ é™¤å½“前开票登记
        invoiceRegistrationProductMapper.deleteById(invoiceRegistrationProductId);
        // ä¿®æ”¹sale_product数据
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(invoiceRegistrationProduct.getSalesLedgerProductId());
        // æŸ¥è¯¢åˆ é™¤åŽçš„剩余开票登记
        QueryWrapper<InvoiceRegistrationProduct> newQueryWrapper = new QueryWrapper<>();
        queryWrapper.eq("sales_ledger_id", invoiceRegistrationProduct.getSalesLedgerId());
        queryWrapper.eq("sales_ledger_product_id", invoiceRegistrationProduct.getSalesLedgerProductId());
        queryWrapper.orderByAsc("create_time");
        List<InvoiceRegistrationProduct> newInvoiceRegistrationProductList = invoiceRegistrationProductMapper.selectList(newQueryWrapper);
        if(CollectionUtils.isEmpty(newInvoiceRegistrationProductList)){
        newQueryWrapper.eq("sales_ledger_id", invoiceRegistrationProduct.getSalesLedgerId());
        newQueryWrapper.eq("sales_ledger_product_id", invoiceRegistrationProduct.getSalesLedgerProductId());
        newQueryWrapper.orderByAsc("create_time");
        List<InvoiceRegistrationProduct> remainList = invoiceRegistrationProductMapper.selectList(newQueryWrapper);
        // æŸ¥è¯¢é”€å”®å°è´¦äº§å“
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(invoiceRegistrationProduct.getSalesLedgerProductId());
        if (CollectionUtils.isEmpty(remainList)) {
            // æ²¡æœ‰ä»»ä½•开票记录,恢复初始状态
            salesLedgerProduct.setInvoiceNum(BigDecimal.ZERO);
            salesLedgerProduct.setInvoiceAmount(BigDecimal.ZERO);
            salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
            salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
        }else {
        } else {
            salesLedgerProduct.setInvoiceNum(salesLedgerProduct.getInvoiceNum().subtract(invoiceRegistrationProduct.getInvoiceNum()));
            salesLedgerProduct.setInvoiceAmount(salesLedgerProduct.getInvoiceAmount().subtract(invoiceRegistrationProduct.getInvoiceAmount()));
            salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getNoInvoiceNum().add(invoiceRegistrationProduct.getInvoiceNum()));
            salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getNoInvoiceAmount().add(invoiceRegistrationProduct.getInvoiceAmount()));
        }
        salesLedgerProductMapper.updateById(salesLedgerProduct);
    }
@@ -438,46 +454,59 @@
     * @param invoiceRegistrationProduct
     * @param invoiceLedger
     */
    private void dealOtherMonthDel(InvoiceRegistrationProduct invoiceRegistrationProduct,InvoiceLedger invoiceLedger ){
        InvoiceRegistrationProduct copyRegProduct = new InvoiceRegistrationProduct();
        BeanUtils.copyProperties(invoiceRegistrationProduct, copyRegProduct);
        BigDecimal invoiceNum = copyRegProduct.getInvoiceNum().negate();
        BigDecimal invoiceAmount = copyRegProduct.getInvoiceAmount().negate();
        // invoice_registration_product
        // åˆ é™¤å¼€ç¥¨ç™»è®°å¹¶å›žæ»š
    private void dealOtherMonthDel(InvoiceRegistrationProduct invoiceRegistrationProduct, InvoiceLedger invoiceLedger) {
        //查询历史开票登记
        QueryWrapper<InvoiceRegistrationProduct> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("sales_ledger_id", invoiceRegistrationProduct.getSalesLedgerId());
        queryWrapper.eq("sales_ledger_product_id", invoiceRegistrationProduct.getSalesLedgerProductId());
        queryWrapper.orderByAsc("create_time");
        List<InvoiceRegistrationProduct> invoiceRegistrationProductList = invoiceRegistrationProductMapper.selectList(queryWrapper);
        InvoiceRegistrationProduct lastInvoiceRegistrationProduct = invoiceRegistrationProductList.get(invoiceRegistrationProductList.size() - 1);
        BigDecimal noInvoiceNum = lastInvoiceRegistrationProduct.getNoInvoiceNum().subtract(invoiceNum);
        BigDecimal noInvoiceAmount = lastInvoiceRegistrationProduct.getNoInvoiceAmount().subtract(invoiceAmount);
        copyRegProduct.setInvoiceNum(invoiceNum);
        copyRegProduct.setInvoiceAmount(invoiceAmount);
        copyRegProduct.setNoInvoiceNum(noInvoiceNum);
        copyRegProduct.setNoInvoiceAmount(noInvoiceAmount);
        copyRegProduct.setId(null);
        invoiceRegistrationProductMapper.insert(copyRegProduct);
        List<InvoiceRegistrationProduct> list = invoiceRegistrationProductMapper.selectList(queryWrapper);
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        InvoiceRegistrationProduct last = list.get(list.size() - 1);
        BigDecimal negateInvoiceNum = invoiceRegistrationProduct.getInvoiceNum().negate();
        BigDecimal negateInvoiceAmount = invoiceRegistrationProduct.getInvoiceAmount().negate();
        InvoiceRegistrationProduct copy = new InvoiceRegistrationProduct();
        BeanUtils.copyProperties(invoiceRegistrationProduct, copy);
        copy.setId(null);
        copy.setInvoiceNum(negateInvoiceNum);
        copy.setInvoiceAmount(negateInvoiceAmount);
        // æœªå¼€ç¥¨ = ä¸Šä¸€æ¡ + æœ¬æ¬¡å†²å›žçš„æ•°é‡
        copy.setNoInvoiceNum(last.getNoInvoiceNum().add(invoiceRegistrationProduct.getInvoiceNum()));
        copy.setNoInvoiceAmount(last.getNoInvoiceAmount().add(invoiceRegistrationProduct.getInvoiceAmount()));
        invoiceRegistrationProductMapper.insert(copy);
        // å¤åˆ¶å¼€ç¥¨å°è´¦
        InvoiceLedger invoiceLedgerCopy = new InvoiceLedger();
        BeanUtils.copyProperties(invoiceLedger, invoiceLedgerCopy);
        invoiceLedgerCopy.setInvoiceRegistrationProductId(copyRegProduct.getId());
        BigDecimal invoiceTotal = invoiceLedgerCopy.getInvoiceTotal().negate();
        invoiceLedgerCopy.setInvoiceTotal(invoiceTotal);
        invoiceLedgerCopy.setId(null);
        invoiceLedgerCopy.setInvoiceDate(LocalDate.now());
        invoiceLedgerMapper.insert(invoiceLedgerCopy);
        // æ›´æ–°sales_leger_product
        QueryWrapper<SalesLedgerProduct> salesLedgerProductQueryWrapper = new QueryWrapper<>();
        salesLedgerProductQueryWrapper.eq("id", invoiceRegistrationProduct.getSalesLedgerProductId());
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectOne(salesLedgerProductQueryWrapper);
        salesLedgerProduct.setNoInvoiceNum(noInvoiceNum);
        salesLedgerProduct.setNoInvoiceAmount(noInvoiceAmount);
        BigDecimal newInvoiceNum = salesLedgerProduct.getInvoiceNum().add(invoiceNum);
        BigDecimal newInvocieAmount = salesLedgerProduct.getInvoiceAmount().add(invoiceAmount);
        salesLedgerProduct.setInvoiceNum(newInvoiceNum);
        salesLedgerProduct.setInvoiceAmount(newInvocieAmount);
        InvoiceLedger ledgerCopy = new InvoiceLedger();
        BeanUtils.copyProperties(invoiceLedger, ledgerCopy);
        ledgerCopy.setId(null);
        ledgerCopy.setInvoiceRegistrationProductId(copy.getId());
        ledgerCopy.setInvoiceTotal(invoiceLedger.getInvoiceTotal().negate());
        ledgerCopy.setInvoiceDate(LocalDate.now());
        invoiceLedgerMapper.insert(ledgerCopy);
        // å›žæ»š sales_ledger_product
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(invoiceRegistrationProduct.getSalesLedgerProductId());
        // å·²å¼€ç¥¨
        salesLedgerProduct.setInvoiceNum(salesLedgerProduct.getInvoiceNum().add(negateInvoiceNum));
        salesLedgerProduct.setInvoiceAmount(salesLedgerProduct.getInvoiceAmount().add(negateInvoiceAmount));
        // æœªå¼€ç¥¨
        salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getNoInvoiceNum().add(invoiceRegistrationProduct.getInvoiceNum()));
        salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getNoInvoiceAmount().add(invoiceRegistrationProduct.getInvoiceAmount()));
        salesLedgerProductMapper.updateById(salesLedgerProduct);
    }
}
src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java
@@ -78,6 +78,8 @@
                invoiceRegistrationProduct.setSalesLedgerProductId(productDatum.getId().intValue());
                invoiceRegistrationProductMapper.insert(invoiceRegistrationProduct);
                productDatum.setInvoiceNum(currentInvoiceNum);
                productDatum.setInvoiceAmount(productDatum.getCurrentInvoiceAmount());
                salesLedgerProductMapper.updateById(productDatum);
                // æ–°å¢žä¸€æ¡å¼€ç¥¨å°è´¦æ•°æ®
                InvoiceLedger invoiceLedger = new InvoiceLedger();
src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
@@ -161,9 +161,16 @@
    @Override
    public IPage<ReceiptPaymentDto> bindInvoiceNoRegPage(Page page, ReceiptPaymentDto receiptPaymentDto) {
        IPage<ReceiptPaymentDto> receiptPaymentDtoIPage = receiptPaymentMapper.bindInvoiceNoRegPage(page, receiptPaymentDto);
        if (receiptPaymentDto.getStatus()) {
            receiptPaymentDtoIPage.getRecords().removeIf(receiptPaymentDto1 -> new BigDecimal("0.00").equals(receiptPaymentDto1.getNoReceiptAmount()));
        }
//        if (receiptPaymentDto.getStatus()) {
//            long count = receiptPaymentDtoIPage.getRecords()
//                    .stream()
//                    .filter(receiptPaymentDto1 -> new BigDecimal("0.00").equals(receiptPaymentDto1.getNoReceiptAmount()))
//                    .count();
//            receiptPaymentDtoIPage
//                    .getRecords()
//                    .removeIf(receiptPaymentDto1 -> new BigDecimal("0.00").equals(receiptPaymentDto1.getNoReceiptAmount()));
//            receiptPaymentDtoIPage.setTotal(receiptPaymentDtoIPage.getTotal() - count);
//        }
        receiptPaymentDtoIPage.getRecords().forEach(item -> {
            // æ¯”较回款金额 == å¾…回款金额
            if (item.getInvoiceTotal().compareTo(item.getReceiptPaymentAmountTotal()) == 0) {
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -4,6 +4,8 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
@@ -22,6 +24,8 @@
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.LocalDateTime;
import java.util.*;
import java.util.function.Function;
@@ -43,8 +47,18 @@
    private PurchaseLedgerMapper purchaseLedgerMapper;
    @Autowired
    private ProductOrderMapper productOrderMapper;
    private ProcessRouteItemMapper processRouteItemMapper;
    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    private ProcessRouteMapper processRouteMapper;
    private ProductProcessRouteMapper productProcessRouteMapper;
    private ProductWorkOrderMapper productWorkOrderMapper;
    @Override
    public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -53,27 +67,34 @@
    @Override
    public List<SalesLedgerProduct> selectSalesLedgerProductList(SalesLedgerProduct salesLedgerProduct) {
        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(queryWrapper);
//        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
//        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
//                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct);
        if(!CollectionUtils.isEmpty(salesLedgerProducts)){
            // å¼€ç¥¨
            InvoiceRegistrationProductDto invoiceRegistrationProductDto = new InvoiceRegistrationProductDto();
            invoiceRegistrationProductDto.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId().intValue());
            List<InvoiceRegistrationProductDto> invoiceRegistrationProductDtoList = invoiceRegistrationProductMapper.invoiceRegistrationProductList(invoiceRegistrationProductDto);
            // ç»Ÿè®¡å¼€ç¥¨ç™»è®°äº§å“çš„已开票数/已开票金额
            if(!CollectionUtils.isEmpty(invoiceRegistrationProductDtoList)){
            if (!CollectionUtils.isEmpty(invoiceRegistrationProductDtoList)) {
                for (SalesLedgerProduct ledgerProduct : salesLedgerProducts) {
                    BigDecimal invoiceNum = BigDecimal.ZERO;
                    BigDecimal invoiceAmount = BigDecimal.ZERO;
                    BigDecimal noInvoiceNum = BigDecimal.ZERO;
                    BigDecimal noInvoiceAmount = BigDecimal.ZERO;
                    for (InvoiceRegistrationProductDto registrationProductDto : invoiceRegistrationProductDtoList) {
                        if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){
                            invoiceNum =  invoiceNum.add(registrationProductDto.getInvoiceNum());
                            invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount());
                            noInvoiceNum = ledgerProduct.getQuantity().subtract(invoiceNum);
                            noInvoiceAmount = ledgerProduct.getTaxInclusiveTotalPrice().subtract(invoiceAmount);
                        }
                    }
                    ledgerProduct.setInvoiceNum(invoiceNum);
                    ledgerProduct.setInvoiceAmount(invoiceAmount);
                    ledgerProduct.setNoInvoiceNum(noInvoiceNum);
                    ledgerProduct.setNoInvoiceAmount(noInvoiceAmount);
                }
            }
@@ -94,7 +115,7 @@
            return 0; // æ²¡æœ‰å¯åˆ é™¤çš„æ•°æ®
        }
        // å¯èƒ½å±žäºŽå¤šä¸ªä¸»è¡¨ï¼ˆä½†é€šå¸¸ä¸€ä¸ªæŽ¥å£åªå¤„理一个主表)
        // å¯èƒ½å±žäºŽå¤šä¸ªä¸»è¡¨
        Set<Long> mainIds = deletedProducts.stream()
                .map(SalesLedgerProduct::getSalesLedgerId)
                .filter(Objects::nonNull)
@@ -102,6 +123,46 @@
        // 2. æ‰§è¡Œåˆ é™¤æ“ä½œ
        int result = salesLedgerProductMapper.deleteBatchIds(Arrays.asList(ids));
        //删除对应的生产订单
        //批量查询productOrder
        List<ProductOrder> productOrders = productOrderMapper.selectList(
                new LambdaQueryWrapper<ProductOrder>()
                        .in(ProductOrder::getProductModelId, ids)
        );
        if (!CollectionUtils.isEmpty(productOrders)) {
            List<Long> orderIds = productOrders.stream()
                    .map(ProductOrder::getId)
                    .collect(Collectors.toList());
            // æ‰¹é‡æŸ¥è¯¢processRouteItems
            List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
                    new LambdaQueryWrapper<ProductProcessRouteItem>()
                            .in(ProductProcessRouteItem::getProductOrderId, orderIds)
            );
            if (!CollectionUtils.isEmpty(allRouteItems)) {
                List<Long> routeItemIds = allRouteItems.stream()
                        .map(ProductProcessRouteItem::getId)
                        .collect(Collectors.toList());
                // æ‰¹é‡åˆ é™¤workOrder
                productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
                                .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
            }
            // æ‰¹é‡åˆ é™¤productProcessRouteItem
            productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
                            .in(ProductProcessRouteItem::getProductOrderId, orderIds));
            // æ‰¹é‡åˆ é™¤productProcessRoute
            productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>()
                    .in(ProductProcessRoute::getProductOrderId, orderIds));
            // æ‰¹é‡åˆ é™¤productOrder
            productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
                    .in(ProductOrder::getProductModelId, ids));
        }
        // 3. å¯¹æ¯ä¸ªä¸»è¡¨ID进行金额更新
        for (Long salesLedgerId : mainIds) {
@@ -132,6 +193,73 @@
        if (salesLedgerProduct.getId() == null) {
            salesLedgerProduct.setRegisterDate(LocalDateTime.now());
            result = salesLedgerProductMapper.insert(salesLedgerProduct);
            ProductOrder productOrder = new ProductOrder();
            productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
            productOrder.setProductModelId(salesLedgerProduct.getId());
            productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId()));
            productOrder.setQuantity(salesLedgerProduct.getQuantity());//需求数量
            productOrder.setCompleteQuantity(BigDecimal.ZERO);//完成数量
            productOrderMapper.insert(productOrder);
            ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()));
            if (processRoute != null) {
                //新增生产订单工艺路线主表
                ProductProcessRoute productProcessRoute = new ProductProcessRoute();
                productProcessRoute.setProductModelId(processRoute.getProductModelId());
                productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
                productProcessRoute.setProductOrderId(productOrder.getId());
                productProcessRoute.setBomId(processRoute.getBomId());
                productProcessRouteMapper.insert(productProcessRoute);
                //新增生产订单工艺路线子表
                List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
                // ç”Ÿæˆå½“前日期的前缀:年月日
                String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
                for (ProcessRouteItem processRouteItem : processRouteItems) {
                    ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
                    productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
                    productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
                    productProcessRouteItem.setProductOrderId(productOrder.getId());
                    productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
                    int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
                    if (insert > 0) {
                        // æŸ¥è¯¢ä»Šæ—¥å·²å­˜åœ¨çš„æœ€å¤§å·¥å•号
                        QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
                        queryWrapper.likeRight("work_order_no", datePrefix)
                                .orderByDesc("work_order_no")
                                .last("LIMIT 1");
                        ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
                        int sequenceNumber = 1; // é»˜è®¤åºå·
                        if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                            String lastNo = lastWorkOrder.getWorkOrderNo().toString();
                            if (lastNo.startsWith(datePrefix)) {
                                String seqStr = lastNo.substring(datePrefix.length());
                                try {
                                    sequenceNumber = Integer.parseInt(seqStr) + 1;
                                } catch (NumberFormatException e) {
                                    sequenceNumber = 1;
                                }
                            }
                        }
                        // ç”Ÿæˆå®Œæ•´çš„工单号
                        String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber);
                        ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                        productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                        productWorkOrder.setProductOrderId(productOrder.getId());
                        productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
                        productWorkOrder.setWorkOrderNo(workOrderNoStr);
                        productWorkOrder.setStatus(1);
                        productWorkOrderMapper.insert(productWorkOrder);
                    }
                }
                productOrder.setRouteId(processRoute.getId());
                productOrderMapper.updateById(productOrder);
            }
        } else {
            salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
            result = salesLedgerProductMapper.updateById(salesLedgerProduct);
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -8,21 +9,25 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.pojo.AccountExpense;
import com.ruoyi.account.pojo.AccountIncome;
import com.ruoyi.account.service.AccountIncomeService;
import com.ruoyi.basic.mapper.CustomerMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.other.mapper.TempFileMapper;
import com.ruoyi.other.pojo.TempFile;
import com.ruoyi.production.mapper.SalesLedgerSchedulingMapper;
import com.ruoyi.production.pojo.SalesLedgerScheduling;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.mapper.SysDeptMapper;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.sales.dto.MonthlyAmountDto;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.mapper.*;
@@ -84,6 +89,33 @@
    private final SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
    private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    private final SalesLedgerWorkMapper salesLedgerWorkMapper;
    private final SalesLedgerProductionAccountingMapper  salesLedgerProductionAccountingMapper;
    private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    private final InvoiceRegistrationMapper invoiceRegistrationMapper;
    private final ProductOrderMapper productOrderMapper;
    private final ProcessRouteMapper processRouteMapper;
    private final ProductProcessRouteMapper productProcessRouteMapper;
    private final ProcessRouteItemMapper processRouteItemMapper;
    private final ProductProcessRouteItemMapper productProcessRouteItemMapper;
    private final ProductWorkOrderMapper productWorkOrderMapper;
    private final ProductionProductMainMapper productionProductMainMapper;
    private final ProductionProductOutputMapper productionProductOutputMapper;
    private final ProductionProductInputMapper productionProductInputMapper;
    private final QualityInspectMapper qualityInspectMapper;
    @Autowired
    private SysDeptMapper sysDeptMapper;
@@ -95,6 +127,10 @@
    private static final long LOCK_EXPIRE_TIME = 30;  // é”è‡ªåŠ¨è¿‡æœŸæ—¶é—´ï¼ˆç§’ï¼‰
    private final RedisTemplate<String, String> redisTemplate;
    @Autowired
    private ProductModelMapper productModelMapper;
    @Autowired
    private ProductStructureMapper productStructureMapper;
    @Override
    public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) {
@@ -125,7 +161,8 @@
        // 3.查询上传文件
        LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
        salesLedgerFileWrapper.eq(CommonFile::getCommonId, salesLedger.getId());
        salesLedgerFileWrapper.eq(CommonFile::getCommonId, salesLedger.getId())
                .eq(CommonFile::getType, FileNameType.SALE.getValue());
        List<CommonFile> salesLedgerFiles = commonFileMapper.selectList(salesLedgerFileWrapper);
        // 4. è½¬æ¢ DTO
@@ -348,29 +385,138 @@
        if (CollectionUtils.isEmpty(idList)) {
            return 0;
        }
        // ç”Ÿäº§è®¢å•有待排产数据,台账不可删除
        LambdaQueryWrapper<SalesLedgerScheduling> salesLedgerSchedulingLambdaQueryWrapper = new LambdaQueryWrapper<SalesLedgerScheduling>()
                .in(SalesLedgerScheduling::getSalesLedgerId, idList);
        if (salesLedgerSchedulingMapper.selectCount(salesLedgerSchedulingLambdaQueryWrapper) > 0) {
            throw new BaseException("有排产数据,不可删除");
        // åˆ é™¤é”€å”®ç®¡ç†æ•°æ®
        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(SalesLedgerProduct::getSalesLedgerId, idList)
                .select(SalesLedgerProduct::getId);
        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(queryWrapper);
        List<Long> productIds = products.stream()
                .map(SalesLedgerProduct::getId)
                .collect(Collectors.toList());
        //批量查询productOrder
        List<ProductOrder> productOrders = productOrderMapper.selectList(
                new LambdaQueryWrapper<ProductOrder>()
                        .in(ProductOrder::getProductModelId, productIds)
        );
        if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) {
            List<Long> orderIds = productOrders.stream()
                    .map(ProductOrder::getId)
                    .collect(Collectors.toList());
            // æ‰¹é‡æŸ¥è¯¢processRouteItems
            List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
                    new LambdaQueryWrapper<ProductProcessRouteItem>()
                            .in(ProductProcessRouteItem::getProductOrderId, orderIds)
            );
            if (!CollectionUtils.isEmpty(allRouteItems)) {
                // èŽ·å–è¦åˆ é™¤çš„å·¥åºé¡¹ID
                List<Long> routeItemIds = allRouteItems.stream()
                        .map(ProductProcessRouteItem::getId)
                        .collect(Collectors.toList());
                // æŸ¥è¯¢å…³è”的工单ID
                List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList(
                        new LambdaQueryWrapper<ProductWorkOrder>()
                                .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)
                );
                if (!CollectionUtils.isEmpty(workOrders)) {
                    List<Long> workOrderIds = workOrders.stream()
                            .map(ProductWorkOrder::getId)
                            .collect(Collectors.toList());
                    // æŸ¥è¯¢å…³è”的生产主表ID
                    List<ProductionProductMain> productMains = productionProductMainMapper.selectList(
                            new LambdaQueryWrapper<ProductionProductMain>()
                                    .in(ProductionProductMain::getWorkOrderId, workOrderIds)
                    );
                    List<Long> productMainIds = productMains.stream()
                            .map(ProductionProductMain::getId)
                            .collect(Collectors.toList());
                    // åˆ é™¤äº§å‡ºè¡¨ã€æŠ•入表数据
                    if (!CollectionUtils.isEmpty(productMainIds)) {
                        productionProductOutputMapper.deleteByProductMainIds(productMainIds);
                        productionProductInputMapper.deleteByProductMainIds(productMainIds);
                        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
                                new LambdaQueryWrapper<QualityInspect>()
                                        .in(QualityInspect::getProductMainId, productMainIds)
                        );
                        qualityInspects.forEach(qualityInspect -> {
                            //inspectState=1 å·²æäº¤ ä¸èƒ½åˆ é™¤
                            if(qualityInspect.getInspectState() == 1){
                                throw new RuntimeException("已提交的检验单不能删除");
                            }
                        });
                        qualityInspectMapper.deleteByProductMainIds(productMainIds);
                    }
                    // åˆ é™¤ç”Ÿäº§ä¸»è¡¨æ•°æ®
                    productionProductMainMapper.deleteByWorkOrderIds(workOrderIds);
                    // åˆ é™¤å·¥å•数据
                    productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
                            .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
                }
            }
            // æ‰¹é‡åˆ é™¤processRouteItem
            productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
                    .in(ProductProcessRouteItem::getProductOrderId, orderIds));
            // æ‰¹é‡åˆ é™¤productProcessRoute
            productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>()
                    .in(ProductProcessRoute::getProductOrderId, orderIds));
            // æ‰¹é‡åˆ é™¤productOrder
            productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
                    .in(ProductOrder::getProductModelId, productIds));
        }
        // 1. å…ˆåˆ é™¤å­è¡¨æ•°æ®
        LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
        productWrapper.in(SalesLedgerProduct::getSalesLedgerId, idList);
        salesLedgerProductMapper.delete(productWrapper);
        // æ‰¹é‡åˆ é™¤äº§å“å­è¡¨
        if (!productIds.isEmpty()) {
            salesLedgerProductMapper.deleteBatchIds(productIds);
        }
        LambdaQueryWrapper<InvoiceRegistrationProduct> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(InvoiceRegistrationProduct::getSalesLedgerId, idList);
        List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(wrapper);
        List<Integer> invoiceLedgerIds = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(invoiceRegistrationProducts)){
            LambdaQueryWrapper<InvoiceLedger> wrapperOne = new LambdaQueryWrapper<>();
            wrapperOne.in(InvoiceLedger::getInvoiceRegistrationProductId, invoiceRegistrationProducts.stream().map(InvoiceRegistrationProduct::getId).collect(Collectors.toList()));
            List<InvoiceLedger> invoiceLedgers = invoiceLedgerMapper.selectList(wrapperOne);
            if(CollectionUtils.isNotEmpty(invoiceLedgers)){
                invoiceLedgerIds = invoiceLedgers.stream().map(InvoiceLedger::getId).collect(Collectors.toList());
            }
            invoiceLedgerMapper.delete(wrapperOne);
        }
        invoiceRegistrationProductMapper.delete(wrapper);
        LambdaQueryWrapper<InvoiceRegistration> wrapperTwo = new LambdaQueryWrapper<>();
        wrapperTwo.in(InvoiceRegistration::getSalesLedgerId, idList);
        invoiceRegistrationMapper.delete(wrapperTwo);
        if(CollectionUtils.isNotEmpty(invoiceLedgerIds)){
            LambdaQueryWrapper<ReceiptPayment> wrapperTree = new LambdaQueryWrapper<>();
            wrapperTree.in(ReceiptPayment::getInvoiceLedgerId, invoiceLedgerIds);
            receiptPaymentMapper.delete(wrapperTree);
        }
        // åˆ é™¤ç”Ÿäº§ç®¡æŽ§æ•°æ®
        // åˆ é™¤ç”Ÿäº§è®¢å•数据
        LambdaQueryWrapper<SalesLedgerScheduling> in = new LambdaQueryWrapper<SalesLedgerScheduling>()
                .in(SalesLedgerScheduling::getSalesLedgerId, idList);
        salesLedgerSchedulingMapper.delete(in);
        LambdaQueryWrapper<InvoiceRegistrationProduct> InvoiceRegistrationProductWrapper = new LambdaQueryWrapper<>();
        InvoiceRegistrationProductWrapper.in(InvoiceRegistrationProduct::getSalesLedgerId, idList);
        List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(InvoiceRegistrationProductWrapper);
        if (!CollectionUtils.isEmpty(invoiceRegistrationProducts)) {
            List<Integer> InvoiceRegistrationProductIds = invoiceRegistrationProducts.stream().map(InvoiceRegistrationProduct::getId).collect(Collectors.toList());
            LambdaQueryWrapper<InvoiceLedger> invoiceLedgerQuery = new LambdaQueryWrapper<>();
            invoiceLedgerQuery.in(InvoiceLedger::getInvoiceRegistrationProductId, InvoiceRegistrationProductIds);
            invoiceLedgerMapper.delete(invoiceLedgerQuery);
        }
        // åˆ é™¤ç”Ÿäº§æ´¾å·¥æ•°æ®
        LambdaQueryWrapper<SalesLedgerWork> workOrderWrapper = new LambdaQueryWrapper<>();
        workOrderWrapper.in(SalesLedgerWork::getSalesLedgerId, idList);
        salesLedgerWorkMapper.delete(workOrderWrapper);
        // åˆ é™¤ç”Ÿäº§æŠ¥å·¥æ•°æ®
        LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>();
        reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, idList);
        salesLedgerProductionAccountingMapper.delete(reportWrapper);
        // 2. å†åˆ é™¤ä¸»è¡¨æ•°æ®
        return salesLedgerMapper.deleteBatchIds(idList);
    }
@@ -410,8 +556,8 @@
                salesLedgerMapper.updateById(salesLedger);
                SalesLedger salesLedgerDB = salesLedgerMapper.selectById(salesLedger.getId());
                List<AccountIncome> accountIncomeDBs = accountIncomeService.getByInvoiceNumberList(salesLedger.getSalesContractNo());
                if (!CollectionUtils.isEmpty(accountIncomeDBs)) {
                    accountIncomeDBs.forEach(accountIncomeDB ->{
                if (!org.springframework.util.CollectionUtils.isEmpty(accountIncomeDBs)) {
                    accountIncomeDBs.forEach(accountIncomeDB -> {
                        accountIncomeDB.setCustomerName(salesLedgerDB.getCustomerName());
                        accountIncomeDB.setIncomeMoney(salesLedgerDB.getContractAmount());
                        accountIncomeDB.setIncomeDescribed("销售合同:" + salesLedgerDB.getSalesContractNo());
@@ -548,6 +694,79 @@
                salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
                salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
                salesLedgerProductMapper.insert(salesLedgerProduct);
                ProductOrder productOrder = new ProductOrder();
                productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
                productOrder.setProductModelId(salesLedgerProduct.getId());
                productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId()));
                productOrder.setQuantity(salesLedgerProduct.getQuantity());//需求数量
                productOrder.setCompleteQuantity(BigDecimal.ZERO);//完成数量
                productOrderMapper.insert(productOrder);
                ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()));
                List<ProductStructureDto> productStructureDtos = productStructureMapper.listByproductModelId(salesLedgerProduct.getProductModelId());
                if (processRoute != null) {
                    //新增生产订单工艺路线主表
                    ProductProcessRoute productProcessRoute = new ProductProcessRoute();
                    productProcessRoute.setProductModelId(processRoute.getProductModelId());
                    productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
                    productProcessRoute.setProductOrderId(productOrder.getId());
                    productProcessRoute.setBomId(processRoute.getBomId());
                    productProcessRouteMapper.insert(productProcessRoute);
                    //新增生产订单工艺路线子表
                    List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
                    // ç”Ÿæˆå½“前日期的前缀:年月日
                    String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
                    for (ProcessRouteItem processRouteItem : processRouteItems) {
                        ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
                        productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
                        productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
                        productProcessRouteItem.setProductOrderId(productOrder.getId());
                        productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
                        productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
                        int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
                        if (insert > 0) {
                            // æŸ¥è¯¢ä»Šæ—¥å·²å­˜åœ¨çš„æœ€å¤§å·¥å•号
                            QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
                            queryWrapper.likeRight("work_order_no", datePrefix)
                                    .orderByDesc("work_order_no")
                                    .last("LIMIT 1");
                            ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
                            int sequenceNumber = 1; // é»˜è®¤åºå·
                            if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                                String lastNo = lastWorkOrder.getWorkOrderNo().toString();
                                if (lastNo.startsWith(datePrefix)) {
                                    String seqStr = lastNo.substring(datePrefix.length());
                                    try {
                                        sequenceNumber = Integer.parseInt(seqStr) + 1;
                                    } catch (NumberFormatException e) {
                                        sequenceNumber = 1;
                                    }
                                }
                            }
                            // ç”Ÿæˆå®Œæ•´çš„工单号
                            String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber);
                            ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                            productStructureDtos.stream().forEach(productStructureDto -> {
                                if (productStructureDto.getProductModelId().equals(productProcessRouteItem.getProductModelId())){
                                    productWorkOrder.setPlanQuantity(productWorkOrder.getPlanQuantity());
                                }
                            });
                            if (Objects.equals(productProcessRouteItem.getProductModelId(), salesLedgerProduct.getProductModelId())) {
                                productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
                            }
                            productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                            productWorkOrder.setProductOrderId(productOrder.getId());
                            productWorkOrder.setWorkOrderNo(workOrderNoStr);
                            productWorkOrder.setStatus(1);
                            productWorkOrderMapper.insert(productWorkOrder);
                        }
                    }
                    productOrder.setRouteId(processRoute.getId());
                    productOrderMapper.updateById(productOrder);
                }
            }
        }
    }
@@ -601,12 +820,12 @@
            return datePart + String.format("%03d", nextSequence);
        } finally {
            // 3. é‡Šæ”¾é”ï¼ˆä½¿ç”¨Lua脚本保证原子性,避免误删其他线程的锁)
            // 3. é‡Šæ”¾é”
            String luaScript = "if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) else return 0 end";
            redisTemplate.execute(
                    new DefaultRedisScript<>(luaScript, Long.class),
                    Collections.singletonList(lockKey),
                    lockValue // åªæœ‰æŒæœ‰ç›¸åŒå€¼çš„线程才能删除锁
                    lockValue
            );
        }
    }
@@ -615,7 +834,7 @@
        if (sequences.isEmpty()) {
            return 1;
        }
        // æŽ’序后查找第一个缺失的正整数(与原逻辑一致)
        // æŽ’序后查找第一个缺失的正整数
        sequences.sort(Integer::compareTo);
        int next = 1;
        for (int seq : sequences) {
@@ -645,14 +864,13 @@
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // æž„造主表更新对象(支持任意主表类型)
        // æž„造主表更新对象
        try {
            S entity = mainEntityClass.getDeclaredConstructor().newInstance();
            Field idField = mainEntityClass.getDeclaredField("id");
            idField.setAccessible(true);
            idField.set(entity, mainId);
            // è®¾ç½® contractAmount å­—段,注意这里假设字段名为 "contractAmount"
            Field amountField = mainEntityClass.getDeclaredField("contractAmount");
            amountField.setAccessible(true);
            amountField.set(entity, totalAmount);
src/main/java/com/ruoyi/sales/service/impl/ShipmentApprovalServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.sales.service.impl;
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.sales.mapper.ShipmentApprovalMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.ShipmentApproval;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.ShipmentApprovalService;
import com.ruoyi.sales.service.ShippingInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author :yys
 * @date : 2025/10/22 9:33
 */
@Service
@Slf4j
public class ShipmentApprovalServiceImpl extends ServiceImpl<ShipmentApprovalMapper, ShipmentApproval> implements ShipmentApprovalService {
    @Autowired
    private ShipmentApprovalMapper shipmentApprovalMapper;
    @Override
    public IPage<ShipmentApproval> listPage(Page page, ShipmentApproval req) {
        IPage<ShipmentApproval> listPage = shipmentApprovalMapper.listPage(page, req);
        return listPage;
    }
}
src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -8,12 +8,15 @@
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.service.IStaffJoinLeaveRecordService;
import com.ruoyi.staff.service.IStaffOnJobService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.List;
/**
@@ -21,6 +24,7 @@
 */
@RestController
@RequestMapping("/staff/staffOnJob")
@Api(tags = "员工台账/合同管理")
public class StaffOnJobController {
    @Resource
@@ -79,5 +83,16 @@
        staffOnJobService.staffOnJobExport(response, staffOnJob);
    }
    /**
     * word模板合同在职员工导出
     * @param response
     * @param staffOnJob
     */
    @PostMapping("/exportCopy")
    @ApiOperation("word模板合同在职员工导出")
    public AjaxResult exportCopy(HttpServletResponse response,@RequestBody StaffOnJob staffOnJob) throws Exception{
       return AjaxResult.success(staffOnJobService.exportCopy(response, staffOnJob));
    }
}
src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java
@@ -53,6 +53,14 @@
        return AjaxResult.success();
    }
    /**
     * èŽ·å–å½“å‰ç”¨æˆ·æœ€æ–°æŽ’ç­è®°å½•
     */
    @GetMapping("/getCurrentUserLatestScheduling")
    public AjaxResult getCurrentUserLatestScheduling(){
        return AjaxResult.success(staffSchedulingService.getCurrentUserLatestScheduling());
    }
    @Log(title = "导出人员排班列表", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response ) {
src/main/java/com/ruoyi/staff/dto/SaveStaffSchedulingDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.staff.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -21,27 +22,34 @@
public class SaveStaffSchedulingDto implements Serializable {
    private Integer id;
    @NotNull(message = "必须要选择员工")
    private Integer staffId;
//    @NotNull(message = "必须要选择员工")
    private String staffId;
    @NotNull(message = "部门id不能为空!")
    /**
     * åˆä¼‘æ—¶é—´
     */
    private String lunchTime;
    private String staffName;
//    @NotNull(message = "部门id不能为空!")
    private Integer department;
    @NotNull(message = "班次id不能为空!")
//    @NotNull(message = "班次id不能为空!")
    private Integer shiftType;
    @NotNull(message = "工作日不能为空!")
//    @NotNull(message = "工作日不能为空!")
    private Date workDate;
    @NotNull(message = "上班时间不能为空!")
//    @NotNull(message = "上班时间不能为空!")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime workStartTime;
    @NotNull(message = "下班时间不能为空!")
//    @NotNull(message = "下班时间不能为空!")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime workEndTime;
    @NotNull(message = "工时不能为空!")
//    @NotNull(message = "工时不能为空!")
    private Integer status;
    private String remark;
src/main/java/com/ruoyi/staff/dto/StaffSchedulingDto.java
@@ -1,6 +1,7 @@
package com.ruoyi.staff.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
@@ -24,7 +25,14 @@
    /**
     * å‘˜å·¥ID
     */
    private Integer staffId;
    private String staffId;
    /**
     * åˆä¼‘æ—¶é—´
     */
    @Excel(name = "午休时间")
    private String lunchTime;
    @Excel(name = "员工名称")
    private String staffName;
src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
@@ -10,6 +10,7 @@
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
@@ -148,6 +149,53 @@
    @Excel(name = "合同结束日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date contractEndTime;
    /**
     * å¼€å§‹è¯•用日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "开始试用日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date trialStartDate;
    /**
     * è¯•用结束日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "试用结束日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date trialEndDate;
    /**
     * ç­¾è®¢æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "签订时间", width = 30, dateFormat = "yyyy-MM-dd")
    private Date signDate;
    /**
     * å·¥èµ„报酬选择条款
     */
//    @Excel(name = "工资报酬选择条款")
    private String salarySelect;
    /**
     * è¯•用期工资
     */
    @Excel(name = "试用期工资")
    private BigDecimal proSalary;
    /**
     * åŠ³åŠ¨åˆåŒæœŸé™é€‰æ‹©
     */
//    @Excel(name = "劳动合同期限选择")
    private String dateSelect;
    /**
     * å¤‡æ³¨ï¼ˆç¦åˆ©å¾…遇)
     */
    @Excel(name = "备注(福利待遇)")
    private String remark;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
@@ -6,8 +6,10 @@
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
@@ -128,11 +130,63 @@
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "合同到期日期", width = 30, dateFormat = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date contractExpireTime;
    /**
     * ç»“束试用时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "结束试用时间", width = 30, dateFormat = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date trialEndDate;
    /**
     * å¼€å§‹è¯•用日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "开始试用日期", width = 30, dateFormat = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date trialStartDate;
    /**
     * ç­¾è®¢æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "签订时间", width = 30, dateFormat = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date signDate;
    /**
     * å·¥èµ„报酬选择条款
     */
//    @Excel(name = "工资报酬选择条款")
    private String salarySelect;
    /**
     * è¯•用期工资
     */
    @Excel(name = "试用期工资")
    private BigDecimal proSalary;
    /**
     * åŠ³åŠ¨åˆåŒæœŸé™é€‰æ‹©
     */
//    @Excel(name = "劳动合同期限选择")
    private String dateSelect;
    /**
     * å¤‡æ³¨ï¼ˆç¦åˆ©å¾…遇)
     */
    @Excel(name = "备注(福利待遇)")
    private String remark;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
@@ -141,6 +195,8 @@
    @ApiModelProperty(value = "修改时间")
    @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(value = "修改用户")
src/main/java/com/ruoyi/staff/pojo/StaffScheduling.java
@@ -24,7 +24,19 @@
     * å‘˜å·¥ID
     */
    @TableField(value = "staff_id")
    private Integer staffId;
    private String staffId;
    /**
     * æŽ’班人员
     */
    @TableField(value = "staff_name")
    private String staffName;
    /**
     * åˆä¼‘æ—¶é—´
     */
    @TableField(value = "lunch_time")
    private String lunchTime;
    /**
     * éƒ¨é—¨
@@ -44,6 +56,7 @@
    @TableField(value = "work_date")
    private Date workDate;
    /**
     * å¼€å§‹å·¥ä½œæ—¶é—´
     */
src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
@@ -22,4 +22,6 @@
    List<StaffJoinLeaveRecord> staffOnJobList();
    Boolean importData(MultipartFile file);
    String exportCopy(HttpServletResponse response, StaffOnJob staffOnJob) throws Exception;
}
src/main/java/com/ruoyi/staff/service/StaffSchedulingService.java
@@ -17,4 +17,6 @@
    void saveStaffScheduling(SaveStaffSchedulingDto saveStaffSchedulingDto);
    IPage<StaffSchedulingDto> listPage(SearchSchedulingVo vo);
    StaffScheduling getCurrentUserLatestScheduling();
}
src/main/java/com/ruoyi/staff/service/impl/StaffJoinLeaveRecordServiceImpl.java
@@ -162,13 +162,16 @@
            /*入职*/
            StaffOnJob job = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery()
                    .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())).get(0);
            // å¢žåŠ äº†åˆåŒæ–¹æ¡ˆæ‰€ä»¥åŽ»æŽ‰è¿™ä¸ªåˆ¤æ–­
            //如果更改的合同到期时间更久则更新,如果没有就不用更新
//            if (staffJoinLeaveRecord.getContractEndTime().compareTo(job.getContractExpireTime())>0) {
//                BeanUtils.copyProperties(staffJoinLeaveRecord,job,ignoreProperties);
//                staffOnJobMapper.updateById(job);
//            }
            BeanUtils.copyProperties(staffJoinLeaveRecord,job,ignoreProperties);
            staffOnJobMapper.updateById(job);
            if(job != null){
                BeanUtils.copyProperties(staffJoinLeaveRecord,job,ignoreProperties);
                staffOnJobMapper.updateById(job);
            }
        }else {
            /*离职*/
            //离职的编辑不会影响在职表
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -6,19 +6,34 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.dto.WordDateDto;
import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.service.IStaffJoinLeaveRecordService;
import com.ruoyi.staff.service.IStaffOnJobService;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@AllArgsConstructor
@Service
@@ -69,4 +84,85 @@
    }
    @Override
    public String exportCopy(HttpServletResponse response, StaffOnJob staffOnJob) throws Exception {
        String url = "/javaWork/product-inventory-management/file/prod/" + staffOnJob.getStaffName() + "-劳动合同书.docx";
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
        // è®¾ç½®æ¨¡æ¿æ–‡ä»¶æ‰€åœ¨ç›®å½•(绝对路径,例如:/templates/)
        cfg.setClassForTemplateLoading(StaffOnJobServiceImpl.class, "/static");
        cfg.setDefaultEncoding("UTF-8");
        //2.定义需要填充的变里
        // â‘  æž„造员工信息(实际项目中可从数据库/Excel读取)
        WordDateDto staff = new WordDateDto();
        BeanUtils.copyProperties(staffOnJob, staff);
        // é€šè¿‡åˆåŒå¹´é™ï¼ŒåˆåŒåˆ°æœŸæ—¥æœŸè®¡ç®—合同开始日期,在获取开始日期,结束日期的年月日数字
        // åˆåŒåˆ°æœŸæ—¥æœŸ - åˆåŒå¹´é™ï¼ˆDate类型)
        // 1. å°†Date转换为Instant(时间戳)
        Instant instant = staff.getContractExpireTime().toInstant();
        // ä¹Ÿå¯ä»¥æŒ‡å®šå…·ä½“时区,例如Asia/Shanghai:
        LocalDate localDate = instant.atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();  // åˆåŒç»“束时间
        LocalDate localDate1 = localDate.minusYears(Integer.parseInt(staff.getContractTerm()));// åˆåŒå¼€å§‹æ—¶é—´
        // ç­¾è®¢æ—¥æœŸè½¬æ¢lcoaldate
        LocalDate localDate2 = staff.getSignDate().toInstant().atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();
        // è¯•用日期转换lcoaldate
        LocalDate localDate3 = staff.getTrialStartDate().toInstant().atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();
        LocalDate localDate4 = staff.getTrialEndDate().toInstant().atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();
        staff.setQyear(localDate2.getYear() + "");
        staff.setQmoth(localDate2.getMonthValue() + "");
        staff.setQday(localDate2.getDayOfMonth() + "");
        if(staff.getDateSelect().equals("A")){
            staff.setSyear(localDate1.getYear() + "");
            staff.setSmoth(localDate1.getMonthValue() + "");
            staff.setSday(localDate1.getDayOfMonth() + "");
            staff.setEyear(localDate.getDayOfMonth() + "");
            staff.setEmoth(localDate.getDayOfMonth() + "");
            staff.setEday(localDate.getDayOfMonth() + "");
            staff.setStyear(localDate3.getYear() + "");
            staff.setStmoth(localDate3.getMonthValue() + "");
            staff.setStday(localDate3.getDayOfMonth() + "");
            staff.setSeyear(localDate4.getYear() + "");
            staff.setSemoth(localDate4.getMonthValue() + "");
            staff.setSeday(localDate4.getDayOfMonth() + "");
        }else if (staff.getDateSelect().equals("B")){
            staff.setBsyear(localDate1.getYear() + "");
            staff.setBsmoth(localDate1.getMonthValue() + "");
            staff.setBsday(localDate1.getDayOfMonth() + "");
            staff.setBstyear(localDate3.getYear() + "");
            staff.setBstmoth(localDate3.getMonthValue() + "");
            staff.setBstday(localDate3.getDayOfMonth() + "");
            staff.setBseyear(localDate4.getYear() + "");
            staff.setBsemoth(localDate4.getMonthValue() + "");
            staff.setBseday(localDate4.getDayOfMonth() + "");
        }else if (staff.getDateSelect().equals("C")){
            staff.setCsyear(localDate1.getYear() + "");
            staff.setCsmoth(localDate1.getMonthValue() + "");
            staff.setCsday(localDate1.getDayOfMonth() + "");
        }
        Map<String,Object> data = new HashMap<>();
        data.put("item",staff);
        //3.加载XML æ¨¡æ¿
        Template template = cfg.getTemplate("劳动合同书.xml");
        //4.生成填充后的 XML å†…容
        StringWriter out = new StringWriter();
        template.process(data, out);
        String filledXml = out.toString();
        //5.将XML内容写入交件并改为.docx æ ¼å¼
        File outputFile = new File(url);
        try(FileOutputStream fos = new FileOutputStream(outputFile);
            OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
            osw.write(filledXml);
        }
        return url;
    }
}
src/main/java/com/ruoyi/staff/service/impl/StaffSchedulingServiceImpl.java
@@ -1,8 +1,11 @@
package com.ruoyi.staff.service.impl;
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.SecurityUtils;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.staff.dto.SaveStaffSchedulingDto;
import com.ruoyi.staff.dto.StaffSchedulingDto;
import com.ruoyi.staff.mapper.StaffSchedulingMapper;
@@ -54,6 +57,15 @@
        return staffSchedulingMapper.listPage(page, vo);
    }
    @Override
    public StaffScheduling getCurrentUserLatestScheduling() {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        return staffSchedulingMapper.selectOne(new LambdaQueryWrapper<StaffScheduling>()
                .like(StaffScheduling::getStaffId,loginUser.getUserId())
                .orderByDesc(StaffScheduling::getWorkEndTime)
                .last("LIMIT 1"));
    }
}
src/main/resources/application-bdsm.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-bdsm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-bdsm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-bhmy.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-bhmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-bhmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-cjny.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-cjny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-cjny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
src/main/resources/application-cmny.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-cmny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-cmny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-demo.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-demo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-demo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-dev.yml
@@ -35,6 +35,7 @@
# æ—¥å¿—配置
logging:
  level:
    org.quartz: DEBUG
    com.ruoyi: warn
    org.springframework: warn
@@ -62,7 +63,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://localhost:3306/product-inventory-management-sqd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://localhost:3306/product-inventory-management-hckx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123456
      # ä»Žåº“数据源
@@ -135,13 +136,13 @@
  redis:
    # åœ°å€
    host: 127.0.0.1
#    host: 172.17.0.1
    #    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 0
    # å¯†ç 
#    password: root2022!
    #    password: root2022!
    password:
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
@@ -156,6 +157,31 @@
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
  # Quartz定时任务配置(新增部分)
  quartz:
    job-store-type: jdbc  # ä½¿ç”¨æ•°æ®åº“存储
    jdbc:
      initialize-schema: never  # é¦–次运行时自动创建表结构,成功后改为never
      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL表结构脚本
    properties:
      org:
        quartz:
          scheduler:
            instanceName: RuoYiScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL适配
            tablePrefix: qrtz_  # è¡¨åå‰ç¼€ï¼Œä¸Žè„šæœ¬ä¸€è‡´
            isClustered: false  # å•节点模式(集群需改为true)
            clusterCheckinInterval: 10000
            txIsolationLevelSerializable: true
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10  # çº¿ç¨‹æ± å¤§å°
            threadPriority: 5
            makeThreadsDaemons: true
          updateCheck: false  # å…³é—­ç‰ˆæœ¬æ£€æŸ¥
# token配置
token:
@@ -165,7 +191,7 @@
  secret: abcdefghijklmnopqrstuvwxyz
  # ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
  expireTime: 450
# MyBatis Plus配置
mybatis-plus:
  # æœç´¢æŒ‡å®šåŒ…别名   æ ¹æ®è‡ªå·±çš„项目来
@@ -178,7 +204,7 @@
    enable-sql-runner: true
    db-config:
      id-type: auto
# PageHelper分页插件
pagehelper:
  helperDialect: mysql
@@ -200,7 +226,7 @@
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
# ä»£ç ç”Ÿæˆ
gen:
  # ä½œè€…
src/main/resources/application-hbkj.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hbkj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-hbkj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6380
    # æ•°æ®åº“索引
src/main/resources/application-hbxm.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hbxm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-hbxm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-hckx.yml
@@ -45,7 +45,7 @@
  accessKey: admin
  secretKey: 12345678
  preview-expiry: 24 # é¢„览地址默认24小时
  default-bucket: uploadPath
  default-bucket: jxc
# ç”¨æˆ·é…ç½®
user:
  password:
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hckx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-hckx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
@@ -157,6 +157,31 @@
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
  # Quartz定时任务配置(新增部分)
  quartz:
    job-store-type: jdbc  # ä½¿ç”¨æ•°æ®åº“存储
    jdbc:
      initialize-schema: never  # é¦–次运行时自动创建表结构,成功后改为never
      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL表结构脚本
    properties:
      org:
        quartz:
          scheduler:
            instanceName: RuoYiScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL适配
            tablePrefix: qrtz_  # è¡¨åå‰ç¼€ï¼Œä¸Žè„šæœ¬ä¸€è‡´
            isClustered: false  # å•节点模式(集群需改为true)
            clusterCheckinInterval: 10000
            txIsolationLevelSerializable: true
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10  # çº¿ç¨‹æ± å¤§å°
            threadPriority: 5
            makeThreadsDaemons: true
          updateCheck: false  # å…³é—­ç‰ˆæœ¬æ£€æŸ¥
# token配置
token:
  # ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
src/main/resources/application-hckxTest.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,219 @@
# é¡¹ç›®ç›¸å…³é…ç½®
ruoyi:
  # åç§°
  name: RuoYi
  # ç‰ˆæœ¬
  version: 3.8.9
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: /javaWork/product-inventory-management/file
  # èŽ·å–ip地址开关
  addressEnabled: false
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
  captchaType: math
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 9988
  servlet:
    # åº”用的访问路径
    context-path: /
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
    # è¿žæŽ¥æ•°æ»¡åŽçš„æŽ’队数,默认为100
    accept-count: 1000
    threads:
      # tomcat最大线程数,默认为200
      max: 800
      # Tomcat启动初始化的线程数,默认值10
      min-spare: 100
# æ—¥å¿—配置
logging:
  level:
    com.ruoyi: warn
    org.springframework: warn
minio:
  endpoint: http://114.132.189.42/
  port: 7019
  secure: false
  accessKey: admin
  secretKey: 12345678
  preview-expiry: 24 # é¢„览地址默认24小时
  default-bucket: uploadPath
# ç”¨æˆ·é…ç½®
user:
  password:
    # å¯†ç æœ€å¤§é”™è¯¯æ¬¡æ•°
    maxRetryCount: 5
    # å¯†ç é”å®šæ—¶é—´ï¼ˆé»˜è®¤10分钟)
    lockTime: 10
# Spring配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://114.132.189.42:9099/product-inventory-management-hckx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
        enabled: false
        url:
        username:
        password:
      # åˆå§‹è¿žæŽ¥æ•°
      initialSize: 5
      # æœ€å°è¿žæŽ¥æ± æ•°é‡
      minIdle: 10
      # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
      maxActive: 20
      # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
      maxWait: 60000
      # é…ç½®è¿žæŽ¥è¶…æ—¶æ—¶é—´
      connectTimeout: 30000
      # é…ç½®ç½‘络超时时间
      socketTimeout: 60000
      # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      minEvictableIdleTimeMillis: 300000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # è®¾ç½®ç™½åå•,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # æŽ§åˆ¶å°ç®¡ç†ç”¨æˆ·åå’Œå¯†ç 
        login-username: ruoyi
        login-password: 123456
      filter:
        stat:
          enabled: true
          # æ…¢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
  # èµ„源信息
  messages:
    # å›½é™…化资源文件路径
    basename: i18n/messages
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
    multipart:
      # å•个文件大小
      max-file-size: 1GB
      # è®¾ç½®æ€»ä¸Šä¼ çš„æ–‡ä»¶å¤§å°
      max-request-size: 2GB
  # æœåŠ¡æ¨¡å—
  devtools:
    restart:
      # çƒ­éƒ¨ç½²å¼€å…³
      enabled: false
  # redis é…ç½®
  redis:
    # åœ°å€
    host: 127.0.0.1
#    host: 114.132.189.42
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 12
    # å¯†ç 
#    password: root2022!
    password:
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
      pool:
        # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
        min-idle: 0
        # è¿žæŽ¥æ± ä¸­çš„æœ€å¤§ç©ºé—²è¿žæŽ¥
        max-idle: 8
        # è¿žæŽ¥æ± çš„æœ€å¤§æ•°æ®åº“连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
# token配置
token:
  # ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
  header: Authorization
  # ä»¤ç‰Œå¯†é’¥
  secret: abcdefghijklmnopqrstuvwxyz
  # ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
  expireTime: 450
# MyBatis Plus配置
mybatis-plus:
  # æœç´¢æŒ‡å®šåŒ…别名   æ ¹æ®è‡ªå·±çš„项目来
  typeAliasesPackage: com.ruoyi.**.pojo
  # é…ç½®mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # åŠ è½½å…¨å±€çš„é…ç½®æ–‡ä»¶
  configLocation: classpath:mybatis/mybatis-config.xml
  global-config:
    enable-sql-runner: true
    db-config:
      id-type: auto
# PageHelper分页插件
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql
# Swagger配置
swagger:
  # æ˜¯å¦å¼€å¯swagger
  enabled: true
  # è¯·æ±‚前缀
  pathMapping: /dev-api
# é˜²æ­¢XSS攻击
xss:
  # è¿‡æ»¤å¼€å…³
  enabled: true
  # æŽ’除链接(多个用逗号分隔)
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
# ä»£ç ç”Ÿæˆ
gen:
  # ä½œè€…
  author: ruoyi
  # é»˜è®¤ç”ŸæˆåŒ…路径 system éœ€æ”¹æˆè‡ªå·±çš„æ¨¡å—名称 å¦‚ system monitor tool
  packageName: com.ruoyi.project.system
  # è‡ªåŠ¨åŽ»é™¤è¡¨å‰ç¼€ï¼Œé»˜è®¤æ˜¯true
  autoRemovePre: false
  # è¡¨å‰ç¼€ï¼ˆç”Ÿæˆç±»åä¸ä¼šåŒ…含表前缀,多个用逗号分隔)
  tablePrefix: sys_
  # æ˜¯å¦å…è®¸ç”Ÿæˆæ–‡ä»¶è¦†ç›–到本地(自定义路径),默认不允许
  allowOverwrite: false
file:
  temp-dir: D:\\javaWork\\product-inventory-management\\file\\temp\\uploads
  upload-dir: D:\\javaWork\\product-inventory-management\\file\\prod\\uploads
src/main/resources/application-hcmy.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hcmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-hcmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-hhkj.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hhkj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-hhkj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-hsmy.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hsmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-hsmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6380
    # æ•°æ®åº“索引
src/main/resources/application-hsxny.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hsxny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-hsxny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-hxgy.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hxgy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-hxgy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-hysn.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hysn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-hysn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-jjxm.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jjxm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-jjxm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6380
    # æ•°æ®åº“索引
src/main/resources/application-jlsn.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jlsn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-jlsn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-jsmy.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jsmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-jsmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
src/main/resources/application-jsyny.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jsyny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-jsyny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-jtwy.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,244 @@
# é¡¹ç›®ç›¸å…³é…ç½®
ruoyi:
  # åç§°
  name: RuoYi
  # ç‰ˆæœ¬
  version: 3.8.9
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: /javaWork/product-inventory-management/file
  # èŽ·å–ip地址开关
  addressEnabled: false
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
  captchaType: math
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 9001
  servlet:
    # åº”用的访问路径
    context-path: /
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
    # è¿žæŽ¥æ•°æ»¡åŽçš„æŽ’队数,默认为100
    accept-count: 1000
    threads:
      # tomcat最大线程数,默认为200
      max: 800
      # Tomcat启动初始化的线程数,默认值10
      min-spare: 100
# æ—¥å¿—配置
logging:
  level:
    com.ruoyi: warn
    org.springframework: warn
minio:
  endpoint: http://114.132.189.42/
  port: 7019
  secure: false
  accessKey: admin
  secretKey: 12345678
  preview-expiry: 24 # é¢„览地址默认24小时
  default-bucket: jxc
# ç”¨æˆ·é…ç½®
user:
  password:
    # å¯†ç æœ€å¤§é”™è¯¯æ¬¡æ•°
    maxRetryCount: 5
    # å¯†ç é”å®šæ—¶é—´ï¼ˆé»˜è®¤10分钟)
    lockTime: 10
# Spring配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-jtwy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
        enabled: false
        url:
        username:
        password:
      # åˆå§‹è¿žæŽ¥æ•°
      initialSize: 5
      # æœ€å°è¿žæŽ¥æ± æ•°é‡
      minIdle: 10
      # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
      maxActive: 20
      # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
      maxWait: 60000
      # é…ç½®è¿žæŽ¥è¶…æ—¶æ—¶é—´
      connectTimeout: 30000
      # é…ç½®ç½‘络超时时间
      socketTimeout: 60000
      # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      minEvictableIdleTimeMillis: 300000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # è®¾ç½®ç™½åå•,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # æŽ§åˆ¶å°ç®¡ç†ç”¨æˆ·åå’Œå¯†ç 
        login-username: ruoyi
        login-password: 123456
      filter:
        stat:
          enabled: true
          # æ…¢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
  # èµ„源信息
  messages:
    # å›½é™…化资源文件路径
    basename: i18n/messages
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
    multipart:
      # å•个文件大小
      max-file-size: 1GB
      # è®¾ç½®æ€»ä¸Šä¼ çš„æ–‡ä»¶å¤§å°
      max-request-size: 2GB
  # æœåŠ¡æ¨¡å—
  devtools:
    restart:
      # çƒ­éƒ¨ç½²å¼€å…³
      enabled: false
  # redis é…ç½®
  redis:
    # åœ°å€
    #    host: 127.0.0.1
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 12
    # å¯†ç 
    #    password: root2022!
    password:
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
      pool:
        # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
        min-idle: 0
        # è¿žæŽ¥æ± ä¸­çš„æœ€å¤§ç©ºé—²è¿žæŽ¥
        max-idle: 8
        # è¿žæŽ¥æ± çš„æœ€å¤§æ•°æ®åº“连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
  # Quartz定时任务配置(新增部分)
  quartz:
    job-store-type: jdbc  # ä½¿ç”¨æ•°æ®åº“存储
    jdbc:
      initialize-schema: never  # é¦–次运行时自动创建表结构,成功后改为never
      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL表结构脚本
    properties:
      org:
        quartz:
          scheduler:
            instanceName: RuoYiScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL适配
            tablePrefix: qrtz_  # è¡¨åå‰ç¼€ï¼Œä¸Žè„šæœ¬ä¸€è‡´
            isClustered: false  # å•节点模式(集群需改为true)
            clusterCheckinInterval: 10000
            txIsolationLevelSerializable: true
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10  # çº¿ç¨‹æ± å¤§å°
            threadPriority: 5
            makeThreadsDaemons: true
          updateCheck: false  # å…³é—­ç‰ˆæœ¬æ£€æŸ¥
# token配置
token:
  # ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
  header: Authorization
  # ä»¤ç‰Œå¯†é’¥
  secret: abcdefghijklmnopqrstuvwxyz
  # ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
  expireTime: 450
# MyBatis Plus配置
mybatis-plus:
  # æœç´¢æŒ‡å®šåŒ…别名   æ ¹æ®è‡ªå·±çš„项目来
  typeAliasesPackage: com.ruoyi.**.pojo
  # é…ç½®mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # åŠ è½½å…¨å±€çš„é…ç½®æ–‡ä»¶
  configLocation: classpath:mybatis/mybatis-config.xml
  global-config:
    enable-sql-runner: true
    db-config:
      id-type: auto
# PageHelper分页插件
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql
# Swagger配置
swagger:
  # æ˜¯å¦å¼€å¯swagger
  enabled: true
  # è¯·æ±‚前缀
  pathMapping: /dev-api
# é˜²æ­¢XSS攻击
xss:
  # è¿‡æ»¤å¼€å…³
  enabled: true
  # æŽ’除链接(多个用逗号分隔)
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
# ä»£ç ç”Ÿæˆ
gen:
  # ä½œè€…
  author: ruoyi
  # é»˜è®¤ç”ŸæˆåŒ…路径 system éœ€æ”¹æˆè‡ªå·±çš„æ¨¡å—名称 å¦‚ system monitor tool
  packageName: com.ruoyi.project.system
  # è‡ªåŠ¨åŽ»é™¤è¡¨å‰ç¼€ï¼Œé»˜è®¤æ˜¯true
  autoRemovePre: false
  # è¡¨å‰ç¼€ï¼ˆç”Ÿæˆç±»åä¸ä¼šåŒ…含表前缀,多个用逗号分隔)
  tablePrefix: sys_
  # æ˜¯å¦å…è®¸ç”Ÿæˆæ–‡ä»¶è¦†ç›–到本地(自定义路径),默认不允许
  allowOverwrite: false
file:
  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
src/main/resources/application-mkzs.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-mkzs?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-mkzs?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6380
    # æ•°æ®åº“索引
src/main/resources/application-mqsp.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-lqmsp?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-lqmsp?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6380
    # æ•°æ®åº“索引
src/main/resources/application-mxsc.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-mxsc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-mxsc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-native.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,219 @@
# é¡¹ç›®ç›¸å…³é…ç½®
ruoyi:
  # åç§°
  name: RuoYi
  # ç‰ˆæœ¬
  version: 3.8.9
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: /javaWork/product-inventory-management/file
  # èŽ·å–ip地址开关
  addressEnabled: false
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
  captchaType: math
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 8080
  servlet:
    # åº”用的访问路径
    context-path: /
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
    # è¿žæŽ¥æ•°æ»¡åŽçš„æŽ’队数,默认为100
    accept-count: 1000
    threads:
      # tomcat最大线程数,默认为200
      max: 800
      # Tomcat启动初始化的线程数,默认值10
      min-spare: 100
# æ—¥å¿—配置
logging:
  level:
    com.ruoyi: warn
    org.springframework: warn
minio:
  endpoint: http://114.132.189.42/
  port: 7019
  secure: false
  accessKey: admin
  secretKey: 12345678
  preview-expiry: 24 # é¢„览地址默认24小时
  default-bucket: demo-product
# ç”¨æˆ·é…ç½®
user:
  password:
    # å¯†ç æœ€å¤§é”™è¯¯æ¬¡æ•°
    maxRetryCount: 5
    # å¯†ç é”å®šæ—¶é—´ï¼ˆé»˜è®¤10分钟)
    lockTime: 10
# Spring配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://localhost:3306/product-inventory-management?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123456
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
        enabled: false
        url:
        username:
        password:
      # åˆå§‹è¿žæŽ¥æ•°
      initialSize: 5
      # æœ€å°è¿žæŽ¥æ± æ•°é‡
      minIdle: 10
      # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
      maxActive: 20
      # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
      maxWait: 60000
      # é…ç½®è¿žæŽ¥è¶…æ—¶æ—¶é—´
      connectTimeout: 30000
      # é…ç½®ç½‘络超时时间
      socketTimeout: 60000
      # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      minEvictableIdleTimeMillis: 300000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # è®¾ç½®ç™½åå•,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # æŽ§åˆ¶å°ç®¡ç†ç”¨æˆ·åå’Œå¯†ç 
        login-username: ruoyi
        login-password: 123456
      filter:
        stat:
          enabled: true
          # æ…¢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
  # èµ„源信息
  messages:
    # å›½é™…化资源文件路径
    basename: i18n/messages
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
    multipart:
      # å•个文件大小
      max-file-size: 1GB
      # è®¾ç½®æ€»ä¸Šä¼ çš„æ–‡ä»¶å¤§å°
      max-request-size: 2GB
  # æœåŠ¡æ¨¡å—
  devtools:
    restart:
      # çƒ­éƒ¨ç½²å¼€å…³
      enabled: false
  # redis é…ç½®
  redis:
    # åœ°å€
    host: 127.0.0.1
#    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 0
    # å¯†ç 
#    password: root2022!
    password:
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
      pool:
        # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
        min-idle: 0
        # è¿žæŽ¥æ± ä¸­çš„æœ€å¤§ç©ºé—²è¿žæŽ¥
        max-idle: 8
        # è¿žæŽ¥æ± çš„æœ€å¤§æ•°æ®åº“连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
# token配置
token:
  # ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
  header: Authorization
  # ä»¤ç‰Œå¯†é’¥
  secret: abcdefghijklmnopqrstuvwxyz
  # ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
  expireTime: 450
# MyBatis Plus配置
mybatis-plus:
  # æœç´¢æŒ‡å®šåŒ…别名   æ ¹æ®è‡ªå·±çš„项目来
  typeAliasesPackage: com.ruoyi.**.pojo
  # é…ç½®mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # åŠ è½½å…¨å±€çš„é…ç½®æ–‡ä»¶
  configLocation: classpath:mybatis/mybatis-config.xml
  global-config:
    enable-sql-runner: true
    db-config:
      id-type: auto
# PageHelper分页插件
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql
# Swagger配置
swagger:
  # æ˜¯å¦å¼€å¯swagger
  enabled: true
  # è¯·æ±‚前缀
  pathMapping: /dev-api
# é˜²æ­¢XSS攻击
xss:
  # è¿‡æ»¤å¼€å…³
  enabled: true
  # æŽ’除链接(多个用逗号分隔)
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
# ä»£ç ç”Ÿæˆ
gen:
  # ä½œè€…
  author: ruoyi
  # é»˜è®¤ç”ŸæˆåŒ…路径 system éœ€æ”¹æˆè‡ªå·±çš„æ¨¡å—名称 å¦‚ system monitor tool
  packageName: com.ruoyi.project.system
  # è‡ªåŠ¨åŽ»é™¤è¡¨å‰ç¼€ï¼Œé»˜è®¤æ˜¯true
  autoRemovePre: false
  # è¡¨å‰ç¼€ï¼ˆç”Ÿæˆç±»åä¸ä¼šåŒ…含表前缀,多个用逗号分隔)
  tablePrefix: sys_
  # æ˜¯å¦å…è®¸ç”Ÿæˆæ–‡ä»¶è¦†ç›–到本地(自定义路径),默认不允许
  allowOverwrite: false
file:
  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
src/main/resources/application-phmk.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-phmk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-phmk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6380
    # æ•°æ®åº“索引
src/main/resources/application-rzny.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-rzny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-rzny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-tjxm.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-tjxm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-tjxm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-tymk.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-tymk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-tymk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6380
    # æ•°æ®åº“索引
src/main/resources/application-xyhb.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-xyhb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-xyhb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
src/main/resources/application-zyrqCopy.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-zyrq?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-zyrq?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -135,7 +135,7 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.1.185
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6380
    # æ•°æ®åº“索引
src/main/resources/mapper/basic/ProductModelMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
<?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.basic.mapper.ProductModelMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.ProductModel">
        <id column="id" property="id" />
        <result column="product_id" property="productId" />
        <result column="model" property="model" />
        <result column="unit" property="unit" />
        <result column="speculative_trading_name" property="speculativeTradingName" />
        <result column="tenant_id" property="tenantId" />
        <result column="product_name" property="productName" />
        <result column="product_id" property="productId" />
        <result column="product_code" property="productCode" />
    </resultMap>
    <select id="listPageProductModel" resultType="com.ruoyi.basic.pojo.ProductModel">
        select pm.*,p.product_name
        from product_model pm
        left join product p on pm.product_id = p.id
        <where>
            <if test="c.model != null and c.model != ''">
                and pm.model  like  concat('%',#{c.model},'%')
            </if>
            <if test="c.productName != null and c.productName != ''">
                and p.product_name  like  concat('%',#{c.productName},'%')
            </if>
        </where>
        order by  pm.id
    </select>
    <select id="selectLatestRecord" resultType="com.ruoyi.basic.pojo.ProductModel">
            SELECT * FROM product_model
            ORDER BY create_time DESC, id DESC
            LIMIT 1
    </select>
</mapper>
src/main/resources/mapper/basic/SupplierManageFileMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
<?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.basic.mapper.SupplierManageFileMapper">
    <select id="supplierManageFileListPage" resultType="com.ruoyi.basic.pojo.SupplierManageFile">
        select *
        from supplier_manage_file
        where supplier_id = #{supplierManageFile.supplierId}
    </select>
</mapper>
src/main/resources/mapper/basic/SupplierManageMapper.xml
@@ -22,12 +22,16 @@
        T1.update_time,
        T1.update_user,
        T1.tenant_id,
        T1.is_white,
        T2.nick_name AS maintainUserName
        FROM supplier_manage T1
        LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id
        <where>
            <if test="supplierManageDto.supplierName != null and supplierManageDto.supplierName != '' ">
                AND T1.supplier_name LIKE CONCAT('%',#{supplierManageDto.supplierName},'%')
            </if>
            <if test="supplierManageDto.isWhite != null">
                AND T1.is_white = #{supplierManageDto.isWhite}
            </if>
        </where>
    </select>
@@ -50,6 +54,7 @@
        T1.update_time,
        T1.update_user,
        T1.tenant_id,
        T1.is_white,
        T2.nick_name AS maintainUserName
        FROM supplier_manage T1
        LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id
@@ -57,6 +62,9 @@
            <if test="supplierManageDto.supplierName != null and supplierManageDto.supplierName != '' ">
                AND T1.supplier_name LIKE CONCAT('%',#{supplierManageDto.supplierName},'%')
            </if>
            <if test="supplierManageDto.isWhite != null">
                AND T1.is_white = #{supplierManageDto.isWhite}
            </if>
        </where>
    </select>
src/main/resources/mapper/device/DeviceLedgerMapper.xml
@@ -11,6 +11,8 @@
        dl.device_name,
        dl.device_model,
        dl.supplier_name,
        dl.device_brand,
        dl.storage_location,
        dl.unit,
        dl.number,
        dl.status,
@@ -24,7 +26,7 @@
        dl.un_tax_including_price_total,
        dl.create_time,
        dl.update_time ,
        su.user_name AS createUser,
        su.nick_name AS createUser,
        dl.update_user,
        dl.tenant_id
        FROM device_ledger dl
src/main/resources/mapper/device/DeviceRepairMapper.xml
@@ -14,6 +14,7 @@
                dr.maintenance_name,
                dr.maintenance_time,
                dr.maintenance_result,
                dr.maintenance_price,
                dr.status,
                dr.create_time,
                dr.update_time,
@@ -32,6 +33,9 @@
            </if>
            <if test="deviceRepairDto.deviceModel != null">
                and dl.device_model like concat('%',#{deviceRepairDto.deviceModel},'%')
            </if>
            <if test="deviceRepairDto.status != null">
                and dr.status = #{deviceRepairDto.status}
            </if>
            <if test="deviceRepairDto.remark != null">
                and dr.remark like concat('%',#{deviceRepairDto.remark},'%')
@@ -57,6 +61,7 @@
               dr.maintenance_name,
               dr.maintenance_time,
               dr.maintenance_result,
               dr.maintenance_price,
               dr.status,
               dr.create_time,
               dr.update_time,
src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
@@ -2,11 +2,12 @@
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper">
    <select id="listPage" resultType="com.ruoyi.measuringinstrumentledger.dto.SparePartsDto">
        select sp.*,sp1.name as parentName from spare_parts sp
        select sp.*,sp1.name as parentName
        from spare_parts sp
        left join spare_parts sp1 on sp1.id = sp.parent_id
        <where>
            <if test="spareParts.name != null">
                and name like concat('%',#{spareParts.name},'%')
            <if test="spareParts.name != null and spareParts.name != ''">
                and sp.name like concat('%',#{spareParts.name},'%')
            </if>
        </where>
    </select>
src/main/resources/mapper/procurementrecord/ProcurementExceptionRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
<?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.procurementrecord.mapper.ProcurementExceptionRecordMapper">
</mapper>
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -178,7 +178,7 @@
                and t1.create_time &lt;= #{req.endDate}
            </if>
        </where>
        group by t2.product_category,t2.specification_model,t1.unit_price
        group by t3.supplier_name,t2.product_category,t2.specification_model,t1.unit_price
        order by t1.create_time desc
    </select>
    <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
@@ -236,6 +236,158 @@
            t1.update_time as uTime,
            t1.create_by
        from  procurement_record_storage t1
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 2
                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
        where t1.type = 1
        group by t3.supplier_name,t2.product_category,t2.specification_model
    </select>
    <select id="listPageByProduction" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto">
        select
        t3.customer_contract_no,
        t3.sales_contract_no,
        t3.customer_name,
        t2.product_category,
        t1.id,
        t1.sales_ledger_product_id,
        t1.create_user,
        t2.specification_model,
        t2.unit,
        t2.tax_rate,
        t2.tax_inclusive_unit_price,
        (t1.inbound_num * t2.tax_inclusive_unit_price) as taxInclusiveTotalPrice,
        (t1.inbound_num * t2.tax_inclusive_unit_price - t1.inbound_num * t2.tax_inclusive_unit_price * t2.tax_rate / 100) as taxExclusiveTotalPrice,
        t1.unit_price,
        t1.total_price,
        t1.inbound_batches,
        t1.inbound_num,
        t1.inbound_num as inboundNum0,
        t1.create_time,
        t1.update_time,
        t1.create_by,
        t2.warn_num,
        t2.product_id
        from  procurement_record_storage t1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        <where>
            t1.type = 2 and t1.sales_ledger_product_id != 0
            <if test="req.customerName != null and req.customerName != ''">
                and t3.customer_name like  concat('%',#{req.customerName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
            </if>
        </where>
        order by t1.create_time desc
    </select>
    <select id="listPageCopyByProduction" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
        select
        t3.customer_contract_no,
        t3.sales_contract_no,
        t3.customer_name,
        t2.product_category,
        t1.id,
        t1.sales_ledger_product_id,
        t1.create_user,
        t2.specification_model,
        t2.unit,
        t2.min_stock,
        t2.tax_rate,
        t2.tax_inclusive_unit_price,
        t2.tax_inclusive_total_price,
        t2.tax_exclusive_total_price,
        t1.inbound_batches,
        sum(t1.total_price) as totalPrice,
        t1.unit_price,
        sum(t1.inbound_num) as inboundNum,
        sum(t1.inbound_num) as inboundNum0,
        t1.create_time,
        t1.update_time,
        t1.create_by,
        t2.warn_num,
        t2.product_id
        from  procurement_record_storage t1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        <where>
            t1.type = 2
            <if test="req.customerName != null and req.customerName != ''">
                and t3.customer_name like  concat('%',#{req.customerName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
            </if>
            <if test="req.salesLedgerProductId != null and req.salesLedgerProductId != ''">
                and t1.sales_ledger_product_id = #{req.salesLedgerProductId}
            </if>
            <if test="req.reportDate != null">
                and t1.create_time >= #{req.reportDate} and t1.create_time &lt; DATE_ADD(#{req.reportDate}, INTERVAL 1 DAY)
            </if>
            <if test="req.startMonth != null">
                and t1.create_time >= #{req.startMonth}
            </if>
            <if test="req.endMonth != null">
                and t1.create_time &lt;= #{req.endMonth}
            </if>
            <if test="req.startDate != null">
                and t1.create_time >= #{req.startDate}
            </if>
            <if test="req.endDate != null">
                and t1.create_time &lt;= #{req.endDate}
            </if>
        </where>
        group by t2.product_category,t2.specification_model,t1.unit_price
        order by t1.create_time desc
    </select>
    <select id="listPagePRS" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
        select *
        from  procurement_record_storage t1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
          <where>
              1=1
              <if test="req.productCategory != null and req.productCategory != ''">
                  and t2.product_category like  concat('%',#{req.productCategory},'%')
              </if>
              <if test="req.timeStr != null and req.timeStr != ''">
                  and t1.create_time like  concat('%',#{req.timeStr},'%')
              </if>
              <if test="req.salesLedgerProductId != null and req.salesLedgerProductId != ''">
                  and t1.sales_ledger_product_id = #{req.salesLedgerProductId}
              </if>
          </where>
    </select>
    <select id="getSumQuantity" resultType="BigDecimal">
        select COALESCE(sum(inbound_num), 0)
        from procurement_record_storage
        where product_model_id = #{productModelId}
    </select>
    <select id="listPageByProductProduction" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto">
        select
        t1.*,
        t2.model as specification_model  ,
        t2.unit,
        t3.product_name as product_category
        from  procurement_record_storage t1
        left  join product_model t2 on t1.product_model_id = t2.id
        left join product t3 on t2.product_id = t3.id
        <where>
            t1.type = 2 and t1.sales_ledger_product_id  = 0
            <if test="req.productCategory != null and req.productCategory != ''">
                and t3.product_name like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
            </if>
        </where>
        order by t1.create_time desc
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
                  left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        where t1.type = 2
src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
@@ -30,84 +30,74 @@
        <where>
            and t1.type = 1
            <if test="req.supplierName != null and req.supplierName != ''">
                and t3.supplier_name like  concat('%',#{req.supplierName},'%')
                and t3.supplier_name like concat('%',#{req.supplierName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
                and t2.product_category like concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
                and t1.create_time like concat('%',#{req.timeStr},'%')
            </if>
        </where>
        order by t1.create_time desc
    </select>
    <select id="list" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
        select
            t3.supplier_name,
            t2.product_category,
            t1.id,
            t2.specification_model,
            t2.unit,
            t2.tax_rate,
            t2.tax_inclusive_unit_price,
            t2.tax_inclusive_total_price,
            t2.tax_exclusive_total_price,
            t1.inbound_num,
            t1.create_time,
            t1.create_time as time,
            t1.create_by,
            t4.box_num,
            t4.carton_specifications,
            t4.dollar_price
        from  procurement_record_out t1
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
            left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
        select t3.supplier_name,
               t2.product_category,
               t1.id,
               t2.specification_model,
               t2.unit,
               t2.tax_rate,
               t2.tax_inclusive_unit_price,
               t2.tax_inclusive_total_price,
               t2.tax_exclusive_total_price,
               t1.inbound_num,
               t1.create_time,
               t1.create_time as time,
               t1.create_by
        from procurement_record_out t1
                 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                 left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
        where t1.type = 1
    </select>
    <select id="listOne" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
        select
            t3.customer_contract_no,
            t3.sales_contract_no,
            t3.customer_name,
            t2.product_category,
            t1.id,
            t2.specification_model,
            t2.unit,
            t2.tax_rate,
            t2.tax_inclusive_unit_price,
            t2.tax_inclusive_total_price,
            t2.tax_exclusive_total_price,
            t1.inbound_num,
            t1.create_time,
            t1.create_time as time,
            t1.create_by
        from  procurement_record_out t1
            left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
            left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        select t3.customer_contract_no,
               t3.sales_contract_no,
               t3.customer_name,
               t2.product_category,
               t1.id,
               t2.specification_model,
               t2.unit,
               t2.tax_rate,
               t2.tax_inclusive_unit_price,
               t2.tax_inclusive_total_price,
               t2.tax_exclusive_total_price,
               t1.inbound_num,
               t1.create_time,
               t1.create_time as time,
               t1.create_by
        from procurement_record_out t1
                 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                 left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        where t1.type = 2
    </select>
    <select id="listTwo" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
        select
            t1.id,
            t1.`code`,
            t3.supplier_name,
            t2.product_category,
            t2.specification_model,
            t2.unit,
            t2.tax_rate,
            t2.tax_inclusive_unit_price,
            t2.tax_inclusive_total_price,
            t2.tax_exclusive_total_price,
            t1.inbound_num,
            t1.create_time,
            t1.create_time as time,
            t1.create_by
        from  procurement_record_out t1
            left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
            left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
        select t1.supplier_name,
               t1.product_category,
               t1.id,
               t1.specification_model,
               t1.unit,
               t1.tax_rate,
               t1.tax_inclusive_unit_price,
               t1.tax_inclusive_total_price,
               t1.tax_exclusive_total_price,
               t1.inbound_num,
               t1.create_time,
               t1.create_time as time,
               t1.create_by
        from procurement_record_out t1
        where t1.type = 3
    </select>
    <select id="listPageByProduct" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
@@ -128,21 +118,21 @@
        t1.create_time,
        t1.create_by,
        t4.unit_price,
        t4.unit_price *  t1.inbound_num as totalPrice
        from  procurement_record_out t1
        t4.unit_price * t1.inbound_num as totalPrice
        from procurement_record_out t1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
        <where>
            and t1.type = 2
            <if test="req.customerName != null and req.customerName != ''">
                and t3.customer_name like  concat('%',#{req.customerName},'%')
                and t3.customer_name like concat('%',#{req.customerName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
                and t2.product_category like concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
                and t1.create_time like concat('%',#{req.timeStr},'%')
            </if>
        </where>
        order by t1.create_time desc
@@ -152,7 +142,6 @@
        t2.supplier_name,
        t2.product_category,
        t1.id,
        t1.code,
        t2.specification_model,
        t2.unit,
        t2.tax_rate,
@@ -163,24 +152,61 @@
        t1.create_time,
        t1.create_by,
        t2.item_type,
        t2.box_num,
        t2.carton_specifications,
        t2.dollar_price,
        t2.url
        from  procurement_record_out t1
        t2.code
        from procurement_record_out t1
        left join custom_storage t2 on t2.id = t1.procurement_record_storage_id
        <where>
            t1.type = 3
            <if test="req.supplierName != null and req.supplierName != ''">
                and t2.supplier_name like  concat('%',#{req.supplierName},'%')
                and t2.supplier_name like concat('%',#{req.supplierName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
                and t2.product_category like concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
                and t1.create_time like concat('%',#{req.timeStr},'%')
            </if>
        </where>
        order by t1.create_time desc
    </select>
    <select id="getSumQuantity" resultType="BigDecimal">
        select COALESCE(sum(inbound_num), 0)
        from procurement_record_out
        where
           product_model_id = #{productModelId}
    </select>
    <select id="selectCode" resultType="com.ruoyi.procurementrecord.pojo.ProcurementRecordOut">
        select *
        from procurement_record_out
        where code like concat('%', #{format})
        order by id desc
        limit 1
    </select>
    <select id="listPageBySemiProduct" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
        select
        t1.id,
        t1.code,
        t2.unit,
        t1.inbound_num,
        t1.create_time,
        t1.create_by,
        t2.model as specification_model,
        t2.product_code,
        t3.product_name as product_category
        from procurement_record_out t1
        left join product_model t2 on t2.id = t1.product_model_id
        left join product t3 on t3.id = t2.product_id
        <where>
            and t1.type = 4
            <if test="req.productCategory !=null and req.productCategory !=''">
                t3.product_name like concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like concat('%',#{req.timeStr},'%')
            </if>
        </where>
        order by t1.create_time desc
    </select>
</mapper>
src/main/resources/mapper/production/ProcessRouteItemMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
<?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.production.mapper.ProcessRouteItemMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProcessRouteItem">
        <id property="id" column="id"/>
        <result property="routeId" column="route_id"/>
        <result property="processId" column="process_id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="dragSort" column="drag_sort"/>
    </resultMap>
    <select id="listProcessRouteItemDto" resultType="com.ruoyi.production.dto.ProcessRouteItemDto">
        select pri.*,
               pr.description ,
               pp.name as process_name,
               pm.speculative_trading_name,
               pm.product_id,
               pm.model,
               p.product_name,
               pm.unit
        from
            process_route_item pri
                left join product_model pm on pri.product_model_id = pm.id
                left join product_process pp on pp.id = pri.process_id
                left join product p on p.id = pm.product_id
                left join process_route pr on pr.id = pri.route_id
        where
            pri.route_id = #{c.routeId}
        order by pri.drag_sort
    </select>
</mapper>
src/main/resources/mapper/production/ProcessRouteMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
<?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.production.mapper.ProcessRouteMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProcessRoute">
            <id property="id" column="id"/>
            <result property="productModelId" column="product_model_id"/>
            <result property="description" column="description"/>
            <result property="tenantId" column="tenant_id"/>
            <result property="createTime" column="create_time"/>
            <result property="updateTime" column="update_time"/>
    </resultMap>
    <select id="pageProcessRouteDto" resultType="com.ruoyi.production.dto.ProcessRouteDto">
        select ps.*, p.product_name,pm.product_id,pm.model,pb.bom_no
        from process_route ps
        left join product_bom pb on ps.bom_id = pb.id
        left join product_model pm on ps.product_model_id = pm.id
        left join product p on pm.product_id = p.id
        <where>
            <if test="c.model != null and c.model != ''">
                and pm.model like concat('%',#{c.model},'%')
            </if>
        </where>
        order by ps.id asc
    </select>
</mapper>
src/main/resources/mapper/production/ProductBomMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
<?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.production.mapper.ProductBomMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductBom">
        <id column="id" property="id"/>
        <result column="product_model_id" property="productModelId"/>
        <result column="bom_no" property="bomNo"/>
        <result column="remark" property="remark"/>
        <result column="version" property="version"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="create_user" property="createUser"/>
        <result column="update_user" property="updateUser"/>
        <result column="tenant_id" property="tenantId"/>
    </resultMap>
    <select id="listPage" resultType="com.ruoyi.production.dto.ProductBomDto">
        select * from (select pb.*,
        pm.model productModelName,
        p.product_name productName
        from product_bom pb
        left join product_model pm on pb.product_model_id = pm.id
        left join product p on pm.product_id = p.id)A
        where 1=1
        <if test="c.productModelName != null">
            and productModelName = #{c.productModelName}
        </if>
        <if test="c.productName != null">
            and productName = #{c.productName}
        </if>
        <if test="c.bomNo != null">
            and bom_no = #{c.bomNo}
        </if>
        <if test="c.version != null">
            and version = #{c.version}
        </if>
    </select>
    <select id="getById" resultType="com.ruoyi.production.dto.ProductBomDto">
        select pb.*,
               pm.model productModelName,
               p.product_name productName
        from product_bom pb
                 left join product_model pm on pb.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
    </select>
</mapper>
src/main/resources/mapper/production/ProductOrderMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
<?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.production.mapper.ProductOrderMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProductOrder">
        <id property="id" column="id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="salesLedgerId" column="sales_ledger_id"/>
        <result property="routeId" column="route_id"/>
        <result property="npsNo" column="nps_no"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>
    <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">
        select po.*,
        sl.sales_contract_no,
        sl.customer_name,
        slp.product_category,
        slp.specification_model,
        ppr.process_route_code,
        pb.bom_no,
        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus
        from product_order po
        left join sales_ledger sl on po.sales_ledger_id = sl.id
        left join sales_ledger_product slp on po.product_model_id = slp.id
        left join product_process_route ppr on po.id = ppr.product_order_id
        left join product_bom pb on pb.id = ppr.bom_id
        <where>
            <if test="c.npsNo != null and c.npsNo != ''">
                and po.nps_no like concat('%',#{c.npsNo},'%')
            </if>
            <if test="c.salesContractNo != null and c.salesContractNo != ''">
                and sl.sales_contract_no like concat('%',#{c.salesContractNo},'%')
            </if>
            <if test="c.customerName != null and c.customerName != ''">
                and sl.customer_name like concat('%',#{c.customerName},'%')
            </if>
            <if test="c.productCategory != null and c.productCategory != ''">
                and slp.product_category like concat('%',#{c.productCategory},'%')
            </if>
            <if test="c.specificationModel != null and c.specificationModel != ''">
                and slp.specification_model like concat('%',#{c.specificationModel},'%')
            </if>
        </where>
    </select>
    <select id="productMainByOrderId" resultType="com.ruoyi.production.dto.ProductOrderDto">
        select po.*,
               pwo.work_order_no,
               pwo.report_work,
               pwo.status,
               pwo.quantity,
               pwo.plan_quantity
        from product_order po
                 left join product_work_order pwo on po.id = pwo.product_order_id
        where po.id = #{c.id}
    </select>
    <select id="listProcessRoute" resultType="com.ruoyi.production.pojo.ProcessRoute">
        select pr.*
        from process_route pr
                 left join product_model pm on pr.product_model_id = pm.id
                 left join sales_ledger_product slp on pm.id = slp.product_model_id
        where slp.id = #{productModelId}
    </select>
    <select id="listProcessBom" resultType="com.ruoyi.production.dto.ProductStructureDto">
        select ps.id,
               ps.product_model_id,
               ps.process_id,
               ps.unit_quantity,
               ps.unit_quantity * po.quantity as demandedQuantity,
               ps.unit,
               p.product_name,
               pp.name as  process_name,
               pm.product_id,
               pm.model
        from
            product_structure ps
                left join product_model pm on ps.product_model_id = pm.id
                left join product p on pm.product_id = p.id
                left join product_process pp on ps.process_id = pp.id
                left join product_process_route ppr on ps.bom_id = ppr.bom_id
                left join product_order po on po.id = ppr.product_order_id
        where ppr.product_order_id = #{orderId}
        order by ps.id
    </select>
</mapper>
src/main/resources/mapper/production/ProductProcessMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
<?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.production.mapper.ProductProcessMapper">
    <select id="listPage" resultType="com.ruoyi.production.dto.ProductProcessDto">
        SELECT
        *
        FROM
        product_process p
        <where>
            <if test="productProcessDto.name != null and productProcessDto.name != '' ">
                AND  p.name LIKE CONCAT('%',#{productProcessDto.name},'%')
            </if>
            <if test="productProcessDto.no != null and productProcessDto.no != '' ">
                AND  p.no LIKE CONCAT('%',#{productProcessDto.no},'%')
            </if>
        </where>
        order by p.id asc
    </select>
</mapper>
src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
<?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.production.mapper.ProductProcessRouteItemMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProductProcessRouteItem">
        <id property="id" column="id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>
    <select id="listItem" resultType="com.ruoyi.production.dto.ProductProcessRouteItemDto">
        select ppri.*,
               pp.name as process_name,
               pm.model,
               pm.unit,
               p.product_name
        from product_process_route_item ppri
                 left join product_model pm on ppri.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
                 left join product_process pp on pp.id = ppri.process_id
        where ppri.product_order_id = #{orderId}
        order by ppri.drag_sort
    </select>
</mapper>
src/main/resources/mapper/production/ProductProcessRouteMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
<?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.production.mapper.ProductProcessRouteMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductProcessRoute">
        <id column="id" property="id"/>
        <result column="product_model_id" property="productModelId"/>
        <result column="description" property="description"/>
        <result column="tenant_id" property="tenantId"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="bom_id" property="bomId"/>
        <result column="process_route_code" property="processRouteCode"/>
        <result column="product_order_id" property="productOrderId"/>
    </resultMap>
    <select id="listMain" resultType="com.ruoyi.production.dto.ProcessRouteDto">
        select ppr.*, p.product_name, pm.product_id, pm.model, pb.bom_no
        from product_process_route ppr
                 left join product_bom pb on ppr.bom_id = pb.id
                 left join product_model pm on ppr.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
        where ppr.product_order_id = #{orderId}
    </select>
</mapper>
src/main/resources/mapper/production/ProductStructureMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
<?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.production.mapper.ProductStructureMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProductStructure">
        <id property="id" column="id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="processId" column="process_id"/>
        <result property="unitQuantity" column="unit_quantity"/>
        <result property="demandedQuantity" column="demanded_quantity"/>
        <result property="unit" column="unit"/>
        <result property="tenantId" column="tenant_id"/>
    </resultMap>
    <select id="listBybomId" resultType="com.ruoyi.production.dto.ProductStructureDto">
        select ps.*,
               p.product_name,
               pp.name as  process_name,
               pm.product_id,
               pm.model
        from
            product_structure ps
                left join product_model pm on ps.product_model_id = pm.id
                left join product p on pm.product_id = p.id
                left join product_process pp on ps.process_id = pp.id
        where ps.bom_id = #{bomId}
        order by ps.id
    </select>
    <select id="listByproductModelId" resultType="com.ruoyi.production.dto.ProductStructureDto">
        select ps.*,
               p.product_name,
               pp.name as  process_name,
               pm.product_id,
               pm.model
        from
            product_structure ps
                left join product_bom pb on ps.bom_id = pb.id
                left join product_model pm on ps.product_model_id = pm.id
                left join product p on pm.product_id = p.id
                left join product_process pp on ps.process_id = pp.id
        where pb.product_model_id = #{productModelId}
        order by ps.id
    </select>
</mapper>
src/main/resources/mapper/production/ProductWorkOrderMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
<?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.production.mapper.ProductWorkOrderMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductWorkOrder">
        <result column="id" property="id"/>
        <result column="product_process_route_item_id" property="productProcessRouteItemId"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="work_order_no" property="workOrderNo"/>
        <result column="status" property="status"/>
        <result column="tenant_id" property="tenantId"/>
        <result column="actual_end_time" property="planStartTime"/>
        <result column="plan_end_time" property="planEndTime"/>
        <result column="actual_start_time" property="actualStartTime"/>
        <result column="actualEndTime" property="actualEndTime"/>
    </resultMap>
    <select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
        SELECT
        pwo.*,
        pp.NAME as processName,
        pm.model,
        pm.unit,
        p.product_name AS productName,
        po.nps_no AS productOrderNpsNo,
        ROUND(pwo.complete_quantity / pwo.plan_quantity * 100, 2) AS completionStatus
        FROM
        product_work_order pwo
        LEFT JOIN product_process_route_item ppri ON ppri.id = pwo.product_process_route_item_id
        LEFT JOIN product_order po ON po.id = pwo.product_order_id
        LEFT JOIN product_process pp ON pp.id = ppri.process_id
        LEFT JOIN product_model pm ON pm.id = ppri.product_model_id
        LEFT JOIN product p ON p.id = pm.product_id
        <where>
            <if test="c.workOrderNo != null and c.workOrderNo != ''">
                pwo.work_order_no like concat('%',#{c.workOrderNo},'%')
            </if>
        </where>
    </select>
    <select id="selectProductWorkOrderDtoList" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
        select *
        from product_work_order pwo
        left join product_order po on po.id = pwo.product_order_id
    </select>
    <update id="updatePlanQuantity" parameterType="java.util.Map">
        UPDATE product_work_order
        SET
            report_work = #{reportWork},
            plan_quantity = plan_quantity - #{deductQuantity}
        WHERE id = #{workOrderId}
    </update>
    <update id="rollbackPlanQuantity" parameterType="java.lang.Long">
        UPDATE product_work_order pwo
        INNER JOIN production_product_main ppm
        ON pwo.id = ppm.work_order_id
        AND ppm.id = #{productMainId}
        INNER JOIN production_product_output ppo
        ON ppo.product_main_id = ppm.id
        SET
        pwo.plan_quantity = pwo.plan_quantity + ppo.quantity,
        pwo.report_work = 0,
        pwo.quantity = 0
        WHERE pwo.id = ppm.work_order_id
    </update>
</mapper>
src/main/resources/mapper/production/ProductionProductInputMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
<?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.production.mapper.ProductionProductInputMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProductionProductInput">
        <id property="id" column="id"/>
        <result property="productMainId" column="product_main_id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="quantity" column="quantity"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="createTime" column="create_time"/>
    </resultMap>
    <select id="listPageProductionProductInputDto" resultType="com.ruoyi.production.dto.ProductionProductInputDto">
        select ppi.*,
        pm.model as model,
        ppm.product_no as productNo
        from
        production_product_input ppi
        left join production_product_main ppm on ppm.id = ppi.product_main_id
        left join product_model pm on pm.id = ppi.product_model_id
        <where>
            <if test="c.productMainId != null and c.productMainId > 0">
                and ppm.id = #{c.productMainId}
            </if>
        </where>
        order by ppi.id
    </select>
    <delete id="deleteByProductMainIds" parameterType="java.util.List">
        DELETE FROM production_product_input
        WHERE product_main_id IN
        <foreach collection="productMainIds" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>
</mapper>
src/main/resources/mapper/production/ProductionProductMainMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
<?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.production.mapper.ProductionProductMainMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProductionProductMain">
        <id property="id" column="id"/>
        <result property="productNo" column="product_no"/>
        <result property="userId" column="user_id"/>
        <result property="workOrderId" column="work_order_id"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="createTime" column="create_time"/>
        <result property="status" column="status"/>
    </resultMap>
    <select id="listPageProductionProductMainDto" resultType="com.ruoyi.production.dto.ProductionProductMainDto">
        select ppm.*,
               pwo.work_order_no as workOrderNo,
               pwo.status as workOrderStatus,
               u.nick_name as nickName
        from
            production_product_main ppm
                left join product_work_order pwo on pwo.id = ppm.work_order_id
                left join sys_user u on u.user_id = ppm.user_id
        <where>
            <if test="c.nickName != null and c.nickName != ''">
                and u.nick_name like concat('%',#{c.nickName},'%')
            </if>
            <if test="c.workOrderNo != null and c.workOrderNo != ''">
                and pwo.work_order_no like concat('%',#{c.workOrderNo},'%')
            </if>
            <if test="c.workOrderStatus != null and c.workOrderStatus != ''">
                and pwo.status = #{c.workOrderStatus}
            </if>
            <if test="c.status != null and c.status != ''">
                and ppm.status = #{c.status}
            </if>
        </where>
        order by ppm.id
    </select>
    <delete id="deleteByWorkOrderIds" parameterType="java.util.List">
        DELETE FROM production_product_main
        WHERE work_order_id IN
        <foreach collection="workOrderIds" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>
</mapper>
src/main/resources/mapper/production/ProductionProductOutputMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
<?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.production.mapper.ProductionProductOutputMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProductionProductOutput">
        <id property="id" column="id"/>
        <result property="productMainId" column="product_main_id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="quantity" column="quantity"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="createTime" column="create_time"/>
    </resultMap>
    <select id="listPageProductionProductOutputDto" resultType="com.ruoyi.production.dto.ProductionProductOutputDto">
        select ppo.*,
        pm.model as model,
        ppm.product_no as productNo
        from
        production_product_output ppo
        left join production_product_main ppm on ppm.id = ppo.product_main_id
        left join product_model pm on pm.id = ppo.product_model_id
        <where>
            <if test="c.productMainId != null and c.productMainId > 0">
                and ppm.id = #{c.productMainId}
            </if>
        </where>
        order by ppo.id
    </select>
    <delete id="deleteByProductMainIds" parameterType="java.util.List">
        DELETE FROM production_product_output
        WHERE product_main_id IN
        <foreach collection="productMainIds" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>
</mapper>
src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
@@ -48,6 +48,6 @@
            </if>
        </where>
        group by t4.id
        order by t4.update_time desc
        order by t4.scheduling_date desc
    </select>
</mapper>
src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml
@@ -15,6 +15,7 @@
        T2.quantity,
        T2.product_category,
        T2.specification_model,
        T2.speculative_trading_name,
        T2.unit
        FROM
        sales_ledger_product T2
@@ -42,6 +43,10 @@
            </if>
        </where>
        GROUP BY T2.id
        <if test="salesLedgerDto.status != null and salesLedgerDto.status.equals('true')">
            HAVING quantity - schedulingNum > 0
        </if>
        order by T1.entry_date desc
    </select>
    <select id="list" resultType="com.ruoyi.production.dto.SalesLedgerSchedulingDto">
        SELECT
@@ -71,6 +76,7 @@
        T2.status,
        T2.scheduling_user_id,
        T2.scheduling_user_name,
        T2.speculative_trading_name,
        T2.scheduling_date,
        ifNull(T2.scheduling_num,0) AS schedulingNum,
        ifNull(T2.finished_num,0) AS successNum,
@@ -80,7 +86,8 @@
        T1.customer_name,
        t3.product_category,
        t3.specification_model,
        t3.unit
        t3.unit,
        T2.production_line
        FROM
        sales_ledger_scheduling T2
        LEFT JOIN sales_ledger T1 ON T1.id = T2.sales_ledger_id
@@ -109,6 +116,6 @@
                AND  T2.scheduling_date &lt;= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d')
            </if>
        </where>
        order by T2.status asc
        order by T2.scheduling_date desc
    </select>
</mapper>
src/main/resources/mapper/production/SalesLedgerWorkMapper.xml
@@ -13,17 +13,23 @@
        t4.finished_num,
        t4.work_hours,
        t4.process,
        t4.type,
        t4.remark,
        t4.receive,
        T1.sales_contract_no,
        T1.customer_contract_no,
        T1.project_name,
        T1.customer_name,
        t3.product_category,
        t3.specification_model,
        t3.unit
        t3.unit,
        t2.speculative_trading_name,
        t4.production_line
        FROM
        sales_ledger_work t4
        LEFT JOIN sales_ledger T1 ON T1.id = t4.sales_ledger_id
        left join sales_ledger_product t3 on t4.sales_ledger_product_id = t3.id
        left join sales_ledger_scheduling t2 on t4.sales_ledger_scheduling_id = t2.id
        <where>
            t3.type = 1
            <if test="salesLedgerDto.status != null and salesLedgerDto.status != '' ">
@@ -48,6 +54,6 @@
                AND  t4.scheduling_date &lt;= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d')
            </if>
        </where>
        order by t4.update_time desc
        order by t4.scheduling_date desc
    </select>
</mapper>
src/main/resources/mapper/purchase/InvoicePurchaseMapper.xml
@@ -66,6 +66,7 @@
                                LEFT JOIN invoice_registration_product pr ON pr.id = il.invoice_registration_product_id
                       WHERE il.invoice_no IS NOT NULL
                         AND invoice_type = '增专票'
                         AND DATE_FORMAT(il.invoice_date, '%Y-%m') IS NOT NULL  -- æ–°å¢žï¼šè¿‡æ»¤month为NULL的情
                       GROUP BY DATE_FORMAT(il.invoice_date, '%Y-%m')
                   ) a1
                       LEFT JOIN (
@@ -124,12 +125,14 @@
                           LEFT JOIN invoice_registration_product pr ON pr.id = il.invoice_registration_product_id
                  WHERE il.invoice_no IS NOT NULL
                    AND invoice_type = '增专票'
                    AND DATE_FORMAT(il.invoice_date, '%Y-%m') IS NOT NULL  -- æ–°å¢žï¼šè¿‡æ»¤month为NULL的情
                  GROUP BY DATE_FORMAT(il.invoice_date, '%Y-%m')
              ) a1 ON a1.month = a2.month
              WHERE a1.month IS NULL
              ORDER BY month
             )as a
        <where>
            a.month is not null
            <if test="month != null">
                and a.month = #{month}
            </if>
src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
@@ -164,11 +164,9 @@
        FROM
        payment_registration T1
        LEFT JOIN purchase_ledger t4 ON t4.id = T1.purchase_ledger_id
        LEFT JOIN
        supplier_manage T2 ON T1.supplier_id = T2.id
        LEFT JOIN
        sys_user T3 ON T3.user_id = T1.registrant_id
        left join ticket_registration t5 on t5.purchase_ledger_id = T1.purchase_ledger_id
        LEFT JOIN supplier_manage T2 ON T1.supplier_id = T2.id
        LEFT JOIN sys_user T3 ON T3.user_id = T1.registrant_id
        left join ticket_registration t5 on t5.id = T1.ticket_registration_id
        <where>
            <if test="params.searchText != null and params.searchText != '' ">
                AND T2.supplier_name LIKE CONCAT('%',#{params.searchText},'%')
src/main/resources/mapper/purchase/ProductRecordMapper.xml
@@ -28,16 +28,16 @@
        left join product_model pm on pm.id = pr.product_model_id
        WHERE type = 2
        <if test="c.salesContractNo != null and c.salesContractNo != ''">
            and sl.sales_contract_no = #{c.salesContractNo}
            and sl.sales_contract_no like concat('%',#{c.salesContractNo},'%')
        </if>
        <if test="c.supplierName != null and c.supplierName != ''">
            and pl.supplier_name = #{c.supplierName}
            and pl.supplier_name like concat('%',#{c.supplierName},'%')
        </if>
        <if test="c.createdAtStart != null and c.createdAtStart != ''">
            and pr.created_at &gt;= date_format(#{c.createdAtStart},'%Y-%m-%d hh:mm:ss')
            and pr.created_at &gt;= str_to_date(#{c.createdAtStart}, '%Y-%m-%d')
        </if>
        <if test="c.createdAtEnd != null and c.createdAtEnd != ''">
            and pr.created_at &lt;= date_format(#{c.createdAtEnd},'%Y-%m-%d hh:mm:ss')
            and pr.created_at &lt; date_add(str_to_date(#{c.createdAtEnd}, '%Y-%m-%d'), interval 1 day)
        </if>
        <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''">
            and tr.purchase_contract_number like concat('%',#{c.purchaseContractNumber},'%')
@@ -60,7 +60,12 @@
                 left join sales_ledger sl on sl.id = pl.sales_ledger_id
                 left join ticket_registration tr on tr.id = pr.ticket_registration_id
                 left join product_model pm on pm.id = pr.product_model_id
        WHERE type = 2 and pr.id = #{id}
        WHERE type = 2
        <if test="c.purchaseLedgerId != null and c.purchaseLedgerId != ''">
            and pr.purchase_ledger_id = #{c.purchaseLedgerId}
        </if>
        <if test="c.productModelId != null and c.productModelId != ''">
            and pm.id = #{c.productModelId}
        </if>
    </select>
</mapper>
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -14,20 +14,32 @@
        pl.id,
        pl.purchase_contract_number ,
        pl.sales_contract_no,
        pl.supplier_id,
        pl.supplier_name,
        pl.project_name,
        pl.contract_amount,
        sum(pr.tickets_amount)as receipt_payment_amount,
        pl.contract_amount-sum(pr.tickets_amount) AS unReceipt_payment_amount,
        sum(tr.invoice_amount)as receipt_payment_amount,
        pl.contract_amount-sum(tr.invoice_amount) AS unReceipt_payment_amount,
        pl.entry_date,
        pl.recorder_id,
        pl.recorder_name,
        pl.template_name,
        pl.approver_id,
        sm.is_white,
        pl.approval_status,
        pl.payment_method
        from purchase_ledger pl
        left join sales_ledger_product slp on slp.sales_ledger_id = pl.id and slp.type=2
        left join product_record pr on pl.id = pr.purchase_ledger_id
        left join ticket_registration tr on tr.id = pr.ticket_registration_id
        left join supplier_manage sm on pl.supplier_id = sm.id
        <where>
            1 = 1
            <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''">
               and pl.purchase_contract_number like concat('%',#{c.purchaseContractNumber},'%')
            </if>
            <if test="c.approvalStatus != null and c.approvalStatus != ''">
                and pl.approval_status = #{c.approvalStatus}
            </if>
            <if test="c.supplierName != null and c.supplierName != ''">
                and pl.supplier_name like concat('%',#{c.supplierName},'%')
@@ -49,6 +61,7 @@
        pl.project_name,pl.entry_date,
        pl.recorder_name,
        pl.contract_amount
        order by pl.entry_date desc
    </select>
    <select id="getPaymentRegistrationDtoById" resultType="com.ruoyi.purchase.dto.PaymentRegistrationDto">
src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -8,16 +8,16 @@
        where
        inspect_type=#{qualityInspect.inspectType}
        <if test="qualityInspect.supplier != null and qualityInspect.supplier != '' ">
            AND supplier = #{qualityInspect.supplier}
            AND supplier like concat('%',#{qualityInspect.supplier},'%')
        </if>
        <if test="qualityInspect.customer != null and qualityInspect.customer != '' ">
            AND customer = #{qualityInspect.customer}
            AND customer like concat('%',#{qualityInspect.customer},'%')
        </if>
        <if test="qualityInspect.process != null and qualityInspect.process != '' ">
            AND process = #{qualityInspect.process}
            AND process like concat('%',#{qualityInspect.process},'%')
        </if>
        <if test="qualityInspect.productName != null and qualityInspect.productName != '' ">
            AND product_name = #{qualityInspect.productName}
            AND product_name like concat('%',#{qualityInspect.productName},'%')
        </if>
        <if test="qualityInspect.entryDateStart != null and qualityInspect.entryDateStart != '' ">
            AND check_time &gt;= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-%d')
@@ -25,6 +25,7 @@
        <if test="qualityInspect.entryDateEnd != null and qualityInspect.entryDateEnd != '' ">
            AND  check_time &lt;= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d')
        </if>
        ORDER BY check_time DESC
    </select>
    <select id="qualityInspectExport" resultType="com.ruoyi.quality.pojo.QualityInspect">
        SELECT
@@ -45,4 +46,13 @@
            AND product_name = #{qualityInspect.productName}
        </if>
    </select>
    <delete id="deleteByProductMainIds">
        DELETE FROM quality_inspect
        WHERE product_main_id IN
        <foreach collection="productMainIds" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>
</mapper>
src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml
@@ -110,10 +110,10 @@
                     )
            </if>
            <if test="invoiceRegistrationProductDto.invoiceDateStart != null and invoiceRegistrationProductDto.invoiceDateStart != ''">
                AND T3.invoice_date &gt;= date_format(#{invoiceRegistrationProductDto.invoiceDateStart}, '%Y-%m-%d')
                AND T3.invoice_date &gt;= str_to_date(#{invoiceRegistrationProductDto.invoiceDateStart}, '%Y-%m-%d')
            </if>
            <if test="invoiceRegistrationProductDto.invoiceDateEnd != null and invoiceRegistrationProductDto.invoiceDateEnd != ''">
                AND T3.invoice_date &lt;= date_format(#{invoiceRegistrationProductDto.invoiceDateEnd}, '%Y-%m-%d')
                AND T3.invoice_date &lt; date_add(str_to_date(#{invoiceRegistrationProductDto.invoiceDateEnd}, '%Y-%m-%d'), interval 1 day)
            </if>
            <if test="invoiceRegistrationProductDto.createTimeStart != null ">
                AND T1.create_time like CONCAT(#{invoiceRegistrationProductDto.createTimeStart}, '%')
src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
@@ -61,38 +61,42 @@
    <select id="bindInvoiceNoRegPage" resultType="com.ruoyi.sales.dto.ReceiptPaymentDto">
        SELECT
        T1.id ,
        T1.invoice_no ,
        T1.invoice_total ,
        T1.id,
        T1.invoice_no,
        T1.invoice_total,
        T3.project_name,
        T1.invoice_person ,
        T1.invoice_date ,
        T1.create_time ,
        T1.create_user ,
        T1.update_time ,
        T1.update_user ,
        T1.tenant_id ,
        T1.invoice_person,
        T1.invoice_date,
        T1.create_time,
        T1.create_user,
        T1.update_time,
        T1.update_user,
        T1.tenant_id,
        T2.tax_rate,
        T3.sales_contract_no,
        T3.customer_contract_no,
        T3.customer_name,
        T4.invoiceFileName,
        T5.product_category,
        IFNULL(T6.receipt_payment_amount_total ,0) AS receipt_payment_amount_total,
        (T1.invoice_total - IFNULL(T6.receipt_payment_amount_total ,0)) AS no_receipt_amount
        IFNULL(T6.receipt_payment_amount_total, 0) AS receipt_payment_amount_total,
        (T1.invoice_total - IFNULL(T6.receipt_payment_amount_total, 0)) AS noReceiptAmount
        FROM invoice_ledger T1
        LEFT JOIN invoice_registration_product T2 ON T2.id = T1.invoice_registration_product_id
        LEFT JOIN sales_ledger T3 ON T3.id = T2.sales_ledger_id
        LEFT JOIN (
        SELECT
        invoice_ledger_id,
        GROUP_CONCAT( name ORDER BY id ASC SEPARATOR ' | ') AS invoiceFileName
        FROM invoice_ledger_file GROUP BY invoice_ledger_id
        GROUP_CONCAT(name ORDER BY id ASC SEPARATOR ' | ') AS invoiceFileName
        FROM invoice_ledger_file
        GROUP BY invoice_ledger_id
        ) T4 ON T4.invoice_ledger_id = T1.id
        LEFT JOIN sales_ledger_product T5 ON T2.sales_ledger_product_id = T5.id
        LEFT JOIN (
        SELECT SUM(receipt_payment_amount) AS receipt_payment_amount_total,invoice_ledger_id FROM receipt_payment GROUP
        BY invoice_ledger_id
        SELECT
        SUM(receipt_payment_amount) AS receipt_payment_amount_total,
        invoice_ledger_id
        FROM receipt_payment
        GROUP BY invoice_ledger_id
        ) T6 ON T1.id = T6.invoice_ledger_id
        <where>
            <if test="req.customerName != null and req.customerName !=''">
@@ -111,10 +115,15 @@
                AND T1.invoice_date &gt;= DATE_FORMAT(#{req.invoiceDateStart},'%Y-%m-%d')
            </if>
            <if test="req.invoiceDateEnd != null and req.invoiceDateEnd != '' ">
                AND  T1.invoice_date &lt;= DATE_FORMAT(#{req.invoiceDateEnd},'%Y-%m-%d')
                AND T1.invoice_date &lt;= DATE_FORMAT(#{req.invoiceDateEnd},'%Y-%m-%d')
            </if>
            <if test="req.status != null and req.status">
                and (T1.invoice_total - IFNULL(T6.receipt_payment_amount_total, 0)) &gt; 0
            </if>
        </where>
        ORDER BY T2.create_time DESC
        ORDER BY IFNULL(T2.create_time, T1.create_time) DESC
    </select>
    <select id="invoiceInfo" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto">
src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -82,5 +82,6 @@
                AND  T1.entry_date &lt;= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d')
            </if>
        </where>
    order by T1.entry_date desc
    </select>
</mapper>
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
<?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.sales.mapper.SalesLedgerProductMapper">
    <select id="selectSalesLedgerProductList" resultType="com.ruoyi.sales.pojo.SalesLedgerProduct">
        SELECT
        T1.*,
        t3.shipping_car_number,
        t3.shipping_date
        FROM
        sales_ledger_product T1
        left join shipping_info t3 on T1.id = t3.sales_ledger_product_id
        <where>
            1=1
            <if test="salesLedgerProduct.salesLedgerId != null and salesLedgerProduct.salesLedgerId != '' ">
                AND  T1.sales_ledger_id = #{salesLedgerProduct.salesLedgerId}
            </if>
            <if test="salesLedgerProduct.type != null and salesLedgerProduct.type != '' ">
                AND  T1.type = #{salesLedgerProduct.type}
            </if>
        </where>
    </select>
    <select id="selectSalesLedgerProductByMainId" resultType="com.ruoyi.sales.pojo.SalesLedgerProduct">
        select slp.*
        from quality_inspect qi
                 left join production_product_main ppm on qi.product_main_id = ppm.id
                 left join product_work_order pwo on ppm.work_order_id = pwo.id
                 left join product_order  po on pwo.product_order_id = po.id
                 left join sales_ledger_product slp on po.product_model_id = slp.id
        where qi.product_main_id = #{productMainId}
    </select>
</mapper>
src/main/resources/mapper/sales/ShipmentApprovalMapper.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.sales.mapper.ShipmentApprovalMapper">
    <select id="listPage" resultType="com.ruoyi.sales.pojo.ShipmentApproval">
        SELECT *,
        si.shipping_car_number,
        T2.nick_name AS entry_person_name
        FROM shipment_approval sa
                 LEFT JOIN shipping_info si ON sa.shipping_info_id = si.id
                 LEFT JOIN sales_ledger sl ON sa.sales_ledger_id = sl.id
                 LEFT JOIN sales_ledger_product slp ON sa.sales_ledger_product_id = slp.id
                 LEFT JOIN sys_user T2 ON sl.entry_person = T2.user_id
        <where>
            1=1
            <if test="req.approveStatus != null and req.approveStatus != '' ">
                AND  sa.approve_status = #{req.approveStatus}
            </if>
            <if test="req.salesContractNo != null and req.salesContractNo != '' ">
                AND  sl.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%')
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/staff/StaffSchedulingMapper.xml
@@ -6,7 +6,7 @@
    <resultMap id="BaseResultMap" type="com.ruoyi.staff.pojo.StaffScheduling">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <result property="staffId" column="staff_id" jdbcType="INTEGER"/>
            <result property="staffId" column="staff_id" jdbcType="VARCHAR"/>
            <result property="department" column="department" jdbcType="INTEGER"/>
            <result property="shiftType" column="shift_type" jdbcType="INTEGER"/>
            <result property="workDate" column="work_date" jdbcType="DATE"/>
@@ -31,12 +31,11 @@
    </sql>
    <select id="listPage" resultType="com.ruoyi.staff.dto.StaffSchedulingDto">
        SELECT
        t1.*,t2.staff_name as 'staff_name' ,t2.staff_no as 'staff_no'
        t1.*
        FROM staff_scheduling t1
        left join staff_join_leave_record t2 on t1.staff_id = t2.id
        where 1=1
        <if test="vo.staffName != null and vo.staffName != '' ">
            AND t2.staff_name LIKE CONCAT('%', #{vo.staffName}, '%')
            AND t1.staff_name LIKE CONCAT('%', #{vo.staffName}, '%')
        </if>
        <if test="vo.shiftType != null and vo.shiftType != '' ">
            AND t1.shift_type = #{vo.shiftType}
src/main/resources/mapper/system/SysUserDeptMapper.xml
@@ -13,7 +13,7 @@
            sys_user_dept T1
        LEFT JOIN sys_dept T2 ON T1.dept_id = T2.dept_id
        <where>
            T1.dept_id IN (select dept_id from sys_dept where parent_id = 100)
            T1.dept_id IN (select dept_id from sys_dept where parent_id != 0)
            <if test="userDeptVo.userId != null">
                AND T1.user_id = #{userDeptVo.userId}
            </if>
src/main/resources/mapper/system/SysUserMapper.xml
@@ -180,6 +180,12 @@
            #{id}
        </foreach>
    </select>
    <select id="selectUserByNickName" resultType="com.ruoyi.project.system.domain.SysUser"
            parameterType="java.lang.String">
        <include refid="selectUserVo"/>
        where u.nick_name = #{nickName} and u.del_flag = '0'
        limit 1
    </select>
    <insert id="insertUser" parameterType="com.ruoyi.project.system.domain.SysUser" useGeneratedKeys="true" keyProperty="userId">
         insert into sys_user(
src/main/resources/static/ÀͶ¯ºÏͬÊé.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core"  xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve" xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData"><o:DocumentProperties><o:Title>示范文本</o:Title><o:Author>番茄花园</o:Author><o:LastAuthor>清辞</o:LastAuthor><o:Revision>2</o:Revision><o:LastPrinted>2024-12-23T10:36:34Z</o:LastPrinted><o:Created>2023-03-23T04:01:00Z</o:Created><o:LastSaved>2025-11-07T06:33:56Z</o:LastSaved><o:TotalTime>15840</o:TotalTime><o:Pages>10</o:Pages><o:Words>2904</o:Words><o:Characters>3444</o:Characters><o:Company>番茄花园</o:Company><o:Lines>30</o:Lines><o:Paragraphs>8</o:Paragraphs><o:CharactersWithSpaces>4368</o:CharactersWithSpaces><o:Version>14</o:Version></o:DocumentProperties><o:CustomDocumentProperties><o:KSOProductBuildVer dt:dt="string">2052-12.1.0.23125</o:KSOProductBuildVer><o:ICV dt:dt="string">2D97A42FF446489287C6900713CFD441_13</o:ICV><o:KSOTemplateDocerSaveRecord dt:dt="string">eyJoZGlkIjoiZTU3YWIwYTMwZDJkM2QzZDNhMDgzMDIyZjE1NjgxZmYiLCJ1c2VySWQiOiIxMTMzMDExODUxIn0=</o:KSOTemplateDocerSaveRecord></o:CustomDocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="宋体" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Times New Roman"><w:panose-1 w:val="02020603050405020304"/><w:charset w:val="00"/><w:family w:val="Auto"/><w:pitch w:val="Default"/><w:sig w:usb-0="E0002EFF" w:usb-1="C000785B" w:usb-2="00000009" w:usb-3="00000000" w:csb-0="400001FF" w:csb-1="FFFF0000"/></w:font><w:font w:name="宋体"><w:panose-1 w:val="02010600030101010101"/><w:charset w:val="86"/><w:family w:val="Auto"/><w:pitch w:val="Default"/><w:sig w:usb-0="00000203" w:usb-1="288F0000" w:usb-2="00000006" w:usb-3="00000000" w:csb-0="00040001" w:csb-1="00000000"/></w:font><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="Default"/><w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Arial"><w:panose-1 w:val="020B0604020202020204"/><w:charset w:val="01"/><w:family w:val="SWiss"/><w:pitch w:val="Default"/><w:sig w:usb-0="E0002EFF" w:usb-1="C000785B" w:usb-2="00000009" w:usb-3="00000000" w:csb-0="400001FF" w:csb-1="FFFF0000"/></w:font><w:font w:name="黑体"><w:panose-1 w:val="02010609060101010101"/><w:charset w:val="86"/><w:family w:val="Auto"/><w:pitch w:val="Default"/><w:sig w:usb-0="800002BF" w:usb-1="38CF7CFA" w:usb-2="00000016" w:usb-3="00000000" w:csb-0="00040001" w:csb-1="00000000"/></w:font><w:font w:name="Courier New"><w:panose-1 w:val="02070309020205020404"/><w:charset w:val="01"/><w:family w:val="Modern"/><w:pitch w:val="Default"/><w:sig w:usb-0="E0002EFF" w:usb-1="C0007843" w:usb-2="00000009" w:usb-3="00000000" w:csb-0="400001FF" w:csb-1="FFFF0000"/></w:font><w:font w:name="Symbol"><w:panose-1 w:val="05050102010706020507"/><w:charset w:val="02"/><w:family w:val="Roman"/><w:pitch w:val="Default"/><w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Calibri"><w:panose-1 w:val="020F0502020204030204"/><w:charset w:val="00"/><w:family w:val="SWiss"/><w:pitch w:val="Default"/><w:sig w:usb-0="E4002EFF" w:usb-1="C000247B" w:usb-2="00000009" w:usb-3="00000000" w:csb-0="200001FF" w:csb-1="00000000"/></w:font><w:font w:name="仿宋"><w:panose-1 w:val="02010609060101010101"/><w:charset w:val="86"/><w:family w:val="Modern"/><w:pitch w:val="Default"/><w:sig w:usb-0="800002BF" w:usb-1="38CF7CFA" w:usb-2="00000016" w:usb-3="00000000" w:csb-0="00040001" w:csb-1="00000000"/></w:font><w:font w:name="微软雅黑"><w:panose-1 w:val="020B0503020204020204"/><w:charset w:val="86"/><w:family w:val="Auto"/><w:pitch w:val="Default"/><w:sig w:usb-0="80000287" w:usb-1="2ACF3C50" w:usb-2="00000016" w:usb-3="00000000" w:csb-0="0004001F" w:csb-1="00000000"/></w:font><w:font w:name="Tahoma"><w:panose-1 w:val="020B0604030504040204"/><w:charset w:val="00"/><w:family w:val="Auto"/><w:pitch w:val="Default"/><w:sig w:usb-0="E1002EFF" w:usb-1="C000605B" w:usb-2="00000029" w:usb-3="00000000" w:csb-0="200101FF" w:csb-1="20280000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:plt w:val="SingleLevel"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1、"/><w:lvlJc w:val="left"/></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:plt w:val="SingleLevel"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1、"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="700" w:first-line="0"/></w:pPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="0"/></w:list><w:list w:ilfo="2"><w:ilst w:val="1"/></w:list></w:lists><w:styles><w:latentStyles w:defLockedState="off" w:latentStyleCount="260"><w:lsdException w:name="Normal"/><w:lsdException w:name="heading 1"/><w:lsdException w:name="heading 2"/><w:lsdException w:name="heading 3"/><w:lsdException w:name="heading 4"/><w:lsdException w:name="heading 5"/><w:lsdException w:name="heading 6"/><w:lsdException w:name="heading 7"/><w:lsdException w:name="heading 8"/><w:lsdException w:name="heading 9"/><w:lsdException w:name="index 1"/><w:lsdException w:name="index 2"/><w:lsdException w:name="index 3"/><w:lsdException w:name="index 4"/><w:lsdException w:name="index 5"/><w:lsdException w:name="index 6"/><w:lsdException w:name="index 7"/><w:lsdException w:name="index 8"/><w:lsdException w:name="index 9"/><w:lsdException w:name="toc 1"/><w:lsdException w:name="toc 2"/><w:lsdException w:name="toc 3"/><w:lsdException w:name="toc 4"/><w:lsdException w:name="toc 5"/><w:lsdException w:name="toc 6"/><w:lsdException w:name="toc 7"/><w:lsdException w:name="toc 8"/><w:lsdException w:name="toc 9"/><w:lsdException w:name="Normal Indent"/><w:lsdException w:name="footnote text"/><w:lsdException w:name="annotation text"/><w:lsdException w:name="header"/><w:lsdException w:name="footer"/><w:lsdException w:name="index heading"/><w:lsdException w:name="caption"/><w:lsdException w:name="table of figures"/><w:lsdException w:name="envelope address"/><w:lsdException w:name="envelope return"/><w:lsdException w:name="footnote reference"/><w:lsdException w:name="annotation reference"/><w:lsdException w:name="line number"/><w:lsdException w:name="page number"/><w:lsdException w:name="endnote reference"/><w:lsdException w:name="endnote text"/><w:lsdException w:name="table of authorities"/><w:lsdException w:name="macro"/><w:lsdException w:name="toa heading"/><w:lsdException w:name="List"/><w:lsdException w:name="List Bullet"/><w:lsdException w:name="List Number"/><w:lsdException w:name="List 2"/><w:lsdException w:name="List 3"/><w:lsdException w:name="List 4"/><w:lsdException w:name="List 5"/><w:lsdException w:name="List Bullet 2"/><w:lsdException w:name="List Bullet 3"/><w:lsdException w:name="List Bullet 4"/><w:lsdException w:name="List Bullet 5"/><w:lsdException w:name="List Number 2"/><w:lsdException w:name="List Number 3"/><w:lsdException w:name="List Number 4"/><w:lsdException w:name="List Number 5"/><w:lsdException w:name="Title"/><w:lsdException w:name="Closing"/><w:lsdException w:name="Signature"/><w:lsdException w:name="Default Paragraph Font"/><w:lsdException w:name="Body Text"/><w:lsdException w:name="Body Text Indent"/><w:lsdException w:name="List Continue"/><w:lsdException w:name="List Continue 2"/><w:lsdException w:name="List Continue 3"/><w:lsdException w:name="List Continue 4"/><w:lsdException w:name="List Continue 5"/><w:lsdException w:name="Message Header"/><w:lsdException w:name="Subtitle"/><w:lsdException w:name="Salutation"/><w:lsdException w:name="Date"/><w:lsdException w:name="Body Text First Indent"/><w:lsdException w:name="Body Text First Indent 2"/><w:lsdException w:name="Note Heading"/><w:lsdException w:name="Body Text 2"/><w:lsdException w:name="Body Text 3"/><w:lsdException w:name="Body Text Indent 2"/><w:lsdException w:name="Body Text Indent 3"/><w:lsdException w:name="Block Text"/><w:lsdException w:name="Hyperlink"/><w:lsdException w:name="FollowedHyperlink"/><w:lsdException w:name="Strong"/><w:lsdException w:name="Emphasis"/><w:lsdException w:name="Document Map"/><w:lsdException w:name="Plain Text"/><w:lsdException w:name="E-mail Signature"/><w:lsdException w:name="Normal (Web)"/><w:lsdException w:name="HTML Acronym"/><w:lsdException w:name="HTML Address"/><w:lsdException w:name="HTML Cite"/><w:lsdException w:name="HTML Code"/><w:lsdException w:name="HTML Definition"/><w:lsdException w:name="HTML Keyboard"/><w:lsdException w:name="HTML Preformatted"/><w:lsdException w:name="HTML Sample"/><w:lsdException w:name="HTML Typewriter"/><w:lsdException w:name="HTML Variable"/><w:lsdException w:name="Normal Table"/><w:lsdException w:name="annotation subject"/><w:lsdException w:name="Table Simple 1"/><w:lsdException w:name="Table Simple 2"/><w:lsdException w:name="Table Simple 3"/><w:lsdException w:name="Table Classic 1"/><w:lsdException w:name="Table Classic 2"/><w:lsdException w:name="Table Classic 3"/><w:lsdException w:name="Table Classic 4"/><w:lsdException w:name="Table Colorful 1"/><w:lsdException w:name="Table Colorful 2"/><w:lsdException w:name="Table Colorful 3"/><w:lsdException w:name="Table Columns 1"/><w:lsdException w:name="Table Columns 2"/><w:lsdException w:name="Table Columns 3"/><w:lsdException w:name="Table Columns 4"/><w:lsdException w:name="Table Columns 5"/><w:lsdException w:name="Table Grid 1"/><w:lsdException w:name="Table Grid 2"/><w:lsdException w:name="Table Grid 3"/><w:lsdException w:name="Table Grid 4"/><w:lsdException w:name="Table Grid 5"/><w:lsdException w:name="Table Grid 6"/><w:lsdException w:name="Table Grid 7"/><w:lsdException w:name="Table Grid 8"/><w:lsdException w:name="Table List 1"/><w:lsdException w:name="Table List 2"/><w:lsdException w:name="Table List 3"/><w:lsdException w:name="Table List 4"/><w:lsdException w:name="Table List 5"/><w:lsdException w:name="Table List 6"/><w:lsdException w:name="Table List 7"/><w:lsdException w:name="Table List 8"/><w:lsdException w:name="Table 3D effects 1"/><w:lsdException w:name="Table 3D effects 2"/><w:lsdException w:name="Table 3D effects 3"/><w:lsdException w:name="Table Contemporary"/><w:lsdException w:name="Table Elegant"/><w:lsdException w:name="Table Professional"/><w:lsdException w:name="Table Subtle 1"/><w:lsdException w:name="Table Subtle 2"/><w:lsdException w:name="Table Web 1"/><w:lsdException w:name="Table Web 2"/><w:lsdException w:name="Table Web 3"/><w:lsdException w:name="Balloon Text"/><w:lsdException w:name="Table Grid"/><w:lsdException w:name="Table Theme"/><w:lsdException w:name="Light Shading"/><w:lsdException w:name="Light List"/><w:lsdException w:name="Light Grid"/><w:lsdException w:name="Medium Shading 1"/><w:lsdException w:name="Medium Shading 2"/><w:lsdException w:name="Medium List 1"/><w:lsdException w:name="Medium List 2"/><w:lsdException w:name="Medium Grid 1"/><w:lsdException w:name="Medium Grid 2"/><w:lsdException w:name="Medium Grid 3"/><w:lsdException w:name="Dark List"/><w:lsdException w:name="Colorful Shading"/><w:lsdException w:name="Colorful List"/><w:lsdException w:name="Colorful Grid"/><w:lsdException w:name="Light Shading Accent 1"/><w:lsdException w:name="Light List Accent 1"/><w:lsdException w:name="Light Grid Accent 1"/><w:lsdException w:name="Medium Shading 1 Accent 1"/><w:lsdException w:name="Medium Shading 2 Accent 1"/><w:lsdException w:name="Medium List 1 Accent 1"/><w:lsdException w:name="Medium List 2 Accent 1"/><w:lsdException w:name="Medium Grid 1 Accent 1"/><w:lsdException w:name="Medium Grid 2 Accent 1"/><w:lsdException w:name="Medium Grid 3 Accent 1"/><w:lsdException w:name="Dark List Accent 1"/><w:lsdException w:name="Colorful Shading Accent 1"/><w:lsdException w:name="Colorful List Accent 1"/><w:lsdException w:name="Colorful Grid Accent 1"/><w:lsdException w:name="Light Shading Accent 2"/><w:lsdException w:name="Light List Accent 2"/><w:lsdException w:name="Light Grid Accent 2"/><w:lsdException w:name="Medium Shading 1 Accent 2"/><w:lsdException w:name="Medium Shading 2 Accent 2"/><w:lsdException w:name="Medium List 1 Accent 2"/><w:lsdException w:name="Medium List 2 Accent 2"/><w:lsdException w:name="Medium Grid 1 Accent 2"/><w:lsdException w:name="Medium Grid 2 Accent 2"/><w:lsdException w:name="Medium Grid 3 Accent 2"/><w:lsdException w:name="Dark List Accent 2"/><w:lsdException w:name="Colorful Shading Accent 2"/><w:lsdException w:name="Colorful List Accent 2"/><w:lsdException w:name="Colorful Grid Accent 2"/><w:lsdException w:name="Light Shading Accent 3"/><w:lsdException w:name="Light List Accent 3"/><w:lsdException w:name="Light Grid Accent 3"/><w:lsdException w:name="Medium Shading 1 Accent 3"/><w:lsdException w:name="Medium Shading 2 Accent 3"/><w:lsdException w:name="Medium List 1 Accent 3"/><w:lsdException w:name="Medium List 2 Accent 3"/><w:lsdException w:name="Medium Grid 1 Accent 3"/><w:lsdException w:name="Medium Grid 2 Accent 3"/><w:lsdException w:name="Medium Grid 3 Accent 3"/><w:lsdException w:name="Dark List Accent 3"/><w:lsdException w:name="Colorful Shading Accent 3"/><w:lsdException w:name="Colorful List Accent 3"/><w:lsdException w:name="Colorful Grid Accent 3"/><w:lsdException w:name="Light Shading Accent 4"/><w:lsdException w:name="Light List Accent 4"/><w:lsdException w:name="Light Grid Accent 4"/><w:lsdException w:name="Medium Shading 1 Accent 4"/><w:lsdException w:name="Medium Shading 2 Accent 4"/><w:lsdException w:name="Medium List 1 Accent 4"/><w:lsdException w:name="Medium List 2 Accent 4"/><w:lsdException w:name="Medium Grid 1 Accent 4"/><w:lsdException w:name="Medium Grid 2 Accent 4"/><w:lsdException w:name="Medium Grid 3 Accent 4"/><w:lsdException w:name="Dark List Accent 4"/><w:lsdException w:name="Colorful Shading Accent 4"/><w:lsdException w:name="Colorful List Accent 4"/><w:lsdException w:name="Colorful Grid Accent 4"/><w:lsdException w:name="Light Shading Accent 5"/><w:lsdException w:name="Light List Accent 5"/><w:lsdException w:name="Light Grid Accent 5"/><w:lsdException w:name="Medium Shading 1 Accent 5"/><w:lsdException w:name="Medium Shading 2 Accent 5"/><w:lsdException w:name="Medium List 1 Accent 5"/><w:lsdException w:name="Medium List 2 Accent 5"/><w:lsdException w:name="Medium Grid 1 Accent 5"/><w:lsdException w:name="Medium Grid 2 Accent 5"/><w:lsdException w:name="Medium Grid 3 Accent 5"/><w:lsdException w:name="Dark List Accent 5"/><w:lsdException w:name="Colorful Shading Accent 5"/><w:lsdException w:name="Colorful List Accent 5"/><w:lsdException w:name="Colorful Grid Accent 5"/><w:lsdException w:name="Light Shading Accent 6"/><w:lsdException w:name="Light List Accent 6"/><w:lsdException w:name="Light Grid Accent 6"/><w:lsdException w:name="Medium Shading 1 Accent 6"/><w:lsdException w:name="Medium Shading 2 Accent 6"/><w:lsdException w:name="Medium List 1 Accent 6"/><w:lsdException w:name="Medium List 2 Accent 6"/><w:lsdException w:name="Medium Grid 1 Accent 6"/><w:lsdException w:name="Medium Grid 2 Accent 6"/><w:lsdException w:name="Medium Grid 3 Accent 6"/><w:lsdException w:name="Dark List Accent 6"/><w:lsdException w:name="Colorful Shading Accent 6"/><w:lsdException w:name="Colorful List Accent 6"/><w:lsdException w:name="Colorful Grid Accent 6"/></w:latentStyles><w:style w:type="paragraph" w:styleId="a1" w:default="on"><w:name w:val="Normal"/><w:pPr><w:widowControl w:val="off"/><w:jc w:val="both"/></w:pPr><w:rPr><w:kern w:val="2"/><w:sz w:val="21"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="2"><w:name w:val="heading 1"/><w:basedOn w:val="a1"/><w:next w:val="a1"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="340" w:before-lines="0" w:after="330" w:line="578" w:line-rule="auto"/><w:jc w:val="center"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:b/><w:b-cs/><w:spacing w:val="16"/><w:kern w:val="44"/><w:sz w:val="28"/><w:sz-cs w:val="44"/></w:rPr></w:style><w:style w:type="character" w:styleId="a6" w:default="on"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:styleId="a5" w:default="on"><w:name w:val="Normal Table"/><w:tblPr><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="paragraph" w:styleId="a3"><w:name w:val="footer"/><w:basedOn w:val="a1"/><w:pPr><w:tabs><w:tab w:val="center" w:pos="4153"/><w:tab w:val="right" w:pos="8306"/></w:tabs><w:snapToGrid w:val="off"/><w:jc w:val="left"/></w:pPr><w:rPr><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="a4"><w:name w:val="header"/><w:basedOn w:val="a1"/><w:link w:val="a8"/><w:pPr><w:pBdr><w:bottom w:val="single" w:sz="6" wx:bdrwidth="15" w:space="1" w:color="auto"/></w:pBdr><w:tabs><w:tab w:val="center" w:pos="4153"/><w:tab w:val="right" w:pos="8306"/></w:tabs><w:snapToGrid w:val="off"/><w:jc w:val="center"/></w:pPr><w:rPr><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="character" w:styleId="a7"><w:name w:val="page number"/><w:basedOn w:val="a6"/><w:rPr/></w:style><w:style w:type="character" w:styleId="a8"><w:name w:val="页眉 Char"/><w:link w:val="a4"/><w:rPr><w:kern w:val="2"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="a9"><w:name w:val="普通 (Web)"/><w:basedOn w:val="a1"/><w:pPr><w:widowControl/><w:spacing w:before="100" w:before-lines="0" w:before-autospacing="on" w:after="100" w:after-autospacing="on"/><w:jc w:val="left"/></w:pPr><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="default"/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="24"/></w:rPr></w:style></w:styles><w:shapeDefaults><o:shapedefaults fill="t" stroke="t"><v:fill type="gradient" on="t" angle="90" focussize="0f,0f" focusposition="0f,0f"><o:fill type="gradientUnscaled" v:ext="backwardCompatible"/></v:fill><v:stroke weight="1.25pt" color="#739CC3"/></o:shapedefaults></w:shapeDefaults><w:bgPict><w:background/><v:background id="_x0000_s1025"><v:fill on="f" focussize="0,0"/></v:background></w:bgPict><w:docPr><w:view w:val="print"/><w:zoom w:percent="130"/><w:characterSpacingControl w:val="CompressPunctuation"/><w:documentProtection w:edit="comments" w:enforcement="off"/><w:doNotEmbedSystemFonts/><w:defaultTabStop w:val="420"/><w:drawingGridVerticalSpacing w:val="156"/><w:displayHorizontalDrawingGridEvery w:val="1"/><w:displayVerticalDrawingGridEvery w:val="1"/><w:compat><w:adjustLineHeightInTable/><w:ulTrailSpace/><w:doNotExpandShiftReturn/><w:balanceSingleByteDoubleByteWidth/><w:spaceForUL/><w:breakWrappedTables/><w:useFELayout/></w:compat></w:docPr><w:body><wx:sect><w:p><w:pPr><w:pStyle w:val="a9"/><w:tabs><w:tab w:val="center" w:pos="4153"/><w:tab w:val="right" w:pos="8306"/></w:tabs><w:spacing w:line="360" w:line-rule="auto"/><w:rPr><w:rFonts w:hint="fareast"/><w:spacing w:val="16"/></w:rPr></w:pPr><w:r><w:rPr><w:spacing w:val="16"/></w:rPr><w:tab/></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:tabs><w:tab w:val="center" w:pos="4153"/><w:tab w:val="right" w:pos="8306"/></w:tabs><w:spacing w:line="360" w:line-rule="auto"/><w:rPr><w:b/><w:spacing w:val="16"/></w:rPr></w:pPr><w:r><w:rPr><w:spacing w:val="16"/></w:rPr><w:tab/></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:spacing w:val="16"/></w:rPr><w:t>                             </w:t></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:spacing w:val="16"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>                 </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="360" w:line-rule="auto"/><w:jc w:val="center"/><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="48"/><w:sz-cs w:val="48"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="360" w:line-rule="auto"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="84"/><w:sz-cs w:val="84"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="84"/><w:sz-cs w:val="84"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="84"/><w:sz-cs w:val="84"/></w:rPr><w:t>劳 åЍ åˆ åŒ ä¹¦</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="360" w:line-rule="auto"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="84"/><w:sz-cs w:val="84"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="360" w:line-rule="auto"/><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="360" w:line-rule="auto"/><w:ind w:first-line="3000"/><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="360" w:line-rule="auto"/><w:ind w:first-line="3000"/><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr><w:t>  </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="360" w:line-rule="auto"/><w:ind w:first-line="1060" w:first-line-chars="300"/><w:rPr><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/><w:u w:val="single"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr><w:t>甲     æ–¹ï¼š</w:t></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>北屯市海川开心食品有限责任公司</w:t></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/><w:u w:val="single"/></w:rPr><w:t>                    </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="360" w:line-rule="auto"/><w:ind w:first-line="1060" w:first-line-chars="300"/><w:rPr><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/><w:u w:val="single"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr><w:t>乙     æ–¹ï¼š</w:t></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.staffName}</w:t></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/><w:u w:val="single"/></w:rPr><w:t>                          </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="360" w:line-rule="auto"/><w:jc w:val="center"/><w:rPr><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>    </w:t></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr><w:t>签订日期:</w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.qyear}</w:t></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr><w:t>å¹´</w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.qmoth}</w:t></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr><w:t>月</w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.qday}</w:t></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr><w:t>日</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="360" w:line-rule="auto"/><w:jc w:val="center"/><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:widowControl/><w:adjustRightInd w:val="off"/><w:snapToGrid w:val="off"/><w:spacing w:line="400" w:line-rule="exact"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="454545"/><w:kern w:val="0"/><w:sz w:val="32"/><w:sz-cs w:val="30"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="440" w:line-rule="exact"/><w:rPr><w:rFonts w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="454545"/><w:sz w:val="32"/><w:sz-cs w:val="30"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="560" w:line-rule="exact"/><w:ind w:first-line="624" w:first-line-chars="200"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>根据《中华人民共和国劳动法》、《中华人民共和国劳动合同法》及有关法律、法规规定,甲乙双方遵循合法、公平、</w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>平等自愿、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>协商一致、诚实信用原则签订本合同,并共同遵守。</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="2"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:adjustRightInd/><w:snapToGrid/><w:spacing w:line="480" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>一、甲方基本情况</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:adjustRightInd/><w:snapToGrid/><w:spacing w:line="480" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>    ç¬¬ä¸€æ¡ </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>甲方:</w:t></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:b/><w:b-cs w:val="off"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>北屯市海川开心食品有限责任公司</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>            </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:adjustRightInd/><w:snapToGrid/><w:spacing w:line="480" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>法定代表人(主要负责人)或委托代理人:</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>李鑫</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>                          </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:adjustRightInd/><w:snapToGrid/><w:spacing w:line="480" w:line-rule="exact"/><w:ind w:right="-475" w:first-line="2348" w:first-line-chars="750"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>二、乙方基本情况</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:adjustRightInd/><w:snapToGrid/><w:spacing w:line="480" w:line-rule="exact"/><w:ind w:right="-475"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>    ç¬¬äºŒæ¡ </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方:</w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.staffName}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>性别:</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.sex}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>   </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>年龄:</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.age}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>   </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:adjustRightInd/><w:snapToGrid/><w:spacing w:line="480" w:line-rule="exact"/><w:ind w:right="-475"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>身份</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>证</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>号码:</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.identityCard}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>                                     </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:adjustRightInd/><w:snapToGrid/><w:spacing w:line="480" w:line-rule="exact"/><w:ind w:right="5"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>户籍</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>住址:</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.nativePlace}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>          </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>               </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>              </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:adjustRightInd/><w:snapToGrid/><w:spacing w:line="480" w:line-rule="exact"/><w:ind w:right="5"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="default"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="none"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>现住址</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>: </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.adress}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>                                        </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:adjustRightInd/><w:snapToGrid/><w:spacing w:line="480" w:line-rule="exact"/><w:ind w:right="5"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="none"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>联系电话</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>: </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.phone}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>                                      </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="2"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="2974" w:first-line-chars="950"/><w:jc w:val="both"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>三、劳动合同期限</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="62" w:after="62" w:line="520" w:line-rule="exact"/><w:ind w:first-line="614" w:first-line-chars="196"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第三条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ç”²ä¹™åŒæ–¹çº¦å®šæŒ‰ä»¥ä¸‹</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.dateSelect}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>种方式确定“劳动合同期限”:</w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="62" w:after="62" w:line="520" w:line-rule="exact"/><w:ind w:first-line="611" w:first-line-chars="196"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>A、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>有固定期限:自</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.syear}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>   </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>å¹´</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.smoth}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>月</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.sday}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>日起至</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.eyear}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>å¹´</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.emoth}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>月</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.eday}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>日止。试用期自</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.styear}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>   </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>å¹´</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.stmoth}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>月</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.stday}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>日起至</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.seyear}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>   </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>å¹´</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.semoth}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>   </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>月</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.seday}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>   </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>日止。</w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>                </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="62" w:after="62" w:line="520" w:line-rule="exact"/><w:ind w:first-line="611" w:first-line-chars="196"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>B、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>无固定期限:自</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.bsyear}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>å¹´</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.bsmoth}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>月</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.bsday}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>日起</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>至双方解除劳动合同之日</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>。试用期自</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.bstyear}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>å¹´</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.bstmoth}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>月</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.bstday}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>日起至</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.bseyear}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>å¹´</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.bsemoth}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>月</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.bseday}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>日止。   </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="62" w:after="62" w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>    C、以完成一定工作任务为期限:自</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.csyear}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>å¹´</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.csmoth}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>月</w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>  ${item.csday} </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>日起生效,至完成工作任务之日止。</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="2"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>四、劳动关系建立时间、工作内容和工作地点</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="2"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="939" w:first-line-chars="300"/><w:jc w:val="both"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第四条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b w:val="off"/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ä¹™æ–¹ä»¥å®žé™…到岗之日为合同起始时间建立劳动关系。</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="2"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="624" w:first-line-chars="200"/><w:jc w:val="both"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b w:val="off"/><w:b-cs w:val="off"/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ç¬¬äº”条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs w:val="off"/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ä¹™æ–¹å·¥ä½œåœ°ç‚¹ä¸º</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs w:val="off"/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:t>:</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs w:val="off"/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>北屯市</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>188团团部海川开心食品有限责任公司</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs w:val="off"/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>  Â  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>第六条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t> ä¹™æ–¹</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>岗位:</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>     ${item.postJob}                  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:ind w:first-line="630"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第七条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>在合同有效期内,</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方同意甲方根据公司业务需要或者公司针对乙方的业绩考核、定期轮岗、竞聘上岗等原因</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>,调整乙方的工作岗位、工作内容和工作地点。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="center"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>五、工作时间和休息休假</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:ind w:first-line="645"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第八条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ç”²æ–¹ä¾æ³•制定员工</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>工作时长</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>、休息和</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>请</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>休假制度;乙方须遵守甲方依法制定的工时、休息和</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>请</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>休假制度,并按照规定上下班。休假期间工资福利待遇按照</w:t></w:r><aml:annotation aml:id="0" w:type="Word.Bookmark.Start" w:name="_Hlk130463128"/><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>公司《员工手册》相关规定执行</w:t></w:r><aml:annotation aml:id="0" w:type="Word.Bookmark.End"/><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>。        </w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:ind w:first-line="645"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>第九条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t> ä¹™æ–¹ä¾æ³•享有的婚丧假、女职工产</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>护</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>假等,按照甲方依法制定的相关规章制度执行。婚丧假工资、产</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>护</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>假工资以</w:t></w:r><aml:annotation aml:id="1" w:type="Word.Bookmark.Start" w:name="_Hlk130463158"/><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>公司《员工手册》相关规定执行。</w:t></w:r><aml:annotation aml:id="1" w:type="Word.Bookmark.End"/></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第十条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>甲方因工作需要安排乙方延长工作时间或节假日加班,乙方应服从甲方的统一安排。加班工资按照公司《员工手册》相关规定执行。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ç¬¬åä¸€æ¡</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>需在</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>实际加班的当天将经过部门经理批准的加班申请交到人事部,否则不计加班。(紧急情况除外)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="2"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>六、劳动报酬</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>    </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第十二条 </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>甲方结合本单位的生产经营特点</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>及</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>经济效益,依法确定本单位的工资分配制度。乙方的工资,按照本单位的工资分配制度,结合乙方的劳动技能、劳动强度、劳动</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>时长</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>、劳动贡献等确定。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:snapToGrid w:val="off"/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="562" w:first-line-chars="200"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第十三条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  ä¹™æ–¹åœ¨æ³•定工作时间或依法签订劳动合同约定的工作时间内提供了正常劳动,甲方向乙方支付的工资不得低于当地最低工资标准。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:snapToGrid w:val="off"/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>    ï¼ˆ</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>一)</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:u w:val="single"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:t>自签订合同日起</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>每个</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:u w:val="single"/></w:rPr><w:t>次月的10-15号  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>为发薪日</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:snapToGrid w:val="off"/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="420"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ï¼ˆäºŒï¼‰</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>乙方在试用期内的工资</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>为:</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:u w:val="single"/></w:rPr><w:t>   </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> ${item.proSalary}   </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:u w:val="single"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:snapToGrid w:val="off"/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:left="1248" w:hanging="1248" w:hanging-chars="400"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>   ï¼ˆä¸‰ï¼‰ç»ç”²ä¹™åŒæ–¹åå•†ä¸€è‡´ï¼Œå¯¹ä¹™æ–¹çš„工资报酬选择以</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.salarySelect}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条款确定:</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:snapToGrid w:val="off"/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>   A、乙方的工资报酬按照甲方依法制定的规章制度中的内部工资分配办法确定,根据乙方的工作岗位确定其每月工资</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:snapToGrid w:val="off"/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>  B、甲方对乙方实行基本工资和绩效工资相结合的内部工资分配办法,乙方的收入包括基本工资、误餐、交通、生活住宿等各项补助,</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:t>如有变动</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>根据内部工资分配办法调整其工资;</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>绩效工资根据乙方的工作业绩、劳动成果和实际贡献按照内部分配办法考核确定。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:snapToGrid w:val="off"/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="640" w:first-line-chars="200"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="default"/><w:sz w:val="32"/><w:sz-cs w:val="32"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>C、甲方实行计件工资制,以甲方接到订单及公司生产计划,按照定额和计件单价,根据乙方完成的业绩,按时足额支付乙方的工资报酬。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>   </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ç¬¬åå››æ¡ </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方除基本工资以外,业绩考核奖金、全勤奖金、年度奖金根据甲方的经营效益、乙方的工作表现,最后由甲方考核确定等级后予以发放。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:ind w:first-line="840" w:first-line-chars="300"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方如果对甲方发放的工资及奖金表示异议,则应在工资结清之日</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>后</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>10日内向甲方提出</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>书面</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:t>异议</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>,超过时间则视为无异议。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:ind w:first-line="703" w:first-line-chars="250"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>五</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>乙方患病或因非因工负伤期间的的工资待遇按照国家法律法规及当地有关规定执行。</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="2"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>七、社会保险及其他保险福利待遇</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="626" w:first-line-chars="200"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>六</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>甲乙双方依法参加社会保险,按时缴纳职工养老保险,乙方为团场职工,团场已经为其缴纳各类养老保险的除外。其中依法应当由乙方缴纳的部分,由甲方从乙方工资报酬中代扣代缴。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>      </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>七</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条 </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方患病或非因工负伤,其病假工资和医疗待遇等按照甲方依法制定的相关制度执行。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>     </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>八</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条 </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>乙方患职业病或因工负伤的待遇,按国家及</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>自治区</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="333333"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>有关规定执行。</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="626" w:first-line-chars="200"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>十九</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>甲方为乙方提供如下福利待遇:</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>   </w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${item.remark}</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>                                               </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>                                             </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:jc w:val="center"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>八</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>劳动保护、劳动条件和职业危害防护</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="614" w:first-line-chars="196"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>第二十条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>甲方按照国家和自治区有关劳动保护规定提供符合国家劳动卫生标准的劳动作业场所,切实保护乙方在生产工作中的安全和健康。如乙方工作过程中可能产生职业病危害,甲方应如实告知乙方,并按《职业病防治法》的规定保护乙方的健康及其相关权益。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="626" w:first-line-chars="200"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>第二十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>一</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:highlight w:val="none"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ç”²æ–¹åº”按国家有关部门规定,根据乙方从事的工作岗位,发给乙方必要的劳保用品。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="626" w:first-line-chars="200"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第二十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>二</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ç”²æ–¹æŒ‰ç…§å›½å®¶å’Œè‡ªæ²»åŒºçš„æœ‰å…³è§„定,做好职工的劳动保护和保健工作。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="560" w:first-line-chars="200"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:jc w:val="center"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:color w:val="000000"/><w:spacing w:val="16"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>九、竞业保密限制和培训服务约定(无此情形的,双方不受此条款约束)</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="540"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第二十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>三</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ç”²ä¹™åŒæ–¹åå•†ä¸€è‡´ï¼Œçº¦å®šä»¥ä¸‹</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>   A   </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条款:</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="1"/></w:listPr><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="540"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方工作涉及甲方商业秘密和与知识产权相关的保密事项的,甲方可以事前与</w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>乙方</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>依法协商约定保守商业秘密</w:t></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:t>。</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="1"/></w:listPr><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="540"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>由甲方出资对乙方进行专业技术培训,并要求乙方履行服务期的,应当事前征得乙方同意,并签订协议,明确双方权利义务。</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="2"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>十、劳动合同的解除、终止和经济补偿</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:ind w:first-line="703" w:first-line-chars="250"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第二十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>四</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条 </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方有下列情形之一的,甲方可立即解除本劳动合同:</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/></w:listPr><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:ind w:left="700" w:first-line="0" w:first-line-chars="0"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方在试用期间,经业绩考核评审为不合格的;</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/></w:listPr><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:ind w:left="700" w:first-line="0" w:first-line-chars="0"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方被查实在应聘时向甲方提供</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>虚假</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>个人资料,包括但不限于:离职证明、身份证明、户籍证明、学历证明、体检证明、工作经历、家庭成员和主要社会关系等资料;</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  Â 3、严重违反本</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>单位</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>的各项规章制度(具体情形在《员工手册》已列明);</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>     4、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/></w:rPr><w:t>严重失职,营私舞弊,给</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>本</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/></w:rPr><w:t>单位造成重大损害的(</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>具体情形在《员工手册》已列明</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/></w:rPr><w:t>)</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/></w:rPr><w:t>     5、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>每月无故</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/></w:rPr><w:t>请假</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>超过</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/></w:rPr><w:t>3次以上(含3次)</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>的</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/></w:rPr><w:t>。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:color w:val="000000"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/></w:rPr><w:t>    </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第二十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>五</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>有下列情形之一,本合同自行终止:</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  Â  1</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:t>、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>合同期满且双方不能就劳动合同续签达成一致的;</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  Â  2</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:t>、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>甲方经营的状况不佳</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>需裁员</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>或已破产关闭;</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  Â  3</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:t>、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方应征入伍或者履行国家规定的其他法定</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>公民</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>义务的;</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  Â  4</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:t>、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>法律法规规定的其他情形。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  ç¬¬äºŒå</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>六</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>本合同期满前,甲乙双方应按照有关规定就合同续订或者终止事宜</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>提出</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>自己的意见,并办理相关书面手续。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  Â  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第二十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>七</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方未提前30天向甲方提出辞职</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>报告</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>或擅自离职的,</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>å¹¶</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>由此给甲方造成经济损失的,乙方应承担相应的赔偿责任。</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="562" w:first-line-chars="200"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第二十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>八</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ä¹™æ–¹åº”当</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>在</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>合同终止之日</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>前</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>3日内,办理工作交接。应当支付经济补偿的,在办结工作交接时支付。</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:tabs><w:tab w:val="left" w:pos="559"/></w:tabs><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="626" w:first-line-chars="200"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="auto"/><w:spacing w:val="16"/><w:kern w:val="44"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:tab/></w:r><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="auto"/><w:spacing w:val="16"/><w:kern w:val="44"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>            </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:b-cs/><w:color w:val="auto"/><w:spacing w:val="16"/><w:kern w:val="44"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>十一、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>经济追偿</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:ind w:first-line="626" w:first-line-chars="200"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>二十九</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>乙方有下列情形之一的,甲方以绩效考核</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>为依据</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>有权向乙方追偿:</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  Â  ã€€ã€€1</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:t>、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>依照法律法规约定和合同约定乙方应承担的赔偿责任;</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  Â  ã€€ã€€2</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:fareast="ZH-CN"/></w:rPr><w:t>、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>违反甲方依法制订的规章制度并造成经济损失;</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  Â  ã€€ã€€3、工作失误给甲方造成了经济损失;</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  Â  ã€€ã€€4、应向甲方支付的其它款项;</w:t></w:r></w:p><w:p><w:pPr><w:pageBreakBefore w:val="off"/><w:widowControl/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:before="100" w:before-autospacing="on" w:after="180" w:line="520" w:line-rule="exact"/><w:jc w:val="left"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b-cs/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="470" w:first-line-chars="150"/><w:jc w:val="center"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>十二、劳动争议处理及其它</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:adjustRightInd w:val="off"/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>    ç¬¬ä¸‰åæ¡</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ç”²ä¹™åŒæ–¹å› å±¥è¡Œæœ¬åˆåŒå‘生争议,乙方可以向甲方劳动争议调解委员会申请调解;调解不成的,可以向当地劳动争议仲裁委员会申请仲裁。对仲裁裁决不服的,可以自收到仲裁裁决书后依向当地人民法院提起诉讼。</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:jc w:val="both"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>    ç¬¬ä¸‰å</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>一</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条 æœ¬åˆåŒçš„附件如下:</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>1:《员工手册》</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>一本</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:u w:val="single"/></w:rPr><w:t>                                                                                                            </w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:ind w:first-line="626" w:first-line-chars="200"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>第三十</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>二</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> ä¹™æ–¹è‡ªæœ¬åˆåŒç­¾å­—之日签收《员工手册》,并已知晓《员工手册》全部内容。</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:pageBreakBefore w:val="off"/><w:kinsoku/><w:wordWrap/><w:overflowPunct/><w:topLinePunct w:val="off"/><w:autoSpaceDE/><w:autoSpaceDN/><w:spacing w:line="520" w:line-rule="exact"/><w:textAlignment w:val="auto"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>   ç¬¬ä¸‰å</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>三</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:b/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>条</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> æœ¬</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>合同</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>自甲乙双方签</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>订</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>之日起生效。本合同一式两份,甲乙双方各执一份。</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="440" w:line-rule="exact"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="440" w:line-rule="exact"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="440" w:line-rule="exact"/><w:ind w:first-line="511" w:first-line-chars="164"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:spacing w:line="440" w:line-rule="exact"/><w:ind w:first-line="624" w:first-line-chars="200"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>甲方:(公   ç« ï¼‰    </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>   ä¹™æ–¹ï¼š</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a9"/><w:wordWrap w:val="off"/><w:spacing w:line="440" w:line-rule="exact"/><w:ind w:right="1440" w:first-line="400"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="仿宋" w:h-ansi="仿宋" w:fareast="仿宋" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>å¹´ </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> æœˆ </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>日           </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>    </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>å¹´</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>  </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> æœˆ</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:spacing w:val="16"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr><w:t>日</w:t></w:r></w:p><w:sectPr><w:ftr w:type="even"><w:p><w:pPr><w:pStyle w:val="a3"/><w:framePr w:wrap="around" w:hanchor="margin" w:vanchor="text" w:x-align="center" w:y="0"/><w:rPr><w:rStyle w:val="a7"/></w:rPr></w:pPr><w:r><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:rPr><w:rStyle w:val="a7"/></w:rPr><w:instrText>PAGE  </w:instrText></w:r><w:r><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:fldChar w:fldCharType="end"/></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a3"/></w:pPr></w:p></w:ftr><w:ftr w:type="odd"><w:p><w:pPr><w:pStyle w:val="a3"/><w:framePr w:wrap="around" w:hanchor="margin" w:vanchor="text" w:x-align="center" w:y="0"/><w:rPr><w:rStyle w:val="a7"/></w:rPr></w:pPr><w:r><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:rPr><w:rStyle w:val="a7"/></w:rPr><w:instrText>PAGE  </w:instrText></w:r><w:r><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:rStyle w:val="a7"/><w:lang/></w:rPr><w:t>2</w:t></w:r><w:r><w:fldChar w:fldCharType="end"/></w:r></w:p><w:p><w:pPr><w:pStyle w:val="a3"/></w:pPr></w:p></w:ftr><w:pgSz w:w="10319" w:h="14572"/><w:pgMar w:top="720" w:right="720" w:bottom="720" w:left="720" w:header="851" w:footer="992" w:gutter="0"/><w:cols w:space="720"/><w:titlePg/><w:docGrid w:type="lines" w:line-pitch="312"/></w:sectPr></wx:sect></w:body></w:wordDocument>