diff --git a/.image/common/iot-feature.png b/.image/common/iot-feature.png new file mode 100644 index 000000000..357781c53 Binary files /dev/null and b/.image/common/iot-feature.png differ diff --git a/.image/common/iot-preview.png b/.image/common/iot-preview.png new file mode 100644 index 000000000..58e8940eb Binary files /dev/null and b/.image/common/iot-preview.png differ diff --git a/.image/common/mes-feature.png b/.image/common/mes-feature.png new file mode 100644 index 000000000..33196fd06 Binary files /dev/null and b/.image/common/mes-feature.png differ diff --git a/.image/common/mes-preview.png b/.image/common/mes-preview.png new file mode 100644 index 000000000..a140979e7 Binary files /dev/null and b/.image/common/mes-preview.png differ diff --git a/.image/common/ruoyi-vue-pro-biz.png b/.image/common/ruoyi-vue-pro-biz.png index 24a385abe..42dc849b5 100644 Binary files a/.image/common/ruoyi-vue-pro-biz.png and b/.image/common/ruoyi-vue-pro-biz.png differ diff --git a/README.md b/README.md index 170f33ca2..65d5aafdc 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ | 【完整版】[yudao-cloud](https://gitee.com/zhijiantianya/yudao-cloud) | [`master`](https://gitee.com/zhijiantianya/yudao-cloud/tree/master/) 分支 | [`master-jdk17`](https://gitee.com/zhijiantianya/yudao-cloud/tree/master-jdk17/) 分支 | | 【精简版】[yudao-cloud-mini](https://gitee.com/yudaocode/yudao-cloud-mini) | [`master`](https://gitee.com/yudaocode/yudao-cloud-mini/tree/master/) 分支 | [`master-jdk17`](https://gitee.com/yudaocode/yudao-cloud-mini/tree/master-jdk17/) 分支 | -* 【完整版】:包括系统功能、基础设施、会员中心、数据报表、工作流程、商城系统、微信公众号、CRM、ERP 等功能 -* 【精简版】:只包括系统功能、基础设施功能,不包括会员中心、数据报表、工作流程、商城系统、微信公众号、CRM、ERP 等功能 +* 【完整版】:包括系统功能、基础设施、会员中心、数据报表、工作流程、商城系统、微信公众号、CRM、ERP、MES、AI 大模型、IoT 物联网 等功能 +* 【精简版】:只包括系统功能、基础设施功能,不包括会员中心、数据报表、工作流程、商城系统、微信公众号、CRM、ERP、MES、AI 大模型、IoT 物联网 等功能 可参考 [《迁移文档》](https://cloud.iocoder.cn/migrate-module/) ,只需要 5-10 分钟,即可将【完整版】按需迁移到【精简版】 @@ -115,7 +115,7 @@ * 通用模块(必选):系统功能、基础设施 * 通用模块(可选):工作流程、支付系统、数据报表、会员中心 -* 业务系统(按需):ERP 系统、CRM 系统、商城系统、微信公众号、AI 大模型 +* 业务系统(按需):ERP 系统、CRM 系统、MES 系统、商城系统、微信公众号、AI 大模型、IoT 物联网 > 友情提示:本项目基于 RuoYi-Vue 修改,**重构优化**后端的代码,**美化**前端的界面。 > @@ -279,6 +279,14 @@ ![功能图](/.image/common/crm-feature.png) +### MES 系统 + +演示地址: + +![功能图](/.image/common/mes-feature.png) + +![功能图](/.image/common/mes-preview.png) + ### AI 大模型 演示地址: @@ -287,6 +295,14 @@ ![功能图](/.image/common/ai-preview.gif) +### IoT 物联网 + +演示地址: + +![功能图](/.image/common/iot-feature.png) + +![预览图](/.image/common/iot-preview.png) + ## 🐨 技术栈 ### 微服务 @@ -304,7 +320,9 @@ | `yudao-module-mall` | 商城系统的 Module 模块 | | `yudao-module-erp` | ERP 系统的 Module 模块 | | `yudao-module-crm` | CRM 系统的 Module 模块 | +| `yudao-module-mes` | MES 系统的 Module 模块 | | `yudao-module-ai` | AI 大模型的 Module 模块 | +| `yudao-module-iot` | IoT 物联网的 Module 模块 | | `yudao-module-mp` | 微信公众号的 Module 模块 | | `yudao-module-report` | 大屏报表 Module 模块 | diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java index 1cafbcd45..2e7555232 100644 --- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java @@ -9,6 +9,7 @@ import uk.co.jemos.podam.api.PodamFactory; import uk.co.jemos.podam.api.PodamFactoryImpl; import java.lang.reflect.Type; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Date; @@ -52,6 +53,10 @@ public class RandomUtils { } return RandomUtil.randomInt(); }); + // BigDecimal:限制精度在 DECIMAL(10,2) 范围内,避免 H2 等数据库溢出 + PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(BigDecimal.class, + (dataProviderStrategy, attributeMetadata, map) -> + BigDecimal.valueOf(RandomUtil.randomInt(0, 10000000), 2)); // LocalDateTime PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(LocalDateTime.class, (dataProviderStrategy, attributeMetadata, map) -> randomLocalDateTime()); diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java index ea234136e..8d268ff1b 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java @@ -7,32 +7,81 @@ package cn.iocoder.yudao.module.mes.enums; */ public interface DictTypeConstants { + // ========== 基础数据 (MD) ========== String MES_MD_ITEM_OR_PRODUCT = "mes_md_item_or_product"; // MES 物料产品标识 + String MES_MD_AUTO_CODE_PART_TYPE = "mes_md_auto_code_part_type"; // MES 分段类型 + String MES_MD_AUTO_CODE_CYCLE_METHOD = "mes_md_auto_code_cycle_method"; // MES 循环方式 + String MES_MD_AUTO_CODE_PADDED_METHOD = "mes_md_auto_code_padded_method"; // MES 补齐方式 String MES_CLIENT_TYPE = "mes_client_type"; // MES 客户类型 String MES_VENDOR_LEVEL = "mes_vendor_level"; // MES 供应商级别 - String MES_CAL_HOLIDAY_TYPE = "mes_cal_holiday_type"; // MES 假期类型 - String MES_TM_TOOL_STATUS = "mes_tm_tool_status"; // MES 工具状态 - String MES_TM_MAINTEN_TYPE = "mes_tm_mainten_type"; // MES 保养维护类型 - String MES_CAL_SHIFT_TYPE = "mes_cal_shift_type"; // MES 轮班方式 - String MES_CAL_SHIFT_METHOD = "mes_cal_shift_method"; // MES 倒班方式 - String MES_CAL_CALENDAR_TYPE = "mes_cal_calendar_type"; // MES 班组类型 - String MES_CAL_PLAN_STATUS = "mes_cal_plan_status"; // MES 排班计划状态 - String MES_DV_MACHINERY_STATUS = "mes_dv_machinery_status"; // MES 设备状态 - String MES_DV_SUBJECT_TYPE = "mes_dv_subject_type"; // MES 点检保养项目类型 + + // ========== 生产计划与执行 (PRO) ========== + String MES_PRO_WORK_ORDER_STATUS = "mes_pro_work_order_status"; // MES 生产工单状态 + String MES_PRO_WORK_ORDER_SOURCE_TYPE = "mes_pro_work_order_source_type"; // MES 工单来源类型 + String MES_PRO_WORK_ORDER_TYPE = "mes_pro_work_order_type"; // MES 工单类型 + String MES_PRO_LINK_TYPE = "mes_pro_link_type"; // MES 工序关系类型 + String MES_TIME_UNIT_TYPE = "mes_time_unit_type"; // MES 时间单位 + String MES_PRO_ANDON_STATUS = "mes_pro_andon_status"; // MES 安灯处置状态 + String MES_PRO_ANDON_LEVEL = "mes_pro_andon_level"; // MES 安灯级别 + String MES_PRO_WORK_RECORD_TYPE = "mes_pro_work_record_type"; // MES 上下工状态类型 + String MES_PRO_FEEDBACK_STATUS = "mes_pro_feedback_status"; // MES 生产报工状态 + String MES_PRO_FEEDBACK_TYPE = "mes_pro_feedback_type"; // MES 生产报工类型 + String MES_PRO_FEEDBACK_CHANNEL = "mes_pro_feedback_channel"; // MES 生产报工途径 + String MES_PRO_TASK_STATUS = "mes_pro_task_status"; // MES 任务状态 + + // ========== 仓储条码与管理 (WM) ========== + String MES_BARCODE_FORMAT = "mes_barcode_format"; // MES 条码格式 + String MES_BARCODE_BIZ_TYPE = "mes_barcode_biz_type"; // MES 条码业务类型 + String MES_WM_TRANSACTION_TYPE = "mes_wm_transaction_type"; // MES 库存事务类型 + String MES_WM_QUALITY_STATUS = "mes_wm_quality_status"; // MES 质量状态(待检/合格/不合格) + + // ========== 仓储入库 (WM Receipt) ========== + String MES_WM_ARRIVAL_NOTICE_STATUS = "mes_wm_arrival_notice_status"; // MES 到货通知单状态 + String MES_WM_ITEM_RECEIPT_STATUS = "mes_wm_item_receipt_status"; // MES 采购入库单状态 + String MES_WM_PRODUCT_PRODUCE_STATUS = "mes_wm_product_produce_status"; // MES 生产入库单状态 + String MES_WM_MISC_RECEIPT_TYPE = "mes_wm_misc_receipt_type"; // MES 杂项入库类型 + String MES_WM_MISC_RECEIPT_STATUS = "mes_wm_misc_receipt_status"; // MES 杂项入库状态 + String MES_WM_OUTSOURCE_RECEIPT_STATUS = "mes_wm_outsource_receipt_status"; // MES 委外入库状态 + String MES_WM_PRODUCT_RECEIPT_STATUS = "mes_wm_product_receipt_status"; // MES 产品入库状态 + String MES_WM_RETURN_ISSUE_TYPE = "mes_wm_return_issue_type"; // MES 生产退料类型 + String MES_WM_RETURN_ISSUE_STATUS = "mes_wm_return_issue_status"; // MES 生产退料单状态 + String MES_WM_RETURN_SALES_STATUS = "mes_wm_return_sales_status"; // MES 销售退货状态 + + // ========== 仓储出库 (WM Issue) ========== + String MES_WM_MISC_ISSUE_TYPE = "mes_wm_misc_issue_type"; // MES 杂项出库类型 + String MES_WM_MISC_ISSUE_STATUS = "mes_wm_misc_issue_status"; // MES 杂项出库单状态 + String MES_WM_SALES_NOTICE_STATUS = "mes_wm_sales_notice_status"; // MES 发货通知单状态 + String MES_WM_PRODUCT_SALES_STATUS = "mes_wm_product_sales_status"; // MES 销售出库单状态 + String MES_WM_OUTSOURCE_ISSUE_STATUS = "mes_wm_outsource_issue_status"; // MES 委外出库状态 + String MES_WM_PRODUCT_ISSUE_STATUS = "mes_wm_product_issue_status"; // MES 生产领料状态 + String MES_WM_RETURN_VENDOR_STATUS = "mes_wm_return_vendor_status"; // MES 供应商退货单状态 + + // ========== 仓储移库与盘点 (WM Transfer) ========== + String MES_WM_TRANSFER_STATUS = "mes_wm_transfer_status"; // MES 转移单状态 + String MES_WM_TRANSFER_TYPE = "mes_wm_transfer_type"; // MES 转移单类型 + String MES_WM_STOCK_TAKING_PLAN_PARAM_TYPE = "mes_wm_stock_taking_plan_param_type"; // MES 盘点参数值类型 + String MES_WM_STOCK_TAKING_TYPE = "mes_wm_stock_taking_type"; // MES 盘点类型 + String MES_WM_STOCK_TAKING_TASK_STATUS = "mes_wm_stock_taking_task_status"; // MES 盘点任务状态 + String MES_WM_STOCK_TAKING_TASK_LINE_STATUS = "mes_wm_stock_taking_task_line_status"; // MES 盘点任务明细状态 + + // ========== 其它仓储 (WM Misc) ========== + String MES_WM_PACKAGE_STATUS = "mes_wm_package_status"; // MES 打包状态 + String MES_WM_ITEM_CONSUME_STATUS = "mes_wm_item_consume_status"; // MES 物料消耗状态 + + // ========== 质量管理 (QC) ========== String MES_INDICATOR_TYPE = "mes_indicator_type"; // MES 检测项类型 String MES_QC_RESULT_TYPE = "mes_qc_result_type"; // MES 质检结果值类型 String MES_DEFECT_TYPE = "mes_defect_type"; // MES 缺陷检测项类型 String MES_DEFECT_LEVEL = "mes_defect_level"; // MES 缺陷等级 - String MES_PRO_WORK_ORDER_STATUS = "mes_pro_work_order_status"; // MES 生产工单状态 - String MES_PRO_WORK_ORDER_SOURCE_TYPE = "mes_pro_work_order_source_type"; // MES 工单来源类型 - String MES_PRO_WORK_ORDER_TYPE = "mes_pro_work_order_type"; // MES 工单类型 String MES_QC_TYPE = "mes_qc_type"; // MES 检测种类(IQC/IPQC/OQC/RQC) - String MES_PRO_LINK_TYPE = "mes_pro_link_type"; // MES 工序关系类型 - String MES_TIME_UNIT_TYPE = "mes_time_unit_type"; // MES 时间单位 String MES_IPQC_TYPE = "mes_ipqc_type"; // MES IPQC 检验类型 String MES_ORDER_STATUS = "mes_order_status"; // MES 单据状态(IQC/IPQC/OQC/RQC 通用) String MES_QC_CHECK_RESULT = "mes_qc_check_result"; // MES 检测结果 String MES_QC_SOURCE_DOC_TYPE = "mes_qc_source_doc_type"; // MES 来源单据类型 + + // ========== 设备管理 (DV) ========== + String MES_DV_MACHINERY_STATUS = "mes_dv_machinery_status"; // MES 设备状态 + String MES_DV_SUBJECT_TYPE = "mes_dv_subject_type"; // MES 点检保养项目类型 String MES_DV_CYCLE_TYPE = "mes_dv_cycle_type"; // MES 点检保养周期类型 String MES_DV_CHECK_PLAN_STATUS = "mes_dv_check_plan_status"; // MES 点检保养方案状态 String MES_MAINTEN_RECORD_STATUS = "mes_mainten_record_status"; // MES 保养记录状态 @@ -41,23 +90,15 @@ public interface DictTypeConstants { String MES_DV_CHECK_RESULT = "mes_dv_check_result"; // MES 点检结果 String MES_DV_REPAIR_STATUS = "mes_dv_repair_status"; // MES 维修工单状态 String MES_DV_REPAIR_RESULT = "mes_dv_repair_result"; // MES 维修结果 - String MES_PRO_ANDON_STATUS = "mes_pro_andon_status"; // MES 安灯处置状态 - String MES_PRO_ANDON_LEVEL = "mes_pro_andon_level"; // MES 安灯级别 - String MES_PRO_WORK_RECORD_TYPE = "mes_pro_work_record_type"; // MES 上下工状态类型 - String MES_PRO_FEEDBACK_STATUS = "mes_pro_feedback_status"; // MES 生产报工状态 - String MES_PRO_FEEDBACK_TYPE = "mes_pro_feedback_type"; // MES 生产报工类型 - String MES_PRO_FEEDBACK_CHANNEL = "mes_pro_feedback_channel"; // MES 生产报工途径 - String MES_WM_ARRIVAL_NOTICE_STATUS = "mes_wm_arrival_notice_status"; // MES 到货通知单状态 - String MES_WM_ITEM_RECEIPT_STATUS = "mes_wm_item_receipt_status"; // MES 采购入库单状态 - String MES_WM_PRODUCT_PRODUCE_STATUS = "mes_wm_product_produce_status"; // MES 生产入库单状态 - String MES_WM_RETURN_VENDOR_STATUS = "mes_wm_return_vendor_status"; // MES 供应商退货单状态 - String MES_WM_QUALITY_STATUS = "mes_wm_quality_status"; // MES 质量状态(待检/合格/不合格) - String MES_WM_RETURN_ISSUE_STATUS = "mes_wm_return_issue_status"; // MES 生产退料单状态 - String MES_WM_RETURN_ISSUE_TYPE = "mes_wm_return_issue_type"; // MES 生产退料类型 - String MES_WM_MISC_ISSUE_TYPE = "mes_wm_misc_issue_type"; // MES 杂项出库类型 - String MES_WM_MISC_ISSUE_STATUS = "mes_wm_misc_issue_status"; // MES 杂项出库单状态 - String MES_WM_SALES_NOTICE_STATUS = "mes_wm_sales_notice_status"; // MES 发货通知单状态 - String MES_WM_TRANSFER_STATUS = "mes_wm_transfer_status"; // MES 转移单状态 - String MES_WM_TRANSFER_TYPE = "mes_wm_transfer_type"; // MES 转移单类型 + // ========== 排班日历 (CAL) ========== + String MES_CAL_HOLIDAY_TYPE = "mes_cal_holiday_type"; // MES 假期类型 + String MES_CAL_SHIFT_TYPE = "mes_cal_shift_type"; // MES 轮班方式 + String MES_CAL_SHIFT_METHOD = "mes_cal_shift_method"; // MES 倒班方式 + String MES_CAL_CALENDAR_TYPE = "mes_cal_calendar_type"; // MES 班组类型 + String MES_CAL_PLAN_STATUS = "mes_cal_plan_status"; // MES 排班计划状态 + + // ========== 工具管理 (TM) ========== + String MES_TM_TOOL_STATUS = "mes_tm_tool_status"; // MES 工具状态 + String MES_TM_MAINTEN_TYPE = "mes_tm_mainten_type"; // MES 保养维护类型 } diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index aaee1b8f6..14c22c27c 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -18,11 +18,16 @@ public interface ErrorCodeConstants { ErrorCode MD_ITEM_TYPE_CODE_DUPLICATE = new ErrorCode(1_040_100_005, "同一父分类下已存在该编码的分类"); ErrorCode MD_ITEM_TYPE_PARENT_IS_CHILD = new ErrorCode(1_040_100_006, "不能设置自己的子分类为父分类"); ErrorCode MD_ITEM_TYPE_EXITS_ITEM = new ErrorCode(1_040_100_007, "该分类下存在物料,无法删除"); + ErrorCode MD_ITEM_TYPE_NOT_LEAF = new ErrorCode(1_040_100_008, "只能将物料挂载到叶子分类(该分类下存在子分类)"); // ========== MES 基础数据-计量单位(1-040-101-000) ========== ErrorCode MD_UNIT_MEASURE_NOT_EXISTS = new ErrorCode(1_040_101_000, "计量单位不存在"); ErrorCode MD_UNIT_MEASURE_CODE_DUPLICATE = new ErrorCode(1_040_101_001, "计量单位编码已存在"); ErrorCode MD_UNIT_MEASURE_HAS_ITEM = new ErrorCode(1_040_101_002, "该计量单位下存在物料,无法删除"); + ErrorCode MD_UNIT_MEASURE_HAS_SECONDARY = new ErrorCode(1_040_101_003, "该主单位下存在辅单位,无法删除"); + ErrorCode MD_UNIT_MEASURE_HAS_TASK_ISSUE = new ErrorCode(1_040_101_004, "该计量单位已被生产投料引用,无法删除"); + ErrorCode MD_UNIT_MEASURE_HAS_QC_TEMPLATE_INDICATOR = new ErrorCode(1_040_101_005, "该计量单位已被质检方案指标项引用,无法删除"); + ErrorCode MD_UNIT_MEASURE_HAS_QC_LINE = new ErrorCode(1_040_101_006, "该计量单位已被质检单据行引用,无法删除"); // ========== MES 基础数据-物料(1-040-102-000) ========== ErrorCode MD_ITEM_NOT_EXISTS = new ErrorCode(1_040_102_000, "物料不存在"); @@ -30,6 +35,7 @@ public interface ErrorCodeConstants { ErrorCode MD_ITEM_NAME_DUPLICATE = new ErrorCode(1_040_102_002, "物料名称已存在"); ErrorCode MD_ITEM_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_040_102_003, "导入物料数据不能为空"); ErrorCode MD_ITEM_BATCH_REQUIRED = new ErrorCode(1_040_102_004, "当前物料启用了批次管理,请选择批次"); + ErrorCode MD_ITEM_IS_DISABLE = new ErrorCode(1_040_102_005, "物料已禁用"); // ========== MES 基础数据-物料批次属性配置(1-040-102-100) ========== ErrorCode MD_ITEM_BATCH_CONFIG_NOT_EXISTS = new ErrorCode(1_040_102_100, "物料批次属性配置不存在"); @@ -51,6 +57,10 @@ public interface ErrorCodeConstants { ErrorCode WM_BATCH_MOLD_REQUIRED = new ErrorCode(1_040_717_011, "批次配置要求模具不能为空"); ErrorCode WM_BATCH_LOT_NUMBER_REQUIRED = new ErrorCode(1_040_717_012, "批次配置要求生产批号不能为空"); ErrorCode WM_BATCH_QUALITY_STATUS_REQUIRED = new ErrorCode(1_040_717_013, "批次配置要求质量状态不能为空"); + ErrorCode WM_BATCH_NOT_EXISTS = new ErrorCode(1_040_717_014, "批次不存在"); + ErrorCode WM_BATCH_ITEM_MISMATCH = new ErrorCode(1_040_717_015, "批次不属于当前物料"); + ErrorCode WM_BATCH_CLIENT_MISMATCH = new ErrorCode(1_040_717_016, "批次不属于当前客户"); + ErrorCode WM_BATCH_VENDOR_MISMATCH = new ErrorCode(1_040_717_017, "批次不属于当前供应商"); // ========== MES 基础数据-客户(1-040-103-000) ========== ErrorCode MD_CLIENT_NOT_EXISTS = new ErrorCode(1_040_103_000, "客户不存在"); @@ -58,6 +68,7 @@ public interface ErrorCodeConstants { ErrorCode MD_CLIENT_NAME_DUPLICATE = new ErrorCode(1_040_103_002, "客户名称已存在"); ErrorCode MD_CLIENT_NICKNAME_DUPLICATE = new ErrorCode(1_040_103_003, "客户简称已存在"); ErrorCode MD_CLIENT_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_040_103_004, "导入客户数据不能为空"); + ErrorCode MD_CLIENT_IS_DISABLE = new ErrorCode(1_040_103_005, "客户已禁用"); // ========== MES 基础数据-供应商(1-040-104-000) ========== ErrorCode MD_VENDOR_NOT_EXISTS = new ErrorCode(1_040_104_000, "供应商不存在"); @@ -66,6 +77,7 @@ public interface ErrorCodeConstants { ErrorCode MD_VENDOR_NICKNAME_DUPLICATE = new ErrorCode(1_040_104_003, "供应商简称已存在"); ErrorCode MD_VENDOR_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_040_104_004, "导入供应商数据不能为空"); ErrorCode MD_VENDOR_HAS_REFERENCE = new ErrorCode(1_040_104_005, "该供应商已被其他业务引用,无法删除"); + ErrorCode MD_VENDOR_IS_DISABLE = new ErrorCode(1_040_104_006, "供应商已禁用"); // ========== MES 基础数据-车间(1-040-105-000) ========== ErrorCode MD_WORKSHOP_NOT_EXISTS = new ErrorCode(1_040_105_000, "车间不存在"); @@ -77,6 +89,7 @@ public interface ErrorCodeConstants { ErrorCode MD_WORKSTATION_NOT_EXISTS = new ErrorCode(1_040_106_000, "工作站不存在"); ErrorCode MD_WORKSTATION_CODE_DUPLICATE = new ErrorCode(1_040_106_001, "工作站编码已存在"); ErrorCode MD_WORKSTATION_NAME_DUPLICATE = new ErrorCode(1_040_106_002, "工作站名称已存在"); + ErrorCode MD_WORKSTATION_IS_DISABLE = new ErrorCode(1_040_106_003, "工作站已禁用"); // ========== MES 基础数据-设备资源(1-040-106-100) ========== ErrorCode MD_WORKSTATION_MACHINE_NOT_EXISTS = new ErrorCode(1_040_106_100, "设备资源记录不存在"); ErrorCode MD_WORKSTATION_MACHINE_EXISTS = new ErrorCode(1_040_106_101, "该设备已分配至工作站:{}"); @@ -91,6 +104,7 @@ public interface ErrorCodeConstants { ErrorCode MD_PRODUCT_BOM_NOT_EXISTS = new ErrorCode(1_040_107_000, "产品BOM不存在"); ErrorCode MD_PRODUCT_BOM_SELF_REFERENCE = new ErrorCode(1_040_107_001, "产品不能作为自身的BOM物料"); ErrorCode MD_PRODUCT_BOM_CIRCULAR = new ErrorCode(1_040_107_002, "BOM物料存在闭环,无法新增"); + ErrorCode MD_PRODUCT_BOM_ITEM_INVALID = new ErrorCode(1_040_107_003, "选择的 BOM 物料不属于当前产品"); // ========== MES 基础数据-产品SOP(1-040-108-000) ========== ErrorCode MD_PRODUCT_SOP_NOT_EXISTS = new ErrorCode(1_040_108_000, "产品SOP不存在"); @@ -149,6 +163,7 @@ public interface ErrorCodeConstants { // ========== MES 设备管理-设备台账(1-040-301-000) ========== ErrorCode DV_MACHINERY_NOT_EXISTS = new ErrorCode(1_040_301_000, "设备不存在"); ErrorCode DV_MACHINERY_CODE_DUPLICATE = new ErrorCode(1_040_301_001, "设备编码已存在"); + ErrorCode DV_MACHINERY_IS_DISABLE = new ErrorCode(1_040_301_007, "设备已禁用"); ErrorCode DV_MACHINERY_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_040_301_002, "导入设备数据不能为空"); ErrorCode DV_MACHINERY_HAS_CHECK_PLAN = new ErrorCode(1_040_301_003, "设备已关联点检计划,无法删除"); ErrorCode DV_MACHINERY_HAS_CHECK_RECORD = new ErrorCode(1_040_301_004, "设备已关联点检记录,无法删除"); @@ -159,6 +174,7 @@ public interface ErrorCodeConstants { ErrorCode DV_SUBJECT_NOT_EXISTS = new ErrorCode(1_040_304_000, "点检保养项目不存在"); ErrorCode DV_SUBJECT_CODE_DUPLICATE = new ErrorCode(1_040_304_001, "项目编码已存在"); ErrorCode DV_SUBJECT_USED_BY_CHECK_PLAN = new ErrorCode(1_040_304_002, "点检保养项目已被点检保养方案使用,无法删除"); + ErrorCode DV_SUBJECT_IS_DISABLE = new ErrorCode(1_040_304_003, "点检保养项目已禁用"); // ========== MES 设备管理-点检计划(1-040-302-000) ========== ErrorCode DV_CHECK_PLAN_NOT_EXISTS = new ErrorCode(1_040_302_000, "点检计划不存在"); @@ -167,6 +183,8 @@ public interface ErrorCodeConstants { ErrorCode DV_CHECK_PLAN_NO_MACHINERY = new ErrorCode(1_040_302_003, "启用方案时,至少需要关联一台设备"); ErrorCode DV_CHECK_PLAN_NO_SUBJECT = new ErrorCode(1_040_302_004, "启用方案时,至少需要关联一个点检保养项目"); ErrorCode DV_CHECK_PLAN_NOT_ENABLED = new ErrorCode(1_040_302_005, "点检保养方案未启用,不允许停用"); + ErrorCode DV_CHECK_PLAN_TYPE_MISMATCH = new ErrorCode(1_040_302_006, "点检保养方案类型与当前业务不匹配"); + ErrorCode DV_CHECK_PLAN_NOT_ENABLED_FOR_RECORD = new ErrorCode(1_040_302_007, "点检保养方案未启用,不允许创建记录"); // ========== MES 设备管理-点检方案设备(1-040-302-100) ========== ErrorCode DV_CHECK_PLAN_MACHINERY_NOT_EXISTS = new ErrorCode(1_040_302_100, "点检保养方案设备不存在"); ErrorCode DV_CHECK_PLAN_MACHINERY_DUPLICATE = new ErrorCode(1_040_302_101, "该设备已关联到当前方案,请勿重复添加"); @@ -203,16 +221,19 @@ public interface ErrorCodeConstants { ErrorCode TM_TOOL_TYPE_CODE_DUPLICATE = new ErrorCode(1_040_400_001, "工具类型编码已存在"); ErrorCode TM_TOOL_TYPE_NAME_DUPLICATE = new ErrorCode(1_040_400_002, "工具类型名称已存在"); ErrorCode TM_TOOL_TYPE_HAS_TOOL = new ErrorCode(1_040_400_003, "该工具类型下存在工具,无法删除"); + ErrorCode TM_TOOL_TYPE_HAS_WORKSTATION_TOOL = new ErrorCode(1_040_400_004, "该工具类型已被工作站工装资源引用,无法删除"); // ========== MES 工具管理-工具台账(1-040-401-000) ========== ErrorCode TM_TOOL_NOT_EXISTS = new ErrorCode(1_040_401_000, "工具不存在"); ErrorCode TM_TOOL_CODE_DUPLICATE = new ErrorCode(1_040_401_001, "工具编码已存在"); + ErrorCode TM_TOOL_HAS_BATCH = new ErrorCode(1_040_401_002, "该工具已被批次引用,无法删除"); // ========== MES 生产管理-工序(1-040-500-000) ========== ErrorCode PRO_PROCESS_NOT_EXISTS = new ErrorCode(1_040_500_000, "工序不存在"); ErrorCode PRO_PROCESS_CODE_EXISTS = new ErrorCode(1_040_500_001, "工序编码已存在"); ErrorCode PRO_PROCESS_NAME_EXISTS = new ErrorCode(1_040_500_002, "工序名称已存在"); ErrorCode PRO_PROCESS_USED_BY_ROUTE = new ErrorCode(1_040_500_003, "工序已被工艺路线引用,无法删除"); + ErrorCode PRO_PROCESS_IS_DISABLE = new ErrorCode(1_040_500_004, "工序已禁用"); // ========== MES 生产管理-工序内容(1-040-500-100) ========== ErrorCode PRO_PROCESS_CONTENT_NOT_EXISTS = new ErrorCode(1_040_500_100, "工序内容不存在"); @@ -241,11 +262,17 @@ public interface ErrorCodeConstants { ErrorCode PRO_WORK_ORDER_NOT_PREPARE = new ErrorCode(1_040_502_002, "只有草稿状态的工单才能执行此操作"); ErrorCode PRO_WORK_ORDER_NOT_CONFIRMED = new ErrorCode(1_040_502_003, "只有已确认状态的工单才能执行此操作"); ErrorCode PRO_WORK_ORDER_HAS_CHILDREN = new ErrorCode(1_040_502_004, "存在子工单,无法删除"); + ErrorCode PRO_WORK_ORDER_PRODUCT_MISMATCH = new ErrorCode(1_040_502_005, "当前产品物料与生产工单产品不一致"); ErrorCode PRO_WORK_ORDER_BOM_NOT_EXISTS = new ErrorCode(1_040_502_100, "生产工单BOM不存在"); // ========== MES 生产管理-生产任务(1-040-503-000) ========== ErrorCode PRO_TASK_NOT_EXISTS = new ErrorCode(1_040_503_000, "生产任务不存在"); ErrorCode PRO_TASK_ALREADY_FINISHED = new ErrorCode(1_040_503_001, "生产任务已完成或已取消,不能继续操作"); + ErrorCode PRO_TASK_WORK_ORDER_MISMATCH = new ErrorCode(1_040_503_002, "生产任务不属于当前生产工单"); + ErrorCode PRO_TASK_WORKSTATION_MISMATCH = new ErrorCode(1_040_503_003, "生产任务不属于当前工作站"); + ErrorCode PRO_TASK_ROUTE_PROCESS_MISMATCH = new ErrorCode(1_040_503_004, "生产任务与当前工艺路线或工序不一致"); + ErrorCode PRO_TASK_ITEM_MISMATCH = new ErrorCode(1_040_503_005, "生产任务产品与当前产品物料不一致"); + ErrorCode PRO_WORKSTATION_PROCESS_MISMATCH = new ErrorCode(1_040_503_006, "工作站所属工序与当前工序不一致"); // ========== MES 生产管理-生产任务投料(1-040-503-100) ========== ErrorCode PRO_TASK_ISSUE_NOT_EXISTS = new ErrorCode(1_040_503_100, "生产任务投料记录不存在"); @@ -278,6 +305,7 @@ public interface ErrorCodeConstants { ErrorCode PRO_CARD_CODE_DUPLICATE = new ErrorCode(1_040_507_001, "流转卡编码已存在"); ErrorCode PRO_CARD_STATUS_ERROR = new ErrorCode(1_040_507_002, "流转卡状态不正确"); ErrorCode PRO_CARD_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_507_003, "已完成或已取消的流转卡不允许取消"); + ErrorCode PRO_CARD_NOT_PREPARE = new ErrorCode(1_040_507_004, "流转卡不是草稿状态,不允许修改或删除"); // ========== MES 生产管理-流转卡工序(1-040-507-100) ========== ErrorCode PRO_CARD_PROCESS_NOT_EXISTS = new ErrorCode(1_040_507_100, "流转卡工序记录不存在"); @@ -323,6 +351,11 @@ public interface ErrorCodeConstants { ErrorCode QC_IPQC_QUANTITY_MISMATCH = new ErrorCode(1_040_604_004, "合格品与不合格品数量之和须等于检测数量"); ErrorCode QC_IPQC_NO_TEMPLATE = new ErrorCode(1_040_604_005, "当前产品未配置 IPQC 检测模板"); ErrorCode QC_IPQC_CHECK_RESULT_EMPTY = new ErrorCode(1_040_604_006, "完成检验单前,检测结果必须填写"); + ErrorCode QC_IPQC_SOURCE_DOC_TYPE_UNKNOWN = new ErrorCode(1_040_604_007, "未知的 IPQC 来源单据类型"); + ErrorCode QC_IPQC_SOURCE_DOC_NO_PENDING_LINE = new ErrorCode(1_040_604_008, "来源报工单不存在待检产出行,无法创建 IPQC"); + ErrorCode QC_IPQC_SOURCE_LINE_NOT_BELONG = new ErrorCode(1_040_604_009, "来源单据行不属于该报工单"); + ErrorCode QC_IPQC_SOURCE_LINE_REQUIRED = new ErrorCode(1_040_604_010, "来源单据类型为报工时,来源产出行 ID 不能为空"); + ErrorCode QC_IPQC_SOURCE_LINE_NOT_PENDING = new ErrorCode(1_040_604_011, "来源产出行不是待检验状态"); // ========== MES 质量管理-过程检验行(1-040-604-100) ========== ErrorCode QC_IPQC_LINE_NOT_EXISTS = new ErrorCode(1_040_604_100, "过程检验行不存在"); @@ -333,6 +366,8 @@ public interface ErrorCodeConstants { // ========== MES 质量管理-检验结果(1-040-606-000) ========== ErrorCode QC_RESULT_NOT_EXISTS = new ErrorCode(1_040_606_000, "检验结果不存在"); + ErrorCode QC_RESULT_VALUE_FORMAT_INVALID = new ErrorCode(1_040_606_001, "检测值格式不正确:{}"); + ErrorCode QC_FINISH_INDICATOR_RESULT_REQUIRED = new ErrorCode(1_040_606_002, "完成检验单前,至少需要录入一条检测结果"); // ========== MES 质量管理-出货检验(1-040-607-000) ========== ErrorCode QC_OQC_NOT_EXISTS = new ErrorCode(1_040_607_000, "出货检验单不存在"); @@ -341,6 +376,8 @@ public interface ErrorCodeConstants { ErrorCode QC_OQC_QUANTITY_MISMATCH = new ErrorCode(1_040_607_004, "合格品与不合格品数量之和须等于检测数量"); ErrorCode QC_OQC_NO_TEMPLATE = new ErrorCode(1_040_607_005, "当前产品未配置 OQC 检测模板"); ErrorCode QC_OQC_CHECK_RESULT_EMPTY = new ErrorCode(1_040_607_006, "完成检验单前,检测结果必须填写"); + ErrorCode QC_OQC_SOURCE_DOC_TYPE_UNKNOWN = new ErrorCode(1_040_607_007, "未知的 OQC 来源单据类型"); + // ========== MES 质量管理-出货检验行(1-040-607-100) ========== ErrorCode QC_OQC_LINE_NOT_EXISTS = new ErrorCode(1_040_607_100, "出货检验行不存在"); @@ -399,6 +436,8 @@ public interface ErrorCodeConstants { ErrorCode WM_TRANSACTION_RELATED_NOT_EXISTS = new ErrorCode(1_040_703_010, "关联的库存事务不存在"); ErrorCode WM_TRANSACTION_LIST_EMPTY = new ErrorCode(1_040_703_011, "库存事务列表不能为空"); ErrorCode WM_TRANSACTION_BATCH_NOT_EXISTS = new ErrorCode(1_040_703_012, "批次记录不存在"); + ErrorCode WM_MATERIAL_STOCK_REQUIRED = new ErrorCode(1_040_703_013, "库存记录不能为空"); + ErrorCode WM_MATERIAL_STOCK_SELECTION_MISMATCH = new ErrorCode(1_040_703_014, "库存记录与提交的物料、批次或库位信息不一致"); // ========== MES 仓库管理-到货通知单(1-040-704-000) ========== ErrorCode WM_ARRIVAL_NOTICE_NOT_EXISTS = new ErrorCode(1_040_704_000, "到货通知单不存在"); @@ -408,6 +447,7 @@ public interface ErrorCodeConstants { ErrorCode WM_ARRIVAL_NOTICE_STATUS_NOT_PENDING_RECEIPT = new ErrorCode(1_040_704_004, "只有待入库状态才允许完成"); ErrorCode WM_ARRIVAL_NOTICE_IQC_PENDING = new ErrorCode(1_040_704_005, "存在待检验行,无法审批通过"); ErrorCode WM_ARRIVAL_NOTICE_NO_LINE = new ErrorCode(1_040_704_006, "至少需要一条行项目"); + ErrorCode WM_ARRIVAL_NOTICE_VENDOR_MISMATCH = new ErrorCode(1_040_704_007, "到货通知单的供应商与当前单据不一致"); ErrorCode WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS = new ErrorCode(1_040_704_100, "到货通知单行不存在"); ErrorCode WM_ARRIVAL_NOTICE_LINE_NOT_MATCH = new ErrorCode(1_040_704_101, "到货通知单行不属于指定的到货通知单"); @@ -444,6 +484,8 @@ public interface ErrorCodeConstants { ErrorCode WM_OUTSOURCE_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_707_100, "外协发料单行不存在"); ErrorCode WM_OUTSOURCE_ISSUE_LINE_ITEM_NOT_IN_BOM = new ErrorCode(1_040_707_101, "发料单行对应的物料不在当前工单的 BOM 列表中"); ErrorCode WM_OUTSOURCE_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_707_200, "外协发料单明细不存在"); + ErrorCode WM_OUTSOURCE_ISSUE_DETAIL_LINE_NOT_MATCH = new ErrorCode(1_040_707_201, "拣货明细不属于指定的外协发料单"); + ErrorCode WM_OUTSOURCE_ISSUE_DETAIL_ITEM_MISMATCH = new ErrorCode(1_040_707_202, "拣货明细的物料与外协发料单行的物料不一致"); ErrorCode WM_OUTSOURCE_ISSUE_WORK_ORDER_TYPE_INVALID = new ErrorCode(1_040_707_008, "工单类型不是外协(代工)类型"); // ========== MES 仓库管理-生产领料出库单(1-040-708-000) ========== @@ -459,6 +501,8 @@ public interface ErrorCodeConstants { ErrorCode WM_PRODUCT_ISSUE_CODE_DUPLICATE = new ErrorCode(1_040_708_102, "领料出库单编码已存在"); ErrorCode WM_PRODUCT_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_708_200, "生产领料出库单明细不存在"); ErrorCode WM_PRODUCT_ISSUE_DETAIL_ITEM_MISMATCH = new ErrorCode(1_040_708_201, "拣货明细的物料与领料单行的物料不一致"); + ErrorCode WM_PRODUCT_ISSUE_DETAIL_LINE_NOT_MATCH = new ErrorCode(1_040_708_202, "拣货明细不属于指定的领料出库单"); + ErrorCode WM_PRODUCT_ISSUE_NO_DETAIL = new ErrorCode(1_040_708_203, "领料出库单没有拣货明细,无法执行领出"); // ========== MES 仓库管理-生产入库单(1-040-709-000) ========== ErrorCode WM_PRODUCT_PRODUCE_NOT_EXISTS = new ErrorCode(1_040_709_000, "生产入库单不存在"); @@ -501,6 +545,8 @@ public interface ErrorCodeConstants { ErrorCode WM_RETURN_ISSUE_DETAIL_QUANTITY_INVALID = new ErrorCode(1_040_710_201, "退料明细数量必须大于0"); ErrorCode WM_RETURN_ISSUE_DETAIL_QUANTITY_EXCEED = new ErrorCode(1_040_710_202, "退料明细总数量不能超过退料单行数量"); ErrorCode WM_RETURN_ISSUE_CODE_DUPLICATE = new ErrorCode(1_040_710_203, "退料单编码已存在"); + ErrorCode WM_RETURN_ISSUE_DETAIL_LINE_NOT_MATCH = new ErrorCode(1_040_710_204, "退料明细不属于指定的退料单"); + ErrorCode WM_RETURN_ISSUE_DETAIL_ITEM_MISMATCH = new ErrorCode(1_040_710_205, "退料明细的物料与退料单行的物料不一致"); // ========== MES 仓库管理-供应商退货单(1-040-711-000) ========== ErrorCode WM_RETURN_VENDOR_NOT_EXISTS = new ErrorCode(1_040_711_000, "供应商退货单不存在"); @@ -514,6 +560,7 @@ public interface ErrorCodeConstants { ErrorCode WM_RETURN_VENDOR_LINE_NOT_EXISTS = new ErrorCode(1_040_711_100, "供应商退货单行不存在"); ErrorCode WM_RETURN_VENDOR_DETAIL_NOT_EXISTS = new ErrorCode(1_040_711_200, "供应商退货单明细不存在"); ErrorCode WM_RETURN_VENDOR_DETAIL_QUANTITY_INVALID = new ErrorCode(1_040_711_201, "退货明细数量必须大于 0"); + ErrorCode WM_RETURN_VENDOR_DETAIL_LINE_NOT_MATCH = new ErrorCode(1_040_711_202, "拣货明细不属于指定的供应商退货单"); // ========== MES 仓库管理-产品收货单(1-040-712-000) ========== ErrorCode WM_PRODUCT_RECPT_NOT_EXISTS = new ErrorCode(1_040_712_000, "产品收货单不存在"); @@ -588,6 +635,20 @@ public interface ErrorCodeConstants { ErrorCode WM_PRODUCT_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_714_012, "销售出库明细不存在"); ErrorCode WM_PRODUCT_SALES_STOCK_INSUFFICIENT = new ErrorCode(1_040_714_013, "库存不足,无法拣货"); ErrorCode WM_PRODUCT_SALES_LINE_QUANTITY_INVALID = new ErrorCode(1_040_714_014, "出库数量必须大于 0"); + ErrorCode WM_PRODUCT_SALES_DETAIL_LINE_NOT_MATCH = new ErrorCode(1_040_714_015, "拣货明细不属于指定的销售出库单"); + ErrorCode WM_PRODUCT_SALES_DETAIL_ITEM_MISMATCH = new ErrorCode(1_040_714_016, "拣货明细的物料与销售出库单行的物料不一致"); + ErrorCode WM_PRODUCT_SALES_LINE_SALES_NOTICE_LINE_REQUIRED = new ErrorCode(1_040_714_017, + "出库单关联了发货通知单,必须选择发货通知单行"); + ErrorCode WM_PRODUCT_SALES_LINE_SALES_NOTICE_LINE_NOT_ALLOWED = new ErrorCode(1_040_714_018, + "出库单未关联发货通知单,不能选择发货通知单行"); + ErrorCode WM_PRODUCT_SALES_LINE_NOTICE_LINE_ITEM_MISMATCH = new ErrorCode(1_040_714_030, + "出库行物料与发货通知单行物料不一致"); + ErrorCode WM_PRODUCT_SALES_LINE_NOTICE_LINE_QUANTITY_MISMATCH = new ErrorCode(1_040_714_031, + "出库行数量与发货通知单行数量不一致"); + ErrorCode WM_PRODUCT_SALES_LINE_NOTICE_LINE_BATCH_MISMATCH = new ErrorCode(1_040_714_032, + "出库行批次号与发货通知单行批次号不一致"); + ErrorCode WM_PRODUCT_SALES_LINE_NOTICE_LINE_OQC_MISMATCH = new ErrorCode(1_040_714_033, + "出库行 OQC 检验标识与发货通知单行不一致"); // ========== MES 仓库管理-杂项出库单(1-040-715-000) ========== ErrorCode WM_MISC_ISSUE_NOT_EXISTS = new ErrorCode(1_040_715_000, "杂项出库单不存在"); @@ -616,8 +677,11 @@ public interface ErrorCodeConstants { ErrorCode WM_SALES_NOTICE_CODE_DUPLICATE = new ErrorCode(1_040_720_001, "通知单编号重复"); ErrorCode WM_SALES_NOTICE_STATUS_NOT_ALLOW_DELETE = new ErrorCode(1_040_720_002, "单据状态不允许删除"); ErrorCode WM_SALES_NOTICE_STATUS_NOT_ALLOW_UPDATE = new ErrorCode(1_040_720_003, "单据状态不允许修改"); + ErrorCode WM_SALES_NOTICE_STATUS_NOT_APPROVED = new ErrorCode(1_040_720_004, "发货通知单不是待出库状态"); + ErrorCode WM_SALES_NOTICE_CLIENT_MISMATCH = new ErrorCode(1_040_720_005, "发货通知单的客户与当前单据不一致"); ErrorCode WM_SALES_NOTICE_LINE_NOT_EXISTS = new ErrorCode(1_040_720_010, "发货通知单行不存在"); ErrorCode WM_SALES_NOTICE_LINE_EMPTY = new ErrorCode(1_040_720_011, "发货通知单行为空,不能提交"); + ErrorCode WM_SALES_NOTICE_LINE_NOT_MATCH = new ErrorCode(1_040_720_012, "发货通知单行不属于指定的发货通知单"); // ========== MES 仓库管理-条码配置(1-040-730-000) ========== ErrorCode WM_BARCODE_CONFIG_NOT_EXISTS = new ErrorCode(1_040_730_000, "条码配置不存在"); diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/cal/MesCalShiftTypeEnum.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/cal/MesCalShiftTypeEnum.java index 940cbc888..c85671e47 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/cal/MesCalShiftTypeEnum.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/cal/MesCalShiftTypeEnum.java @@ -19,7 +19,7 @@ import java.util.List; public enum MesCalShiftTypeEnum implements ArrayValuable { SINGLE(1, "单白班", ListUtil.of( - Pair.of("白班", new String[]{"08:00", "17:00"}) + Pair.of("白班", new String[]{"08:00", "18:00"}) )), TWO(2, "两班倒", ListUtil.of( Pair.of("白班", new String[]{"08:00", "20:00"}), @@ -45,7 +45,7 @@ public enum MesCalShiftTypeEnum implements ArrayValuable { * 班次配置列表 * * key: 班次名称(如 "白班", "夜班", "中班") - * value: [startTime, endTime](如 ["08:00", "17:00"]) + * value: [startTime, endTime](如 ["08:00", "18:00"]) */ private final List> shifts; diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/dv/MesDvCheckPlanTypeEnum.java similarity index 60% rename from yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java rename to yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/dv/MesDvCheckPlanTypeEnum.java index 072637efb..c088f8823 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/dv/MesDvCheckPlanTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.mes.enums.wm; +package cn.iocoder.yudao.module.mes.enums.dv; import cn.iocoder.yudao.framework.common.core.ArrayValuable; import lombok.AllArgsConstructor; @@ -7,15 +7,18 @@ import lombok.Getter; import java.util.Arrays; /** - * MES 杂项入库类型枚举 + * MES 点检保养方案类型枚举 + * + * @author 芋道源码 */ @Getter @AllArgsConstructor -public enum MesWmMiscReceiptTypeEnum implements ArrayValuable { +public enum MesDvCheckPlanTypeEnum implements ArrayValuable { - ADJUST(1, "库存调整"); + CHECK(1, "点检"), + MAINTENANCE(2, "保养"); - public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmMiscReceiptTypeEnum::getType).toArray(Integer[]::new); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesDvCheckPlanTypeEnum::getType).toArray(Integer[]::new); /** * 类型值 diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/dv/MesDvMaintenRecordStatusEnum.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/dv/MesDvMaintenRecordStatusEnum.java index dd755ecec..b80ac7afb 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/dv/MesDvMaintenRecordStatusEnum.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/dv/MesDvMaintenRecordStatusEnum.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.enums.dv; import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; import lombok.AllArgsConstructor; import lombok.Getter; @@ -20,13 +21,13 @@ public enum MesDvMaintenRecordStatusEnum implements ArrayValuable { * * 对应 MesDvMaintenRecordService#createMaintenRecord 方法 */ - PREPARE(1, "草稿"), + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), /** * 已提交 * * 对应 MesDvMaintenRecordService#submitMaintenRecord 方法 */ - SUBMITTED(2, "已提交"); + SUBMITTED(MesOrderStatusConstants.FINISHED, "已提交"); public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesDvMaintenRecordStatusEnum::getStatus) .toArray(Integer[]::new); diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java index 698ec85dd..1acb33c9f 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java @@ -12,10 +12,12 @@ import lombok.Getter; @AllArgsConstructor public enum MesMdAutoCodeRuleCodeEnum { + MD_ITEM_TYPE_CODE("MD_ITEM_TYPE_CODE", "物料分类编码"), MD_ITEM_CODE("MD_ITEM_CODE", "物料编码"), MD_VENDOR_CODE("MD_VENDOR_CODE", "供应商编码"), MD_CLIENT_CODE("MD_CLIENT_CODE", "客户编码"), MD_WORKSTATION_CODE("MD_WORKSTATION_CODE", "工作站编码"), + MD_WORKSHOP_CODE("MD_WORKSHOP_CODE", "车间编码"), TM_TOOL_TYPE_CODE("TM_TOOL_TYPE_CODE", "工具类型编码"), WM_ARRIVAL_NOTICE_CODE("WM_ARRIVAL_NOTICE_CODE", "到货通知单编码"), WM_ITEM_RECEIPT_CODE("WM_ITEM_RECEIPT_CODE", "采购入库单编码"), diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkplan/MesDvCheckPlanMachineryController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkplan/MesDvCheckPlanMachineryController.java index ab1b5fd1b..b44a36386 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkplan/MesDvCheckPlanMachineryController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkplan/MesDvCheckPlanMachineryController.java @@ -75,7 +75,7 @@ public class MesDvCheckPlanMachineryController { return BeanUtils.toBean(list, MesDvCheckPlanMachineryRespVO.class, vo -> MapUtils.findAndThen(machineryMap, vo.getMachineryId(), machinery -> vo.setMachineryCode(machinery.getCode()).setMachineryName(machinery.getName()) - .setMachineryBrand(machinery.getBrand()).setMachinerySpec(machinery.getSpec()) + .setMachineryBrand(machinery.getBrand()).setMachinerySpecification(machinery.getSpecification()) ) ); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkplan/vo/machinery/MesDvCheckPlanMachineryRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkplan/vo/machinery/MesDvCheckPlanMachineryRespVO.java index 0d2b74267..f3e226a52 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkplan/vo/machinery/MesDvCheckPlanMachineryRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkplan/vo/machinery/MesDvCheckPlanMachineryRespVO.java @@ -28,7 +28,7 @@ public class MesDvCheckPlanMachineryRespVO { private String machineryBrand; @Schema(description = "规格型号", example = "HTF120") - private String machinerySpec; + private String machinerySpecification; @Schema(description = "备注") private String remark; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/MesDvCheckRecordController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/MesDvCheckRecordController.java index 79e8bd92c..676a08f84 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/MesDvCheckRecordController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/MesDvCheckRecordController.java @@ -46,10 +46,8 @@ public class MesDvCheckRecordController { @Resource private MesDvCheckRecordService checkRecordService; - @Resource private MesDvCheckPlanService checkPlanService; - @Resource private MesDvMachineryService machineryService; @@ -143,7 +141,7 @@ public class MesDvCheckRecordController { .setPlanCycleType(plan.getCycleType()).setPlanCycleCount(plan.getCycleCount())); MapUtils.findAndThen(machineryMap, vo.getMachineryId(), machinery -> vo .setMachineryCode(machinery.getCode()).setMachineryName(machinery.getName()) - .setMachineryBrand(machinery.getBrand()).setMachinerySpec(machinery.getSpec())); + .setMachineryBrand(machinery.getBrand()).setMachinerySpecification(machinery.getSpecification())); MapUtils.findAndThen(userMap, vo.getUserId(), user -> vo.setNickname(user.getNickname())); }); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordRespVO.java index 5dc284939..b65e04362 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordRespVO.java @@ -64,7 +64,7 @@ public class MesDvCheckRecordRespVO { @Schema(description = "规格型号", example = "X-100") @ExcelProperty("规格型号") - private String machinerySpec; + private String machinerySpecification; @Schema(description = "点检时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("点检时间") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/MesDvMachineryController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/MesDvMachineryController.java index 6ff7a4be9..49950620e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/MesDvMachineryController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/MesDvMachineryController.java @@ -48,10 +48,8 @@ public class MesDvMachineryController { @Resource private MesDvMachineryService machineryService; - @Resource private MesDvMachineryTypeService machineryTypeService; - @Resource private MesMdWorkshopService workshopService; @@ -126,7 +124,7 @@ public class MesDvMachineryController { // 手动创建导出 demo List list = Collections.singletonList( MesDvMachineryImportExcelVO.builder().code("EQ-001").name("示例设备") - .brand("示例品牌").spec("型号A").machineryTypeCode("MT-001") + .brand("示例品牌").specification("型号A").machineryTypeCode("MT-001") .workshopCode("WS-001").status(0).build() ); // 输出 diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachineryImportExcelVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachineryImportExcelVO.java index 64f8d824c..82b236455 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachineryImportExcelVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachineryImportExcelVO.java @@ -28,7 +28,7 @@ public class MesDvMachineryImportExcelVO { private String brand; @ExcelProperty("规格型号") - private String spec; + private String specification; @ExcelProperty("设备类型编码") private String machineryTypeCode; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachineryRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachineryRespVO.java index 1cd7538a7..82829094c 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachineryRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachineryRespVO.java @@ -33,7 +33,7 @@ public class MesDvMachineryRespVO { @Schema(description = "规格型号", example = "S7-300") @ExcelProperty("规格型号") - private String spec; + private String specification; @Schema(description = "设备类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") private Long machineryTypeId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachinerySaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachinerySaveReqVO.java index 846e84931..64960b24a 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachinerySaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/MesDvMachinerySaveReqVO.java @@ -26,7 +26,7 @@ public class MesDvMachinerySaveReqVO { private String brand; @Schema(description = "规格型号", example = "S7-300") - private String spec; + private String specification; @Schema(description = "设备类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @NotNull(message = "设备类型不能为空") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/maintenrecord/MesDvMaintenRecordController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/maintenrecord/MesDvMaintenRecordController.java index decaf077a..e12a4de34 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/maintenrecord/MesDvMaintenRecordController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/maintenrecord/MesDvMaintenRecordController.java @@ -46,10 +46,8 @@ public class MesDvMaintenRecordController { @Resource private MesDvMaintenRecordService maintenRecordService; - @Resource private MesDvCheckPlanService checkPlanService; - @Resource private MesDvMachineryService machineryService; @@ -146,7 +144,7 @@ public class MesDvMaintenRecordController { .setPlanCycleCount(plan.getCycleCount())); MapUtils.findAndThen(machineryMap, vo.getMachineryId(), machinery -> vo .setMachineryCode(machinery.getCode()).setMachineryName(machinery.getName()) - .setMachineryBrand(machinery.getBrand()).setMachinerySpec(machinery.getSpec())); + .setMachineryBrand(machinery.getBrand()).setMachinerySpecification(machinery.getSpecification())); MapUtils.findAndThen(userMap, vo.getUserId(), user -> vo.setNickname(user.getNickname())); }); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/maintenrecord/vo/MesDvMaintenRecordRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/maintenrecord/vo/MesDvMaintenRecordRespVO.java index e159fcf63..ed3dab093 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/maintenrecord/vo/MesDvMaintenRecordRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/maintenrecord/vo/MesDvMaintenRecordRespVO.java @@ -64,7 +64,7 @@ public class MesDvMaintenRecordRespVO { @Schema(description = "规格型号", example = "X-100") @ExcelProperty("规格型号") - private String machinerySpec; + private String machinerySpecification; @Schema(description = "保养时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("保养时间") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/repair/MesDvRepairController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/repair/MesDvRepairController.java index 0dd241fca..6ac726b2e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/repair/MesDvRepairController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/repair/MesDvRepairController.java @@ -48,7 +48,6 @@ public class MesDvRepairController { @Resource private MesDvRepairService repairService; - @Resource private MesDvMachineryService machineryService; @@ -160,7 +159,7 @@ public class MesDvRepairController { return BeanUtils.toBean(list, MesDvRepairRespVO.class, vo -> { MapUtils.findAndThen(machineryMap, vo.getMachineryId(), machinery -> vo .setMachineryCode(machinery.getCode()).setMachineryName(machinery.getName()) - .setMachineryBrand(machinery.getBrand()).setMachinerySpec(machinery.getSpec())); + .setMachineryBrand(machinery.getBrand()).setMachinerySpecification(machinery.getSpecification())); MapUtils.findAndThen(userMap, vo.getAcceptedUserId(), user -> vo.setAcceptedUserNickname(user.getNickname())); MapUtils.findAndThen(userMap, vo.getConfirmUserId(), diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/repair/vo/MesDvRepairRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/repair/vo/MesDvRepairRespVO.java index c5a8fb75c..97c5c7db2 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/repair/vo/MesDvRepairRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/repair/vo/MesDvRepairRespVO.java @@ -44,7 +44,7 @@ public class MesDvRepairRespVO { @Schema(description = "规格型号", example = "X-100") @ExcelProperty("规格型号") - private String machinerySpec; + private String machinerySpecification; @Schema(description = "报修日期") @ExcelProperty("报修日期") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/client/vo/MesMdClientImportExcelVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/client/vo/MesMdClientImportExcelVO.java index 64f5c1251..ee99e1ce7 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/client/vo/MesMdClientImportExcelVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/client/vo/MesMdClientImportExcelVO.java @@ -37,6 +37,39 @@ public class MesMdClientImportExcelVO { @ExcelProperty("客户邮箱地址") private String email; + @ExcelProperty("客户英文名称") + private String englishName; + + @ExcelProperty("客户简介") + private String description; + + @ExcelProperty("客户地址") + private String address; + + @ExcelProperty("客户官网地址") + private String website; + + @ExcelProperty("联系人1") + private String contact1Name; + + @ExcelProperty("联系人1-电话") + private String contact1Telephone; + + @ExcelProperty("联系人1-邮箱") + private String contact1Email; + + @ExcelProperty("联系人2") + private String contact2Name; + + @ExcelProperty("联系人2-电话") + private String contact2Telephone; + + @ExcelProperty("联系人2-邮箱") + private String contact2Email; + + @ExcelProperty("统一社会信用代码") + private String creditCode; + @ExcelProperty(value = "状态", converter = DictConvert.class) @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.COMMON_STATUS) private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/client/vo/MesMdClientSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/client/vo/MesMdClientSaveReqVO.java index cf17a01ef..2166f927f 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/client/vo/MesMdClientSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/client/vo/MesMdClientSaveReqVO.java @@ -1,11 +1,12 @@ package cn.iocoder.yudao.module.mes.controller.admin.md.client.vo; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Data; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - @Schema(description = "管理后台 - MES 客户新增/修改 Request VO") @Data public class MesMdClientSaveReqVO { @@ -15,22 +16,28 @@ public class MesMdClientSaveReqVO { @Schema(description = "客户编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "C00184") @NotEmpty(message = "客户编码不能为空") + @Size(max = 64, message = "客户编码长度不能超过 64 个字符") private String code; @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "比亚迪") @NotEmpty(message = "客户名称不能为空") + @Size(max = 255, message = "客户名称长度不能超过 255 个字符") private String name; @Schema(description = "客户简称", example = "比亚迪") + @Size(max = 255, message = "客户简称长度不能超过 255 个字符") private String nickname; @Schema(description = "客户英文名称", example = "BYD") + @Size(max = 255, message = "客户英文名称长度不能超过 255 个字符") private String englishName; @Schema(description = "客户简介", example = "比亚迪品牌诞生于深圳") + @Size(max = 500, message = "客户简介长度不能超过 500 个字符") private String description; @Schema(description = "客户LOGO地址", example = "https://xxx.com/logo.png") + @Size(max = 255, message = "客户LOGO地址长度不能超过 255 个字符") private String logo; @Schema(description = "客户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @@ -38,36 +45,50 @@ public class MesMdClientSaveReqVO { private Integer type; @Schema(description = "客户地址", example = "深圳南山区") + @Size(max = 500, message = "客户地址长度不能超过 500 个字符") private String address; @Schema(description = "客户官网地址", example = "https://www.bydglobal.com") + @Size(max = 255, message = "客户官网地址长度不能超过 255 个字符") private String website; @Schema(description = "客户邮箱地址", example = "salse@bydglobal.com") + @Size(max = 255, message = "客户邮箱地址长度不能超过 255 个字符") + @Email(message = "客户邮箱地址格式不正确") private String email; @Schema(description = "客户电话", example = "123432222") + @Size(max = 64, message = "客户电话长度不能超过 64 个字符") private String telephone; @Schema(description = "联系人1", example = "张三") + @Size(max = 64, message = "联系人1长度不能超过 64 个字符") private String contact1Name; @Schema(description = "联系人1-电话", example = "122212312") + @Size(max = 64, message = "联系人1-电话长度不能超过 64 个字符") private String contact1Telephone; @Schema(description = "联系人1-邮箱", example = "s1@bydglobal.com") + @Size(max = 255, message = "联系人1-邮箱长度不能超过 255 个字符") + @Email(message = "联系人1-邮箱格式不正确") private String contact1Email; @Schema(description = "联系人2", example = "李四") + @Size(max = 64, message = "联系人2长度不能超过 64 个字符") private String contact2Name; @Schema(description = "联系人2-电话", example = "1132323232") + @Size(max = 64, message = "联系人2-电话长度不能超过 64 个字符") private String contact2Telephone; @Schema(description = "联系人2-邮箱", example = "s2@bydglobal.com") + @Size(max = 255, message = "联系人2-邮箱长度不能超过 255 个字符") + @Email(message = "联系人2-邮箱格式不正确") private String contact2Email; @Schema(description = "统一社会信用代码", example = "11212121") + @Size(max = 64, message = "统一社会信用代码长度不能超过 64 个字符") private String creditCode; @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") @@ -75,6 +96,7 @@ public class MesMdClientSaveReqVO { private Integer status; @Schema(description = "备注", example = "备注") + @Size(max = 500, message = "备注长度不能超过 500 个字符") private String remark; } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vendor/vo/MesMdVendorImportExcelVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vendor/vo/MesMdVendorImportExcelVO.java index 44aaa35cc..237e60385 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vendor/vo/MesMdVendorImportExcelVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vendor/vo/MesMdVendorImportExcelVO.java @@ -37,6 +37,39 @@ public class MesMdVendorImportExcelVO { @ExcelProperty("供应商邮箱地址") private String email; + @ExcelProperty("供应商英文名称") + private String englishName; + + @ExcelProperty("供应商简介") + private String description; + + @ExcelProperty("供应商地址") + private String address; + + @ExcelProperty("供应商官网地址") + private String website; + + @ExcelProperty("联系人1") + private String contact1Name; + + @ExcelProperty("联系人1-电话") + private String contact1Telephone; + + @ExcelProperty("联系人1-邮箱") + private String contact1Email; + + @ExcelProperty("联系人2") + private String contact2Name; + + @ExcelProperty("联系人2-电话") + private String contact2Telephone; + + @ExcelProperty("联系人2-邮箱") + private String contact2Email; + + @ExcelProperty("统一社会信用代码") + private String creditCode; + @ExcelProperty(value = "状态", converter = DictConvert.class) @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.COMMON_STATUS) private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vendor/vo/MesMdVendorSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vendor/vo/MesMdVendorSaveReqVO.java index fc73f6a6f..c17c653bf 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vendor/vo/MesMdVendorSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/vendor/vo/MesMdVendorSaveReqVO.java @@ -1,11 +1,12 @@ package cn.iocoder.yudao.module.mes.controller.admin.md.vendor.vo; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Data; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - @Schema(description = "管理后台 - MES 供应商新增/修改 Request VO") @Data public class MesMdVendorSaveReqVO { @@ -15,61 +16,82 @@ public class MesMdVendorSaveReqVO { @Schema(description = "供应商编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "V00101") @NotEmpty(message = "供应商编码不能为空") + @Size(max = 64, message = "供应商编码长度不能超过 64 个字符") private String code; @Schema(description = "供应商名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "海力德电子") @NotEmpty(message = "供应商名称不能为空") + @Size(max = 255, message = "供应商名称长度不能超过 255 个字符") private String name; @Schema(description = "供应商简称", example = "海力德") + @Size(max = 255, message = "供应商简称长度不能超过 255 个字符") private String nickname; @Schema(description = "供应商英文名称", example = "HLD Electronics") + @Size(max = 255, message = "供应商英文名称长度不能超过 255 个字符") private String englishName; @Schema(description = "供应商简介", example = "专业从事电子元器件生产与销售") + @Size(max = 500, message = "供应商简介长度不能超过 500 个字符") private String description; @Schema(description = "供应商LOGO地址", example = "https://xxx.com/logo.png") + @Size(max = 255, message = "供应商LOGO地址长度不能超过 255 个字符") private String logo; @Schema(description = "供应商等级", example = "A") + @Size(max = 64, message = "供应商等级长度不能超过 64 个字符") private String level; @Schema(description = "供应商评分", example = "95") private Integer score; @Schema(description = "供应商地址", example = "深圳市宝安区") + @Size(max = 500, message = "供应商地址长度不能超过 500 个字符") private String address; @Schema(description = "供应商官网地址", example = "https://www.hld-elec.com") + @Size(max = 255, message = "供应商官网地址长度不能超过 255 个字符") private String website; @Schema(description = "供应商邮箱地址", example = "info@hld-elec.com") + @Size(max = 255, message = "供应商邮箱地址长度不能超过 255 个字符") + @Email(message = "供应商邮箱地址格式不正确") private String email; @Schema(description = "供应商电话", example = "0755-12345678") + @Size(max = 64, message = "供应商电话长度不能超过 64 个字符") private String telephone; @Schema(description = "联系人1", example = "王经理") + @Size(max = 64, message = "联系人1长度不能超过 64 个字符") private String contact1Name; @Schema(description = "联系人1-电话", example = "13800138001") + @Size(max = 64, message = "联系人1-电话长度不能超过 64 个字符") private String contact1Telephone; @Schema(description = "联系人1-邮箱", example = "wang@hld-elec.com") + @Size(max = 255, message = "联系人1-邮箱长度不能超过 255 个字符") + @Email(message = "联系人1-邮箱格式不正确") private String contact1Email; @Schema(description = "联系人2", example = "赵助理") + @Size(max = 64, message = "联系人2长度不能超过 64 个字符") private String contact2Name; @Schema(description = "联系人2-电话", example = "13800138002") + @Size(max = 64, message = "联系人2-电话长度不能超过 64 个字符") private String contact2Telephone; @Schema(description = "联系人2-邮箱", example = "zhao@hld-elec.com") + @Size(max = 255, message = "联系人2-邮箱长度不能超过 255 个字符") + @Email(message = "联系人2-邮箱格式不正确") private String contact2Email; @Schema(description = "统一社会信用代码", example = "91440300MA5EXAMPLE") + @Size(max = 64, message = "统一社会信用代码长度不能超过 64 个字符") private String creditCode; @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") @@ -77,6 +99,7 @@ public class MesMdVendorSaveReqVO { private Integer status; @Schema(description = "备注", example = "备注") + @Size(max = 500, message = "备注长度不能超过 500 个字符") private String remark; } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/workstation/MesMdWorkshopController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/workstation/MesMdWorkshopController.java index 7aa433474..8e46b5911 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/workstation/MesMdWorkshopController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/workstation/MesMdWorkshopController.java @@ -77,7 +77,11 @@ public class MesMdWorkshopController { @PreAuthorize("@ss.hasPermission('mes:md-workshop:query')") public CommonResult getWorkshop(@RequestParam("id") Long id) { MesMdWorkshopDO workshop = workshopService.getWorkshop(id); - return success(BeanUtils.toBean(workshop, MesMdWorkshopRespVO.class)); + if (workshop == null) { + return success(null); + } + List voList = buildWorkshopRespVOList(Collections.singletonList(workshop)); + return success(voList.get(0)); } @GetMapping("/page") @@ -92,8 +96,19 @@ public class MesMdWorkshopController { @Operation(summary = "获得车间精简列表", description = "只包含被开启的车间,主要用于前端的下拉选项") public CommonResult> getWorkshopSimpleList() { List list = workshopService.getWorkshopListByStatus(CommonStatusEnum.ENABLE.getStatus()); - return success(convertList(list, ws -> new MesMdWorkshopRespVO() - .setId(ws.getId()).setCode(ws.getCode()).setName(ws.getName()).setArea(ws.getArea()))); + if (CollUtil.isEmpty(list)) { + return success(Collections.emptyList()); + } + // 批量获取负责人信息 + Map userMap = adminUserApi.getUserMap( + convertSet(list, MesMdWorkshopDO::getChargeUserId)); + return success(convertList(list, ws -> { + MesMdWorkshopRespVO vo = new MesMdWorkshopRespVO() + .setId(ws.getId()).setCode(ws.getCode()).setName(ws.getName()).setArea(ws.getArea()); + MapUtils.findAndThen(userMap, ws.getChargeUserId(), + user -> vo.setChargeUserName(user.getNickname())); + return vo; + })); } @GetMapping("/export-excel") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java index 146575c49..4970844a3 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java @@ -47,13 +47,10 @@ public class MesProCardController { @Resource private MesProCardService cardService; - @Resource private MesProWorkOrderService workOrderService; - @Resource private MesMdItemService itemService; - @Resource private MesMdUnitMeasureService unitMeasureService; @@ -128,12 +125,6 @@ public class MesProCardController { return success(new PageResult<>(buildCardRespVOList(pageResult.getList()), pageResult.getTotal())); } - @GetMapping("/simple-list") - @Operation(summary = "获得生产流转卡精简列表", description = "主要用于前端的下拉选项") - public CommonResult> getCardSimpleList() { - List list = cardService.getCardSimpleList(); - return success(buildCardRespVOList(list)); - } @GetMapping("/export-excel") @Operation(summary = "导出生产流转卡 Excel") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java index 59e2c7e68..4e3fca97b 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java @@ -32,13 +32,13 @@ public class MesProCardRespVO { @ExcelProperty("工单名称") private String workOrderName; + @Schema(description = "产品物料编号", example = "200") + private Long itemId; + @Schema(description = "批次号", example = "BATCH-001") @ExcelProperty("批次号") private String batchCode; - @Schema(description = "产品物料编号", example = "200") - private Long itemId; - @Schema(description = "产品编码", example = "P-001") @ExcelProperty("产品编码") private String itemCode; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardSaveReqVO.java index dc0c599c5..2cb322586 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardSaveReqVO.java @@ -22,13 +22,13 @@ public class MesProCardSaveReqVO { @NotNull(message = "生产工单不能为空") private Long workOrderId; - @Schema(description = "批次号", example = "BATCH-001") - private String batchCode; - @Schema(description = "产品物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") @NotNull(message = "产品物料不能为空") private Long itemId; + @Schema(description = "批次号", example = "BATCH-001") + private String batchCode; + @Schema(description = "流转数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") @NotNull(message = "流转数量不能为空") private BigDecimal transferedQuantity; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java index 55dbe57f5..9e7e5a104 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java @@ -49,7 +49,7 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPOR import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + @Tag(name = "管理后台 - MES 生产报工") @RestController @@ -158,7 +158,7 @@ public class MesProFeedbackController { @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:pro-feedback:approve')") public CommonResult approveFeedback(@RequestParam("id") Long id) { - return success(feedbackService.approveFeedback(id, getLoginUserId())); + return success(feedbackService.approveFeedback(id)); } // ==================== 拼接 VO ==================== diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java index a6de35d09..20fbfb94d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java @@ -32,19 +32,20 @@ import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; +import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService; + import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -59,24 +60,20 @@ public class MesProTaskController { @Resource private MesProTaskService taskService; - @Resource private MesProWorkOrderService workOrderService; - @Resource private MesMdWorkstationService workstationService; - @Resource private MesProProcessService processService; - @Resource private MesMdItemService itemService; - @Resource private MesMdClientService clientService; - @Resource private MesMdUnitMeasureService unitMeasureService; + @Resource + private MesProRouteProcessService routeProcessService; @PostMapping("/create") @Operation(summary = "创建生产任务") @@ -122,18 +119,6 @@ public class MesProTaskController { return success(new PageResult<>(buildTaskRespVOList(pageResult.getList()), pageResult.getTotal())); } - @GetMapping("/simple-list") - @Operation(summary = "获得生产任务精简列表", description = "主要用于前端的下拉选项") - public CommonResult> getTaskSimpleList( - @RequestParam(value = "workOrderId", required = false) Long workOrderId) { - List list = taskService.getTaskListByWorkOrderId(workOrderId); - return success(convertList(list, task -> new MesProTaskRespVO() - .setId(task.getId()).setCode(task.getCode()).setName(task.getName()) - .setWorkOrderId(task.getWorkOrderId()).setWorkstationId(task.getWorkstationId()) - .setRouteId(task.getRouteId()).setProcessId(task.getProcessId()) - .setItemId(task.getItemId()).setStatus(task.getStatus()))); - } - @GetMapping("/gantt-list") @Operation(summary = "获得甘特图任务列表", description = "后端组装工单=project + 任务=task 列表") @PreAuthorize("@ss.hasPermission('mes:pro-task:query')") @@ -229,11 +214,24 @@ public class MesProTaskController { Map workstationMap = workstationService.getWorkstationMap( convertSet(list, MesProTaskDO::getWorkstationId)); Map processMap = processService.getProcessMap( - new java.util.ArrayList<>(convertSet(list, MesProTaskDO::getProcessId))); + new ArrayList<>(convertSet(list, MesProTaskDO::getProcessId))); Map itemMap = itemService.getItemMap( convertSet(list, MesProTaskDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); Map clientMap = clientService.getClientMap( convertSet(list, MesProTaskDO::getClientId)); + // 工序的 checkFlag:批量查询后构建 routeId -> processId -> checkFlag 的双层 Map + Set routeIds = convertSet(list, MesProTaskDO::getRouteId); + Map> routeProcessCheckFlagMap = new HashMap<>(); + if (CollUtil.isNotEmpty(routeIds)) { + List allRouteProcesses = routeProcessService.getRouteProcessListByRouteIds(routeIds); + for (MesProRouteProcessDO rp : allRouteProcesses) { + routeProcessCheckFlagMap + .computeIfAbsent(rp.getRouteId(), k -> new HashMap<>()) + .put(rp.getProcessId(), Boolean.TRUE.equals(rp.getCheckFlag())); + } + } // 拼接 VO return convertList(list, task -> { MesProTaskRespVO vo = BeanUtils.toBean(task, MesProTaskRespVO.class); @@ -243,10 +241,15 @@ public class MesProTaskController { vo.setWorkstationCode(ws.getCode()).setWorkstationName(ws.getName())); findAndThen(processMap, task.getProcessId(), p -> vo.setProcessName(p.getName())); - findAndThen(itemMap, task.getItemId(), item -> - vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpec(item.getSpecification())); + findAndThen(itemMap, task.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification()); + findAndThen(unitMeasureMap, item.getUnitMeasureId(), unit -> + vo.setUnitMeasureName(unit.getName())); + }); findAndThen(clientMap, task.getClientId(), c -> vo.setClientName(c.getName())); + findAndThen(routeProcessCheckFlagMap, task.getRouteId(), processCheckMap -> + findAndThen(processCheckMap, task.getProcessId(), vo::setCheckFlag)); return vo; }); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskIssueController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskIssueController.java index d4c0b47a8..8de505311 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskIssueController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskIssueController.java @@ -40,10 +40,8 @@ public class MesProTaskIssueController { @Resource private MesProTaskIssueService taskIssueService; - @Resource private MesMdItemService itemService; - @Resource private MesMdUnitMeasureService unitMeasureService; @@ -115,7 +113,7 @@ public class MesProTaskIssueController { return cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList(list, issue -> { MesProTaskIssueRespVO vo = BeanUtils.toBean(issue, MesProTaskIssueRespVO.class); findAndThen(itemMap, issue.getItemId(), item -> - vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpec(item.getSpecification())); + vo.setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification())); findAndThen(unitMap, issue.getUnitMeasureId(), unit -> vo.setUnitMeasureName(unit.getName())); return vo; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskIssueRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskIssueRespVO.java index 74e68369f..6e0833eb5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskIssueRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskIssueRespVO.java @@ -22,21 +22,21 @@ public class MesProTaskIssueRespVO { @Schema(description = "工作站编号", example = "1") private Long workstationId; + @Schema(description = "来源单据类型", example = "MATERIAL_ISSUE") + private String sourceDocType; + @Schema(description = "来源单据编号", example = "1") private Long sourceDocId; + @Schema(description = "来源单据行编号", example = "1") + private Long sourceLineId; + @Schema(description = "来源单据编码", example = "DOC-001") private String sourceDocCode; - @Schema(description = "来源单据类型", example = "MATERIAL_ISSUE") - private String sourceDocType; - @Schema(description = "投料批次", example = "BATCH-001") private String batchCode; - @Schema(description = "来源单据行编号", example = "1") - private Long sourceLineId; - @Schema(description = "产品物料编号", example = "100") private Long itemId; @@ -47,7 +47,7 @@ public class MesProTaskIssueRespVO { private String itemName; @Schema(description = "规格型号", example = "100x200mm") - private String itemSpec; + private String itemSpecification; @Schema(description = "单位编号", example = "1") private Long unitMeasureId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskIssueSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskIssueSaveReqVO.java index 1a5591353..951efb273 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskIssueSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskIssueSaveReqVO.java @@ -23,22 +23,22 @@ public class MesProTaskIssueSaveReqVO { @Schema(description = "工作站编号", example = "1") private Long workstationId; + @Schema(description = "来源单据类型", example = "MATERIAL_ISSUE") + private String sourceDocType; + @Schema(description = "来源单据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "来源单据编号不能为空") private Long sourceDocId; + @Schema(description = "来源单据行编号", example = "1") + private Long sourceLineId; + @Schema(description = "来源单据编码", example = "DOC-001") private String sourceDocCode; - @Schema(description = "来源单据类型", example = "MATERIAL_ISSUE") - private String sourceDocType; - @Schema(description = "投料批次", example = "BATCH-001") private String batchCode; - @Schema(description = "来源单据行编号", example = "1") - private Long sourceLineId; - @Schema(description = "产品物料编号", example = "100") private Long itemId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskPageReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskPageReqVO.java index b38b80148..28b4c060c 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskPageReqVO.java @@ -8,6 +8,7 @@ import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; +import java.util.List; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -38,6 +39,12 @@ public class MesProTaskPageReqVO extends PageParam { @Schema(description = "任务状态", example = "0") private Integer status; + @Schema(description = "任务状态列表(IN 查询)", example = "[0, 1, 2]") + private List statuses; + + @Schema(description = "是否质检(关联工艺路线工序)", example = "true") + private Boolean checkFlag; + @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java index 743ece81b..468636fdc 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskRespVO.java @@ -56,7 +56,10 @@ public class MesProTaskRespVO { private String itemName; @Schema(description = "规格型号", example = "100x200mm") - private String itemSpec; + private String itemSpecification; + + @Schema(description = "计量单位名称", example = "个") + private String unitMeasureName; @Schema(description = "排产数量", example = "100.00") private BigDecimal quantity; @@ -103,6 +106,9 @@ public class MesProTaskRespVO { @Schema(description = "任务状态", example = "0") private Integer status; + @Schema(description = "是否质检(派生自工艺路线工序 checkFlag)", example = "true") + private Boolean checkFlag; + @Schema(description = "备注", example = "备注") private String remark; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java index 4ac27ef8c..833b4b286 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java @@ -44,16 +44,12 @@ public class MesProWorkOrderBomController { @Resource private MesProWorkOrderBomService workOrderBomService; - @Resource private MesMdItemService itemService; - @Resource private MesMdUnitMeasureService unitMeasureService; - @Resource private MesMdItemTypeService itemTypeService; - @Resource private MesMdProductBomService productBomService; @@ -123,6 +119,8 @@ public class MesProWorkOrderBomController { Map itemMap = itemService.getItemMap(leafItems.keySet()); Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + Map itemTypeMap = itemTypeService.getItemTypeMap( + convertSet(itemMap.values(), MesMdItemDO::getItemTypeId)); List result = new ArrayList<>(leafItems.size()); for (Map.Entry entry : leafItems.entrySet()) { MesMdItemDO item = itemMap.get(entry.getKey()); @@ -131,9 +129,11 @@ public class MesProWorkOrderBomController { } MesProWorkOrderItemRespVO vo = new MesProWorkOrderItemRespVO() .setItemId(item.getId()).setQuantity(entry.getValue()) - .setItemCode(item.getCode()).setItemName(item.getName()).setItemSpec(item.getSpecification()); + .setItemCode(item.getCode()).setItemName(item.getName()).setItemSpecification(item.getSpecification()); MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + MapUtils.findAndThen(itemTypeMap, item.getItemTypeId(), + itemType -> vo.setItemOrProduct(itemType.getItemOrProduct())); result.add(vo); } return success(result); @@ -156,7 +156,7 @@ public class MesProWorkOrderBomController { return BeanUtils.toBean(list, MesProWorkOrderBomRespVO.class, vo -> { MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { vo.setItemName(item.getName()).setItemCode(item.getCode()) - .setItemSpec(item.getSpecification()); + .setItemSpecification(item.getSpecification()); MapUtils.findAndThen(itemTypeMap, item.getItemTypeId(), itemType -> vo.setItemOrProduct(itemType.getItemOrProduct())); MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderController.java index 0afcf6357..e19e3bb20 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderController.java @@ -47,16 +47,12 @@ public class MesProWorkOrderController { @Resource private MesProWorkOrderService workOrderService; - @Resource private MesMdItemService itemService; - @Resource private MesMdClientService clientService; - @Resource private MesMdVendorService vendorService; - @Resource private MesMdUnitMeasureService unitMeasureService; @@ -165,7 +161,7 @@ public class MesProWorkOrderController { return BeanUtils.toBean(list, MesProWorkOrderRespVO.class, vo -> { MapUtils.findAndThen(itemMap, vo.getProductId(), item -> { vo.setProductName(item.getName()).setProductCode(item.getCode()) - .setProductSpec(item.getSpecification()); + .setProductSpecification(item.getSpecification()); MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); }); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderItemRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderItemRespVO.java index efd077f79..922bc243a 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderItemRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderItemRespVO.java @@ -19,7 +19,7 @@ public class MesProWorkOrderItemRespVO { private String itemName; @Schema(description = "规格型号", example = "0603") - private String itemSpec; + private String itemSpecification; @Schema(description = "单位名称", example = "个") private String unitMeasureName; @@ -27,4 +27,7 @@ public class MesProWorkOrderItemRespVO { @Schema(description = "需求数量", example = "1000.00") private BigDecimal quantity; + @Schema(description = "物料/产品标识", example = "ITEM") + private String itemOrProduct; + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderPageReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderPageReqVO.java index 357fc314f..cc17629c9 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderPageReqVO.java @@ -35,6 +35,9 @@ public class MesProWorkOrderPageReqVO extends PageParam { @Schema(description = "客户编号", example = "300") private Long clientId; + @Schema(description = "工单状态", example = "1") + private Integer status; + @Schema(description = "需求日期") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] requestDate; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderRespVO.java index 973775d4c..122fdd3e1 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderRespVO.java @@ -55,7 +55,7 @@ public class MesProWorkOrderRespVO { @Schema(description = "规格型号", example = "100x200mm") @ExcelProperty("规格型号") - private String productSpec; + private String productSpecification; @Schema(description = "单位名称", example = "个") @ExcelProperty("单位") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/bom/MesProWorkOrderBomRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/bom/MesProWorkOrderBomRespVO.java index ca4e31eeb..140e49eef 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/bom/MesProWorkOrderBomRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/bom/MesProWorkOrderBomRespVO.java @@ -33,7 +33,7 @@ public class MesProWorkOrderBomRespVO { @Schema(description = "规格型号", example = "10K 0603") @ExcelProperty("规格型号") - private String itemSpec; + private String itemSpecification; @Schema(description = "单位编号", example = "300") private Long unitMeasureId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectPageReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectPageReqVO.java index 7f2638cd9..dbd1b7a88 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectPageReqVO.java @@ -18,8 +18,8 @@ public class MesQcDefectPageReqVO extends PageParam { @Schema(description = "缺陷描述", example = "外观缺陷") private String name; - @Schema(description = "检测项类型", example = "APPEARANCE") - private String type; + @Schema(description = "检测项类型", example = "2") + private Integer type; @Schema(description = "缺陷等级", example = "1") private Integer level; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java index 0cc9cf8f9..4efb97188 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java @@ -27,10 +27,10 @@ public class MesQcDefectRespVO { @ExcelProperty("缺陷描述") private String name; - @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "APPEARANCE") + @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") @ExcelProperty(value = "检测项类型", converter = DictConvert.class) @DictFormat(DictTypeConstants.MES_DEFECT_TYPE) - private String type; + private Integer type; @Schema(description = "缺陷等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @ExcelProperty(value = "缺陷等级", converter = DictConvert.class) diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectSaveReqVO.java index eee4d279a..5c209c460 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectSaveReqVO.java @@ -23,9 +23,9 @@ public class MesQcDefectSaveReqVO { @NotEmpty(message = "缺陷描述不能为空") private String name; - @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "APPEARANCE") - @NotEmpty(message = "检测项类型不能为空") - private String type; + @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "检测项类型不能为空") + private Integer type; @Schema(description = "缺陷等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "缺陷等级不能为空") @@ -35,4 +35,4 @@ public class MesQcDefectSaveReqVO { @Schema(description = "备注", example = "备注") private String remark; - } +} diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defectrecord/MesQcDefectRecordController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defectrecord/MesQcDefectRecordController.java index 4eacc0a3c..8e5e5bcd1 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defectrecord/MesQcDefectRecordController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defectrecord/MesQcDefectRecordController.java @@ -47,7 +47,7 @@ public class MesQcDefectRecordController { @DeleteMapping("/delete") @Operation(summary = "删除质检缺陷记录") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:qc-defect:update')") + @PreAuthorize("@ss.hasPermission('mes:qc-defect:delete')") public CommonResult deleteDefectRecord(@RequestParam("id") Long id) { defectRecordService.deleteDefectRecord(id); return success(true); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/MesQcIndicatorController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/MesQcIndicatorController.java index e7856060f..1ba78e1a5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/MesQcIndicatorController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/MesQcIndicatorController.java @@ -77,13 +77,6 @@ public class MesQcIndicatorController { return success(BeanUtils.toBean(pageResult, MesQcIndicatorRespVO.class)); } - @GetMapping("/simple-list") - @Operation(summary = "获得质检指标精简列表", description = "主要用于前端的下拉选项") - public CommonResult> getIndicatorSimpleList() { - List list = indicatorService.getIndicatorList(); - return success(BeanUtils.toBean(list, MesQcIndicatorRespVO.class)); - } - @GetMapping("/export-excel") @Operation(summary = "导出质检指标 Excel") @PreAuthorize("@ss.hasPermission('mes:qc-indicator:export')") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorPageReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorPageReqVO.java index 773814e28..ff92db5fd 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorPageReqVO.java @@ -18,8 +18,8 @@ public class MesQcIndicatorPageReqVO extends PageParam { @Schema(description = "检测项名称", example = "长度") private String name; - @Schema(description = "检测项类型", example = "SIZE") - private String type; + @Schema(description = "检测项类型", example = "1") + private Integer type; @Schema(description = "结果值类型", example = "1") private Integer resultType; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorRespVO.java index f4df5f744..33f915b92 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorRespVO.java @@ -27,10 +27,10 @@ public class MesQcIndicatorRespVO { @ExcelProperty("检测项名称") private String name; - @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "SIZE") + @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @ExcelProperty(value = "检测项类型", converter = DictConvert.class) @DictFormat(DictTypeConstants.MES_INDICATOR_TYPE) - private String type; + private Integer type; @Schema(description = "检测工具", example = "卡尺") @ExcelProperty("检测工具") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorSaveReqVO.java index fb9155896..ce5545823 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/indicator/vo/MesQcIndicatorSaveReqVO.java @@ -21,9 +21,9 @@ public class MesQcIndicatorSaveReqVO { @NotEmpty(message = "检测项名称不能为空") private String name; - @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "SIZE") - @NotEmpty(message = "检测项类型不能为空") - private String type; + @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "检测项类型不能为空") + private Integer type; @Schema(description = "检测工具", example = "卡尺") private String tool; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java index 10bd8a3a7..469076dd5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java @@ -34,12 +34,12 @@ public class MesQcIpqcRespVO { // ========== 来源单据 ========== - @Schema(description = "来源单据 ID", example = "200") - private Long sourceDocId; - @Schema(description = "来源单据类型", example = "304") private Integer sourceDocType; + @Schema(description = "来源单据 ID", example = "200") + private Long sourceDocId; + @Schema(description = "来源单据行 ID", example = "300") private Long sourceLineId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/line/MesQcIpqcLineRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/line/MesQcIpqcLineRespVO.java index dba702073..8fab393ee 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/line/MesQcIpqcLineRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/line/MesQcIpqcLineRespVO.java @@ -27,8 +27,8 @@ public class MesQcIpqcLineRespVO { @Schema(description = "检测指标名称", example = "外观") private String indicatorName; - @Schema(description = "检测指标类型", example = "QUANTITATIVE") - private String indicatorType; + @Schema(description = "检测指标类型", example = "1") + private Integer indicatorType; @Schema(description = "检测工具", example = "卡尺") private String tool; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java index ab51d361b..0c19e1c18 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java @@ -30,12 +30,12 @@ public class MesQcIqcRespVO { // ========== 来源单据 ========== - @Schema(description = "来源单据 ID", example = "200") - private Long sourceDocId; - @Schema(description = "来源单据类型", example = "100") private Integer sourceDocType; + @Schema(description = "来源单据 ID", example = "200") + private Long sourceDocId; + @Schema(description = "来源单据行 ID", example = "300") private Long sourceLineId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/line/MesQcIqcLineRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/line/MesQcIqcLineRespVO.java index d8170aee9..508dcbfd5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/line/MesQcIqcLineRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/line/MesQcIqcLineRespVO.java @@ -27,8 +27,8 @@ public class MesQcIqcLineRespVO { @Schema(description = "检测指标名称", example = "外观") private String indicatorName; - @Schema(description = "检测指标类型", example = "QUANTITATIVE") - private String indicatorType; + @Schema(description = "检测指标类型", example = "1") + private Integer indicatorType; @Schema(description = "检测工具", example = "卡尺") private String tool; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java index 8c314bb02..79d9bed32 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java @@ -30,12 +30,12 @@ public class MesQcOqcRespVO { // ========== 来源单据 ========== - @Schema(description = "来源单据 ID", example = "200") - private Long sourceDocId; - @Schema(description = "来源单据类型", example = "118") private Integer sourceDocType; + @Schema(description = "来源单据 ID", example = "200") + private Long sourceDocId; + @Schema(description = "来源单据行 ID", example = "300") private Long sourceLineId; @@ -51,12 +51,12 @@ public class MesQcOqcRespVO { @ExcelProperty("客户简称") private String clientNickname; + // ========== 物料 ========== + @Schema(description = "批次号", example = "BC20250101") @ExcelProperty("批次号") private String batchCode; - // ========== 物料 ========== - @Schema(description = "产品物料 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") private Long itemId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcSaveReqVO.java index 985e342af..bd590bb76 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcSaveReqVO.java @@ -26,12 +26,12 @@ public class MesQcOqcSaveReqVO { // ========== 来源单据 ========== - @Schema(description = "来源单据 ID", example = "200") - private Long sourceDocId; - @Schema(description = "来源单据类型", example = "118") private Integer sourceDocType; + @Schema(description = "来源单据 ID", example = "200") + private Long sourceDocId; + @Schema(description = "来源单据行 ID", example = "300") private Long sourceLineId; @@ -41,11 +41,11 @@ public class MesQcOqcSaveReqVO { @NotNull(message = "客户不能为空") private Long clientId; + // ========== 物料 ========== + @Schema(description = "批次号", example = "BC20250101") private String batchCode; - // ========== 物料 ========== - @Schema(description = "产品物料 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") @NotNull(message = "产品物料不能为空") private Long itemId; @@ -74,9 +74,8 @@ public class MesQcOqcSaveReqVO { // ========== 检验 ========== - @Schema(description = "检测人员用户 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "检测人员不能为空") - private Long inspectorUserId; + @Schema(description = "检测结果", example = "1") + private Integer checkResult; @Schema(description = "出货日期", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "出货日期不能为空") @@ -86,8 +85,9 @@ public class MesQcOqcSaveReqVO { @NotNull(message = "检测日期不能为空") private LocalDateTime inspectDate; - @Schema(description = "检测结果", example = "1") - private Integer checkResult; + @Schema(description = "检测人员用户 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "检测人员不能为空") + private Long inspectorUserId; @Schema(description = "备注", example = "备注") private String remark; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/line/MesQcOqcLineRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/line/MesQcOqcLineRespVO.java index ae69409a6..39cf91177 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/line/MesQcOqcLineRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/line/MesQcOqcLineRespVO.java @@ -27,8 +27,8 @@ public class MesQcOqcLineRespVO { @Schema(description = "检测指标名称", example = "外观") private String indicatorName; - @Schema(description = "检测指标类型", example = "QUANTITATIVE") - private String indicatorType; + @Schema(description = "检测指标类型", example = "1") + private Integer indicatorType; @Schema(description = "检测工具", example = "卡尺") private String tool; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/pendinginspect/vo/MesQcPendingInspectRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/pendinginspect/vo/MesQcPendingInspectRespVO.java index 6e7f5c9a6..effe2a558 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/pendinginspect/vo/MesQcPendingInspectRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/pendinginspect/vo/MesQcPendingInspectRespVO.java @@ -10,17 +10,16 @@ import java.time.LocalDateTime; @Data public class MesQcPendingInspectRespVO { - @Schema(description = "来源单据 ID", example = "100") - private Long sourceDocId; - @Schema(description = "来源单据类型(MesBizTypeConstants)", example = "100") private Integer sourceDocType; - @Schema(description = "来源单据编号", example = "AN2025001") - private String sourceDocCode; + @Schema(description = "来源单据 ID", example = "100") + private Long sourceDocId; @Schema(description = "来源单据行 ID", example = "200") private Long sourceLineId; + @Schema(description = "来源单据编号", example = "AN2025001") + private String sourceDocCode; @Schema(description = "检验类型(MesQcTypeEnum)", example = "1") private Integer qcType; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java index df8d1bc98..d6cf18485 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java @@ -30,12 +30,12 @@ public class MesQcRqcRespVO { // ========== 来源单据 ========== - @Schema(description = "来源单据 ID", example = "200") - private Long sourceDocId; - @Schema(description = "来源单据类型", example = "116") private Integer sourceDocType; + @Schema(description = "来源单据 ID", example = "200") + private Long sourceDocId; + @Schema(description = "来源单据行 ID", example = "300") private Long sourceLineId; @@ -85,6 +85,26 @@ public class MesQcRqcRespVO { @ExcelProperty("不合格数量") private BigDecimal unqualifiedQuantity; + // ========== 缺陷统计 ========== + + @Schema(description = "致命缺陷率(%)", example = "5.00") + private BigDecimal criticalRate; + + @Schema(description = "严重缺陷率(%)", example = "10.00") + private BigDecimal majorRate; + + @Schema(description = "轻微缺陷率(%)", example = "15.00") + private BigDecimal minorRate; + + @Schema(description = "致命缺陷数量", example = "5") + private Integer criticalQuantity; + + @Schema(description = "严重缺陷数量", example = "10") + private Integer majorQuantity; + + @Schema(description = "轻微缺陷数量", example = "15") + private Integer minorQuantity; + // ========== 检验 ========== @Schema(description = "检测结果", example = "1") @@ -110,26 +130,6 @@ public class MesQcRqcRespVO { @ExcelProperty("备注") private String remark; - // ========== 缺陷统计 ========== - - @Schema(description = "致命缺陷数量", example = "5") - private Integer criticalQuantity; - - @Schema(description = "严重缺陷数量", example = "10") - private Integer majorQuantity; - - @Schema(description = "轻微缺陷数量", example = "15") - private Integer minorQuantity; - - @Schema(description = "致命缺陷率(%)", example = "5.00") - private BigDecimal criticalRate; - - @Schema(description = "严重缺陷率(%)", example = "10.00") - private BigDecimal majorRate; - - @Schema(description = "轻微缺陷率(%)", example = "15.00") - private BigDecimal minorRate; - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") private LocalDateTime createTime; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcSaveReqVO.java index 9e3619fec..187fd1f3e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcSaveReqVO.java @@ -32,12 +32,12 @@ public class MesQcRqcSaveReqVO { // ========== 来源单据 ========== - @Schema(description = "来源单据 ID", example = "200") - private Long sourceDocId; - @Schema(description = "来源单据类型", example = "116") private Integer sourceDocType; + @Schema(description = "来源单据 ID", example = "200") + private Long sourceDocId; + @Schema(description = "来源单据行 ID", example = "300") private Long sourceLineId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/line/MesQcRqcLineRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/line/MesQcRqcLineRespVO.java index da3874772..2f785ce9b 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/line/MesQcRqcLineRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/line/MesQcRqcLineRespVO.java @@ -27,8 +27,8 @@ public class MesQcRqcLineRespVO { @Schema(description = "检测指标名称", example = "外观") private String indicatorName; - @Schema(description = "检测指标类型", example = "QUANTITATIVE") - private String indicatorType; + @Schema(description = "检测指标类型", example = "1") + private Integer indicatorType; @Schema(description = "检测工具", example = "卡尺") private String tool; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateController.java index 087b48a79..a279af227 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateController.java @@ -77,13 +77,6 @@ public class MesQcTemplateController { return success(BeanUtils.toBean(pageResult, MesQcTemplateRespVO.class)); } - @GetMapping("/simple-list") - @Operation(summary = "获得质检方案精简列表", description = "主要用于前端的下拉选项") - public CommonResult> getTemplateSimpleList() { - List list = templateService.getTemplateList(); - return success(BeanUtils.toBean(list, MesQcTemplateRespVO.class)); - } - @GetMapping("/export-excel") @Operation(summary = "导出质检方案 Excel") @PreAuthorize("@ss.hasPermission('mes:qc-template:export')") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorRespVO.java index 67d38388f..e32be8704 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorRespVO.java @@ -63,9 +63,9 @@ public class MesQcTemplateIndicatorRespVO { @ExcelProperty("检测项名称") private String indicatorName; - @Schema(description = "检测项类型(字典 mes_index_type)", example = "SIZE") + @Schema(description = "检测项类型", example = "1") @ExcelProperty("检测项类型") - private String indicatorType; + private Integer indicatorType; @Schema(description = "检测工具", example = "卡尺") @ExcelProperty("检测工具") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolPageReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolPageReqVO.java index b51082ee2..d411be8e5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolPageReqVO.java @@ -25,7 +25,7 @@ public class MesTmToolPageReqVO extends PageParam { private String brand; @Schema(description = "型号规格", example = "M5-100") - private String spec; + private String specification; @Schema(description = "状态", example = "1") private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolRespVO.java index 25399b97c..22783f2fd 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolRespVO.java @@ -33,7 +33,7 @@ public class MesTmToolRespVO { @Schema(description = "型号规格", example = "M5-100") @ExcelProperty("型号规格") - private String spec; + private String specification; @Schema(description = "工具类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") private Long toolTypeId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolSaveReqVO.java index a2f75493e..b0e51c154 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolSaveReqVO.java @@ -1,10 +1,11 @@ package cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Data; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; import java.time.LocalDateTime; @Schema(description = "管理后台 - MES 工具台账新增/修改 Request VO") @@ -16,17 +17,21 @@ public class MesTmToolSaveReqVO { @Schema(description = "工具编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "T-001") @NotEmpty(message = "工具编码不能为空") + @Size(max = 64, message = "工具编码长度不能超过 64 个字符") private String code; @Schema(description = "工具名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "5mm 铣刀") @NotEmpty(message = "工具名称不能为空") + @Size(max = 255, message = "工具名称长度不能超过 255 个字符") private String name; @Schema(description = "品牌", example = "三菱") + @Size(max = 255, message = "品牌长度不能超过 255 个字符") private String brand; @Schema(description = "型号规格", example = "M5-100") - private String spec; + @Size(max = 255, message = "型号规格长度不能超过 255 个字符") + private String specification; @Schema(description = "工具类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @NotNull(message = "工具类型不能为空") @@ -36,7 +41,8 @@ public class MesTmToolSaveReqVO { @NotNull(message = "数量不能为空") private Integer quantity; - @Schema(description = "可用数量", example = "1") + @Schema(description = "可用数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "可用数量不能为空") private Integer availableQuantity; @Schema(description = "保养维护类型", example = "1") @@ -53,6 +59,7 @@ public class MesTmToolSaveReqVO { private Integer status; @Schema(description = "备注", example = "备注") + @Size(max = 500, message = "备注长度不能超过 500 个字符") private String remark; - } +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/type/MesTmToolTypeSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/type/MesTmToolTypeSaveReqVO.java index 82e880eac..49305c8cd 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/type/MesTmToolTypeSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/type/MesTmToolTypeSaveReqVO.java @@ -1,11 +1,11 @@ package cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.type; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Data; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; - @Schema(description = "管理后台 - MES 工具类型新增/修改 Request VO") @Data public class MesTmToolTypeSaveReqVO { @@ -15,10 +15,12 @@ public class MesTmToolTypeSaveReqVO { @Schema(description = "类型编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "TT-001") @NotEmpty(message = "类型编码不能为空") + @Size(max = 64, message = "类型编码长度不能超过 64 个字符") private String code; @Schema(description = "类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "铣刀") @NotEmpty(message = "类型名称不能为空") + @Size(max = 255, message = "类型名称长度不能超过 255 个字符") private String name; @Schema(description = "是否编码管理", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") @@ -32,6 +34,7 @@ public class MesTmToolTypeSaveReqVO { private Integer maintenPeriod; @Schema(description = "备注", example = "备注") + @Size(max = 500, message = "备注长度不能超过 500 个字符") private String remark; - } +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java index d0515ab69..92e66ece8 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java @@ -42,7 +42,6 @@ public class MesWmArrivalNoticeController { @Resource private MesWmArrivalNoticeService arrivalNoticeService; - @Resource private MesMdVendorService vendorService; @@ -112,15 +111,6 @@ public class MesWmArrivalNoticeController { return success(true); } - @GetMapping("/simple-list") - @Operation(summary = "获得到货通知单精简列表") - @Parameter(name = "status", description = "状态", example = "2") - public CommonResult> getArrivalNoticeSimpleList( - @RequestParam(value = "status", required = false) Integer status) { - List list = arrivalNoticeService.getArrivalNoticeListByStatus(status); - return success(buildRespVOList(list)); - } - // ==================== 拼接 VO ==================== private List buildRespVOList(List list) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java index 08e2fe627..0a3b04506 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java @@ -40,13 +40,10 @@ public class MesWmArrivalNoticeLineController { @Resource private MesWmArrivalNoticeLineService arrivalNoticeLineService; - @Resource private MesMdItemService itemService; - @Resource private MesMdUnitMeasureService unitMeasureService; - @Resource private MesQcIqcService iqcService; @@ -95,16 +92,6 @@ public class MesWmArrivalNoticeLineController { return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); } - @GetMapping("/list-by-notice-id") - @Operation(summary = "获得到货通知单行列表") - @Parameter(name = "noticeId", description = "到货通知单编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:query')") - public CommonResult> getArrivalNoticeLineListByNoticeId( - @RequestParam("noticeId") Long noticeId) { - List list = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(noticeId); - return success(buildRespVOList(list)); - } - // ==================== 拼接 VO ==================== private List buildRespVOList(List list) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemconsume/vo/MesWmItemConsumeLinePageReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemconsume/vo/MesWmItemConsumeLinePageReqVO.java index 7cfdbdac8..000554f96 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemconsume/vo/MesWmItemConsumeLinePageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemconsume/vo/MesWmItemConsumeLinePageReqVO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.itemconsume.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; @@ -13,6 +14,7 @@ import lombok.ToString; public class MesWmItemConsumeLinePageReqVO extends PageParam { @Schema(description = "报工记录编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "报工记录编号不能为空") private Long feedbackId; } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java index 9494e49b1..2a9802d87 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java @@ -10,10 +10,12 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWm import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptLineService; +import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -38,12 +40,12 @@ public class MesWmItemReceiptLineController { @Resource private MesWmItemReceiptLineService itemReceiptLineService; - @Resource private MesMdItemService itemService; - @Resource private MesMdUnitMeasureService unitMeasureService; + @Resource + private MesWmItemReceiptService itemReceiptService; @PostMapping("/create") @Operation(summary = "创建采购入库单行") @@ -101,6 +103,8 @@ public class MesWmItemReceiptLineController { convertSet(list, MesWmItemReceiptLineDO::getItemId)); Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + Map receiptMap = itemReceiptService.getItemReceiptMap( + convertSet(list, MesWmItemReceiptLineDO::getReceiptId)); // 2. 构建结果 return BeanUtils.toBean(list, MesWmItemReceiptLineRespVO.class, vo -> { MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { @@ -108,6 +112,8 @@ public class MesWmItemReceiptLineController { MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); }); + MapUtils.findAndThen(receiptMap, vo.getReceiptId(), receipt -> + vo.setReceiptCode(receipt.getCode()).setPurchaseOrderCode(receipt.getPurchaseOrderCode())); }); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineRespVO.java index 25596dbdc..98a824852 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineRespVO.java @@ -16,6 +16,12 @@ public class MesWmItemReceiptLineRespVO { @Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long receiptId; + @Schema(description = "入库单编码", example = "IR2026020001") + private String receiptCode; + + @Schema(description = "采购订单号", example = "PO20260201") + private String purchaseOrderCode; + @Schema(description = "到货通知单行编号", example = "1") private Long arrivalNoticeLineId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java index 9660bacca..41dcf0841 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java @@ -52,22 +52,16 @@ public class MesWmMaterialStockController { @Resource private MesWmMaterialStockService materialStockService; - @Resource private MesMdItemService itemService; - @Resource private MesMdUnitMeasureService unitMeasureService; - @Resource private MesWmWarehouseService warehouseService; - @Resource private MesWmWarehouseLocationService locationService; - @Resource private MesWmWarehouseAreaService areaService; - @Resource private MesMdVendorService vendorService; @@ -139,8 +133,8 @@ public class MesWmMaterialStockController { MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); }); - MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), - warehouse -> vo.setWarehouseName(warehouse.getName())); + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> + vo.setWarehouseCode(warehouse.getCode()).setWarehouseName(warehouse.getName())); MapUtils.findAndThen(locationMap, vo.getLocationId(), location -> vo.setLocationName(location.getName())); MapUtils.findAndThen(areaMap, vo.getAreaId(), diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockPageReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockPageReqVO.java index 0a880e230..b5a18ac4f 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockPageReqVO.java @@ -12,6 +12,18 @@ import lombok.ToString; @ToString(callSuper = true) public class MesWmMaterialStockPageReqVO extends PageParam { + /** + * 虚拟仓过滤模式 - 排除虚拟仓 + */ + public static final String VIRTUAL_FILTER_EXCLUDE = "exclude"; + /** + * 虚拟仓过滤模式 - 只看虚拟仓 + */ + public static final String VIRTUAL_FILTER_ONLY = "only"; + + @Schema(description = "虚拟仓过滤模式", example = "exclude") + private String virtualFilter; + @Schema(description = "物料分类编号", example = "1") private Long itemTypeId; @@ -21,6 +33,9 @@ public class MesWmMaterialStockPageReqVO extends PageParam { @Schema(description = "批次号", example = "B20260101") private String batchCode; + @Schema(description = "批次编号", example = "1") + private Long batchId; + @Schema(description = "仓库编号", example = "1") private Long warehouseId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockRespVO.java index 366e64f9b..03349b347 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockRespVO.java @@ -49,6 +49,9 @@ public class MesWmMaterialStockRespVO { @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long warehouseId; + @Schema(description = "仓库编码", example = "WH001") + private String warehouseCode; + @Schema(description = "仓库名称", example = "原料仓") @ExcelProperty("仓库") private String warehouseName; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueRespVO.java index cbab9242d..63cc75214 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueRespVO.java @@ -21,15 +21,14 @@ public class MesWmMiscIssueRespVO { @Schema(description = "杂项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer type; + @Schema(description = "来源单据类型", example = "PURCHASE_ORDER") + private String sourceDocType; @Schema(description = "来源单据ID", example = "1") private Long sourceDocId; @Schema(description = "来源单据编号", example = "DOC20260302001") private String sourceDocCode; - @Schema(description = "来源单据类型", example = "PURCHASE_ORDER") - private String sourceDocType; - @Schema(description = "出库日期", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime issueDate; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueSaveReqVO.java index 6eb365248..a208d0a88 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueSaveReqVO.java @@ -26,15 +26,14 @@ public class MesWmMiscIssueSaveReqVO { @NotNull(message = "杂项类型不能为空") private Integer type; + @Schema(description = "来源单据类型", example = "PURCHASE_ORDER") + private String sourceDocType; @Schema(description = "来源单据ID", example = "1") private Long sourceDocId; @Schema(description = "来源单据编号", example = "DOC20260302001") private String sourceDocCode; - @Schema(description = "来源单据类型", example = "PURCHASE_ORDER") - private String sourceDocType; - @Schema(description = "出库日期", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "出库日期不能为空") private LocalDateTime issueDate; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java index e29fc879d..effeabf89 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java @@ -21,15 +21,14 @@ public class MesWmMiscReceiptRespVO { @Schema(description = "杂项类型", example = "1") private Integer type; + @Schema(description = "来源单据类型", example = "WORK_ORDER") + private String sourceDocType; @Schema(description = "来源单据 ID", example = "1") private Long sourceDocId; @Schema(description = "来源单据编码", example = "WO2026030001") private String sourceDocCode; - @Schema(description = "来源单据类型", example = "WORK_ORDER") - private String sourceDocType; - @Schema(description = "入库日期") private LocalDateTime receiptDate; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java index 2d9f21f4f..c14dbedd1 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java @@ -26,15 +26,14 @@ public class MesWmMiscReceiptSaveReqVO { @NotNull(message = "杂项类型不能为空") private Integer type; + @Schema(description = "来源单据类型", example = "WORK_ORDER") + private String sourceDocType; @Schema(description = "来源单据 ID", example = "1") private Long sourceDocId; @Schema(description = "来源单据编码", example = "WO2026030001") private String sourceDocCode; - @Schema(description = "来源单据类型", example = "WORK_ORDER") - private String sourceDocType; - @Schema(description = "入库日期", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "入库日期不能为空") private LocalDateTime receiptDate; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java index 1643e40a5..6d7d6d612 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java @@ -50,6 +50,7 @@ public class MesWmPackageController { private MesMdClientService clientService; @Resource private MesMdUnitMeasureService unitMeasureService; + @Resource private AdminUserApi adminUserApi; @@ -125,20 +126,6 @@ public class MesWmPackageController { return success(true); } - @GetMapping("/childable-simple-list") - @Operation(summary = "可添加为子箱的装箱单精简列表") - @PreAuthorize("@ss.hasPermission('mes:wm-package:query')") - public CommonResult> getChildablePackageSimpleList() { - List list = packageService.getChildablePackageList(); - return success(buildRespVOList(list)); - } - - @GetMapping("/simple-list") - @Operation(summary = "获得装箱单精简列表", description = "主要用于前端的下拉选项") - public CommonResult> getPackageSimpleList() { - List list = packageService.getPackageSimpleList(); - return success(buildRespVOList(list)); - } // ========== 私有方法 ========== diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackagePageReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackagePageReqVO.java index 08cb21953..f5dec9e62 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackagePageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackagePageReqVO.java @@ -32,4 +32,7 @@ public class MesWmPackagePageReqVO extends PageParam { @Schema(description = "检查员用户 ID", example = "1") private Long inspectorUserId; + @Schema(description = "单据状态", example = "1") + private Integer status; + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java index eef855ea4..34c418c6f 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java @@ -36,10 +36,10 @@ public class MesWmPackageLineSaveReqVO { @DecimalMin(value = "0.01", message = "装箱数量必须大于 0") private BigDecimal quantity; - @Schema(description = "生产工单 ID", example = "1") + @Schema(description = "生产工单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "生产工单不能为空") private Long workOrderId; - // DONE @AI:时间都是 LocalDateTIme; @Schema(description = "有效期") private LocalDateTime expireDate; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailSaveReqVO.java index 18c583504..3be07d66d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailSaveReqVO.java @@ -26,6 +26,9 @@ public class MesWmProductIssueDetailSaveReqVO { @NotNull(message = "物料编号不能为空") private Long itemId; + @Schema(description = "库存记录编号", example = "1") + private Long materialStockId; + @Schema(description = "领料数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00") @NotNull(message = "领料数量不能为空") @DecimalMin(value = "0", inclusive = false, message = "领料数量必须大于 0") @@ -49,4 +52,4 @@ public class MesWmProductIssueDetailSaveReqVO { @Schema(description = "备注", example = "备注") private String remark; - } +} diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/vo/line/MesWmProductReceiptLineSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/vo/line/MesWmProductReceiptLineSaveReqVO.java index 1866b9f31..851ad33aa 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/vo/line/MesWmProductReceiptLineSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/vo/line/MesWmProductReceiptLineSaveReqVO.java @@ -7,7 +7,7 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import java.math.BigDecimal; -@Schema(description = "管理后台 - MES 产品收货单行新增/修改 Request VO") +@Schema(description = "管理后台 - MES 产品入库单行新增/修改 Request VO") @Data public class MesWmProductReceiptLineSaveReqVO { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesController.java index 6463825c0..58661b0b7 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesController.java @@ -43,7 +43,6 @@ public class MesWmProductSalesController { @Resource private MesWmProductSalesService productSalesService; - @Resource private MesMdClientService clientService; @Resource @@ -174,7 +173,7 @@ public class MesWmProductSalesController { MapUtils.findAndThen(clientMap, vo.getClientId(), client -> vo.setClientName(client.getName()).setClientCode(client.getCode())); MapUtils.findAndThen(noticeMap, vo.getNoticeId(), - notice -> vo.setNoticeCode(notice.getNoticeCode())); + notice -> vo.setNoticeCode(notice.getCode())); }); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineRespVO.java index 19eff6578..67e244b6d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineRespVO.java @@ -16,6 +16,9 @@ public class MesWmProductSalesLineRespVO { @Schema(description = "出库单ID", example = "1") private Long salesId; + @Schema(description = "发货通知单行ID", example = "1") + private Long noticeLineId; + @Schema(description = "物料ID", example = "1") private Long itemId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineSaveReqVO.java index 998a6590f..c2c3075ae 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineSaveReqVO.java @@ -17,6 +17,9 @@ public class MesWmProductSalesLineSaveReqVO { @NotNull(message = "出库单ID不能为空") private Long salesId; + @Schema(description = "发货通知单行ID", example = "1") + private Long noticeLineId; + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "物料不能为空") private Long itemId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/detail/MesWmReturnIssueDetailSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/detail/MesWmReturnIssueDetailSaveReqVO.java index b78bb2f18..b09f94967 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/detail/MesWmReturnIssueDetailSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/detail/MesWmReturnIssueDetailSaveReqVO.java @@ -26,6 +26,9 @@ public class MesWmReturnIssueDetailSaveReqVO { @NotNull(message = "物料编号不能为空") private Long itemId; + @Schema(description = "库存记录编号", example = "1") + private Long materialStockId; + @Schema(description = "退料数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00") @NotNull(message = "退料数量不能为空") @DecimalMin(value = "0", inclusive = false, message = "退料数量必须大于0") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailSaveReqVO.java index e5f28b7f4..00501c580 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailSaveReqVO.java @@ -39,6 +39,9 @@ public class MesWmReturnSalesDetailSaveReqVO { @Schema(description = "批次ID", example = "1") private Long batchId; + @Schema(description = "批次号", example = "B20250101") + private String batchCode; + @Schema(description = "仓库ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "仓库ID不能为空") private Long warehouseId; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java index ae8eb5137..8dd4aae25 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java @@ -32,9 +32,12 @@ public class MesWmReturnSalesLineSaveReqVO { @DecimalMin(value = "0", inclusive = false, message = "退货数量必须大于 0") private BigDecimal quantity; - @Schema(description = "批次号", example = "B20250101") + @Schema(description = "批次ID", example = "1") private Long batchId; + @Schema(description = "批次号", example = "B20250101") + private String batchCode; + @Schema(description = "是否需要质检", example = "true") private Boolean rqcCheckFlag; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/detail/MesWmReturnVendorDetailSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/detail/MesWmReturnVendorDetailSaveReqVO.java index 4132eacbe..8bbba0aa8 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/detail/MesWmReturnVendorDetailSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/detail/MesWmReturnVendorDetailSaveReqVO.java @@ -14,21 +14,20 @@ public class MesWmReturnVendorDetailSaveReqVO { @Schema(description = "编号", example = "1024") private Long id; + @Schema(description = "退货单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "退货单编号不能为空") + private Long returnId; @Schema(description = "退货单行编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "退货单行编号不能为空") private Long lineId; - @Schema(description = "退货单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "退货单编号不能为空") - private Long returnId; + @Schema(description = "库存记录编号", example = "1") + private Long materialStockId; @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "物料编号不能为空") private Long itemId; - @Schema(description = "库存记录编号", example = "1") - private Long materialStockId; - @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00") @NotNull(message = "退货数量不能为空") @DecimalMin(value = "0", inclusive = false, message = "退货数量必须大于 0") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java index 6e6825e3d..f65ddd83f 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java @@ -42,7 +42,6 @@ public class MesWmSalesNoticeController { @Resource private MesWmSalesNoticeService salesNoticeService; - @Resource private MesMdClientService clientService; @@ -112,15 +111,6 @@ public class MesWmSalesNoticeController { return success(true); } - @GetMapping("/simple-list") - @Operation(summary = "获得发货通知单精简列表") - @Parameter(name = "status", description = "状态", example = "1") - public CommonResult> getSalesNoticeSimpleList( - @RequestParam(value = "status", required = false) Integer status) { - List list = salesNoticeService.getSalesNoticeListByStatus(status); - return success(buildRespVOList(list)); - } - // ==================== 拼接 VO ==================== private List buildRespVOList(List list) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java index d7568df34..3dee41cea 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java @@ -13,10 +13,10 @@ import lombok.ToString; public class MesWmSalesNoticePageReqVO extends PageParam { @Schema(description = "通知单编码", example = "SN202603010001") - private String noticeCode; + private String code; @Schema(description = "通知单名称", example = "测试发货通知") - private String noticeName; + private String name; @Schema(description = "销售订单编号", example = "SO202603010001") private String salesOrderCode; @@ -24,4 +24,7 @@ public class MesWmSalesNoticePageReqVO extends PageParam { @Schema(description = "客户编号", example = "1") private Long clientId; + @Schema(description = "状态", example = "3") + private Integer status; + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java index bf453e634..473de9920 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java @@ -18,11 +18,11 @@ public class MesWmSalesNoticeRespVO { @Schema(description = "通知单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "SN202603010001") @ExcelProperty("通知单编码") - private String noticeCode; + private String code; @Schema(description = "通知单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试发货通知") @ExcelProperty("通知单名称") - private String noticeName; + private String name; @Schema(description = "销售订单编号", example = "SO202603010001") @ExcelProperty("销售订单编号") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeSaveReqVO.java index 9cb40859a..021157179 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeSaveReqVO.java @@ -16,11 +16,11 @@ public class MesWmSalesNoticeSaveReqVO { @Schema(description = "通知单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "SN202603010001") @NotEmpty(message = "通知单编码不能为空") - private String noticeCode; + private String code; @Schema(description = "通知单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试发货通知") @NotEmpty(message = "通知单名称不能为空") - private String noticeName; + private String name; @Schema(description = "销售订单编号", example = "SO202603010001") private String salesOrderCode; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/MesWmSnController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/MesWmSnController.java index d5569049d..5d98d91bb 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/MesWmSnController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/MesWmSnController.java @@ -13,7 +13,9 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.sn.vo.MesWmSnGroupRespVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.sn.vo.MesWmSnPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.sn.vo.MesWmSnRespVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; import cn.iocoder.yudao.module.mes.service.wm.sn.MesWmSnService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -44,6 +46,8 @@ public class MesWmSnController { private MesWmSnService snService; @Resource private MesMdItemService itemService; + @Resource + private MesMdUnitMeasureService unitMeasureService; @PostMapping("/generate") @Operation(summary = "生成 SN 码") @@ -103,8 +107,12 @@ public class MesWmSnController { return; } Map itemMap = itemService.getItemMap(convertSet(list, MesWmSnGroupRespVO::getItemId)); - list.forEach(vo -> MapUtils.findAndThen(itemMap, vo.getItemId(), item -> - vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()))); + Map unitMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + list.forEach(vo -> MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMap, item.getUnitMeasureId(), unit -> vo.setUnitName(unit.getName())); + })); } private void buildItemInfo(List list) { @@ -112,8 +120,12 @@ public class MesWmSnController { return; } Map itemMap = itemService.getItemMap(convertSet(list, MesWmSnRespVO::getItemId)); - list.forEach(vo -> MapUtils.findAndThen(itemMap, vo.getItemId(), item -> - vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()))); + Map unitMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + list.forEach(vo -> MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMap, item.getUnitMeasureId(), unit -> vo.setUnitName(unit.getName())); + })); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/vo/MesWmSnGroupRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/vo/MesWmSnGroupRespVO.java index ed2883050..05e2b5e0e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/vo/MesWmSnGroupRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/vo/MesWmSnGroupRespVO.java @@ -34,6 +34,10 @@ public class MesWmSnGroupRespVO { @ExcelProperty("规格型号") private String specification; + @Schema(description = "单位", example = "个") + @ExcelProperty("单位") + private String unitName; + @Schema(description = "批次号", example = "BATCH001") @ExcelProperty("批次号") private String batchCode; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/vo/MesWmSnRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/vo/MesWmSnRespVO.java index f42011180..d831b2d2c 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/vo/MesWmSnRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/vo/MesWmSnRespVO.java @@ -37,6 +37,10 @@ public class MesWmSnRespVO { @ExcelProperty("规格型号") private String specification; + @Schema(description = "单位", example = "个") + @ExcelProperty("单位") + private String unitName; + @Schema(description = "批次号", example = "BATCH001") @ExcelProperty("批次号") private String batchCode; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanController.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanController.java index ae48eed5a..23ce8f970 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanController.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanController.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -24,7 +23,6 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; -import java.util.List; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -104,13 +102,4 @@ public class MesWmStockTakingPlanController { BeanUtils.toBean(pageResult.getList(), MesWmStockTakingPlanRespVO.class)); } - @GetMapping("/simple-list") - @Operation(summary = "获得已启用的盘点方案精简列表") - @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:query')") - public CommonResult> getEnabledStockTakingPlanSimpleList() { - List list = stockTakingPlanService.getStockTakingPlanListByStatus( - CommonStatusEnum.ENABLE.getStatus()); - return success(BeanUtils.toBean(list, MesWmStockTakingPlanRespVO.class)); - } - } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanPageReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanPageReqVO.java index e4153a5c2..bda1fa137 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanPageReqVO.java @@ -19,4 +19,7 @@ public class MesWmStockTakingPlanPageReqVO extends PageParam { @Schema(description = "盘点类型", example = "1") private Integer type; + @Schema(description = "状态", example = "0") + private Integer status; + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineSaveReqVO.java index 7311c2d6f..64404e33a 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineSaveReqVO.java @@ -18,7 +18,8 @@ public class MesWmTransferLineSaveReqVO { @NotNull(message = "转移单编号不能为空") private Long transferId; - @Schema(description = "库存记录编号", example = "1") + @Schema(description = "库存记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "库存记录编号不能为空") private Long materialStockId; @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationRespVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationRespVO.java index c593a33bc..922868530 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationRespVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationRespVO.java @@ -36,10 +36,6 @@ public class MesWmWarehouseLocationRespVO { @ExcelProperty("面积") private BigDecimal area; - @Schema(description = "库位管理状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @ExcelProperty("库位管理状态") - private Integer areaStatus; - @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") @ExcelProperty("是否冻结") private Boolean frozen; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationSaveReqVO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationSaveReqVO.java index fbcaecd97..7ee0e1636 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationSaveReqVO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationSaveReqVO.java @@ -29,10 +29,6 @@ public class MesWmWarehouseLocationSaveReqVO { @Schema(description = "面积", example = "500.00") private BigDecimal area; - @Schema(description = "库位管理状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @NotNull(message = "库位管理状态不能为空") - private Integer areaStatus; - @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") @NotNull(message = "是否冻结不能为空") private Boolean frozen; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/cal/plan/MesCalPlanDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/cal/plan/MesCalPlanDO.java index 5ead025bd..15eb13bd8 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/cal/plan/MesCalPlanDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/cal/plan/MesCalPlanDO.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 排班计划 DO @@ -54,12 +55,14 @@ public class MesCalPlanDO extends BaseDO { /** * 轮班方式 * + * 字典 {@link DictTypeConstants#MES_CAL_SHIFT_TYPE} * 枚举 {@link MesCalShiftTypeEnum} */ private Integer shiftType; /** * 倒班方式 * + * 字典 {@link DictTypeConstants#MES_CAL_SHIFT_METHOD} * 枚举 {@link MesCalShiftMethodEnum} */ private Integer shiftMethod; @@ -70,6 +73,7 @@ public class MesCalPlanDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_CAL_PLAN_STATUS} * 枚举 {@link MesCalPlanStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkplan/MesDvCheckPlanDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkplan/MesDvCheckPlanDO.java index 1fa287b25..681f2ea90 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkplan/MesDvCheckPlanDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkplan/MesDvCheckPlanDO.java @@ -65,6 +65,7 @@ public class MesDvCheckPlanDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_DV_CHECK_PLAN_STATUS} * 枚举 {@link MesDvCheckPlanStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordDO.java index 8e66d5bca..f3e322395 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordDO.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 设备点检记录 DO @@ -56,6 +57,7 @@ public class MesDvCheckRecordDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_DV_CHECK_RECORD_STATUS} * 枚举 {@link MesDvCheckRecordStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordLineDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordLineDO.java index 732c60fa7..3f5c5fa20 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordLineDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordLineDO.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 设备点检记录明细 DO @@ -43,6 +44,7 @@ public class MesDvCheckRecordLineDO extends BaseDO { /** * 点检结果 * + * 字典 {@link DictTypeConstants#MES_DV_CHECK_RESULT} * 枚举 {@link MesDvCheckResultEnum} */ private Integer checkStatus; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/machinery/MesDvMachineryDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/machinery/MesDvMachineryDO.java index 940734dad..bb6594117 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/machinery/MesDvMachineryDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/machinery/MesDvMachineryDO.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 设备台账 DO @@ -43,7 +44,7 @@ public class MesDvMachineryDO extends BaseDO { /** * 规格型号 */ - private String spec; + private String specification; /** * 设备类型编号 * @@ -59,6 +60,7 @@ public class MesDvMachineryDO extends BaseDO { /** * 设备状态 * + * 字典 {@link DictTypeConstants#MES_DV_MACHINERY_STATUS} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.dv.MesDvMachineryStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/maintenrecord/MesDvMaintenRecordDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/maintenrecord/MesDvMaintenRecordDO.java index 555b6b5a3..7a38aa299 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/maintenrecord/MesDvMaintenRecordDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/maintenrecord/MesDvMaintenRecordDO.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 设备保养记录 DO @@ -56,8 +57,8 @@ public class MesDvMaintenRecordDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_MAINTEN_RECORD_STATUS} * 枚举 {@link MesDvMaintenRecordStatusEnum} - * 字典类型 mes_mainten_record_status */ private Integer status; /** diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/maintenrecord/MesDvMaintenRecordLineDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/maintenrecord/MesDvMaintenRecordLineDO.java index 224902da6..4de462402 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/maintenrecord/MesDvMaintenRecordLineDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/maintenrecord/MesDvMaintenRecordLineDO.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 设备保养记录明细 DO @@ -43,8 +44,8 @@ public class MesDvMaintenRecordLineDO extends BaseDO { /** * 保养结果 * + * 字典 {@link DictTypeConstants#MES_MAINTEN_STATUS} * 枚举 {@link MesDvMaintenStatusEnum} - * 字典类型 mes_mainten_status */ private Integer status; /** diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/repair/MesDvRepairDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/repair/MesDvRepairDO.java index 25f7cca86..8632a1d2c 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/repair/MesDvRepairDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/repair/MesDvRepairDO.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 维修工单 DO @@ -60,6 +61,7 @@ public class MesDvRepairDO extends BaseDO { /** * 维修结果 * + * 字典 {@link DictTypeConstants#MES_DV_REPAIR_RESULT} * 枚举 {@link MesDvRepairResultEnum} */ private Integer result; @@ -91,6 +93,7 @@ public class MesDvRepairDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_DV_REPAIR_STATUS} * 枚举 {@link MesDvRepairStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodePartDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodePartDO.java index a76fc5009..e7225e51d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodePartDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodePartDO.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 编码规则组成 DO @@ -36,26 +37,17 @@ public class MesMdAutoCodePartDO extends BaseDO { * 分段序号 */ private Integer sort; - /** - * 分段长度 - */ - private Integer length; - /** - * 备注 - */ - private String remark; /** * 分段类型 * + * 字典 {@link DictTypeConstants#MES_MD_AUTO_CODE_PART_TYPE} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodePartTypeEnum} */ private Integer type; - - // ========== 当 MesMdAutoCodePartTypeEnum#INPUT_CHAR 时,使用 ========== /** - * 固定字符 + * 分段长度 */ - private String fixCharacter; + private Integer length; // ========== 当 MesMdAutoCodePartTypeEnum#DATE 时,使用 ========== /** @@ -65,6 +57,12 @@ public class MesMdAutoCodePartDO extends BaseDO { */ private String dateFormat; + // ========== 当 MesMdAutoCodePartTypeEnum#INPUT_CHAR 时,使用 ========== + /** + * 固定字符 + */ + private String fixCharacter; + // ========== 当 MesMdAutoCodePartTypeEnum#SERIAL_NUMBER 时,使用 ========== /** * 流水号起始值 @@ -81,8 +79,14 @@ public class MesMdAutoCodePartDO extends BaseDO { /** * 循环方式 * + * 字典 {@link DictTypeConstants#MES_MD_AUTO_CODE_CYCLE_METHOD} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeCycleMethodEnum} */ private Integer cycleMethod; + /** + * 备注 + */ + private String remark; + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodeRecordDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodeRecordDO.java index e2079e934..e66e5fceb 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodeRecordDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodeRecordDO.java @@ -37,15 +37,15 @@ public class MesMdAutoCodeRecordDO extends BaseDO { * 生成的编码 */ private String result; - /** - * 传入的参数 - */ - private String inputChar; /** * 生成的流水号 * * 当规则组成中包含流水号分段({@link MesMdAutoCodePartTypeEnum#SERIAL_NUMBER})时记录,方便追溯和调试 */ private Long serialNo; + /** + * 传入的参数 + */ + private String inputChar; } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodeRuleDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodeRuleDO.java index c198f9b51..fc11ce75d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodeRuleDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/autocode/MesMdAutoCodeRuleDO.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 编码规则 DO @@ -53,6 +54,7 @@ public class MesMdAutoCodeRuleDO extends BaseDO { /** * 补齐方式 * + * 字典 {@link DictTypeConstants#MES_MD_AUTO_CODE_PADDED_METHOD} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodePaddedMethodEnum} */ private Integer paddedMethod; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemTypeDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemTypeDO.java index c70933081..6a5f65ec7 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemTypeDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemTypeDO.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 物料产品分类 DO @@ -43,6 +44,7 @@ public class MesMdItemTypeDO extends BaseDO { /** * 物料/产品标识 * + * 字典 {@link DictTypeConstants#MES_MD_ITEM_OR_PRODUCT} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.md.MesMdItemTypeEnum} */ private String itemOrProduct; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdProductBomDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdProductBomDO.java index 77e6a47c7..a5a93c5c8 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdProductBomDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdProductBomDO.java @@ -9,7 +9,7 @@ import lombok.*; import java.math.BigDecimal; /** - * MES 产品BOM DO + * MES 产品 BOM DO * * @author 芋道源码 */ diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/andon/MesProAndonConfigDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/andon/MesProAndonConfigDO.java index c5c96250c..ef1a8e1d3 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/andon/MesProAndonConfigDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/andon/MesProAndonConfigDO.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 安灯呼叫配置 DO @@ -34,6 +35,7 @@ public class MesProAndonConfigDO extends BaseDO { /** * 级别 * + * 字典 {@link DictTypeConstants#MES_PRO_ANDON_LEVEL} * 枚举 {@link MesProAndonLevelEnum} */ private Integer level; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/andon/MesProAndonRecordDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/andon/MesProAndonRecordDO.java index 663d3b8d8..52d945eb1 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/andon/MesProAndonRecordDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/andon/MesProAndonRecordDO.java @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 安灯呼叫记录 DO @@ -70,12 +71,14 @@ public class MesProAndonRecordDO extends BaseDO { /** * 级别(快照值) * + * 字典 {@link DictTypeConstants#MES_PRO_ANDON_LEVEL} * 枚举 {@link MesProAndonLevelEnum} */ private Integer level; /** * 处置状态 * + * 字典 {@link DictTypeConstants#MES_PRO_ANDON_STATUS} * 枚举 {@link MesProAndonStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java index 750ad47d8..97676e1b9 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.math.BigDecimal; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 生产流转卡 DO @@ -57,6 +58,7 @@ public class MesProCardDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_PRO_WORK_ORDER_STATUS} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java index 8b02d7716..38262437b 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java @@ -15,6 +15,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 生产报工 DO @@ -43,6 +44,7 @@ public class MesProFeedbackDO extends BaseDO { /** * 报工类型 * + * 字典 {@link DictTypeConstants#MES_PRO_FEEDBACK_TYPE} * 枚举 {@link MesProFeedbackTypeEnum} */ private Integer type; @@ -149,6 +151,7 @@ public class MesProFeedbackDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_PRO_FEEDBACK_STATUS} * 枚举 {@link MesProFeedbackStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java index 1a14001b5..d8c06bde8 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java @@ -15,6 +15,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 生产任务 DO @@ -130,6 +131,7 @@ public class MesProTaskDO extends BaseDO { /** * 任务状态 * + * 字典 {@link DictTypeConstants#MES_PRO_TASK_STATUS} * 枚举 {@link MesProTaskStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskIssueDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskIssueDO.java index 54b57a48c..65033585f 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskIssueDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskIssueDO.java @@ -50,26 +50,26 @@ public class MesProTaskIssueDO extends BaseDO { * 关联 {@link MesMdWorkstationDO#getId()} */ private Long workstationId; + /** + * 来源单据类型 + */ + private String sourceDocType; /** * 来源单据编号 */ private Long sourceDocId; + /** + * 来源单据行编号 + */ + private Long sourceLineId; /** * 来源单据编码 */ private String sourceDocCode; - /** - * 来源单据类型 - */ - private String sourceDocType; /** * 投料批次 */ private String batchCode; - /** - * 来源单据行编号 - */ - private Long sourceLineId; /** * 产品物料编号 * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderDO.java index 6ff101a7c..578cfd9b6 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderDO.java @@ -14,6 +14,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 生产工单 DO @@ -51,12 +52,14 @@ public class MesProWorkOrderDO extends BaseDO { /** * 工单类型 * + * 字典 {@link DictTypeConstants#MES_PRO_WORK_ORDER_TYPE} * 枚举 {@link MesProWorkOrderTypeEnum} */ private Integer type; /** * 来源类型 * + * 字典 {@link DictTypeConstants#MES_PRO_WORK_ORDER_SOURCE_TYPE} * 枚举 {@link MesProWorkOrderSourceTypeEnum} */ private Integer orderSourceType; @@ -123,6 +126,7 @@ public class MesProWorkOrderDO extends BaseDO { /** * 工单状态 * + * 字典 {@link DictTypeConstants#MES_PRO_WORK_ORDER_STATUS} * 枚举 {@link MesProWorkOrderStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workrecord/MesProWorkRecordDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workrecord/MesProWorkRecordDO.java index f0bc16e17..fc541a9de 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workrecord/MesProWorkRecordDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workrecord/MesProWorkRecordDO.java @@ -2,9 +2,8 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.pro.workrecord; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; -import com.baomidou.mybatisplus.annotation.FieldStrategy; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; @@ -46,6 +45,7 @@ public class MesProWorkRecordDO extends BaseDO { /** * 当前状态 * + * 字典 {@link DictTypeConstants#MES_PRO_WORK_RECORD_TYPE} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.pro.MesProWorkRecordTypeEnum} */ private Integer type; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workrecord/MesProWorkRecordLogDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workrecord/MesProWorkRecordLogDO.java index 84cfcd962..8f2035508 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workrecord/MesProWorkRecordLogDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workrecord/MesProWorkRecordLogDO.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 上下工记录流水 DO @@ -43,6 +44,7 @@ public class MesProWorkRecordLogDO extends BaseDO { /** * 操作类型 * + * 字典 {@link DictTypeConstants#MES_PRO_WORK_RECORD_TYPE} * 枚举 {@link MesProWorkRecordTypeEnum} */ private Integer type; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java index ee835c7e4..26679aec1 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 缺陷类型 DO @@ -39,10 +40,11 @@ public class MesQcDefectDO extends BaseDO { * * 字典类型 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_DEFECT_TYPE} */ - private String type; + private Integer type; /** * 缺陷等级 * + * 字典 {@link DictTypeConstants#MES_DEFECT_LEVEL} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum} */ private Integer level; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defectrecord/MesQcDefectRecordDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defectrecord/MesQcDefectRecordDO.java index 51d1836ea..bd0143c38 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defectrecord/MesQcDefectRecordDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defectrecord/MesQcDefectRecordDO.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 质检缺陷记录 DO @@ -37,6 +38,7 @@ public class MesQcDefectRecordDO extends BaseDO { /** * 检验类型 * + * 字典 {@link DictTypeConstants#MES_QC_TYPE} * 枚举 {@link MesQcTypeEnum} */ private Integer qcType; @@ -61,6 +63,7 @@ public class MesQcDefectRecordDO extends BaseDO { /** * 缺陷等级 * + * 字典 {@link DictTypeConstants#MES_DEFECT_LEVEL} * 枚举 {@link MesQcDefectLevelEnum} */ private Integer level; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicator/MesQcIndicatorDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicator/MesQcIndicatorDO.java index a338ba356..7f99dd1fb 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicator/MesQcIndicatorDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicator/MesQcIndicatorDO.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 质检指标 DO @@ -39,7 +40,7 @@ public class MesQcIndicatorDO extends BaseDO { * * 枚举 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_INDICATOR_TYPE} */ - private String type; + private Integer type; /** * 检测工具 */ @@ -47,6 +48,7 @@ public class MesQcIndicatorDO extends BaseDO { /** * 结果值类型 * + * 字典 {@link DictTypeConstants#MES_QC_RESULT_TYPE} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcResultValueTypeEnum} */ private Integer resultType; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDO.java index cb8343a63..45fc965b5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/indicatorresult/MesQcIndicatorResultDO.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 检验结果记录 DO @@ -48,6 +49,7 @@ public class MesQcIndicatorResultDO extends BaseDO { /** * 质检类型 * + * 字典 {@link DictTypeConstants#MES_QC_TYPE} * 枚举 {@link MesQcTypeEnum} */ private Integer qcType; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/ipqc/MesQcIpqcDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/ipqc/MesQcIpqcDO.java index 53e9222bc..244c34757 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/ipqc/MesQcIpqcDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/ipqc/MesQcIpqcDO.java @@ -15,6 +15,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 过程检验单(IPQC, In-Process Quality Control) DO @@ -62,6 +63,7 @@ public class MesQcIpqcDO extends BaseDO { /** * 来源单据类型 * + * 字典 {@link DictTypeConstants#MES_QC_SOURCE_DOC_TYPE} * 枚举 {@link MesQcSourceDocTypeEnum} */ private Integer sourceDocType; @@ -179,6 +181,7 @@ public class MesQcIpqcDO extends BaseDO { /** * 检测结果 * + * 字典 {@link DictTypeConstants#MES_QC_CHECK_RESULT} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum} */ private Integer checkResult; @@ -195,6 +198,7 @@ public class MesQcIpqcDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_ORDER_STATUS} * 枚举 {@link MesQcStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcDO.java index d0a02017b..9ccc71bfd 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcDO.java @@ -16,6 +16,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 来料检验单(IQC, Incoming Quality Control) DO @@ -57,6 +58,7 @@ public class MesQcIqcDO extends BaseDO { /** * 来源单据类型 * + * 字典 {@link DictTypeConstants#MES_QC_SOURCE_DOC_TYPE} * 枚举 {@link MesQcSourceDocTypeEnum} */ private Integer sourceDocType; @@ -152,6 +154,7 @@ public class MesQcIqcDO extends BaseDO { /** * 检测结果 * + * 字典 {@link DictTypeConstants#MES_QC_CHECK_RESULT} * 枚举 {@link MesQcCheckResultEnum} */ private Integer checkResult; @@ -172,6 +175,7 @@ public class MesQcIqcDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_ORDER_STATUS} * 枚举 {@link MesQcStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/oqc/MesQcOqcDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/oqc/MesQcOqcDO.java index ce7a97eed..62efd792b 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/oqc/MesQcOqcDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/oqc/MesQcOqcDO.java @@ -11,6 +11,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 出货检验单(OQC, Outgoing Quality Control) DO @@ -49,6 +50,13 @@ public class MesQcOqcDO extends BaseDO { // ========== 来源单据 ========== + /** + * 来源单据类型 + * + * 字典 {@link DictTypeConstants#MES_QC_SOURCE_DOC_TYPE} + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcSourceDocTypeEnum} + */ + private Integer sourceDocType; /** * 来源单据 ID * @@ -56,12 +64,6 @@ public class MesQcOqcDO extends BaseDO { * 1. {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcSourceDocTypeEnum#PRODUCT_SALES} 时,关联 {@link cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO#getId()} */ private Long sourceDocId; - /** - * 来源单据类型 - * - * 枚举 {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcSourceDocTypeEnum} - */ - private Integer sourceDocType; /** * 来源单据行 ID * @@ -155,6 +157,7 @@ public class MesQcOqcDO extends BaseDO { /** * 检测结果 * + * 字典 {@link DictTypeConstants#MES_QC_CHECK_RESULT} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum} */ private Integer checkResult; @@ -175,6 +178,7 @@ public class MesQcOqcDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_ORDER_STATUS} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/rqc/MesQcRqcDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/rqc/MesQcRqcDO.java index 868f4c91c..4dfcaae82 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/rqc/MesQcRqcDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/rqc/MesQcRqcDO.java @@ -11,6 +11,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 退货检验单(RQC, Return Quality Control) DO @@ -49,16 +50,16 @@ public class MesQcRqcDO extends BaseDO { // ========== 来源单据 ========== - /** - * 来源单据 ID - */ - private Long sourceDocId; /** * 来源单据类型 * * 关联 {@link cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants} */ private Integer sourceDocType; + /** + * 来源单据 ID + */ + private Long sourceDocId; /** * 来源单据行 ID */ @@ -105,11 +106,39 @@ public class MesQcRqcDO extends BaseDO { */ private BigDecimal unqualifiedQuantity; + // ========== 缺陷统计 ========== + + /** + * 致命缺陷率(%) + */ + private BigDecimal criticalRate; + /** + * 严重缺陷率(%) + */ + private BigDecimal majorRate; + /** + * 轻微缺陷率(%) + */ + private BigDecimal minorRate; + /** + * 致命缺陷数量 + */ + private Integer criticalQuantity; + /** + * 严重缺陷数量 + */ + private Integer majorQuantity; + /** + * 轻微缺陷数量 + */ + private Integer minorQuantity; + // ========== 检验 ========== /** * 检测结果 * + * 字典 {@link DictTypeConstants#MES_QC_CHECK_RESULT} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum} */ private Integer checkResult; @@ -126,6 +155,7 @@ public class MesQcRqcDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_ORDER_STATUS} * 枚举 {@link MesQcStatusEnum} */ private Integer status; @@ -134,31 +164,4 @@ public class MesQcRqcDO extends BaseDO { */ private String remark; - // ========== 缺陷统计 ========== - - /** - * 致命缺陷数量 - */ - private Integer criticalQuantity; - /** - * 严重缺陷数量 - */ - private Integer majorQuantity; - /** - * 轻微缺陷数量 - */ - private Integer minorQuantity; - /** - * 致命缺陷率(%) - */ - private BigDecimal criticalRate; - /** - * 严重缺陷率(%) - */ - private BigDecimal majorRate; - /** - * 轻微缺陷率(%) - */ - private BigDecimal minorRate; - } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolDO.java index c31869940..a6296a2e3 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolDO.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 工具台账 DO @@ -45,7 +46,7 @@ public class MesTmToolDO extends BaseDO { /** * 型号规格 */ - private String spec; + private String specification; /** * 工具类型编号 * @@ -63,6 +64,7 @@ public class MesTmToolDO extends BaseDO { /** * 保养维护类型 * + * 字典 {@link DictTypeConstants#MES_TM_MAINTEN_TYPE} * 枚举 {@link MesTmMaintenTypeEnum} */ private Integer maintenType; @@ -77,6 +79,7 @@ public class MesTmToolDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_TM_TOOL_STATUS} * 枚举 {@link MesTmToolStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolTypeDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolTypeDO.java index c261ba8f3..a3f8d09fb 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolTypeDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolTypeDO.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 工具类型 DO @@ -42,6 +43,7 @@ public class MesTmToolTypeDO extends BaseDO { /** * 保养维护类型 * + * 字典 {@link DictTypeConstants#MES_TM_MAINTEN_TYPE} * 枚举 {@link MesTmMaintenTypeEnum} */ private Integer maintenType; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java index 41e232c56..a3defc0c4 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 到货通知单 DO @@ -61,6 +62,7 @@ public class MesWmArrivalNoticeDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_ARRIVAL_NOTICE_STATUS} * 枚举 {@link MesWmArrivalNoticeStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeConfigDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeConfigDO.java index 0d44f133a..e1c39d7ed 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeConfigDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeConfigDO.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 条码配置 DO @@ -34,12 +35,14 @@ public class MesWmBarcodeConfigDO extends BaseDO { /** * 条码格式 * + * 字典 {@link DictTypeConstants#MES_BARCODE_FORMAT} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.BarcodeFormatEnum} */ private Integer format; /** * 业务类型 * + * 字典 {@link DictTypeConstants#MES_BARCODE_BIZ_TYPE} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum} */ private Integer bizType; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeDO.java index 2205bb9bd..15a5b6047 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeDO.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 条码清单 DO @@ -35,12 +36,14 @@ public class MesWmBarcodeDO extends BaseDO { /** * 条码格式 * + * 字典 {@link DictTypeConstants#MES_BARCODE_FORMAT} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.BarcodeFormatEnum} */ private Integer format; /** * 业务类型 * + * 字典 {@link DictTypeConstants#MES_BARCODE_BIZ_TYPE} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum} */ private Integer bizType; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemconsume/MesWmItemConsumeDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemconsume/MesWmItemConsumeDO.java index 577cf8d4a..65e2f0ca9 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemconsume/MesWmItemConsumeDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemconsume/MesWmItemConsumeDO.java @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 物料消耗记录 DO @@ -71,6 +72,7 @@ public class MesWmItemConsumeDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_ITEM_CONSUME_STATUS} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmItemConsumeStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java index 1dea8d232..3b3e25764 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 采购入库单 DO @@ -69,6 +70,7 @@ public class MesWmItemReceiptDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_ITEM_RECEIPT_STATUS} * 枚举 {@link MesWmItemReceiptStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java index 502884144..95b7c5fe6 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java @@ -34,23 +34,6 @@ public class MesWmMaterialStockDO extends BaseDO { */ @TableId private Long id; - - /** - * 在库数量 - */ - private BigDecimal quantity; - /** - * 入库时间 - */ - private LocalDateTime receiptTime; - - /** - * 供应商编号 - * - * 关联 {@link MesMdVendorDO#getId()} - */ - private Long vendorId; - // ==================== 物料维度 ==================== /** @@ -99,6 +82,23 @@ public class MesWmMaterialStockDO extends BaseDO { */ private Long areaId; + // ==================== 供应商 & 数量 ==================== + + /** + * 供应商编号 + * + * 关联 {@link MesMdVendorDO#getId()} + */ + private Long vendorId; + /** + * 在库数量 + */ + private BigDecimal quantity; + /** + * 入库时间 + */ + private LocalDateTime receiptTime; + // ==================== 状态 ==================== /** diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDO.java index cd722a04a..a93ed5bd4 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDO.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 杂项出库单 DO @@ -38,22 +39,23 @@ public class MesWmMiscIssueDO extends BaseDO { /** * 杂项类型 * + * 字典 {@link DictTypeConstants#MES_WM_MISC_ISSUE_TYPE} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmMiscIssueTypeEnum} */ private Integer type; // TODO @芋艿:这里还没定,关联哪些; /** - * 来源单据ID + * 来源单据类型 + */ + private String sourceDocType; + /** + * 来源单据 ID */ private Long sourceDocId; /** * 来源单据编号 */ private String sourceDocCode; - /** - * 来源单据类型 - */ - private String sourceDocType; /** * 出库日期 */ @@ -61,6 +63,7 @@ public class MesWmMiscIssueDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_MISC_ISSUE_STATUS} * 枚举 {@link MesWmMiscIssueStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java index 635ca292f..0fb63807c 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; import cn.iocoder.yudao.module.mes.enums.wm.MesWmMiscReceiptStatusEnum; -import cn.iocoder.yudao.module.mes.enums.wm.MesWmMiscReceiptTypeEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -41,9 +41,13 @@ public class MesWmMiscReceiptDO extends BaseDO { /** * 杂项类型 * - * 枚举 {@link MesWmMiscReceiptTypeEnum} + * 字典 {@link DictTypeConstants#MES_WM_MISC_RECEIPT_TYPE} */ private Integer type; + /** + * 来源单据类型 + */ + private String sourceDocType; /** * 来源单据 ID */ @@ -52,10 +56,6 @@ public class MesWmMiscReceiptDO extends BaseDO { * 来源单据编码 */ private String sourceDocCode; - /** - * 来源单据类型 - */ - private String sourceDocType; /** * 入库日期 */ @@ -63,6 +63,7 @@ public class MesWmMiscReceiptDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_MISC_RECEIPT_STATUS} * 枚举 {@link MesWmMiscReceiptStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourceissue/MesWmOutsourceIssueDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourceissue/MesWmOutsourceIssueDO.java index a74915721..e69f65939 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourceissue/MesWmOutsourceIssueDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourceissue/MesWmOutsourceIssueDO.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 外协发料单 DO @@ -58,6 +59,7 @@ public class MesWmOutsourceIssueDO extends BaseDO { /** * 单据状态 * + * 字典 {@link DictTypeConstants#MES_WM_OUTSOURCE_ISSUE_STATUS} * 枚举 {@link MesWmOutsourceIssueStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourcereceipt/MesWmOutsourceReceiptDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourcereceipt/MesWmOutsourceReceiptDO.java index 589721fb8..cf1a903fd 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourcereceipt/MesWmOutsourceReceiptDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourcereceipt/MesWmOutsourceReceiptDO.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 外协入库单 DO @@ -55,6 +56,7 @@ public class MesWmOutsourceReceiptDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_OUTSOURCE_RECEIPT_STATUS} * 枚举 {@link MesWmOutsourceReceiptStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourcereceipt/MesWmOutsourceReceiptLineDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourcereceipt/MesWmOutsourceReceiptLineDO.java index 30dd611c0..8f23a5372 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourcereceipt/MesWmOutsourceReceiptLineDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourcereceipt/MesWmOutsourceReceiptLineDO.java @@ -11,6 +11,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 外协入库单行 DO @@ -87,6 +88,7 @@ public class MesWmOutsourceReceiptLineDO extends BaseDO { /** * 质量状态 * + * 字典 {@link DictTypeConstants#MES_WM_QUALITY_STATUS} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum} */ private Integer qualityStatus; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java index bef8c8207..bfb2d8778 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java @@ -10,6 +10,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 装箱单 DO @@ -97,6 +98,7 @@ public class MesWmPackageDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_PACKAGE_STATUS} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmPackageStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDO.java index 83f414c6e..b6de8d957 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDO.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 领料出库单 DO @@ -69,6 +70,7 @@ public class MesWmProductIssueDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_PRODUCT_ISSUE_STATUS} * 枚举 {@link MesWmProductIssueStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productproduce/MesWmProductProduceDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productproduce/MesWmProductProduceDO.java index 4d29666c9..5d06054e3 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productproduce/MesWmProductProduceDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productproduce/MesWmProductProduceDO.java @@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 生产入库单 DO @@ -71,6 +72,7 @@ public class MesWmProductProduceDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_PRODUCT_PRODUCE_STATUS} * 枚举 {@link MesWmProductProduceStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productproduce/MesWmProductProduceLineDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productproduce/MesWmProductProduceLineDO.java index fb2733eca..7c6dd8410 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productproduce/MesWmProductProduceLineDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productproduce/MesWmProductProduceLineDO.java @@ -10,6 +10,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 生产入库单行 DO @@ -72,6 +73,7 @@ public class MesWmProductProduceLineDO extends BaseDO { /** * 质量状态 * + * 字典 {@link DictTypeConstants#MES_WM_QUALITY_STATUS} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum} */ private Integer qualityStatus; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productreceipt/MesWmProductReceiptDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productreceipt/MesWmProductReceiptDO.java index df832998f..c9a99e491 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productreceipt/MesWmProductReceiptDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productreceipt/MesWmProductReceiptDO.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 产品收货(入库)单 DO @@ -56,6 +57,7 @@ public class MesWmProductReceiptDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_PRODUCT_RECEIPT_STATUS} * 枚举 {@link MesWmProductReceiptStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesDO.java index c86fb3a3d..818579b61 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesDO.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 销售出库单 DO @@ -49,17 +50,16 @@ public class MesWmProductSalesDO extends BaseDO { * 销售订单号 */ private String salesOrderCode; - /** - * 出库日期 - */ - private LocalDateTime salesDate; - /** * 发货通知单 ID * * 关联 {@link MesWmSalesNoticeDO#getId()} */ private Long noticeId; + /** + * 出库日期 + */ + private LocalDateTime salesDate; /** * 联系人 @@ -86,6 +86,7 @@ public class MesWmProductSalesDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_PRODUCT_SALES_STATUS} * 枚举 {@link MesWmProductSalesStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java index cf390f754..ec0405f5e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; @@ -12,6 +13,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.math.BigDecimal; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 销售出库单行 DO @@ -39,6 +41,12 @@ public class MesWmProductSalesLineDO extends BaseDO { * 关联 {@link MesWmProductSalesDO#getId()} */ private Long salesId; + /** + * 发货通知单行ID + * + * 关联 {@link MesWmSalesNoticeLineDO#getId()} + */ + private Long noticeLineId; /** * 物料ID * @@ -80,6 +88,7 @@ public class MesWmProductSalesLineDO extends BaseDO { /** * 质量状态 * + * 字典 {@link DictTypeConstants#MES_WM_QUALITY_STATUS} * 枚举 {@link MesWmQualityStatusEnum} */ private Integer qualityStatus; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueDO.java index d0acb3700..dc08306db 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueDO.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 生产退料单 DO @@ -52,6 +53,7 @@ public class MesWmReturnIssueDO extends BaseDO { /** * 退料类型 * + * 字典 {@link DictTypeConstants#MES_WM_RETURN_ISSUE_TYPE} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnIssueTypeEnum} */ private Integer type; @@ -62,6 +64,7 @@ public class MesWmReturnIssueDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_RETURN_ISSUE_STATUS} * 枚举 {@link MesWmReturnIssueStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java index 00b3ca16b..1a7a787aa 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.math.BigDecimal; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 生产退料单行 DO @@ -77,6 +78,7 @@ public class MesWmReturnIssueLineDO extends BaseDO { /** * 质量状态 * + * 字典 {@link DictTypeConstants#MES_WM_QUALITY_STATUS} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum} */ private Integer qualityStatus; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java index bb4c0975a..679a81bfb 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 销售退货单 DO @@ -59,6 +60,7 @@ public class MesWmReturnSalesDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_RETURN_SALES_STATUS} * 枚举 {@link MesWmReturnSalesStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java index 1a3fad65e..85e70b41b 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java @@ -58,6 +58,10 @@ public class MesWmReturnSalesDetailDO extends BaseDO { * 批次 ID */ private Long batchId; + /** + * 批次号 + */ + private String batchCode; /** * 仓库 ID * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java index 635409244..4f39b7ff4 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.math.BigDecimal; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 销售退货单行 DO @@ -49,6 +50,10 @@ public class MesWmReturnSalesLineDO extends BaseDO { * 批次 ID */ private Long batchId; + /** + * 批次号 + */ + private String batchCode; /** * 退货检验单 ID */ @@ -60,6 +65,7 @@ public class MesWmReturnSalesLineDO extends BaseDO { /** * 质量状态 * + * 字典 {@link DictTypeConstants#MES_WM_QUALITY_STATUS} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum} */ private Integer qualityStatus; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java index 1f307e375..779b0e5ce 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 供应商退货单 DO @@ -65,6 +66,7 @@ public class MesWmReturnVendorDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_RETURN_VENDOR_STATUS} * 枚举 {@link MesWmReturnVendorStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java index 01a3ea7dd..f38280dd5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 发货通知单 DO @@ -30,11 +31,11 @@ public class MesWmSalesNoticeDO extends BaseDO { /** * 通知单编码 */ - private String noticeCode; + private String code; /** * 通知单名称 */ - private String noticeName; + private String name; /** * 销售订单编号 */ @@ -64,6 +65,7 @@ public class MesWmSalesNoticeDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_SALES_NOTICE_STATUS} * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmSalesNoticeStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanDO.java index 0f2a21915..9359f6cb6 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanDO.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 盘点方案 DO @@ -44,6 +45,7 @@ public class MesWmStockTakingPlanDO extends BaseDO { /** * 盘点类型 * + * 字典 {@link DictTypeConstants#MES_WM_STOCK_TAKING_TYPE} * 枚举 {@link MesWmStockTakingTypeEnum} */ private Integer type; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanParamDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanParamDO.java index e01edaa34..0a580a05a 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanParamDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanParamDO.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 盘点方案参数 DO @@ -37,6 +38,7 @@ public class MesWmStockTakingPlanParamDO extends BaseDO { /** * 参数值类型 * + * 字典 {@link DictTypeConstants#MES_WM_STOCK_TAKING_PLAN_PARAM_TYPE} * 枚举 {@link MesWmStockTakingPlanParamTypeEnum} */ private Integer type; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskDO.java index 7c42087ad..d2028dabd 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskDO.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 盘点任务 DO @@ -47,6 +48,7 @@ public class MesWmStockTakingTaskDO extends BaseDO { /** * 盘点类型 * + * 字典 {@link DictTypeConstants#MES_WM_STOCK_TAKING_TYPE} * 枚举 {@link MesWmStockTakingTypeEnum} */ private Integer type; @@ -85,6 +87,7 @@ public class MesWmStockTakingTaskDO extends BaseDO { /** * 任务状态 * + * 字典 {@link DictTypeConstants#MES_WM_STOCK_TAKING_TASK_STATUS} * 枚举 {@link MesWmStockTakingTaskStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskLineDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskLineDO.java index 004ddfd92..f13686dba 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskLineDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskLineDO.java @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.math.BigDecimal; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 盘点任务行 DO @@ -91,6 +92,7 @@ public class MesWmStockTakingTaskLineDO extends BaseDO { /** * 盘点状态 * + * 字典 {@link DictTypeConstants#MES_WM_STOCK_TAKING_TASK_LINE_STATUS} * 枚举 {@link MesWmStockTakingTaskLineStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transaction/MesWmTransactionDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transaction/MesWmTransactionDO.java index b1c317681..f574a36f4 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transaction/MesWmTransactionDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transaction/MesWmTransactionDO.java @@ -16,6 +16,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 库存事务流水 DO @@ -43,15 +44,10 @@ public class MesWmTransactionDO extends BaseDO { /** * 事务类型 * + * 字典 {@link DictTypeConstants#MES_WM_TRANSACTION_TYPE} * 枚举 {@link MesWmTransactionTypeEnum} */ private Integer type; - /** - * 本次变动数量 - * - * 正数=入库,负数=出库 - */ - private BigDecimal quantity; /** * 业务类型 @@ -93,6 +89,12 @@ public class MesWmTransactionDO extends BaseDO { * 关联 {@link MesMdItemDO#getId()} */ private Long itemId; + /** + * 本次变动数量 + * + * 正数=入库,负数=出库 + */ + private BigDecimal quantity; /** * 批次 ID * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferDO.java index d593a3eba..64ed37afa 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferDO.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; /** * MES 转移单 DO @@ -41,6 +42,7 @@ public class MesWmTransferDO extends BaseDO { /** * 转移单类型 * + * 字典 {@link DictTypeConstants#MES_WM_TRANSFER_TYPE} * 枚举 {@link MesWmTransferTypeEnum} */ private Integer type; @@ -82,6 +84,7 @@ public class MesWmTransferDO extends BaseDO { /** * 状态 * + * 字典 {@link DictTypeConstants#MES_WM_TRANSFER_STATUS} * 枚举 {@link MesWmTransferStatusEnum} */ private Integer status; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseLocationDO.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseLocationDO.java index bf062ce5d..1c68ff87f 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseLocationDO.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseLocationDO.java @@ -49,12 +49,6 @@ public class MesWmWarehouseLocationDO extends BaseDO { * 面积 */ private BigDecimal area; - /** - * 库位管理状态 - * - * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} - */ - private Integer areaStatus; /** * 是否冻结 */ diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/unitmeasure/MesMdUnitMeasureMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/unitmeasure/MesMdUnitMeasureMapper.java index cb9a2bf03..7b9fda792 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/unitmeasure/MesMdUnitMeasureMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/unitmeasure/MesMdUnitMeasureMapper.java @@ -33,4 +33,8 @@ public interface MesMdUnitMeasureMapper extends BaseMapperX return selectList(MesMdUnitMeasureDO::getStatus, status); } + default Long selectCountByPrimaryId(Long primaryId) { + return selectCount(MesMdUnitMeasureDO::getPrimaryId, primaryId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/workstation/MesMdWorkstationMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/workstation/MesMdWorkstationMapper.java index 8819cf60c..43c403a06 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/workstation/MesMdWorkstationMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/workstation/MesMdWorkstationMapper.java @@ -39,6 +39,10 @@ public interface MesMdWorkstationMapper extends BaseMapperX return selectList(MesMdWorkstationDO::getStatus, status); } + default Long selectCountByWorkshopId(Long workshopId) { + return selectCount(MesMdWorkstationDO::getWorkshopId, workshopId); + } + default Long selectCountByWarehouseId(Long warehouseId) { return selectCount(MesMdWorkstationDO::getWarehouseId, warehouseId); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/workstation/MesMdWorkstationToolMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/workstation/MesMdWorkstationToolMapper.java index fcb8268f6..c1ac2f44c 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/workstation/MesMdWorkstationToolMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/workstation/MesMdWorkstationToolMapper.java @@ -29,4 +29,8 @@ public interface MesMdWorkstationToolMapper extends BaseMapperX { .orderByDesc(MesProTaskIssueDO::getId)); } + default Long selectCountByUnitMeasureId(Long unitMeasureId) { + return selectCount(MesProTaskIssueDO::getUnitMeasureId, unitMeasureId); + } + default List selectListByTaskId(Long taskId) { return selectList(new LambdaQueryWrapperX() .eq(MesProTaskIssueDO::getTaskId, taskId) diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/task/MesProTaskMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/task/MesProTaskMapper.java index ade7495a8..21b9f4455 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/task/MesProTaskMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/task/MesProTaskMapper.java @@ -3,7 +3,9 @@ package cn.iocoder.yudao.module.mes.dal.mysql.pro.task; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.ibatis.annotations.Mapper; @@ -20,16 +22,26 @@ import java.util.List; public interface MesProTaskMapper extends BaseMapperX { default PageResult selectPage(MesProTaskPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(MesProTaskDO::getCode, reqVO.getCode()) + MPJLambdaWrapperX query = new MPJLambdaWrapperX<>(); + query.selectAll(MesProTaskDO.class); + // 当需要按 checkFlag 过滤时,LEFT JOIN pro_route_process + if (reqVO.getCheckFlag() != null) { + query.leftJoin(MesProRouteProcessDO.class, on -> on + .eq(MesProRouteProcessDO::getRouteId, MesProTaskDO::getRouteId) + .eq(MesProRouteProcessDO::getProcessId, MesProTaskDO::getProcessId)); + query.eq(MesProRouteProcessDO::getCheckFlag, reqVO.getCheckFlag()); + } + query.likeIfPresent(MesProTaskDO::getCode, reqVO.getCode()) .likeIfPresent(MesProTaskDO::getName, reqVO.getName()) .eqIfPresent(MesProTaskDO::getWorkOrderId, reqVO.getWorkOrderId()) .eqIfPresent(MesProTaskDO::getRouteId, reqVO.getRouteId()) .eqIfPresent(MesProTaskDO::getProcessId, reqVO.getProcessId()) .eqIfPresent(MesProTaskDO::getWorkstationId, reqVO.getWorkstationId()) .eqIfPresent(MesProTaskDO::getStatus, reqVO.getStatus()) + .inIfPresent(MesProTaskDO::getStatus, reqVO.getStatuses()) .betweenIfPresent(MesProTaskDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(MesProTaskDO::getId)); + .orderByDesc(MesProTaskDO::getId); + return selectPage(reqVO, query); } default List selectListByWorkOrderId(Long workOrderId) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java index b6f9b0961..e9352b851 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java @@ -26,6 +26,7 @@ public interface MesProWorkOrderMapper extends BaseMapperX { .likeIfPresent(MesProWorkOrderDO::getOrderSourceCode, reqVO.getOrderSourceCode()) .eqIfPresent(MesProWorkOrderDO::getProductId, reqVO.getProductId()) .eqIfPresent(MesProWorkOrderDO::getClientId, reqVO.getClientId()) + .eqIfPresent(MesProWorkOrderDO::getStatus, reqVO.getStatus()) .betweenIfPresent(MesProWorkOrderDO::getRequestDate, reqVO.getRequestDate()) .orderByDesc(MesProWorkOrderDO::getId)); } @@ -40,4 +41,8 @@ public interface MesProWorkOrderMapper extends BaseMapperX { .setSql("quantity_produced = IFNULL(quantity_produced, 0) + " + incrQuantityProduced)); } + default Long selectCountByVendorId(Long vendorId) { + return selectCount(MesProWorkOrderDO::getVendorId, vendorId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java index 265ba1218..b134d961e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java @@ -24,4 +24,10 @@ public interface MesQcIndicatorResultMapper extends BaseMapperX() + .eq(MesQcIndicatorResultDO::getQcId, qcId) + .eq(MesQcIndicatorResultDO::getQcType, qcType)); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcLineMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcLineMapper.java index 4dad4b940..37b4a0951 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcLineMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/ipqc/MesQcIpqcLineMapper.java @@ -32,4 +32,8 @@ public interface MesQcIpqcLineMapper extends BaseMapperX { .eq(MesQcIpqcLineDO::getIpqcId, ipqcId)); } + default Long selectCountByUnitMeasureId(Long unitMeasureId) { + return selectCount(MesQcIpqcLineDO::getUnitMeasureId, unitMeasureId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcLineMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcLineMapper.java index d238845c1..761b54d6e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcLineMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcLineMapper.java @@ -32,4 +32,8 @@ public interface MesQcIqcLineMapper extends BaseMapperX { .eq(MesQcIqcLineDO::getIqcId, iqcId)); } + default Long selectCountByUnitMeasureId(Long unitMeasureId) { + return selectCount(MesQcIqcLineDO::getUnitMeasureId, unitMeasureId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcMapper.java index 50a50e91a..07000d619 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/iqc/MesQcIqcMapper.java @@ -32,4 +32,8 @@ public interface MesQcIqcMapper extends BaseMapperX { return selectOne(MesQcIqcDO::getCode, code); } + default Long selectCountByVendorId(Long vendorId) { + return selectCount(MesQcIqcDO::getVendorId, vendorId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcLineMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcLineMapper.java index 34031d0c7..a3907c736 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcLineMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/oqc/MesQcOqcLineMapper.java @@ -32,4 +32,8 @@ public interface MesQcOqcLineMapper extends BaseMapperX { .eq(MesQcOqcLineDO::getOqcId, oqcId)); } + default Long selectCountByUnitMeasureId(Long unitMeasureId) { + return selectCount(MesQcOqcLineDO::getUnitMeasureId, unitMeasureId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcLineMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcLineMapper.java index 1fc134dfc..e3d48d852 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcLineMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcLineMapper.java @@ -32,4 +32,8 @@ public interface MesQcRqcLineMapper extends BaseMapperX { .eq(MesQcRqcLineDO::getRqcId, rqcId)); } + default Long selectCountByUnitMeasureId(Long unitMeasureId) { + return selectCount(MesQcRqcLineDO::getUnitMeasureId, unitMeasureId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/template/MesQcTemplateIndicatorMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/template/MesQcTemplateIndicatorMapper.java index 94b2ae2e1..1e4313382 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/template/MesQcTemplateIndicatorMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/template/MesQcTemplateIndicatorMapper.java @@ -27,6 +27,10 @@ public interface MesQcTemplateIndicatorMapper extends BaseMapperX() .eq(MesQcTemplateIndicatorDO::getTemplateId, templateId)); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/tm/tool/MesTmToolMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/tm/tool/MesTmToolMapper.java index f2f256b59..582957fa5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/tm/tool/MesTmToolMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/tm/tool/MesTmToolMapper.java @@ -21,7 +21,7 @@ public interface MesTmToolMapper extends BaseMapperX { .likeIfPresent(MesTmToolDO::getName, reqVO.getName()) .eqIfPresent(MesTmToolDO::getToolTypeId, reqVO.getToolTypeId()) .likeIfPresent(MesTmToolDO::getBrand, reqVO.getBrand()) - .likeIfPresent(MesTmToolDO::getSpec, reqVO.getSpec()) + .likeIfPresent(MesTmToolDO::getSpecification, reqVO.getSpecification()) .eqIfPresent(MesTmToolDO::getStatus, reqVO.getStatus()) .orderByDesc(MesTmToolDO::getId)); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java index 38119a9ec..12dddc1a2 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java @@ -7,8 +7,6 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArr import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import org.apache.ibatis.annotations.Mapper; -import java.util.List; - /** * MES 到货通知单 Mapper */ @@ -30,10 +28,6 @@ public interface MesWmArrivalNoticeMapper extends BaseMapperX selectListByStatus(Integer status) { - return selectList(MesWmArrivalNoticeDO::getStatus, status); - } - default Long selectCountByVendorId(Long vendorId) { return selectCount(MesWmArrivalNoticeDO::getVendorId, vendorId); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java index 195858cc8..db221d87b 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java @@ -24,6 +24,10 @@ public interface MesWmBatchMapper extends BaseMapperX { return selectOne(MesWmBatchDO:: getCode, code); } + default Long selectCountByToolId(Long toolId) { + return selectCount(MesWmBatchDO::getToolId, toolId); + } + default PageResult selectPage(MesWmBatchPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(MesWmBatchDO::getCode, reqVO.getCode()) diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java index 178717cbe..2810c054b 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java @@ -21,18 +21,29 @@ public interface MesWmMaterialStockMapper extends BaseMapperX selectPage(MesWmMaterialStockPageReqVO reqVO, Collection itemTypeIds, - Collection itemIds) { - return selectPage(reqVO, new LambdaQueryWrapperX() + Collection itemIds, + Long virtualWarehouseId) { + LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX() .inIfPresent(MesWmMaterialStockDO::getItemTypeId, itemTypeIds) .inIfPresent(MesWmMaterialStockDO::getItemId, itemIds) .likeIfPresent(MesWmMaterialStockDO::getBatchCode, reqVO.getBatchCode()) + .eqIfPresent(MesWmMaterialStockDO::getBatchId, reqVO.getBatchId()) .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, reqVO.getWarehouseId()) .eqIfPresent(MesWmMaterialStockDO::getLocationId, reqVO.getLocationId()) .eqIfPresent(MesWmMaterialStockDO::getAreaId, reqVO.getAreaId()) .eqIfPresent(MesWmMaterialStockDO::getVendorId, reqVO.getVendorId()) - .eqIfPresent(MesWmMaterialStockDO::getFrozen, reqVO.getFrozen()) - .ne(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO) - .orderByAsc(MesWmMaterialStockDO::getReceiptTime)); + .eqIfPresent(MesWmMaterialStockDO::getFrozen, reqVO.getFrozen()); + wrapper.ne(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO) + .orderByAsc(MesWmMaterialStockDO::getReceiptTime); + // 虚拟仓过滤(Service 层已将 virtualFilter 解析为 virtualWarehouseId) + if (virtualWarehouseId != null) { + if (MesWmMaterialStockPageReqVO.VIRTUAL_FILTER_ONLY.equals(reqVO.getVirtualFilter())) { + wrapper.eq(MesWmMaterialStockDO::getWarehouseId, virtualWarehouseId); + } else if (MesWmMaterialStockPageReqVO.VIRTUAL_FILTER_EXCLUDE.equals(reqVO.getVirtualFilter())) { + wrapper.ne(MesWmMaterialStockDO::getWarehouseId, virtualWarehouseId); + } + } + return selectPage(reqVO, wrapper); } default Long selectCountByWarehouseId(Long warehouseId) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourceissue/MesWmOutsourceIssueMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourceissue/MesWmOutsourceIssueMapper.java index 48b285515..fc696d52e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourceissue/MesWmOutsourceIssueMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourceissue/MesWmOutsourceIssueMapper.java @@ -29,4 +29,8 @@ public interface MesWmOutsourceIssueMapper extends BaseMapperX { .eqIfPresent(MesWmPackageDO::getClientId, reqVO.getClientId()) .eqIfPresent(MesWmPackageDO::getParentId, reqVO.getParentId()) .eqIfPresent(MesWmPackageDO::getInspectorUserId, reqVO.getInspectorUserId()) + .eqIfPresent(MesWmPackageDO::getStatus, reqVO.getStatus()) .orderByDesc(MesWmPackageDO::getId)); } @@ -42,11 +43,5 @@ public interface MesWmPackageMapper extends BaseMapperX { .in(MesWmPackageDO::getParentId, parentIds)); } - default List selectChildableList() { - return selectList(new LambdaQueryWrapperX() - .eq(MesWmPackageDO::getParentId, MesWmPackageDO.PARENT_ID_ROOT) - .eq(MesWmPackageDO::getStatus, MesWmPackageStatusEnum.FINISHED.getStatus()) - .orderByDesc(MesWmPackageDO::getId)); - } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java index de0477749..a4256f0f2 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java @@ -7,8 +7,6 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSales import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO; import org.apache.ibatis.annotations.Mapper; -import java.util.List; - /** * MES 发货通知单 Mapper */ @@ -17,19 +15,16 @@ public interface MesWmSalesNoticeMapper extends BaseMapperX default PageResult selectPage(MesWmSalesNoticePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(MesWmSalesNoticeDO::getNoticeCode, reqVO.getNoticeCode()) - .likeIfPresent(MesWmSalesNoticeDO::getNoticeName, reqVO.getNoticeName()) + .likeIfPresent(MesWmSalesNoticeDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmSalesNoticeDO::getName, reqVO.getName()) .likeIfPresent(MesWmSalesNoticeDO::getSalesOrderCode, reqVO.getSalesOrderCode()) .eqIfPresent(MesWmSalesNoticeDO::getClientId, reqVO.getClientId()) + .eqIfPresent(MesWmSalesNoticeDO::getStatus, reqVO.getStatus()) .orderByDesc(MesWmSalesNoticeDO::getId)); } - default MesWmSalesNoticeDO selectByNoticeCode(String noticeCode) { - return selectOne(MesWmSalesNoticeDO::getNoticeCode, noticeCode); - } - - default List selectListByStatus(Integer status) { - return selectList(MesWmSalesNoticeDO::getStatus, status); + default MesWmSalesNoticeDO selectByCode(String code) { + return selectOne(MesWmSalesNoticeDO::getCode, code); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanMapper.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanMapper.java index b7cd7339a..fbfc19102 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanMapper.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanMapper.java @@ -7,7 +7,6 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWm import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO; import org.apache.ibatis.annotations.Mapper; -import java.util.List; /** * MES 盘点方案 Mapper @@ -26,12 +25,7 @@ public interface MesWmStockTakingPlanMapper extends BaseMapperX selectListByStatus(Integer status) { - return selectList(new LambdaQueryWrapperX() - .eqIfPresent(MesWmStockTakingPlanDO::getStatus, status) + .eqIfPresent(MesWmStockTakingPlanDO::getStatus, reqVO.getStatus()) .orderByDesc(MesWmStockTakingPlanDO::getId)); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanService.java index 511e9bfed..a4e925c7d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanService.java @@ -62,6 +62,15 @@ public interface MesDvCheckPlanService { */ void validateCheckPlanExists(Long id); + /** + * 校验点检保养方案存在、类型匹配,且方案已启用 + * + * @param id 方案编号 + * @param type 期望的方案类型 + * @return 方案 + */ + MesDvCheckPlanDO validateCheckPlanExistsAndType(Long id, Integer type); + /** * 校验点检保养方案为草稿状态 * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanServiceImpl.java index 21c7eb00a..e209947f9 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanServiceImpl.java @@ -33,6 +33,7 @@ public class MesDvCheckPlanServiceImpl implements MesDvCheckPlanService { @Resource private MesDvCheckPlanMapper checkPlanMapper; + @Resource @Lazy private MesDvCheckPlanMachineryService checkPlanMachineryService; @@ -149,6 +150,20 @@ public class MesDvCheckPlanServiceImpl implements MesDvCheckPlanService { return plan; } + @Override + public MesDvCheckPlanDO validateCheckPlanExistsAndType(Long id, Integer type) { + MesDvCheckPlanDO plan = doValidateCheckPlanExists(id); + // 校验类型匹配 + if (ObjUtil.notEqual(plan.getType(), type)) { + throw exception(DV_CHECK_PLAN_TYPE_MISMATCH); + } + // 校验方案已启用 + if (ObjUtil.notEqual(MesDvCheckPlanStatusEnum.ENABLED.getStatus(), plan.getStatus())) { + throw exception(DV_CHECK_PLAN_NOT_ENABLED_FOR_RECORD); + } + return plan; + } + private void validateCheckPlanCodeUnique(Long id, String code) { MesDvCheckPlanDO plan = checkPlanMapper.selectByCode(code); if (plan == null) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanSubjectServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanSubjectServiceImpl.java index c78ee1298..47f3a137d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanSubjectServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkplan/MesDvCheckPlanSubjectServiceImpl.java @@ -26,6 +26,7 @@ public class MesDvCheckPlanSubjectServiceImpl implements MesDvCheckPlanSubjectSe @Resource private MesDvCheckPlanSubjectMapper checkPlanSubjectMapper; + @Resource @Lazy private MesDvCheckPlanService checkPlanService; @@ -37,7 +38,7 @@ public class MesDvCheckPlanSubjectServiceImpl implements MesDvCheckPlanSubjectSe // 1.1 校验方案草稿状态 checkPlanService.validateCheckPlanPrepare(createReqVO.getPlanId()); // 1.2 校验项目存在 - subjectService.validateSubjectExists(createReqVO.getSubjectId()); + subjectService.validateSubjectExistsAndEnable(createReqVO.getSubjectId()); // 1.3 校验同一方案下项目不重复 if (checkPlanSubjectMapper.selectByPlanIdAndSubjectId(createReqVO.getPlanId(), createReqVO.getSubjectId()) != null) { throw exception(DV_CHECK_PLAN_SUBJECT_DUPLICATE); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordLineServiceImpl.java index f1fd37cc8..17d6cc75e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordLineServiceImpl.java @@ -58,13 +58,10 @@ public class MesDvCheckRecordLineServiceImpl implements MesDvCheckRecordLineServ @Override public void deleteCheckRecordLine(Long id) { // 1. 校验存在 - // TODO @AI:复用 validateCheckRecordLineExists 方法; - MesDvCheckRecordLineDO line = checkRecordLineMapper.selectById(id); - if (line == null) { - throw exception(DV_CHECK_RECORD_LINE_NOT_EXISTS); - } + validateCheckRecordLineExists(id); // 2. 校验父记录为草稿状态 + MesDvCheckRecordLineDO line = checkRecordLineMapper.selectById(id); checkRecordService.validateCheckRecordDraft(line.getRecordId()); // 3. 删除 checkRecordLineMapper.deleteById(id); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordServiceImpl.java index 6a8e9cdfb..27a45b3e1 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordServiceImpl.java @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord.MesDvCheckRecor import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord.MesDvCheckRecordLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.dv.checkrecord.MesDvCheckRecordMapper; import cn.iocoder.yudao.module.mes.enums.dv.MesDvCheckRecordStatusEnum; +import cn.iocoder.yudao.module.mes.enums.dv.MesDvCheckPlanTypeEnum; import cn.iocoder.yudao.module.mes.enums.dv.MesDvCheckResultEnum; import cn.iocoder.yudao.module.mes.service.dv.checkplan.MesDvCheckPlanService; import cn.iocoder.yudao.module.mes.service.dv.checkplan.MesDvCheckPlanSubjectService; @@ -37,8 +38,10 @@ import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @Validated public class MesDvCheckRecordServiceImpl implements MesDvCheckRecordService { + @Resource private MesDvCheckRecordMapper checkRecordMapper; + @Resource @Lazy private MesDvCheckRecordLineService checkRecordLineService; @@ -48,6 +51,7 @@ public class MesDvCheckRecordServiceImpl implements MesDvCheckRecordService { private MesDvCheckPlanService checkPlanService; @Resource private MesDvCheckPlanSubjectService checkPlanSubjectService; + @Resource private AdminUserApi adminUserApi; @@ -95,6 +99,7 @@ public class MesDvCheckRecordServiceImpl implements MesDvCheckRecordService { } @Override + @Transactional(rollbackFor = Exception.class) public void submitCheckRecord(Long id) { // 1.1 校验状态为草稿 validateCheckRecordDraft(id); @@ -105,9 +110,15 @@ public class MesDvCheckRecordServiceImpl implements MesDvCheckRecordService { } // 2. 状态改为已完成 + MesDvCheckRecordDO record = checkRecordMapper.selectById(id); MesDvCheckRecordDO updateObj = new MesDvCheckRecordDO() .setId(id).setStatus(MesDvCheckRecordStatusEnum.FINISHED.getStatus()); checkRecordMapper.updateById(updateObj); + + // 3. 回写设备台账的【最近点检时间】 + if (record.getCheckTime() != null) { + machineryService.updateMachineryLastCheckTime(record.getMachineryId(), record.getCheckTime()); + } } @Override @@ -162,7 +173,7 @@ public class MesDvCheckRecordServiceImpl implements MesDvCheckRecordService { machineryService.validateMachineryExists(reqVO.getMachineryId()); // 校验点检计划是否存在 if (reqVO.getPlanId() != null) { - checkPlanService.validateCheckPlanExists(reqVO.getPlanId()); + checkPlanService.validateCheckPlanExistsAndType(reqVO.getPlanId(), MesDvCheckPlanTypeEnum.CHECK.getType()); } // 校验点检人是否存在 if (reqVO.getUserId() != null) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryService.java index ed5ae596d..5a5588d87 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryService.java @@ -6,8 +6,9 @@ import cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.MesDvMachine import cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.MesDvMachineryPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.MesDvMachinerySaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.dv.machinery.MesDvMachineryDO; +import jakarta.validation.Valid; -import javax.validation.Valid; +import java.time.LocalDateTime; import java.util.Collection; import java.util.List; import java.util.Map; @@ -99,6 +100,22 @@ public interface MesDvMachineryService { return convertMap(getMachineryList(ids), MesDvMachineryDO::getId); } + /** + * 更新设备的最近点检时间 + * + * @param machineryId 设备编号 + * @param lastCheckTime 最近点检时间 + */ + void updateMachineryLastCheckTime(Long machineryId, LocalDateTime lastCheckTime); + + /** + * 更新设备的最近保养时间 + * + * @param machineryId 设备编号 + * @param lastMaintenTime 最近保养时间 + */ + void updateMachineryLastMaintenTime(Long machineryId, LocalDateTime lastMaintenTime); + /** * 导入设备列表 * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryServiceImpl.java index 1eebc11d3..9e74cf637 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.mes.service.dv.machinery; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.MesDvMachineryImportExcelVO; @@ -20,12 +21,13 @@ import cn.iocoder.yudao.module.mes.service.dv.maintenrecord.MesDvMaintenRecordSe import cn.iocoder.yudao.module.mes.service.dv.repair.MesDvRepairService; import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkshopService; import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; +import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -48,26 +50,20 @@ public class MesDvMachineryServiceImpl implements MesDvMachineryService { @Resource @Lazy // 延迟加载,避免循环依赖 private MesDvMachineryTypeService machineryTypeService; - @Resource @Lazy private MesMdWorkshopService workshopService; - @Resource private MesWmBarcodeService barcodeService; - @Resource @Lazy private MesDvCheckPlanMachineryService checkPlanMachineryService; - @Resource @Lazy private MesDvCheckRecordService checkRecordService; - @Resource @Lazy private MesDvMaintenRecordService maintenRecordService; - @Resource @Lazy private MesDvRepairService repairService; @@ -173,6 +169,16 @@ public class MesDvMachineryServiceImpl implements MesDvMachineryService { return machineryMapper.selectCountByMachineryTypeId(machineryTypeId); } + @Override + public void updateMachineryLastCheckTime(Long machineryId, LocalDateTime lastCheckTime) { + machineryMapper.updateById(new MesDvMachineryDO().setId(machineryId).setLastCheckTime(lastCheckTime)); + } + + @Override + public void updateMachineryLastMaintenTime(Long machineryId, LocalDateTime lastMaintenTime) { + machineryMapper.updateById(new MesDvMachineryDO().setId(machineryId).setLastMaintenTime(lastMaintenTime)); + } + @Override public List getMachineryList() { return machineryMapper.selectList(); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/maintenrecord/MesDvMaintenRecordLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/maintenrecord/MesDvMaintenRecordLineServiceImpl.java index 62ac5ce59..d65312df9 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/maintenrecord/MesDvMaintenRecordLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/maintenrecord/MesDvMaintenRecordLineServiceImpl.java @@ -73,7 +73,7 @@ public class MesDvMaintenRecordLineServiceImpl implements MesDvMaintenRecordLine // 校验保养记录为草稿状态 maintenRecordService.validateMaintenRecordDraft(reqVO.getRecordId()); // 校验保养项目是否存在 - subjectService.validateSubjectExists(reqVO.getSubjectId()); + subjectService.validateSubjectExistsAndEnable(reqVO.getSubjectId()); } private MesDvMaintenRecordLineDO validateMaintenRecordLineExists(Long id) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/maintenrecord/MesDvMaintenRecordServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/maintenrecord/MesDvMaintenRecordServiceImpl.java index ef0ab5077..ab5479f25 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/maintenrecord/MesDvMaintenRecordServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/maintenrecord/MesDvMaintenRecordServiceImpl.java @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.dv.maintenrecord.MesDvMaintenR import cn.iocoder.yudao.module.mes.dal.dataobject.dv.maintenrecord.MesDvMaintenRecordLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.dv.maintenrecord.MesDvMaintenRecordMapper; import cn.iocoder.yudao.module.mes.enums.dv.MesDvMaintenRecordStatusEnum; +import cn.iocoder.yudao.module.mes.enums.dv.MesDvCheckPlanTypeEnum; import cn.iocoder.yudao.module.mes.service.dv.checkplan.MesDvCheckPlanService; import cn.iocoder.yudao.module.mes.service.dv.machinery.MesDvMachineryService; import org.springframework.context.annotation.Lazy; @@ -34,6 +35,7 @@ public class MesDvMaintenRecordServiceImpl implements MesDvMaintenRecordService @Resource private MesDvMaintenRecordMapper maintenRecordMapper; + @Resource @Lazy private MesDvMaintenRecordLineService maintenRecordLineService; @@ -67,6 +69,7 @@ public class MesDvMaintenRecordServiceImpl implements MesDvMaintenRecordService } @Override + @Transactional(rollbackFor = Exception.class) public void submitMaintenRecord(Long id) { // 1.1 校验状态为草稿 validateMaintenRecordDraft(id); @@ -77,10 +80,16 @@ public class MesDvMaintenRecordServiceImpl implements MesDvMaintenRecordService } // 2. 状态改为已提交 + MesDvMaintenRecordDO record = maintenRecordMapper.selectById(id); MesDvMaintenRecordDO updateObj = new MesDvMaintenRecordDO(); updateObj.setId(id); updateObj.setStatus(MesDvMaintenRecordStatusEnum.SUBMITTED.getStatus()); maintenRecordMapper.updateById(updateObj); + + // 3. 回写设备台账的【最近保养时间】 + if (record.getMaintenTime() != null) { + machineryService.updateMachineryLastMaintenTime(record.getMachineryId(), record.getMaintenTime()); + } } @Override @@ -100,7 +109,7 @@ public class MesDvMaintenRecordServiceImpl implements MesDvMaintenRecordService machineryService.validateMachineryExists(reqVO.getMachineryId()); // 校验保养计划是否存在 if (reqVO.getPlanId() != null) { - checkPlanService.validateCheckPlanExists(reqVO.getPlanId()); + checkPlanService.validateCheckPlanExistsAndType(reqVO.getPlanId(), MesDvCheckPlanTypeEnum.MAINTENANCE.getType()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/repair/MesDvRepairLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/repair/MesDvRepairLineServiceImpl.java index 2da6220a1..8273fe139 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/repair/MesDvRepairLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/repair/MesDvRepairLineServiceImpl.java @@ -80,7 +80,7 @@ public class MesDvRepairLineServiceImpl implements MesDvRepairLineService { repairService.validateRepairExists(reqVO.getRepairId()); // 校验点检保养项目是否存在(可选) if (reqVO.getSubjectId() != null) { - subjectService.validateSubjectExists(reqVO.getSubjectId()); + subjectService.validateSubjectExistsAndEnable(reqVO.getSubjectId()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/subject/MesDvSubjectService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/subject/MesDvSubjectService.java index 960e1b6ac..efb02cf7a 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/subject/MesDvSubjectService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/subject/MesDvSubjectService.java @@ -64,6 +64,13 @@ public interface MesDvSubjectService { */ void validateSubjectExists(Long id); + /** + * 校验点检保养项目存在且启用 + * + * @param id 编号 + */ + void validateSubjectExistsAndEnable(Long id); + /** * 获得点检保养项目列表 * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/subject/MesDvSubjectServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/subject/MesDvSubjectServiceImpl.java index 2687ecae0..1d18e0677 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/subject/MesDvSubjectServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/dv/subject/MesDvSubjectServiceImpl.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.service.dv.subject; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.dv.subject.vo.MesDvSubjectPageReqVO; @@ -32,7 +33,7 @@ public class MesDvSubjectServiceImpl implements MesDvSubjectService { @Resource private MesDvSubjectMapper subjectMapper; - // DONE @AI:调用对方的 service + @Resource @Lazy private MesDvCheckPlanSubjectService checkPlanSubjectService; @@ -80,6 +81,17 @@ public class MesDvSubjectServiceImpl implements MesDvSubjectService { } } + @Override + public void validateSubjectExistsAndEnable(Long id) { + MesDvSubjectDO subject = subjectMapper.selectById(id); + if (subject == null) { + throw exception(DV_SUBJECT_NOT_EXISTS); + } + if (ObjUtil.notEqual(CommonStatusEnum.ENABLE.getStatus(), subject.getStatus())) { + throw exception(DV_SUBJECT_IS_DISABLE); + } + } + private void validateSubjectCodeUnique(Long id, String code) { if (code == null) { return; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/client/MesMdClientService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/client/MesMdClientService.java index c50575e97..be36dffc2 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/client/MesMdClientService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/client/MesMdClientService.java @@ -84,6 +84,13 @@ public interface MesMdClientService { */ void validateClientExists(Long id); + /** + * 校验客户存在且启用 + * + * @param id 编号 + */ + void validateClientExistsAndEnable(Long id); + /** * 批量导入客户 * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/client/MesMdClientServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/client/MesMdClientServiceImpl.java index dac5754b7..8242f592a 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/client/MesMdClientServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/client/MesMdClientServiceImpl.java @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.client.vo.MesMdClientImpo import cn.iocoder.yudao.module.mes.controller.admin.md.client.vo.MesMdClientImportRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.client.vo.MesMdClientPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.client.vo.MesMdClientSaveReqVO; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.client.MesMdClientMapper; import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum; @@ -95,6 +96,17 @@ public class MesMdClientServiceImpl implements MesMdClientService { } } + @Override + public void validateClientExistsAndEnable(Long id) { + MesMdClientDO client = clientMapper.selectById(id); + if (client == null) { + throw exception(MD_CLIENT_NOT_EXISTS); + } + if (ObjUtil.notEqual(CommonStatusEnum.ENABLE.getStatus(), client.getStatus())) { + throw exception(MD_CLIENT_IS_DISABLE); + } + } + private void validateClientCodeUnique(Long id, String code) { MesMdClientDO client = clientMapper.selectByCode(code); if (client == null) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemService.java index 647ae0a0c..1dad9200a 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemService.java @@ -67,6 +67,14 @@ public interface MesMdItemService { */ MesMdItemDO validateItemExists(Long id); + /** + * 校验物料产品存在且启用 + * + * @param id 编号 + * @return 物料产品 + */ + MesMdItemDO validateItemExistsAndEnable(Long id); + /** * 获得物料产品分页 * @@ -110,4 +118,12 @@ public interface MesMdItemService { */ MesMdItemImportRespVO importItemList(List importItems, boolean updateSupport); + /** + * 基于计量单位编号,获得物料数量 + * + * @param unitMeasureId 计量单位编号 + * @return 物料数量 + */ + Long getItemCountByUnitMeasureId(Long unitMeasureId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java index 837592c6e..47723ec27 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java @@ -17,8 +17,10 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper; import cn.iocoder.yudao.module.mes.enums.md.MesMdItemTypeEnum; +import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum; import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum; import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -59,6 +61,8 @@ public class MesMdItemServiceImpl implements MesMdItemService { private MesMdProductSipService productSipService; @Resource private MesWmBarcodeService barcodeService; + @Resource + private MesMdAutoCodeRecordService autoCodeRecordService; @Override public Long createItem(MesMdItemSaveReqVO createReqVO) { @@ -150,6 +154,15 @@ public class MesMdItemServiceImpl implements MesMdItemService { return item; } + @Override + public MesMdItemDO validateItemExistsAndEnable(Long id) { + MesMdItemDO item = validateItemExists(id); + if (ObjUtil.notEqual(CommonStatusEnum.ENABLE.getStatus(), item.getStatus())) { + throw exception(MD_ITEM_IS_DISABLE); + } + return item; + } + private void validateItemCodeUnique(Long id, String code) { MesMdItemDO item = itemMapper.selectByCode(code); if (item == null) { @@ -174,6 +187,11 @@ public class MesMdItemServiceImpl implements MesMdItemService { if (itemTypeService.getItemType(itemTypeId) == null) { throw exception(MD_ITEM_TYPE_NOT_EXISTS); } + // 校验必须是叶子分类(没有子分类) + List children = itemTypeService.getItemTypeChildrenList(itemTypeId); + if (CollUtil.isNotEmpty(children)) { + throw exception(MD_ITEM_TYPE_NOT_LEAF); + } } private void validateUnitMeasureExists(Long unitMeasureId) { @@ -251,6 +269,11 @@ public class MesMdItemServiceImpl implements MesMdItemService { return itemMapper.selectCountByItemTypeId(itemTypeId); } + @Override + public Long getItemCountByUnitMeasureId(Long unitMeasureId) { + return itemMapper.selectCountByUnitMeasureId(unitMeasureId); + } + @Override @Transactional(rollbackFor = Exception.class) public MesMdItemImportRespVO importItemList(List importItems, boolean updateSupport) { @@ -267,11 +290,11 @@ public class MesMdItemServiceImpl implements MesMdItemService { importItems.forEach(importItem -> { int currentIndex = index.getAndIncrement(); // 2.1 校验字段 - String key = StrUtil.blankToDefault(importItem.getCode(), "第 " + currentIndex + " 行"); if (StrUtil.isBlank(importItem.getCode())) { - respVO.getFailureCodes().put(key, "物料编码不能为空"); - return; + // 空编码时自动生成 + importItem.setCode(autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.MD_ITEM_CODE.getCode())); } + String key = importItem.getCode(); if (StrUtil.isBlank(importItem.getName())) { respVO.getFailureCodes().put(key, "物料名称不能为空"); return; diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductSipServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductSipServiceImpl.java index 468dae6b2..c6486a02d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductSipServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductSipServiceImpl.java @@ -59,7 +59,7 @@ public class MesMdProductSipServiceImpl implements MesMdProductSipService { validateSortUnique(reqVO.getItemId(), reqVO.getSort(), excludeId); // 校验工序存在 if (reqVO.getProcessId() != null) { - processService.validateProcessExists(reqVO.getProcessId()); + processService.validateProcessExistsAndEnable(reqVO.getProcessId()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductSopServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductSopServiceImpl.java index d46974fd6..564e930c4 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductSopServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductSopServiceImpl.java @@ -59,7 +59,7 @@ public class MesMdProductSopServiceImpl implements MesMdProductSopService { validateSortUnique(reqVO.getItemId(), reqVO.getSort(), excludeId); // 校验工序存在 if (reqVO.getProcessId() != null) { - processService.validateProcessExists(reqVO.getProcessId()); + processService.validateProcessExistsAndEnable(reqVO.getProcessId()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureServiceImpl.java index bed51580f..139fb121a 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureServiceImpl.java @@ -6,12 +6,19 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasurePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasureSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; -import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper; import cn.iocoder.yudao.module.mes.dal.mysql.md.unitmeasure.MesMdUnitMeasureMapper; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskIssueService; +import cn.iocoder.yudao.module.mes.service.qc.ipqc.MesQcIpqcLineService; +import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcLineService; +import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcLineService; +import cn.iocoder.yudao.module.mes.service.qc.rqc.MesQcRqcLineService; +import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateIndicatorService; +import org.springframework.context.annotation.Lazy; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -33,7 +40,26 @@ public class MesMdUnitMeasureServiceImpl implements MesMdUnitMeasureService { private MesMdUnitMeasureMapper unitMeasureMapper; @Resource - private MesMdItemMapper itemMapper; + @Lazy + private MesMdItemService itemService; + @Resource + @Lazy + private MesProTaskIssueService taskIssueService; + @Resource + @Lazy + private MesQcTemplateIndicatorService templateIndicatorService; + @Resource + @Lazy + private MesQcIqcLineService iqcLineService; + @Resource + @Lazy + private MesQcOqcLineService oqcLineService; + @Resource + @Lazy + private MesQcIpqcLineService ipqcLineService; + @Resource + @Lazy + private MesQcRqcLineService rqcLineService; @Override public Long createUnitMeasure(MesMdUnitMeasureSaveReqVO createReqVO) { @@ -62,10 +88,30 @@ public class MesMdUnitMeasureServiceImpl implements MesMdUnitMeasureService { public void deleteUnitMeasure(Long id) { // 校验存在 validateUnitMeasureExists(id); + // 校验是否存在以此为主单位的辅单位 + if (unitMeasureMapper.selectCountByPrimaryId(id) > 0) { + throw exception(MD_UNIT_MEASURE_HAS_SECONDARY); + } // 校验是否被物料引用 - if (itemMapper.selectCountByUnitMeasureId(id) > 0) { + if (itemService.getItemCountByUnitMeasureId(id) > 0) { throw exception(MD_UNIT_MEASURE_HAS_ITEM); } + // 校验是否被生产任务投料引用 + if (taskIssueService.getTaskIssueCountByUnitMeasureId(id) > 0) { + throw exception(MD_UNIT_MEASURE_HAS_TASK_ISSUE); + } + // 校验是否被质检方案指标项引用 + if (templateIndicatorService.getTemplateIndicatorCountByUnitMeasureId(id) > 0) { + throw exception(MD_UNIT_MEASURE_HAS_QC_TEMPLATE_INDICATOR); + } + // 校验是否被质检单据行引用(IQC/OQC/IPQC/RQC) + if (iqcLineService.getIqcLineCountByUnitMeasureId(id) > 0 + || oqcLineService.getOqcLineCountByUnitMeasureId(id) > 0 + || ipqcLineService.getIpqcLineCountByUnitMeasureId(id) > 0 + || rqcLineService.getRqcLineCountByUnitMeasureId(id) > 0) { + throw exception(MD_UNIT_MEASURE_HAS_QC_LINE); + } + // 删除 unitMeasureMapper.deleteById(id); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/vendor/MesMdVendorService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/vendor/MesMdVendorService.java index 05ca667c1..b2fe2b67f 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/vendor/MesMdVendorService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/vendor/MesMdVendorService.java @@ -59,6 +59,14 @@ public interface MesMdVendorService { */ MesMdVendorDO validateVendorExists(Long id); + /** + * 校验供应商存在且启用 + * + * @param id 供应商 ID + * @return 供应商 + */ + MesMdVendorDO validateVendorExistsAndEnable(Long id); + /** * 获得供应商分页 * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/vendor/MesMdVendorServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/vendor/MesMdVendorServiceImpl.java index abea8833a..ea7ec8294 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/vendor/MesMdVendorServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/vendor/MesMdVendorServiceImpl.java @@ -10,12 +10,17 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.vendor.vo.MesMdVendorImpo import cn.iocoder.yudao.module.mes.controller.admin.md.vendor.vo.MesMdVendorImportRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.vendor.vo.MesMdVendorPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.vendor.vo.MesMdVendorSaveReqVO; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.vendor.MesMdVendorMapper; import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; +import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptService; +import cn.iocoder.yudao.module.mes.service.wm.outsourceissue.MesWmOutsourceIssueService; +import cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt.MesWmOutsourceReceiptService; import cn.iocoder.yudao.module.mes.service.wm.returnvendor.MesWmReturnVendorService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -56,6 +61,18 @@ public class MesMdVendorServiceImpl implements MesMdVendorService { @Resource @Lazy private MesWmReturnVendorService returnVendorService; + @Resource + @Lazy + private MesQcIqcService iqcService; + @Resource + @Lazy + private MesProWorkOrderService workOrderService; + @Resource + @Lazy + private MesWmOutsourceIssueService outsourceIssueService; + @Resource + @Lazy + private MesWmOutsourceReceiptService outsourceReceiptService; @Override public Long createVendor(MesMdVendorSaveReqVO createReqVO) { @@ -103,6 +120,15 @@ public class MesMdVendorServiceImpl implements MesMdVendorService { return vendor; } + @Override + public MesMdVendorDO validateVendorExistsAndEnable(Long id) { + MesMdVendorDO vendor = validateVendorExists(id); + if (ObjUtil.notEqual(CommonStatusEnum.ENABLE.getStatus(), vendor.getStatus())) { + throw exception(MD_VENDOR_IS_DISABLE); + } + return vendor; + } + private void validateVendorSaveData(MesMdVendorSaveReqVO reqVO) { // 校验编码唯一 validateVendorCodeUnique(reqVO.getId(), reqVO.getCode()); @@ -148,7 +174,11 @@ public class MesMdVendorServiceImpl implements MesMdVendorService { private void validateVendorNotReferenced(Long id) { if (itemReceiptService.getItemReceiptCountByVendorId(id) > 0 || arrivalNoticeService.getArrivalNoticeCountByVendorId(id) > 0 - || returnVendorService.getReturnVendorCountByVendorId(id) > 0) { + || returnVendorService.getReturnVendorCountByVendorId(id) > 0 + || iqcService.getIqcCountByVendorId(id) > 0 + || workOrderService.getWorkOrderCountByVendorId(id) > 0 + || outsourceIssueService.getOutsourceIssueCountByVendorId(id) > 0 + || outsourceReceiptService.getOutsourceReceiptCountByVendorId(id) > 0) { throw exception(MD_VENDOR_HAS_REFERENCE); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkshopServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkshopServiceImpl.java index 68c944e4a..c32c9772d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkshopServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkshopServiceImpl.java @@ -7,9 +7,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.md.workstation.vo.workshop.MesMdWorkshopPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.workstation.vo.workshop.MesMdWorkshopSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkshopDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkshopMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkstationMapper; import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum; import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; import org.springframework.context.annotation.Lazy; @@ -38,8 +36,7 @@ public class MesMdWorkshopServiceImpl implements MesMdWorkshopService { @Resource @Lazy - private MesMdWorkstationMapper workstationMapper; - + private MesMdWorkstationService workstationService; @Resource private MesWmBarcodeService barcodeService; @@ -79,7 +76,7 @@ public class MesMdWorkshopServiceImpl implements MesMdWorkshopService { // 校验存在 validateWorkshopExists(id); // 校验车间下是否存在工作站 - Long count = workstationMapper.selectCount(MesMdWorkstationDO::getWorkshopId, id); + Long count = workstationService.getWorkstationCountByWorkshopId(id); if (count > 0) { throw exception(MD_WORKSHOP_HAS_WORKSTATION); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationMachineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationMachineServiceImpl.java index c63e36f2d..b970352ac 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationMachineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationMachineServiceImpl.java @@ -5,12 +5,12 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.workstation.vo.machine.Me import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationMachineDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkstationMachineMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkstationMapper; import cn.iocoder.yudao.module.mes.service.dv.machinery.MesDvMachineryService; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -29,8 +29,8 @@ public class MesMdWorkstationMachineServiceImpl implements MesMdWorkstationMachi private MesMdWorkstationMachineMapper workstationMachineMapper; @Resource - private MesMdWorkstationMapper workstationMapper; - + @Lazy + private MesMdWorkstationService workstationService; @Resource private MesDvMachineryService machineryService; @@ -51,7 +51,7 @@ public class MesMdWorkstationMachineServiceImpl implements MesMdWorkstationMachi // 校验该设备是否已分配到其他工作站(一台设备只能分配到一个工作站) MesMdWorkstationMachineDO existing = workstationMachineMapper.selectByMachineryId(reqVO.getMachineryId()); if (existing != null) { - MesMdWorkstationDO workstation = workstationMapper.selectById(existing.getWorkstationId()); + MesMdWorkstationDO workstation = workstationService.getWorkstation(existing.getWorkstationId()); throw exception(MD_WORKSTATION_MACHINE_EXISTS, workstation != null ? workstation.getName() : String.valueOf(existing.getWorkstationId())); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationService.java index 04c9c8d5f..7b4df3511 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationService.java @@ -49,6 +49,14 @@ public interface MesMdWorkstationService { */ MesMdWorkstationDO validateWorkstationExists(Long id); + /** + * 校验工作站存在且启用 + * + * @param id 编号 + * @return 工作站 + */ + MesMdWorkstationDO validateWorkstationExistsAndEnable(Long id); + /** * 获得工作站 * @@ -97,6 +105,14 @@ public interface MesMdWorkstationService { */ Long getWorkstationCountByAreaId(Long areaId); + /** + * 获得指定车间下的工作站数量 + * + * @param workshopId 车间编号 + * @return 工作站数量 + */ + Long getWorkstationCountByWorkshopId(Long workshopId); + /** * 获得工作站列表 * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationServiceImpl.java index c1db5be20..647177a05 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.mes.service.md.workstation; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.md.workstation.vo.MesMdWorkstationPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.workstation.vo.MesMdWorkstationSaveReqVO; @@ -13,16 +14,17 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkstationMapper; import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum; -import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -43,12 +45,12 @@ public class MesMdWorkstationServiceImpl implements MesMdWorkstationService { private MesMdWorkstationMapper workstationMapper; @Resource + @Lazy private MesMdWorkstationMachineService workstationMachineService; @Resource private MesMdWorkstationToolService workstationToolService; @Resource private MesMdWorkstationWorkerService workstationWorkerService; - @Resource private MesMdWorkshopService workshopService; @Resource @@ -97,7 +99,7 @@ public class MesMdWorkstationServiceImpl implements MesMdWorkstationService { // 校验车间存在 validateWorkshopExists(reqVO.getWorkshopId()); // 校验工序存在 - processService.validateProcessExists(reqVO.getProcessId()); + processService.validateProcessExistsAndEnable(reqVO.getProcessId()); // 处理仓库层级(未指定仓库时自动设置虚拟线边库) handleWarehouseHierarchy(reqVO); } @@ -125,6 +127,15 @@ public class MesMdWorkstationServiceImpl implements MesMdWorkstationService { return workstation; } + @Override + public MesMdWorkstationDO validateWorkstationExistsAndEnable(Long id) { + MesMdWorkstationDO workstation = validateWorkstationExists(id); + if (ObjUtil.notEqual(CommonStatusEnum.ENABLE.getStatus(), workstation.getStatus())) { + throw exception(MD_WORKSTATION_IS_DISABLE); + } + return workstation; + } + private void validateWorkshopExists(Long workshopId) { MesMdWorkshopDO workshop = workshopService.getWorkshop(workshopId); if (workshop == null) { @@ -232,6 +243,11 @@ public class MesMdWorkstationServiceImpl implements MesMdWorkstationService { return workstationMapper.selectListByStatus(status); } + @Override + public Long getWorkstationCountByWorkshopId(Long workshopId) { + return workstationMapper.selectCountByWorkshopId(workshopId); + } + @Override public Long getWorkstationCountByWarehouseId(Long warehouseId) { return workstationMapper.selectCountByWarehouseId(warehouseId); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationToolService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationToolService.java index 215e437fb..bc58c8336 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationToolService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationToolService.java @@ -50,4 +50,12 @@ public interface MesMdWorkstationToolService { */ void deleteWorkstationToolByWorkstationId(Long workstationId); + /** + * 获得指定工具类型的工装夹具资源数量 + * + * @param toolTypeId 工具类型编号 + * @return 数量 + */ + Long getWorkstationToolCountByToolTypeId(Long toolTypeId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationToolServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationToolServiceImpl.java index a6666e7eb..d4d29c71e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationToolServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkstationToolServiceImpl.java @@ -89,4 +89,9 @@ public class MesMdWorkstationToolServiceImpl implements MesMdWorkstationToolServ workstationToolMapper.deleteByWorkstationId(workstationId); } + @Override + public Long getWorkstationToolCountByToolTypeId(Long toolTypeId) { + return workstationToolMapper.selectCountByToolTypeId(toolTypeId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/andon/MesProAndonRecordServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/andon/MesProAndonRecordServiceImpl.java index 12be2ebd0..0048651fd 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/andon/MesProAndonRecordServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/andon/MesProAndonRecordServiceImpl.java @@ -35,13 +35,10 @@ public class MesProAndonRecordServiceImpl implements MesProAndonRecordService { @Resource private MesMdWorkstationService workstationService; - @Resource private MesProWorkOrderService workOrderService; - @Resource private MesProProcessService processService; - @Resource private MesProAndonConfigService andonConfigService; @@ -51,10 +48,10 @@ public class MesProAndonRecordServiceImpl implements MesProAndonRecordService { MesProAndonConfigDO config = andonConfigService.validateAndonConfigExists(createReqVO.getConfigId()); workstationService.validateWorkstationExists(createReqVO.getWorkstationId()); if (createReqVO.getWorkOrderId() != null) { - workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); + workOrderService.validateWorkOrderConfirmed(createReqVO.getWorkOrderId()); } if (createReqVO.getProcessId() != null) { - processService.validateProcessExists(createReqVO.getProcessId()); + processService.validateProcessExistsAndEnable(createReqVO.getProcessId()); } // 2. 插入记录 diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java index b9bcc9f54..fed995963 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java @@ -31,13 +31,12 @@ public class MesProCardProcessServiceImpl implements MesProCardProcessService { @Resource @Lazy private MesProCardService cardService; - @Resource private MesProProcessService processService; @Override public Long createCardProcess(MesProCardProcessSaveReqVO createReqVO) { - // 1. 校验关联数据 + // 1. 校验关联数据(含流转卡草稿状态校验) validateCardProcessSaveData(createReqVO); // 2. 插入 @@ -50,7 +49,7 @@ public class MesProCardProcessServiceImpl implements MesProCardProcessService { public void updateCardProcess(MesProCardProcessSaveReqVO updateReqVO) { // 1.1 校验存在 validateCardProcessExists(updateReqVO.getId()); - // 1.2 校验关联数据 + // 1.2 校验关联数据(含流转卡草稿状态校验) validateCardProcessSaveData(updateReqVO); // 2. 更新 @@ -61,9 +60,14 @@ public class MesProCardProcessServiceImpl implements MesProCardProcessService { @Override public void deleteCardProcess(Long id) { // 1. 校验存在 - validateCardProcessExists(id); + MesProCardProcessDO cardProcess = cardProcessMapper.selectById(id); + if (cardProcess == null) { + throw exception(PRO_CARD_PROCESS_NOT_EXISTS); + } + // 2. 校验流转卡为草稿状态 + cardService.validateCardExistsAndPrepare(cardProcess.getCardId()); - // 2. 删除 + // 3. 删除 cardProcessMapper.deleteById(id); } @@ -86,11 +90,11 @@ public class MesProCardProcessServiceImpl implements MesProCardProcessService { } private void validateCardProcessSaveData(MesProCardProcessSaveReqVO reqVO) { - // 校验流转卡存在 - cardService.validateCardExists(reqVO.getCardId()); + // 校验流转卡存在 + 草稿状态 + cardService.validateCardExistsAndPrepare(reqVO.getCardId()); // 校验工序存在 if (reqVO.getProcessId() != null) { - processService.validateProcessExists(reqVO.getProcessId()); + processService.validateProcessExistsAndEnable(reqVO.getProcessId()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java index 59f365464..b43e7421e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java @@ -4,9 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardDO; - -import javax.validation.Valid; -import java.util.List; +import jakarta.validation.Valid; /** * MES 生产流转卡 Service 接口 @@ -44,6 +42,13 @@ public interface MesProCardService { */ void validateCardExists(Long id); + /** + * 校验生产流转卡存在,且为草稿状态 + * + * @param id 编号 + */ + void validateCardExistsAndPrepare(Long id); + /** * 获得生产流转卡 * @@ -60,13 +65,6 @@ public interface MesProCardService { */ PageResult getCardPage(MesProCardPageReqVO pageReqVO); - /** - * 获得生产流转卡精简列表 - * - * @return 流转卡列表 - */ - List getCardSimpleList(); - /** * 提交生产流转卡(草稿 → 已确认) * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java index 8b71efa47..86eb479ed 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java @@ -7,20 +7,19 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.dal.mysql.pro.card.MesProCardMapper; import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; -import java.util.List; - import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -36,11 +35,9 @@ public class MesProCardServiceImpl implements MesProCardService { @Resource private MesProCardMapper cardMapper; - // DONE @AI:会用对应的 service @Resource @Lazy private MesProCardProcessService cardProcessService; - @Resource private MesProWorkOrderService workOrderService; @Resource @@ -66,8 +63,8 @@ public class MesProCardServiceImpl implements MesProCardService { @Override public void updateCard(MesProCardSaveReqVO updateReqVO) { - // 1.1 校验存在 - validateCardExists(updateReqVO.getId()); + // 1.1 校验存在 + 草稿状态 + validateCardExistsAndPrepare(updateReqVO.getId()); // 1.2 校验关联数据 validateCardSaveData(updateReqVO); @@ -79,8 +76,8 @@ public class MesProCardServiceImpl implements MesProCardService { @Override @Transactional(rollbackFor = Exception.class) public void deleteCard(Long id) { - // 1. 校验存在 - validateCardExists(id); + // 1. 校验存在 + 草稿状态 + validateCardExistsAndPrepare(id); // 2. 删除流转卡 + 级联删除工序记录 cardMapper.deleteById(id); @@ -97,11 +94,6 @@ public class MesProCardServiceImpl implements MesProCardService { return cardMapper.selectPage(pageReqVO); } - @Override - public List getCardSimpleList() { - return cardMapper.selectList(); - } - @Override public void submitCard(Long id) { // 1. 校验存在 + 草稿状态 @@ -145,6 +137,14 @@ public class MesProCardServiceImpl implements MesProCardService { validateCardExistsInternal(id); } + @Override + public void validateCardExistsAndPrepare(Long id) { + MesProCardDO card = validateCardExistsInternal(id); + if (ObjUtil.notEqual(MesProWorkOrderStatusEnum.PREPARE.getStatus(), card.getStatus())) { + throw exception(PRO_CARD_NOT_PREPARE); + } + } + private MesProCardDO validateCardExistsInternal(Long id) { MesProCardDO card = cardMapper.selectById(id); if (card == null) { @@ -178,9 +178,12 @@ public class MesProCardServiceImpl implements MesProCardService { // 校验编码唯一 validateCardCodeUnique(reqVO.getId(), reqVO.getCode()); // 校验工单存在 - workOrderService.validateWorkOrderExists(reqVO.getWorkOrderId()); + MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); // 校验物料存在 itemService.validateItemExists(reqVO.getItemId()); + if (ObjUtil.notEqual(workOrder.getProductId(), reqVO.getItemId())) { + throw exception(PRO_WORK_ORDER_PRODUCT_MISMATCH); + } } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java index 75ae40065..d73deec44 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackService.java @@ -45,6 +45,14 @@ public interface MesProFeedbackService { */ MesProFeedbackDO getFeedback(Long id); + /** + * 校验生产报工存在 + * + * @param id 编号 + * @return 生产报工 + */ + MesProFeedbackDO validateFeedbackExists(Long id); + /** * 获得生产报工分页 * @@ -83,11 +91,10 @@ public interface MesProFeedbackService { * * * - * @param id 报工单编号 - * @param userId 当前操作用户编号(审核人) + * @param id 报工单编号 * @return true=已完成, false=待检验(需等质检回调) */ - boolean approveFeedback(Long id, Long userId); + boolean approveFeedback(Long id); /** * IPQC 完成后回调:完成报工单并更新任务/工单进度 @@ -96,13 +103,15 @@ public interface MesProFeedbackService { * 并根据检验结果回写合格/不合格/废品数量,同时更新任务/工单的已生产数量。 * * @param feedbackId 报工记录 ID + * @param sourceLineId 来源产出行 ID(用于直接定位待检行) * @param qualifiedQty 合格品数量 * @param unqualifiedQty 不合格品数量 * @param laborScrapQty 工废数量 * @param materialScrapQty 料废数量 * @param otherScrapQty 其他废品数量 */ - void updateProFeedbackWhenIpqcFinish(Long feedbackId, BigDecimal qualifiedQty, BigDecimal unqualifiedQty, + void updateProFeedbackWhenIpqcFinish(Long feedbackId, Long sourceLineId, + BigDecimal qualifiedQty, BigDecimal unqualifiedQty, BigDecimal laborScrapQty, BigDecimal materialScrapQty, BigDecimal otherScrapQty); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java index 2e46c1c33..9a2a206a7 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java @@ -4,11 +4,13 @@ import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemconsume.MesWmItemConsumeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO; @@ -29,11 +31,9 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** @@ -114,11 +114,9 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { // 1. 校验存在 + 草稿状态 validateFeedbackStatusPrepare(id); - // 2. 更新状态为审批中,记录报工人和报工时间 + // 2. 更新状态为审批中(报工人和报工时间由表单保存时确定,提交不覆盖) feedbackMapper.updateById(new MesProFeedbackDO().setId(id) - .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus()) - .setFeedbackUserId(getLoginUserId()) - .setFeedbackTime(LocalDateTime.now())); + .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus())); } @Override @@ -133,33 +131,34 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { @Override @Transactional(rollbackFor = Exception.class) - public boolean approveFeedback(Long id, Long userId) { - // 1.1.a 校验存在 + 审批中状态 + public boolean approveFeedback(Long id) { + // 1.1 校验存在 + 审批中状态 MesProFeedbackDO feedback = validateFeedbackStatusApproving(id); - // 1.1.b 校验报工数量 > 0 + // 1.2 校验报工数量 > 0 if (feedback.getFeedbackQuantity() == null || feedback.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) { throw exception(PRO_FEEDBACK_QUANTITY_MUST_POSITIVE); } - // 1.2.a 校验任务未完成 + // 1.3 校验任务未完成 taskService.validateTaskNotFinished(feedback.getTaskId()); - // 1.2.b 仍有待检数量时不能执行 - if (feedback.getUncheckQuantity() != null - && feedback.getUncheckQuantity().compareTo(BigDecimal.ZERO) > 0) { - throw exception(PRO_FEEDBACK_UNCHECK_QUANTITY_EXISTS, feedback.getUncheckQuantity()); - } - // 2. 物料消耗:根据工序 BOM 生成消耗记录并执行扣减 - MesWmItemConsumeDO itemConsume = itemConsumeService.generateItemConsume(feedback); - if (itemConsume != null) { - itemConsumeService.finishItemConsume(itemConsume.getId()); - } - - // 3. 查询工序的关键工序标识 + 检验标识 + // 2.1 查询工序的关键工序标识 + 检验标识(需在 uncheckQuantity 校验之前,因为质检工序允许 uncheckQuantity > 0) MesProRouteProcessDO routeProcess = routeProcessService.getRouteProcessByRouteIdAndProcessId( feedback.getRouteId(), feedback.getProcessId()); boolean keyFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getKeyFlag()); boolean checkFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getCheckFlag()); + // 2.2 非质检工序:仍有待检数量时不能审批(质检工序的 uncheckQuantity > 0 是正常状态,不做拦截) + if (!checkFlag + && feedback.getUncheckQuantity() != null + && feedback.getUncheckQuantity().compareTo(BigDecimal.ZERO) > 0) { + throw exception(PRO_FEEDBACK_UNCHECK_QUANTITY_EXISTS, feedback.getUncheckQuantity()); + } + + // 3. 物料消耗:根据工序 BOM 生成消耗记录并执行扣减 + MesWmItemConsumeDO itemConsume = itemConsumeService.generateItemConsume(feedback); + if (itemConsume != null) { + itemConsumeService.finishItemConsume(itemConsume.getId()); + } // 4. 关键工序:生成产出单,并根据是否需要检验决定入库方式 if (keyFlag) { @@ -177,10 +176,10 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { updateTaskAndWorkOrderByFeedback(feedback); } - // 5. 非关键工序:不生成产出单,不更新任务/工单数量,直接完成 + // 5. 非关键工序 / 关键非质检工序:直接完成(清零 uncheckQuantity 防止 !key+check 留脏数据) feedbackMapper.updateById(new MesProFeedbackDO().setId(id) .setStatus(MesProFeedbackStatusEnum.FINISHED.getStatus()) - .setApproveUserId(userId)); + .setUncheckQuantity(BigDecimal.ZERO)); return true; // 已完成 } @@ -219,7 +218,8 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { // ==================== 校验方法 ==================== - private MesProFeedbackDO validateFeedbackExists(Long id) { + @Override + public MesProFeedbackDO validateFeedbackExists(Long id) { MesProFeedbackDO feedback = feedbackMapper.selectById(id); if (feedback == null) { throw exception(PRO_FEEDBACK_NOT_EXISTS); @@ -251,7 +251,10 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { */ private MesProTaskDO validateFeedbackData(MesProFeedbackSaveReqVO reqVO) { // 1. 校验工作站存在 - workstationService.validateWorkstationExists(reqVO.getWorkstationId()); + MesMdWorkstationDO workstation = workstationService.validateWorkstationExists(reqVO.getWorkstationId()); + if (ObjUtil.notEqual(workstation.getProcessId(), reqVO.getProcessId())) { + throw exception(PRO_WORKSTATION_PROCESS_MISMATCH); + } // 2.1 校验工艺路线 + 工序配置有效 MesProRouteProcessDO routeProcess = routeProcessService.getRouteProcessByRouteIdAndProcessId( @@ -277,15 +280,38 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { } // 3. 校验工单已确认 - workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); + MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); + if (ObjUtil.notEqual(workOrder.getProductId(), reqVO.getItemId())) { + throw exception(PRO_WORK_ORDER_PRODUCT_MISMATCH); + } // 4. 校验任务存在且未终态(已完成/已取消),并返回任务用于冗余 itemId - return taskService.validateTaskNotFinished(reqVO.getTaskId()); + MesProTaskDO task = taskService.validateTaskNotFinished(reqVO.getTaskId()); + validateTaskRelation(task, workstation, workOrder, reqVO); + return task; + } + + private void validateTaskRelation(MesProTaskDO task, MesMdWorkstationDO workstation, + MesProWorkOrderDO workOrder, MesProFeedbackSaveReqVO reqVO) { + if (ObjUtil.notEqual(task.getWorkOrderId(), workOrder.getId())) { + throw exception(PRO_TASK_WORK_ORDER_MISMATCH); + } + if (ObjUtil.notEqual(task.getWorkstationId(), workstation.getId())) { + throw exception(PRO_TASK_WORKSTATION_MISMATCH); + } + if (ObjUtil.notEqual(task.getRouteId(), reqVO.getRouteId()) + || ObjUtil.notEqual(task.getProcessId(), reqVO.getProcessId())) { + throw exception(PRO_TASK_ROUTE_PROCESS_MISMATCH); + } + if (ObjUtil.notEqual(task.getItemId(), reqVO.getItemId())) { + throw exception(PRO_TASK_ITEM_MISMATCH); + } } @Override @Transactional(rollbackFor = Exception.class) - public void updateProFeedbackWhenIpqcFinish(Long feedbackId, BigDecimal qualifiedQty, BigDecimal unqualifiedQty, + public void updateProFeedbackWhenIpqcFinish(Long feedbackId, Long sourceLineId, + BigDecimal qualifiedQty, BigDecimal unqualifiedQty, BigDecimal laborScrapQty, BigDecimal materialScrapQty, BigDecimal otherScrapQty) { // 1. 校验报工单存在且为待检验状态 MesProFeedbackDO feedback = validateFeedbackExists(feedbackId); @@ -294,7 +320,7 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { } // 2. 拆分待检产出行(合格/不合格),生成明细,完成产出入库 - productProduceService.splitPendingAndFinishProduce(feedbackId, qualifiedQty, unqualifiedQty); + productProduceService.splitPendingAndFinishProduce(feedbackId, sourceLineId, qualifiedQty, unqualifiedQty); // 3. 回写合格/不合格/废品数量,更新状态为已完成 feedbackMapper.updateById(new MesProFeedbackDO().setId(feedbackId) diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessService.java index dedd59707..cbbc635d8 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessService.java @@ -80,6 +80,13 @@ public interface MesProProcessService { */ void validateProcessExists(Long id); + /** + * 校验工序存在且启用 + * + * @param id 编号 + */ + void validateProcessExistsAndEnable(Long id); + /** * 获得工序 Map * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessServiceImpl.java index 4c7e039b7..b9e48bf6d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessServiceImpl.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.mes.service.pro.process; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.pro.process.vo.MesProProcessPageReqVO; @@ -35,7 +37,6 @@ public class MesProProcessServiceImpl implements MesProProcessService { @Resource private MesProProcessContentService processContentService; - @Resource @Lazy private MesProRouteProcessService routeProcessService; @@ -86,6 +87,17 @@ public class MesProProcessServiceImpl implements MesProProcessService { } } + @Override + public void validateProcessExistsAndEnable(Long id) { + MesProProcessDO process = processMapper.selectById(id); + if (process == null) { + throw exception(PRO_PROCESS_NOT_EXISTS); + } + if (ObjUtil.notEqual(CommonStatusEnum.ENABLE.getStatus(), process.getStatus())) { + throw exception(PRO_PROCESS_IS_DISABLE); + } + } + private void validateProcessCodeUnique(Long id, String code) { MesProProcessDO process = processMapper.selectByCode(code); if (process == null) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java index 75c94cb11..c74db2200 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java @@ -191,8 +191,6 @@ public class MesProRouteProcessServiceImpl implements MesProRouteProcessService // 1. 根据产品查找关联的工艺路线产品记录 MesProRouteProductDO routeProduct = routeProductService.getRouteProductByItemId(productId); if (routeProduct == null) { - // TODO @芋艿:会不会存在配置了多个的情况??? - // TODO @AI:会有这个情况么? return Collections.emptyList(); } // 2. 返回该工艺路线的工序列表 diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProductBomServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProductBomServiceImpl.java index 3e7ddbeb6..7b3ec2aa9 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProductBomServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProductBomServiceImpl.java @@ -1,15 +1,18 @@ package cn.iocoder.yudao.module.mes.service.pro.route; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.productbom.MesProRouteProductBomSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductBomDO; import cn.iocoder.yudao.module.mes.dal.mysql.pro.route.MesProRouteProductBomMapper; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdProductBomService; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -30,13 +33,16 @@ public class MesProRouteProductBomServiceImpl implements MesProRouteProductBomSe @Resource @Lazy private MesProRouteService routeService; + @Resource + private MesMdItemService itemService; + @Resource + private MesMdProductBomService productBomService; @Override public Long createRouteProductBom(MesProRouteProductBomSaveReqVO createReqVO) { - // 1.0 已启用的工艺路线,不允许操作 - routeService.validateRouteNotEnable(createReqVO.getRouteId()); - // 1.1 校验唯一性 - validateBomUnique(null, createReqVO.getItemId(), createReqVO.getProcessId(), createReqVO.getProductId()); + // 1. 校验数据 + validateRouteProductBomSaveData(null, createReqVO); + // 2. 插入 MesProRouteProductBomDO routeProductBom = BeanUtils.toBean(createReqVO, MesProRouteProductBomDO.class); routeProductBomMapper.insert(routeProductBom); @@ -45,13 +51,11 @@ public class MesProRouteProductBomServiceImpl implements MesProRouteProductBomSe @Override public void updateRouteProductBom(MesProRouteProductBomSaveReqVO updateReqVO) { - // 1.0 已启用的工艺路线,不允许操作 - routeService.validateRouteNotEnable(updateReqVO.getRouteId()); - // 1.1 校验存在 + // 1. 校验存在 + 校验数据 validateRouteProductBomExists(updateReqVO.getId()); - // 1.2 校验唯一性 - validateBomUnique(updateReqVO.getId(), updateReqVO.getItemId(), updateReqVO.getProcessId(), updateReqVO.getProductId()); - // 3. 更新 + validateRouteProductBomSaveData(updateReqVO.getId(), updateReqVO); + + // 2. 更新 MesProRouteProductBomDO updateObj = BeanUtils.toBean(updateReqVO, MesProRouteProductBomDO.class); routeProductBomMapper.updateById(updateObj); } @@ -75,6 +79,21 @@ public class MesProRouteProductBomServiceImpl implements MesProRouteProductBomSe } } + /** + * 校验保存时的关联数据 + * + * @param id 记录编号(新增时为 null) + * @param reqVO 保存请求 + */ + private void validateRouteProductBomSaveData(Long id, MesProRouteProductBomSaveReqVO reqVO) { + // 校验已启用的工艺路线,不允许操作 + routeService.validateRouteNotEnable(reqVO.getRouteId()); + // 校验唯一性 + validateBomUnique(id, reqVO.getItemId(), reqVO.getProcessId(), reqVO.getProductId()); + // 校验物料属于产品 BOM + validateBomItemBelongsToProduct(reqVO.getProductId(), reqVO.getItemId()); + } + private void validateBomUnique(Long id, Long itemId, Long processId, Long productId) { MesProRouteProductBomDO existing = routeProductBomMapper.selectByUnique(itemId, processId, productId); if (existing == null) { @@ -85,6 +104,14 @@ public class MesProRouteProductBomServiceImpl implements MesProRouteProductBomSe } } + private void validateBomItemBelongsToProduct(Long productId, Long itemId) { + itemService.validateItemExists(itemId); + if (!CollUtil.anyMatch(productBomService.getProductBomListByItemId(productId), + productBom -> ObjUtil.equal(productBom.getBomItemId(), itemId))) { + throw exception(MD_PRODUCT_BOM_ITEM_INVALID); + } + } + @Override public MesProRouteProductBomDO getRouteProductBom(Long id) { return routeProductBomMapper.selectById(id); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskIssueService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskIssueService.java index b5f2a732b..912e9238a 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskIssueService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskIssueService.java @@ -61,4 +61,12 @@ public interface MesProTaskIssueService { */ List getTaskIssueListByTaskId(Long taskId); + /** + * 获取指定计量单位的投料记录数量 + * + * @param unitMeasureId 计量单位编号 + * @return 投料记录数量 + */ + Long getTaskIssueCountByUnitMeasureId(Long unitMeasureId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskIssueServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskIssueServiceImpl.java index 45e02c0ee..ff4ae76ab 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskIssueServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskIssueServiceImpl.java @@ -30,7 +30,6 @@ public class MesProTaskIssueServiceImpl implements MesProTaskIssueService { @Resource private MesProTaskService taskService; - @Resource private MesMdItemService itemService; @@ -84,6 +83,11 @@ public class MesProTaskIssueServiceImpl implements MesProTaskIssueService { return taskIssueMapper.selectListByTaskId(taskId); } + @Override + public Long getTaskIssueCountByUnitMeasureId(Long unitMeasureId) { + return taskIssueMapper.selectCountByUnitMeasureId(unitMeasureId); + } + private void validateTaskIssueExists(Long id) { if (taskIssueMapper.selectById(id) == null) { throw exception(PRO_TASK_ISSUE_NOT_EXISTS); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskService.java index 034cae650..89e274235 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskService.java @@ -58,14 +58,6 @@ public interface MesProTaskService { */ PageResult getTaskPage(MesProTaskPageReqVO pageReqVO); - /** - * 获得生产任务精简列表 - * - * @param workOrderId 工单编号(可选) - * @return 生产任务列表 - */ - List getTaskListByWorkOrderId(Long workOrderId); - /** * 根据工单编号列表,批量获得生产任务列表 * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java index 49703b06a..a8acb6cf0 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java @@ -69,7 +69,7 @@ public class MesProTaskServiceImpl implements MesProTaskService { MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); workstationService.validateWorkstationExists(createReqVO.getWorkstationId()); routeService.validateRouteExists(createReqVO.getRouteId()); - processService.validateProcessExists(createReqVO.getProcessId()); + processService.validateProcessExistsAndEnable(createReqVO.getProcessId()); MesMdItemDO item = itemService.validateItemExists(createReqVO.getItemId()); // 2.1 构建任务 DO:自动填充客户信息 @@ -100,7 +100,7 @@ public class MesProTaskServiceImpl implements MesProTaskService { routeService.validateRouteExists(updateReqVO.getRouteId()); } if (updateReqVO.getProcessId() != null) { - processService.validateProcessExists(updateReqVO.getProcessId()); + processService.validateProcessExistsAndEnable(updateReqVO.getProcessId()); } MesMdItemDO item; if (updateReqVO.getItemId() != null) { @@ -149,11 +149,6 @@ public class MesProTaskServiceImpl implements MesProTaskService { return taskMapper.selectPage(pageReqVO); } - @Override - public List getTaskListByWorkOrderId(Long workOrderId) { - return taskMapper.selectListByWorkOrderId(workOrderId); - } - @Override public List getTaskListByWorkOrderIds(Collection workOrderIds) { if (CollUtil.isEmpty(workOrderIds)) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomServiceImpl.java index a4406afe7..1fc5f16f0 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomServiceImpl.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.bom.MesProW import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdProductBomDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderBomMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.item.MesMdProductBomService; @@ -25,6 +26,7 @@ import java.util.Set; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_ITEM_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_PRODUCT_BOM_ITEM_INVALID; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_WORK_ORDER_BOM_NOT_EXISTS; /** @@ -49,8 +51,8 @@ public class MesProWorkOrderBomServiceImpl implements MesProWorkOrderBomService @Override public Long createWorkOrderBom(MesProWorkOrderBomSaveReqVO createReqVO) { - // 校验工单存在 - workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); + // 校验数据 + validateWorkOrderBomSaveData(createReqVO); // 插入数据 MesProWorkOrderBomDO workOrderBom = BeanUtils.toBean(createReqVO, MesProWorkOrderBomDO.class); @@ -62,6 +64,8 @@ public class MesProWorkOrderBomServiceImpl implements MesProWorkOrderBomService public void updateWorkOrderBom(MesProWorkOrderBomSaveReqVO updateReqVO) { // 校验存在 validateWorkOrderBomExists(updateReqVO.getId()); + // 校验数据 + validateWorkOrderBomSaveData(updateReqVO); // 更新数据 MesProWorkOrderBomDO updateObj = BeanUtils.toBean(updateReqVO, MesProWorkOrderBomDO.class); @@ -83,6 +87,19 @@ public class MesProWorkOrderBomServiceImpl implements MesProWorkOrderBomService } } + private void validateWorkOrderBomSaveData(MesProWorkOrderBomSaveReqVO reqVO) { + // 校验工单存在 + MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderExists(reqVO.getWorkOrderId()); + // DONE @AI:增加注释 + // 校验物料存在 + itemService.validateItemExists(reqVO.getItemId()); + // 校验物料属于产品 BOM + if (!CollUtil.anyMatch(productBomService.getProductBomListByItemId(workOrder.getProductId()), + productBom -> productBom.getBomItemId().equals(reqVO.getItemId()))) { + throw exception(MD_PRODUCT_BOM_ITEM_INVALID); + } + } + @Override public MesProWorkOrderBomDO getWorkOrderBom(Long id) { return workOrderBomMapper.selectById(id); @@ -133,4 +150,4 @@ public class MesProWorkOrderBomServiceImpl implements MesProWorkOrderBomService workOrderBomMapper.insertBatch(bomList); } -} \ No newline at end of file +} diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderService.java index b15959c7a..3464bff3f 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderService.java @@ -129,4 +129,12 @@ public interface MesProWorkOrderService { */ void updateProducedQuantity(Long id, BigDecimal incrQuantityProduced); + /** + * 根据供应商 ID 统计工单数量 + * + * @param vendorId 供应商 ID + * @return 数量 + */ + Long getWorkOrderCountByVendorId(Long vendorId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java index 5a9220470..0d45544bf 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java @@ -245,4 +245,9 @@ public class MesProWorkOrderServiceImpl implements MesProWorkOrderService { workOrderMapper.updateProducedQuantity(id, incrQuantityProduced); } + @Override + public Long getWorkOrderCountByVendorId(Long vendorId) { + return workOrderMapper.selectCountByVendorId(vendorId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workrecord/MesProWorkRecordServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workrecord/MesProWorkRecordServiceImpl.java index 1a708f176..b18a2adea 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workrecord/MesProWorkRecordServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workrecord/MesProWorkRecordServiceImpl.java @@ -33,6 +33,7 @@ public class MesProWorkRecordServiceImpl implements MesProWorkRecordService { private MesProWorkRecordLogMapper workRecordLogMapper; @Resource private MesProWorkRecordMapper workRecordMapper; + @Resource private MesMdWorkstationService workstationService; @@ -70,7 +71,7 @@ public class MesProWorkRecordServiceImpl implements MesProWorkRecordService { } else { workRecordMapper.updateById(new MesProWorkRecordDO().setId(record.getId()) .setWorkstationId(workstationId).setType(MesProWorkRecordTypeEnum.CLOCK_IN.getType()) - .setClockInTime(LocalDateTime.now()).setClockOutTime(null)); + .setClockInTime(LocalDateTime.now())); } return log.getId(); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorService.java index 1b924273a..797a9f411 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorService.java @@ -82,4 +82,12 @@ public interface MesQcIndicatorService { return convertMap(getIndicatorList(ids), MesQcIndicatorDO::getId); } + /** + * 批量校验质检指标是否都存在 + * + * @param ids 编号数组 + * @return 质检指标 Map + */ + Map validateIndicatorListExists(Collection ids); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorServiceImpl.java index fd54fe444..fe13f7a22 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorServiceImpl.java @@ -18,8 +18,10 @@ import javax.annotation.Resource; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** @@ -132,4 +134,13 @@ public class MesQcIndicatorServiceImpl implements MesQcIndicatorService { return indicatorMapper.selectByIds(ids); } + @Override + public Map validateIndicatorListExists(Collection ids) { + List indicators = getIndicatorList(ids); + if (indicators.size() != ids.size()) { + throw exception(QC_INDICATOR_NOT_EXISTS); + } + return convertMap(indicators, MesQcIndicatorDO::getId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java index 18ba4aed8..983271332 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java @@ -62,4 +62,21 @@ public interface MesQcIndicatorResultService { */ List getIndicatorResultDetailListByResultId(Long resultId); + /** + * 获取指定质检单下的检验结果数量 + * + * @param qcId 质检单 ID + * @param qcType 质检类型 + * @return 结果数量 + */ + Long getIndicatorResultCountByQcIdAndType(Long qcId, Integer qcType); + + /** + * 校验指定质检单下至少存在一条检验结果 + * + * @param qcId 质检单 ID + * @param qcType 质检类型 + */ + void validateIndicatorResultExistsByQcIdAndType(Long qcId, Integer qcType); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java index dd9494f4e..c6b162f44 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.service.qc.indicatorresult; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultPageReqVO; @@ -13,18 +14,22 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcIndicatorResultMapper; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcResultValueTypeEnum; import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; import cn.iocoder.yudao.module.mes.service.qc.ipqc.MesQcIpqcService; import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService; import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcService; import cn.iocoder.yudao.module.mes.service.qc.rqc.MesQcRqcService; +import cn.iocoder.yudao.module.system.api.dict.DictDataApi; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; +import java.math.BigDecimal; +import java.net.URI; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -42,9 +47,9 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ @Resource private MesQcIndicatorResultMapper resultMapper; + @Resource private MesQcIndicatorResultDetailService resultDetailService; - @Resource private MesQcIndicatorService indicatorService; @Resource @@ -59,13 +64,16 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ @Lazy private MesQcRqcService rqcService; + @Resource + private DictDataApi dictDataApi; + @Override @Transactional(rollbackFor = Exception.class) public Long createIndicatorResult(MesQcIndicatorResultSaveReqVO createReqVO) { // 1.1 根据 qcType 查询源质检单,获取 itemId Long itemId = getItemIdFromQcDoc(createReqVO.getQcId(), createReqVO.getQcType()); - // 1.2 校验所有明细的 indicatorId 是否存在 - validateIndicatorIds(createReqVO.getItems()); + // 1.2 校验明细数据(indicatorId 存在性 + 值格式) + validateItemsSaveData(createReqVO.getItems()); // 2.1 插入主表 MesQcIndicatorResultDO result = BeanUtils.toBean(createReqVO, MesQcIndicatorResultDO.class); @@ -82,11 +90,14 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ @Override @Transactional(rollbackFor = Exception.class) public void updateIndicatorResult(MesQcIndicatorResultSaveReqVO updateReqVO) { - // 1. 校验存在 + // 1.1 校验存在 validateIndicatorResultExists(updateReqVO.getId()); + // 1.2 校验明细数据(indicatorId 存在性 + 值格式) + validateItemsSaveData(updateReqVO.getItems()); - // 2.1 更新主表 + // 2.1 更新主表(锁定 qcId/qcType/itemId,不允许改挂到其他质检单) MesQcIndicatorResultDO updateObj = BeanUtils.toBean(updateReqVO, MesQcIndicatorResultDO.class); + updateObj.setQcId(null).setQcType(null).setItemId(null); resultMapper.updateById(updateObj); // 2.2 批量更新明细 List details = BeanUtils.toBean(updateReqVO.getItems(), @@ -121,6 +132,19 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ return resultDetailService.getDetailListByResultId(resultId); } + @Override + public Long getIndicatorResultCountByQcIdAndType(Long qcId, Integer qcType) { + return resultMapper.selectCountByQcIdAndType(qcId, qcType); + } + + @Override + public void validateIndicatorResultExistsByQcIdAndType(Long qcId, Integer qcType) { + Long resultCount = getIndicatorResultCountByQcIdAndType(qcId, qcType); + if (resultCount == 0) { + throw exception(QC_FINISH_INDICATOR_RESULT_REQUIRED); + } + } + // ==================== 私有方法 ==================== private MesQcIndicatorResultDO validateIndicatorResultExists(Long id) { @@ -132,18 +156,87 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ } /** - * 校验所有明细的 indicatorId 是否存在 + * 校验明细保存数据(indicatorId 存在性 + 值格式) */ - private void validateIndicatorIds(List items) { + private void validateItemsSaveData(List items) { + // 校验所有明细的 indicatorId 是否存在 + Map indicatorMap = validateIndicatorIds(items); + // 校验明细值格式是否符合指标的 resultType + validateDetailValues(items, indicatorMap); + } + + /** + * 校验所有明细的 indicatorId 是否存在 + * + * @return indicatorId -> MesQcIndicatorDO 映射,供后续值格式校验使用 + */ + private Map validateIndicatorIds(List items) { + if (CollUtil.isEmpty(items)) { + return Collections.emptyMap(); + } + Set indicatorIds = convertSet(items, MesQcIndicatorResultSaveReqVO.Item::getIndicatorId); + return indicatorService.validateIndicatorListExists(indicatorIds); + } + + /** + * 按检测项的 resultType 校验明细值格式 + * + *

FLOAT → 必须可解析为 BigDecimal;INTEGER → 必须可解析为整数; + * DICT → 必须属于字典值域;FILE → 必须为 http/https URL;TEXT → 放行 + */ + private void validateDetailValues(List items, + Map indicatorMap) { if (CollUtil.isEmpty(items)) { return; } - Set indicatorIds = convertSet(items, MesQcIndicatorResultSaveReqVO.Item::getIndicatorId); - List indicators = indicatorService.getIndicatorList(indicatorIds); - if (indicators.size() != indicatorIds.size()) { - Set existIds = convertSet(indicators, MesQcIndicatorDO::getId); - indicatorIds.removeAll(existIds); - throw exception(QC_INDICATOR_NOT_EXISTS); + for (MesQcIndicatorResultSaveReqVO.Item item : items) { + if (item.getIndicatorId() == null || StrUtil.isBlank(item.getValue())) { + continue; + } + MesQcIndicatorDO indicator = indicatorMap.get(item.getIndicatorId()); + if (indicator == null || indicator.getResultType() == null) { + continue; + } + Integer resultType = indicator.getResultType(); + if (Objects.equals(resultType, MesQcResultValueTypeEnum.FLOAT.getType())) { + try { + new BigDecimal(item.getValue()); + } catch (NumberFormatException e) { + throw exception(QC_RESULT_VALUE_FORMAT_INVALID, + "检测项[" + indicator.getName() + "]要求浮点数,实际值=" + item.getValue()); + } + } else if (Objects.equals(resultType, MesQcResultValueTypeEnum.INTEGER.getType())) { + try { + Long.parseLong(item.getValue()); + } catch (NumberFormatException e) { + throw exception(QC_RESULT_VALUE_FORMAT_INVALID, + "检测项[" + indicator.getName() + "]要求整数,实际值=" + item.getValue()); + } + } + // DICT:校验值属于对应字典类型 + if (Objects.equals(resultType, MesQcResultValueTypeEnum.DICT.getType())) { + String dictType = indicator.getResultSpecification(); + if (StrUtil.isNotBlank(dictType)) { + dictDataApi.validateDictDataList(dictType, Collections.singleton(item.getValue())); + } + } + if (Objects.equals(resultType, MesQcResultValueTypeEnum.FILE.getType()) + && !isHttpUrl(item.getValue())) { + throw exception(QC_RESULT_VALUE_FORMAT_INVALID, + "检测项[" + indicator.getName() + "]要求文件 URL,实际值=" + item.getValue()); + } + // TEXT 不做格式校验 + } + } + + private boolean isHttpUrl(String value) { + try { + URI uri = URI.create(value); + String scheme = uri.getScheme(); + return StrUtil.isNotBlank(uri.getHost()) + && ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)); + } catch (IllegalArgumentException e) { + return false; } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcLineService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcLineService.java index df2d09e49..677c098b4 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcLineService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcLineService.java @@ -69,4 +69,12 @@ public interface MesQcIpqcLineService { */ void deleteListByIpqcId(Long ipqcId); + /** + * 统计使用指定计量单位的过程检验行数量 + * + * @param unitMeasureId 计量单位编号 + * @return 引用数量 + */ + Long getIpqcLineCountByUnitMeasureId(Long unitMeasureId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcLineServiceImpl.java index 7bf2ec8d2..03bd3ebc5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcLineServiceImpl.java @@ -9,13 +9,13 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcLineDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateIndicatorDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.ipqc.MesQcIpqcLineMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.qc.template.MesQcTemplateIndicatorMapper; import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; +import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateIndicatorService; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -37,11 +37,11 @@ public class MesQcIpqcLineServiceImpl implements MesQcIpqcLineService { @Resource private MesQcIpqcLineMapper ipqcLineMapper; - @Resource - private MesQcTemplateIndicatorMapper templateIndicatorMapper; @Resource private MesQcIndicatorService indicatorService; + @Resource + private MesQcTemplateIndicatorService templateIndicatorService; @Override public MesQcIpqcLineDO validateIpqcLineExists(Long id) { @@ -64,7 +64,7 @@ public class MesQcIpqcLineServiceImpl implements MesQcIpqcLineService { @Override public void createLinesFromTemplate(Long ipqcId, Long templateId) { - List templateIndicators = templateIndicatorMapper.selectListByTemplateId(templateId); + List templateIndicators = templateIndicatorService.getTemplateIndicatorListByTemplateId(templateId); if (CollUtil.isEmpty(templateIndicators)) { return; } @@ -127,4 +127,9 @@ public class MesQcIpqcLineServiceImpl implements MesQcIpqcLineService { ipqcLineMapper.deleteByIpqcId(ipqcId); } + @Override + public Long getIpqcLineCountByUnitMeasureId(Long unitMeasureId) { + return ipqcLineMapper.selectCountByUnitMeasureId(unitMeasureId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java index fb533397e..519964f2b 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java @@ -3,12 +3,15 @@ package cn.iocoder.yudao.module.mes.service.qc.ipqc; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcDO; @@ -23,9 +26,12 @@ import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationServic import cn.iocoder.yudao.module.mes.service.pro.feedback.MesProFeedbackService; import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService; import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService; +import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; +import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -76,12 +82,21 @@ public class MesQcIpqcServiceImpl implements MesQcIpqcService { @Resource @Lazy private MesProRouteProcessService routeProcessService; - @Resource - private AdminUserApi adminUserApi; + @Lazy + private MesProTaskService taskService; @Resource @Lazy private MesProFeedbackService feedbackService; + @Resource + @Lazy + private MesQcIndicatorResultService indicatorResultService; + @Resource + @Lazy + private MesWmProductProduceLineService productProduceLineService; + + @Resource + private AdminUserApi adminUserApi; @Override @Transactional(rollbackFor = Exception.class) @@ -96,7 +111,7 @@ public class MesQcIpqcServiceImpl implements MesQcIpqcService { Long templateId = templateItem.getTemplateId(); // 1.4 获取来源单据编号 String sourceDocCode = validateAndGetSourceDocCode( - createReqVO.getSourceDocType(), createReqVO.getSourceDocId()); + createReqVO.getSourceDocType(), createReqVO.getSourceDocId(), createReqVO.getSourceLineId()); // 2. 插入主表 MesQcIpqcDO ipqc = BeanUtils.toBean(createReqVO, MesQcIpqcDO.class) @@ -136,9 +151,39 @@ public class MesQcIpqcServiceImpl implements MesQcIpqcService { // 校验工位、检测人员存在 MesMdWorkstationDO workstation = workstationService.validateWorkstationExists(reqVO.getWorkstationId()); adminUserApi.validateUser(reqVO.getInspectorUserId()); + // 校验工单存在 + MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); + if (reqVO.getItemId() != null && ObjUtil.notEqual(reqVO.getItemId(), workOrder.getProductId())) { + throw exception(PRO_WORK_ORDER_PRODUCT_MISMATCH); + } + if (reqVO.getProcessId() != null && ObjUtil.notEqual(workstation.getProcessId(), reqVO.getProcessId())) { + throw exception(PRO_WORKSTATION_PROCESS_MISMATCH); + } + // 校验任务关系(如果指定了任务) + if (reqVO.getTaskId() != null) { + MesProTaskDO task = taskService.validateTaskNotFinished(reqVO.getTaskId()); + validateTaskRelation(task, workstation, workOrder, reqVO); + } return workstation; } + private void validateTaskRelation(MesProTaskDO task, MesMdWorkstationDO workstation, + MesProWorkOrderDO workOrder, MesQcIpqcSaveReqVO reqVO) { + if (ObjUtil.notEqual(task.getWorkOrderId(), workOrder.getId())) { + throw exception(PRO_TASK_WORK_ORDER_MISMATCH); + } + if (ObjUtil.notEqual(task.getWorkstationId(), workstation.getId())) { + throw exception(PRO_TASK_WORKSTATION_MISMATCH); + } + Long expectedProcessId = reqVO.getProcessId() != null ? reqVO.getProcessId() : workstation.getProcessId(); + if (expectedProcessId != null && ObjUtil.notEqual(task.getProcessId(), expectedProcessId)) { + throw exception(PRO_TASK_ROUTE_PROCESS_MISMATCH); + } + if (ObjUtil.notEqual(task.getItemId(), workOrder.getProductId())) { + throw exception(PRO_TASK_ITEM_MISMATCH); + } + } + @Override @Transactional(rollbackFor = Exception.class) public void finishIpqc(Long id) { @@ -148,6 +193,8 @@ public class MesQcIpqcServiceImpl implements MesQcIpqcService { if (ipqc.getCheckResult() == null) { throw exception(QC_IPQC_CHECK_RESULT_EMPTY); } + // 1.3 校验至少存在一条检测结果 + indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.IPQC.getType()); // 2. 更新状态为已完成 ipqcMapper.updateById(new MesQcIpqcDO() @@ -174,7 +221,7 @@ public class MesQcIpqcServiceImpl implements MesQcIpqcService { } if (Objects.equals(ipqc.getSourceDocType(), MesBizTypeConstants.PRO_FEEDBACK)) { - feedbackService.updateProFeedbackWhenIpqcFinish(ipqc.getSourceDocId(), + feedbackService.updateProFeedbackWhenIpqcFinish(ipqc.getSourceDocId(), ipqc.getSourceLineId(), ObjectUtil.defaultIfNull(ipqc.getQualifiedQuantity(), BigDecimal.ZERO), ObjectUtil.defaultIfNull(ipqc.getUnqualifiedQuantity(), BigDecimal.ZERO), ObjectUtil.defaultIfNull(ipqc.getLaborScrapQuantity(), BigDecimal.ZERO), @@ -233,15 +280,30 @@ public class MesQcIpqcServiceImpl implements MesQcIpqcService { } } - private String validateAndGetSourceDocCode(Integer sourceDocType, Long sourceDocId) { + private String validateAndGetSourceDocCode(Integer sourceDocType, Long sourceDocId, Long sourceLineId) { if (sourceDocType == null || sourceDocId == null) { return null; } if (Objects.equals(sourceDocType, MesBizTypeConstants.PRO_FEEDBACK)) { - MesProFeedbackDO feedback = feedbackService.getFeedback(sourceDocId); - return feedback != null ? feedback.getCode() : null; + MesProFeedbackDO feedback = feedbackService.validateFeedbackExists(sourceDocId); + // 校验 sourceLineId 必填 + if (sourceLineId == null) { + throw exception(QC_IPQC_SOURCE_LINE_REQUIRED); + } + // 校验 sourceLineId 存在,且属于该报工的产出行 + MesWmProductProduceLineDO targetLine = productProduceLineService + .validateProductProduceLineExists(sourceLineId); + if (ObjUtil.notEqual(targetLine.getFeedbackId(), sourceDocId)) { + throw exception(QC_IPQC_SOURCE_LINE_NOT_BELONG); + } + // 校验该产出行为待检验状态 + if (ObjUtil.notEqual(targetLine.getQualityStatus(), MesWmQualityStatusEnum.PENDING.getStatus())) { + throw exception(QC_IPQC_SOURCE_LINE_NOT_PENDING); + } + return feedback.getCode(); } - return null; + // 未知来源类型应报错,而不是静默忽略 + throw exception(QC_IPQC_SOURCE_DOC_TYPE_UNKNOWN); } /** diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineService.java index 6f5263a90..965f0e059 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineService.java @@ -69,4 +69,12 @@ public interface MesQcIqcLineService { */ void deleteListByIqcId(Long iqcId); + /** + * 统计使用指定计量单位的来料检验行数量 + * + * @param unitMeasureId 计量单位编号 + * @return 引用数量 + */ + Long getIqcLineCountByUnitMeasureId(Long unitMeasureId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineServiceImpl.java index 47ae97135..f5420e19d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineServiceImpl.java @@ -5,17 +5,17 @@ import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.line.MesQcIqcLinePageReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateIndicatorDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.iqc.MesQcIqcLineMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.qc.template.MesQcTemplateIndicatorMapper; import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; +import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateIndicatorService; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -37,11 +37,11 @@ public class MesQcIqcLineServiceImpl implements MesQcIqcLineService { @Resource private MesQcIqcLineMapper iqcLineMapper; - @Resource - private MesQcTemplateIndicatorMapper templateIndicatorMapper; @Resource private MesQcIndicatorService indicatorService; + @Resource + private MesQcTemplateIndicatorService templateIndicatorService; @Override public MesQcIqcLineDO validateIqcLineExists(Long id) { @@ -64,7 +64,7 @@ public class MesQcIqcLineServiceImpl implements MesQcIqcLineService { @Override public void createLinesFromTemplate(Long iqcId, Long templateId) { - List templateIndicators = templateIndicatorMapper.selectListByTemplateId(templateId); + List templateIndicators = templateIndicatorService.getTemplateIndicatorListByTemplateId(templateId); if (CollUtil.isEmpty(templateIndicators)) { return; } @@ -127,4 +127,9 @@ public class MesQcIqcLineServiceImpl implements MesQcIqcLineService { iqcLineMapper.deleteByIqcId(iqcId); } + @Override + public Long getIqcLineCountByUnitMeasureId(Long unitMeasureId) { + return iqcLineMapper.selectCountByUnitMeasureId(unitMeasureId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcService.java index 6b7f9d1a8..3314f5dc5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcService.java @@ -87,4 +87,12 @@ public interface MesQcIqcService { */ Map getIqcMap(Collection ids); + /** + * 根据供应商 ID 统计来料检验单数量 + * + * @param vendorId 供应商 ID + * @return 数量 + */ + Long getIqcCountByVendorId(Long vendorId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java index c9b3f82a0..b6715ff50 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.mes.service.qc.iqc; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO; @@ -18,21 +18,24 @@ import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; import cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt.MesWmOutsourceReceiptService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** @@ -61,6 +64,9 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { private MesMdVendorService vendorService; @Resource private MesMdItemService itemService; + @Resource + @Lazy + private MesQcIndicatorResultService indicatorResultService; @Resource private AdminUserApi adminUserApi; @@ -124,6 +130,8 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { if (iqc.getCheckResult() == null) { throw exception(QC_IQC_CHECK_RESULT_EMPTY); } + // 1.2 校验至少存在一条检测结果 + indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.IQC.getType()); // 2. 更新状态为已完成 MesQcIqcDO updateObj = new MesQcIqcDO() @@ -295,4 +303,9 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { return convertMap(list, MesQcIqcDO::getId); } + @Override + public Long getIqcCountByVendorId(Long vendorId) { + return iqcMapper.selectCountByVendorId(vendorId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcLineService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcLineService.java index 1f8fbb2b4..26de52409 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcLineService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcLineService.java @@ -69,4 +69,12 @@ public interface MesQcOqcLineService { */ void recalculateLineDefectStats(Long oqcId, List records); + /** + * 统计使用指定计量单位的出货检验行数量 + * + * @param unitMeasureId 计量单位编号 + * @return 引用数量 + */ + Long getOqcLineCountByUnitMeasureId(Long unitMeasureId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcLineServiceImpl.java index 4da4187ff..cc4135bed 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcLineServiceImpl.java @@ -9,13 +9,13 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcLineDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateIndicatorDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.oqc.MesQcOqcLineMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.qc.template.MesQcTemplateIndicatorMapper; import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; +import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateIndicatorService; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -37,10 +37,11 @@ public class MesQcOqcLineServiceImpl implements MesQcOqcLineService { @Resource private MesQcOqcLineMapper oqcLineMapper; - @Resource - private MesQcTemplateIndicatorMapper templateIndicatorMapper; + @Resource private MesQcIndicatorService indicatorService; + @Resource + private MesQcTemplateIndicatorService templateIndicatorService; @Override public MesQcOqcLineDO validateOqcLineExists(Long id) { @@ -63,7 +64,7 @@ public class MesQcOqcLineServiceImpl implements MesQcOqcLineService { @Override public void createLinesFromTemplate(Long oqcId, Long templateId) { - List templateIndicators = templateIndicatorMapper.selectListByTemplateId(templateId); + List templateIndicators = templateIndicatorService.getTemplateIndicatorListByTemplateId(templateId); if (CollUtil.isEmpty(templateIndicators)) { return; } @@ -124,4 +125,9 @@ public class MesQcOqcLineServiceImpl implements MesQcOqcLineService { oqcLineMapper.deleteByOqcId(oqcId); } + @Override + public Long getOqcLineCountByUnitMeasureId(Long unitMeasureId) { + return oqcLineMapper.selectCountByUnitMeasureId(unitMeasureId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java index 45e2adbc4..0cf4eb6ee 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java @@ -18,6 +18,7 @@ import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesLineService; import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesService; @@ -47,6 +48,7 @@ public class MesQcOqcServiceImpl implements MesQcOqcService { @Resource private MesQcOqcMapper oqcMapper; + @Resource private MesQcTemplateItemService templateItemService; @Resource @@ -66,6 +68,9 @@ public class MesQcOqcServiceImpl implements MesQcOqcService { @Resource @Lazy private MesWmProductSalesService productSalesService; + @Resource + @Lazy + private MesQcIndicatorResultService indicatorResultService; @Resource private AdminUserApi adminUserApi; @@ -128,6 +133,8 @@ public class MesQcOqcServiceImpl implements MesQcOqcService { if (oqc.getCheckResult() == null) { throw exception(QC_OQC_CHECK_RESULT_EMPTY); } + // 1.3 校验至少存在一条检测结果 + indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.OQC.getType()); // 2. 更新状态为已完成 MesQcOqcDO updateObj = new MesQcOqcDO() @@ -221,13 +228,15 @@ public class MesQcOqcServiceImpl implements MesQcOqcService { return null; } if (Objects.equals(sourceDocType, MesBizTypeConstants.WM_PRODUCT_SALES)) { - MesWmProductSalesLineDO salesLine = productSalesLineService.getProductSalesLine(sourceLineId); - if (salesLine != null && salesLine.getSalesId() != null) { + MesWmProductSalesLineDO salesLine = productSalesLineService.validateProductSalesLineExists(sourceLineId); + if (salesLine.getSalesId() != null) { MesWmProductSalesDO sales = productSalesService.getProductSales(salesLine.getSalesId()); return sales != null ? sales.getCode() : null; } + return null; } - return null; + // 未知来源类型应报错,而不是静默忽略 + throw exception(QC_OQC_SOURCE_DOC_TYPE_UNKNOWN); } @Override diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcLineService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcLineService.java index 299233580..64c504efd 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcLineService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcLineService.java @@ -69,4 +69,12 @@ public interface MesQcRqcLineService { */ void deleteByRqcId(Long rqcId); + /** + * 统计使用指定计量单位的退货检验行数量 + * + * @param unitMeasureId 计量单位编号 + * @return 引用数量 + */ + Long getRqcLineCountByUnitMeasureId(Long unitMeasureId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcLineServiceImpl.java index 7b5cba5dd..a14001d5f 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcLineServiceImpl.java @@ -9,13 +9,13 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcLineDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateIndicatorDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.rqc.MesQcRqcLineMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.qc.template.MesQcTemplateIndicatorMapper; import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; +import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateIndicatorService; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -37,11 +37,11 @@ public class MesQcRqcLineServiceImpl implements MesQcRqcLineService { @Resource private MesQcRqcLineMapper rqcLineMapper; - @Resource - private MesQcTemplateIndicatorMapper templateIndicatorMapper; @Resource private MesQcIndicatorService indicatorService; + @Resource + private MesQcTemplateIndicatorService templateIndicatorService; @Override public MesQcRqcLineDO validateRqcLineExists(Long id) { @@ -64,7 +64,7 @@ public class MesQcRqcLineServiceImpl implements MesQcRqcLineService { @Override public void createLinesFromTemplate(Long rqcId, Long templateId) { - List templateIndicators = templateIndicatorMapper.selectListByTemplateId(templateId); + List templateIndicators = templateIndicatorService.getTemplateIndicatorListByTemplateId(templateId); if (CollUtil.isEmpty(templateIndicators)) { return; } @@ -125,4 +125,9 @@ public class MesQcRqcLineServiceImpl implements MesQcRqcLineService { rqcLineMapper.deleteByRqcId(rqcId); } + @Override + public Long getRqcLineCountByUnitMeasureId(Long unitMeasureId) { + return rqcLineMapper.selectCountByUnitMeasureId(unitMeasureId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java index 7e3bacf1b..0273c7529 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java @@ -9,24 +9,25 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRec import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.rqc.MesQcRqcMapper; -import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; -import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; +import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; +import cn.iocoder.yudao.module.mes.service.wm.returnissue.MesWmReturnIssueService; +import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; import cn.iocoder.yudao.module.mes.service.wm.returnissue.MesWmReturnIssueLineService; -import cn.iocoder.yudao.module.mes.service.wm.returnissue.MesWmReturnIssueService; import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesLineService; -import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; @@ -46,6 +47,7 @@ public class MesQcRqcServiceImpl implements MesQcRqcService { @Resource private MesQcRqcMapper rqcMapper; + @Resource private MesQcTemplateItemService templateItemService; @Resource @@ -68,6 +70,9 @@ public class MesQcRqcServiceImpl implements MesQcRqcService { @Resource @Lazy private MesWmReturnSalesService returnSalesService; + @Resource + @Lazy + private MesQcIndicatorResultService indicatorResultService; @Resource private AdminUserApi adminUserApi; @@ -137,6 +142,8 @@ public class MesQcRqcServiceImpl implements MesQcRqcService { throw exception(QC_RQC_QUANTITY_MISMATCH); } } + // 1.4 校验至少存在一条检测结果 + indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.RQC.getType()); // 2. 更新状态为已完成 MesQcRqcDO updateObj = new MesQcRqcDO().setId(id).setStatus(MesQcStatusEnum.FINISHED.getStatus()); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateIndicatorService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateIndicatorService.java index 08ddf5006..df4f989da 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateIndicatorService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateIndicatorService.java @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateIndic import javax.validation.Valid; +import java.util.List; + /** * MES 质检方案-检测指标项 Service 接口 * @@ -59,4 +61,20 @@ public interface MesQcTemplateIndicatorService { */ void deleteTemplateIndicatorByTemplateId(Long templateId); + /** + * 根据方案编号,获得检测指标项列表 + * + * @param templateId 质检方案编号 + * @return 检测指标项列表 + */ + List getTemplateIndicatorListByTemplateId(Long templateId); + + /** + * 获取指定计量单位的检测指标项数量 + * + * @param unitMeasureId 计量单位编号 + * @return 检测指标项数量 + */ + Long getTemplateIndicatorCountByUnitMeasureId(Long unitMeasureId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateIndicatorServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateIndicatorServiceImpl.java index 51a3f195c..667226f06 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateIndicatorServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateIndicatorServiceImpl.java @@ -6,11 +6,12 @@ import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.indicator.Mes import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.indicator.MesQcTemplateIndicatorSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateIndicatorDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.template.MesQcTemplateIndicatorMapper; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; +import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.QC_TEMPLATE_INDICATOR_NOT_EXISTS; @@ -81,4 +82,14 @@ public class MesQcTemplateIndicatorServiceImpl implements MesQcTemplateIndicator templateIndicatorMapper.deleteByTemplateId(templateId); } + @Override + public List getTemplateIndicatorListByTemplateId(Long templateId) { + return templateIndicatorMapper.selectListByTemplateId(templateId); + } + + @Override + public Long getTemplateIndicatorCountByUnitMeasureId(Long unitMeasureId) { + return templateIndicatorMapper.selectCountByUnitMeasureId(unitMeasureId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolService.java index daf3b9e58..a1381812c 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolService.java @@ -64,6 +64,14 @@ public interface MesTmToolService { */ List getToolList(); + /** + * 获得指定工具类型下的工具数量 + * + * @param toolTypeId 工具类型编号 + * @return 工具数量 + */ + Long getToolCountByToolTypeId(Long toolTypeId); + /** * 获得工具列表 * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolServiceImpl.java index 34c7b65b0..21bfc6c66 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolServiceImpl.java @@ -10,19 +10,19 @@ import cn.iocoder.yudao.module.mes.dal.mysql.tm.tool.MesTmToolMapper; import cn.iocoder.yudao.module.mes.enums.tm.MesTmMaintenTypeEnum; import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum; import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TM_TOOL_CODE_DUPLICATE; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TM_TOOL_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * MES 工具台账 Service 实现类 @@ -39,9 +39,11 @@ public class MesTmToolServiceImpl implements MesTmToolService { @Resource @Lazy // 延迟加载,避免循环依赖 private MesTmToolTypeService toolTypeService; - @Resource private MesWmBarcodeService barcodeService; + @Resource + @Lazy + private MesWmBatchService batchService; @Override public Long createTool(MesTmToolSaveReqVO createReqVO) { @@ -87,6 +89,11 @@ public class MesTmToolServiceImpl implements MesTmToolService { public void deleteTool(Long id) { // 校验存在 validateToolExists(id); + // 校验是否被批次引用 + if (batchService.getBatchCountByToolId(id) > 0) { + throw exception(TM_TOOL_HAS_BATCH); + } + // 删除 toolMapper.deleteById(id); } @@ -120,6 +127,11 @@ public class MesTmToolServiceImpl implements MesTmToolService { return toolMapper.selectPage(pageReqVO); } + @Override + public Long getToolCountByToolTypeId(Long toolTypeId) { + return toolMapper.selectCountByToolTypeId(toolTypeId); + } + @Override public List getToolList() { return toolMapper.selectList(); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolTypeServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolTypeServiceImpl.java index 9a7cc092b..4737ddca3 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolTypeServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolTypeServiceImpl.java @@ -1,18 +1,20 @@ package cn.iocoder.yudao.module.mes.service.tm.tool; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.type.MesTmToolTypePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.type.MesTmToolTypeSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolTypeDO; -import cn.iocoder.yudao.module.mes.dal.mysql.tm.tool.MesTmToolMapper; import cn.iocoder.yudao.module.mes.dal.mysql.tm.tool.MesTmToolTypeMapper; +import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationToolService; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; +import cn.hutool.core.util.ObjUtil; + import java.util.Collection; import java.util.Collections; import java.util.List; @@ -33,7 +35,11 @@ public class MesTmToolTypeServiceImpl implements MesTmToolTypeService { private MesTmToolTypeMapper toolTypeMapper; @Resource - private MesTmToolMapper toolMapper; + @Lazy + private MesTmToolService toolService; + @Resource + @Lazy + private MesMdWorkstationToolService workstationToolService; @Override public Long createToolType(MesTmToolTypeSaveReqVO createReqVO) { @@ -70,9 +76,13 @@ public class MesTmToolTypeServiceImpl implements MesTmToolTypeService { // 校验存在 validateToolTypeExists(id); // 校验是否被工具引用 - if (toolMapper.selectCountByToolTypeId(id) > 0) { + if (toolService.getToolCountByToolTypeId(id) > 0) { throw exception(TM_TOOL_TYPE_HAS_TOOL); } + // 校验是否被工作站工装资源引用 + if (workstationToolService.getWorkstationToolCountByToolTypeId(id) > 0) { + throw exception(TM_TOOL_TYPE_HAS_WORKSTATION_TOOL); + } // 删除 toolTypeMapper.deleteById(id); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java index d37c76161..e54ac8120 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java @@ -66,7 +66,7 @@ public class MesWmArrivalNoticeLineServiceImpl implements MesWmArrivalNoticeLine // 校验父单据存在且为草稿状态 arrivalNoticeService.validateArrivalNoticeExistsAndDraft(reqVO.getNoticeId()); // 校验物料存在 - itemService.validateItemExists(reqVO.getItemId()); + itemService.validateItemExistsAndEnable(reqVO.getItemId()); } /** diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java index 30add613d..6d27c55fd 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java @@ -117,12 +117,13 @@ public interface MesWmArrivalNoticeService { void validateArrivalNoticeAndLineExists(Long noticeId, Long lineId); /** - * 按状态获得到货通知单列表 + * 校验到货通知单已就绪可被采购入库引用 + *

校验状态为待入库 + 所有需检行都已完成 IQC

* - * @param status 状态 - * @return 到货通知单列表 + * @param id 到货通知单编号 + * @return 到货通知单 */ - List getArrivalNoticeListByStatus(Integer status); + MesWmArrivalNoticeDO validateArrivalNoticeReadyForReceipt(Long id); /** * 查询指定供应商的到货通知单数量 diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java index c9a675fff..1be4914ce 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java @@ -38,11 +38,13 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService @Resource private MesWmArrivalNoticeLineService arrivalNoticeLineService; + @Resource + private cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService vendorService; @Override public Long createArrivalNotice(MesWmArrivalNoticeSaveReqVO createReqVO) { - // 校验编码唯一 - validateCodeUnique(null, createReqVO.getCode()); + // 校验数据 + validateArrivalNoticeSaveData(createReqVO); // 插入 MesWmArrivalNoticeDO notice = BeanUtils.toBean(createReqVO, MesWmArrivalNoticeDO.class); @@ -55,14 +57,21 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService public void updateArrivalNotice(MesWmArrivalNoticeSaveReqVO updateReqVO) { // 校验存在 + 草稿状态 validateArrivalNoticeExistsAndDraft(updateReqVO.getId()); - // 校验编码唯一 - validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + // 校验数据 + validateArrivalNoticeSaveData(updateReqVO); // 更新 MesWmArrivalNoticeDO updateObj = BeanUtils.toBean(updateReqVO, MesWmArrivalNoticeDO.class); arrivalNoticeMapper.updateById(updateObj); } + private void validateArrivalNoticeSaveData(MesWmArrivalNoticeSaveReqVO reqVO) { + // 校验编码唯一 + validateCodeUnique(reqVO.getId(), reqVO.getCode()); + // 校验供应商存在且启用 + vendorService.validateVendorExistsAndEnable(reqVO.getVendorId()); + } + @Override @Transactional(rollbackFor = Exception.class) public void deleteArrivalNotice(Long id) { @@ -144,6 +153,13 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService if (ObjUtil.notEqual(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus(), notice.getStatus())) { throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PENDING_RECEIPT); } + // 行级防御校验:确保所有需检行都已完成 IQC + List lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(id); + boolean hasUnchecked = CollectionUtils.anyMatch(lines, + line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null); + if (hasUnchecked) { + throw exception(WM_ARRIVAL_NOTICE_IQC_PENDING); + } // 完成 arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO() @@ -158,14 +174,6 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService return arrivalNoticeMapper.selectByIds(ids); } - @Override - public List getArrivalNoticeListByStatus(Integer status) { - if (status == null) { - return arrivalNoticeMapper.selectList(); - } - return arrivalNoticeMapper.selectListByStatus(status); - } - @Override public void validateArrivalNoticeAndLineExists(Long noticeId, Long lineId) { // 1. 校验通知单存在 @@ -202,6 +210,23 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService return notice; } + @Override + public MesWmArrivalNoticeDO validateArrivalNoticeReadyForReceipt(Long id) { + // 1. 校验到货通知单存在且状态为待入库 + MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id); + if (ObjUtil.notEqual(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus(), notice.getStatus())) { + throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PENDING_RECEIPT); + } + // 2. 行级防御校验:确保所有需检行都已完成 IQC + List lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(id); + boolean hasUnchecked = CollectionUtils.anyMatch(lines, + line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null); + if (hasUnchecked) { + throw exception(WM_ARRIVAL_NOTICE_IQC_PENDING); + } + return notice; + } + private void validateCodeUnique(Long id, String code) { MesWmArrivalNoticeDO notice = arrivalNoticeMapper.selectByCode(code); if (notice == null) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java index 2fafc2568..258bb9c3e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java @@ -69,10 +69,31 @@ public interface MesWmBatchService { List getBackwardBatchList(String code); /** - * 获取批次列表 + * 校验批次存在,并校验批次与物料的归属关系 * - * @return 批次列表 + * @param batchId 批次ID + * @param itemId 物料ID + * @return 批次记录 */ - List getBatchList(); + MesWmBatchDO validateBatchExists(Long batchId, Long itemId); + + /** + * 校验批次存在,并校验批次与物料、客户/供应商的归属关系 + * + * @param batchId 批次ID + * @param itemId 物料ID + * @param clientId 客户ID(可选,不为空时校验) + * @param vendorId 供应商ID(可选,不为空时校验) + * @return 批次记录 + */ + MesWmBatchDO validateBatchExists(Long batchId, Long itemId, Long clientId, Long vendorId); + + /** + * 获取指定工具的批次数量 + * + * @param toolId 工具编号 + * @return 批次数量 + */ + Long getBatchCountByToolId(Long toolId); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java index dd22f5bf0..bddd33a32 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java @@ -39,8 +39,14 @@ import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @Slf4j public class MesWmBatchServiceImpl implements MesWmBatchService { + /** + * 批次追溯最大递归深度,防止极端场景下性能问题 + */ + private static final int MAX_TRACE_DEPTH = 20; + @Resource private MesWmBatchMapper batchMapper; + @Resource private MesMdItemService itemService; @Resource @@ -196,11 +202,11 @@ public class MesWmBatchServiceImpl implements MesWmBatchService { @Override public List getForwardBatchList(String code) { - return getForwardBatchList(code, new HashSet<>()); + return getForwardBatchList(code, new HashSet<>(), 0); } - private List getForwardBatchList(String code, Set visited) { - if (code == null || !visited.add(code)) { + private List getForwardBatchList(String code, Set visited, int depth) { + if (code == null || !visited.add(code) || depth >= MAX_TRACE_DEPTH) { return new ArrayList<>(); } List list = batchMapper.selectListByForward(code); @@ -210,18 +216,18 @@ public class MesWmBatchServiceImpl implements MesWmBatchService { // 继续递归查询下游批次 List results = new ArrayList<>(list); for (MesWmBatchDO batch : list) { - results.addAll(getForwardBatchList(batch.getCode(), visited)); + results.addAll(getForwardBatchList(batch.getCode(), visited, depth + 1)); } return results; } @Override public List getBackwardBatchList(String code) { - return getBackwardBatchList(code, new HashSet<>()); + return getBackwardBatchList(code, new HashSet<>(), 0); } - private List getBackwardBatchList(String code, Set visited) { - if (code == null || !visited.add(code)) { + private List getBackwardBatchList(String code, Set visited, int depth) { + if (code == null || !visited.add(code) || depth >= MAX_TRACE_DEPTH) { return new ArrayList<>(); } List list = batchMapper.selectListByBackward(code); @@ -231,14 +237,38 @@ public class MesWmBatchServiceImpl implements MesWmBatchService { // 继续递归查询上游批次 List results = new ArrayList<>(list); for (MesWmBatchDO batch : list) { - results.addAll(getBackwardBatchList(batch.getCode(), visited)); + results.addAll(getBackwardBatchList(batch.getCode(), visited, depth + 1)); } return results; } @Override - public List getBatchList() { - return batchMapper.selectList(); + public MesWmBatchDO validateBatchExists(Long batchId, Long itemId) { + MesWmBatchDO batch = batchMapper.selectById(batchId); + if (batch == null) { + throw exception(WM_BATCH_NOT_EXISTS); + } + if (ObjUtil.notEqual(batch.getItemId(), itemId)) { + throw exception(WM_BATCH_ITEM_MISMATCH); + } + return batch; + } + + @Override + public MesWmBatchDO validateBatchExists(Long batchId, Long itemId, Long clientId, Long vendorId) { + MesWmBatchDO batch = validateBatchExists(batchId, itemId); + if (clientId != null && ObjUtil.notEqual(batch.getClientId(), clientId)) { + throw exception(WM_BATCH_CLIENT_MISMATCH); + } + if (vendorId != null && ObjUtil.notEqual(batch.getVendorId(), vendorId)) { + throw exception(WM_BATCH_VENDOR_MISMATCH); + } + return batch; + } + + @Override + public Long getBatchCountByToolId(Long toolId) { + return batchMapper.selectCountByToolId(toolId); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java index dd4dcc43c..eecab63f4 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java @@ -4,9 +4,12 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; - -import javax.validation.Valid; +import jakarta.validation.Valid; +import java.util.Collection; import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; /** * MES 采购入库单 Service 接口 @@ -103,4 +106,22 @@ public interface MesWmItemReceiptService { */ List getItemReceiptListByVendorId(Long vendorId); + /** + * 批量获得采购入库单列表 + * + * @param ids 编号数组 + * @return 入库单列表 + */ + List getItemReceiptList(Collection ids); + + /** + * 批量获得采购入库单 Map + * + * @param ids 编号数组 + * @return 入库单 Map + */ + default Map getItemReceiptMap(Collection ids) { + return convertMap(getItemReceiptList(ids), MesWmItemReceiptDO::getId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java index 2b5fe076d..8c8cbadef 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java @@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO; @@ -27,6 +28,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; +import java.util.Collection; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -55,7 +57,6 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { @Resource @Lazy private MesQcIqcService iqcService; - @Resource private MesWmTransactionService wmTransactionService; @@ -87,10 +88,13 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { // 校验编码唯一 validateCodeUnique(reqVO.getId(), reqVO.getCode()); // 校验供应商存在 - vendorService.validateVendorExists(reqVO.getVendorId()); + vendorService.validateVendorExistsAndEnable(reqVO.getVendorId()); // 校验到货通知单存在 if (reqVO.getNoticeId() != null) { - arrivalNoticeService.validateArrivalNoticeExists(reqVO.getNoticeId()); + MesWmArrivalNoticeDO notice = arrivalNoticeService.validateArrivalNoticeReadyForReceipt(reqVO.getNoticeId()); + if (ObjUtil.notEqual(notice.getVendorId(), reqVO.getVendorId())) { + throw exception(WM_ARRIVAL_NOTICE_VENDOR_MISMATCH); + } } // 校验来料检验单存在 if (reqVO.getIqcId() != null) { @@ -263,4 +267,9 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { return itemReceiptMapper.selectListByVendorId(vendorId); } + @Override + public List getItemReceiptList(Collection ids) { + return itemReceiptMapper.selectByIds(ids); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java index 4af8e2428..ab24be058 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java @@ -132,4 +132,20 @@ public interface MesWmMaterialStockService { */ void checkAreaMixingRule(Long areaId, Long itemId, Long batchId); + /** + * 校验前端选择的库存记录,兜底避免串单或越权提交 + * + * @param materialStockId 库存记录编号 + * @param itemId 物料编号 + * @param batchId 批次编号 + * @param batchCode 批次号(可选) + * @param warehouseId 仓库编号 + * @param locationId 库区编号 + * @param areaId 库位编号 + * @param quantity 数量(可选,校验库存充足) + * @return 校验通过的库存记录 + */ + MesWmMaterialStockDO validateSelectedStock(Long materialStockId, Long itemId, Long batchId, String batchCode, + Long warehouseId, Long locationId, Long areaId, BigDecimal quantity); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java index 651eef175..50405b650 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.service.wm.materialstock; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; @@ -11,14 +12,17 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.*; @@ -43,6 +47,9 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService private MesMdItemTypeService itemTypeService; @Resource private MesWmWarehouseAreaService areaService; + @Resource + @Lazy + private MesWmWarehouseService warehouseService; @Override public MesWmMaterialStockDO getMaterialStock(Long id) { @@ -77,9 +84,19 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService if (pageReqVO.getItemId() != null) { itemIds = SetUtils.asSet(pageReqVO.getItemId()); } + // 1.3 解析 virtualFilter:转换为虚拟仓 warehouseId + Long virtualWarehouseId = null; + String virtualFilter = pageReqVO.getVirtualFilter(); + if (MesWmMaterialStockPageReqVO.VIRTUAL_FILTER_EXCLUDE.equals(virtualFilter) + || MesWmMaterialStockPageReqVO.VIRTUAL_FILTER_ONLY.equals(virtualFilter)) { + MesWmWarehouseDO virtualWarehouse = warehouseService.getWarehouseByCode( + MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE); + Assert.notNull(virtualWarehouse, "虚拟仓库(WIP_VIRTUAL_WAREHOUSE)不存在"); + virtualWarehouseId = virtualWarehouse.getId(); + } // 2. 分页查询 - return materialStockMapper.selectPage(pageReqVO, itemTypeIds, itemIds); + return materialStockMapper.selectPage(pageReqVO, itemTypeIds, itemIds, virtualWarehouseId); } @Override @@ -185,4 +202,34 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService } } + @Override + public MesWmMaterialStockDO validateSelectedStock(Long materialStockId, + Long itemId, + Long batchId, + String batchCode, + Long warehouseId, + Long locationId, + Long areaId, + BigDecimal quantity) { + // 1. 校验库存记录必须存在 + if (materialStockId == null) { + throw exception(WM_MATERIAL_STOCK_REQUIRED); + } + MesWmMaterialStockDO stock = validateMaterialStockExists(materialStockId); + // 2. 校验库存记录的物料、批次、仓库、库区、库位等信息与前端选择的一致,避免串单或越权提交 + if (ObjUtil.notEqual(stock.getItemId(), itemId) + || ObjUtil.notEqual(stock.getBatchId(), batchId) + || (batchCode != null && ObjUtil.notEqual(stock.getBatchCode(), batchCode)) + || ObjUtil.notEqual(stock.getWarehouseId(), warehouseId) + || ObjUtil.notEqual(stock.getLocationId(), locationId) + || ObjUtil.notEqual(stock.getAreaId(), areaId)) { + throw exception(WM_MATERIAL_STOCK_SELECTION_MISMATCH); + } + // 3. 校验库存数量充足(如果前端传了 quantity,则必须保证库存数量 >= quantity) + if (quantity != null && stock.getQuantity() != null && stock.getQuantity().compareTo(quantity) < 0) { + throw exception(WM_MATERIAL_STOCK_INSUFFICIENT); + } + return stock; + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java index 80abd1b56..005c95a86 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java @@ -32,14 +32,11 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService @Resource @Lazy private MesWmMiscIssueService miscIssueService; - @Resource @Lazy private MesWmMiscIssueDetailService miscIssueDetailService; - @Resource private MesMdItemService itemService; - @Resource private MesWmWarehouseAreaService warehouseAreaService; @@ -132,7 +129,7 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService // 校验父单据存在且为可编辑状态 miscIssueService.validateMiscIssueEditable(issueId); // 校验物料存在 - itemService.validateItemExists(reqVO.getItemId()); + itemService.validateItemExistsAndEnable(reqVO.getItemId()); // 校验仓库、库区、库位的父子关系 warehouseAreaService.validateWarehouseAreaExists(reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java index 621df346a..72fe5425b 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java @@ -132,6 +132,7 @@ public class MesWmMiscIssueServiceImpl implements MesWmMiscIssueService { wmTransactionService.createTransactionList(convertList(lines, line -> new MesWmTransactionSaveReqDTO() .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(line.getItemId()) .setQuantity(line.getQuantity().negate()) // 出库数量为负数 + .setBatchId(line.getBatchId()).setBatchCode(line.getBatchCode()) .setWarehouseId(line.getWarehouseId()).setLocationId(line.getLocationId()).setAreaId(line.getAreaId()) .setBizType(MesBizTypeConstants.WM_MISC_ISSUE).setBizId(issue.getId()).setBizCode(issue.getCode()).setBizLineId(line.getId()))); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java index 2cccbcd14..d4dff91a6 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java @@ -125,7 +125,7 @@ public class MesWmMiscReceiptLineServiceImpl implements MesWmMiscReceiptLineServ // 校验父单据存在且为可编辑状态 miscReceiptService.validateMiscReceiptEditable(reqVO.getReceiptId()); // 校验物料存在 - itemService.validateItemExists(reqVO.getItemId()); + itemService.validateItemExistsAndEnable(reqVO.getItemId()); // 校验仓库层级关系(仓库 - 库位 - 库区) warehouseAreaService.validateWarehouseAreaExists(reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java index 0ebd5c2d8..9a149367f 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java @@ -1,19 +1,23 @@ package cn.iocoder.yudao.module.mes.service.wm.outsourceissue; +import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.detail.MesWmOutsourceIssueDetailSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueDetailMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_OUTSOURCE_ISSUE_DETAIL_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * MES 外协发料单明细 Service 实现类 @@ -26,11 +30,16 @@ public class MesWmOutsourceIssueDetailServiceImpl implements MesWmOutsourceIssue @Resource private MesWmOutsourceIssueDetailMapper outsourceIssueDetailMapper; + @Resource @Lazy - private MesWmOutsourceIssueService outsourceIssueService; + private MesWmOutsourceIssueLineService outsourceIssueLineService; @Resource private MesMdItemService itemService; + @Resource + private MesWmWarehouseAreaService warehouseAreaService; + @Resource + private MesWmMaterialStockService materialStockService; @Override public Long createOutsourceIssueDetail(MesWmOutsourceIssueDetailSaveReqVO createReqVO) { @@ -95,10 +104,26 @@ public class MesWmOutsourceIssueDetailServiceImpl implements MesWmOutsourceIssue } private void validateOutsourceIssueDetailSaveData(MesWmOutsourceIssueDetailSaveReqVO saveReqVO) { - // 校验关联的发料单存在 - outsourceIssueService.getOutsourceIssue(saveReqVO.getIssueId()); - // 校验关联的物料存在 - itemService.validateItemExists(saveReqVO.getItemId()); + // 校验父数据(行)存在 + MesWmOutsourceIssueLineDO line = outsourceIssueLineService.getOutsourceIssueLine(saveReqVO.getLineId()); + if (line == null) { + throw exception(WM_OUTSOURCE_ISSUE_LINE_NOT_EXISTS); + } + if (ObjUtil.notEqual(line.getIssueId(), saveReqVO.getIssueId())) { + throw exception(WM_OUTSOURCE_ISSUE_DETAIL_LINE_NOT_MATCH); + } + // 校验物料存在 + itemService.validateItemExistsAndEnable(saveReqVO.getItemId()); + if (ObjUtil.notEqual(line.getItemId(), saveReqVO.getItemId())) { + throw exception(WM_OUTSOURCE_ISSUE_DETAIL_ITEM_MISMATCH); + } + // 校验仓库、库区、库位的关联关系 + warehouseAreaService.validateWarehouseAreaExists( + saveReqVO.getWarehouseId(), saveReqVO.getLocationId(), saveReqVO.getAreaId()); + // 校验库存记录存在且物料一致 + materialStockService.validateSelectedStock( + saveReqVO.getMaterialStockId(), saveReqVO.getItemId(), saveReqVO.getBatchId(), null, + saveReqVO.getWarehouseId(), saveReqVO.getLocationId(), saveReqVO.getAreaId(), saveReqVO.getQuantity()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java index dbbe5528f..edef2a292 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java @@ -121,7 +121,7 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi throw exception(WM_OUTSOURCE_ISSUE_NOT_EXISTS); } // 校验关联的物料存在 - itemService.validateItemExists(saveReqVO.getItemId()); + itemService.validateItemExistsAndEnable(saveReqVO.getItemId()); // 校验物料是否在工单 BOM 中 validateItemInWorkOrderBom(issue.getWorkOrderId(), saveReqVO.getItemId()); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueService.java index ec5c4b642..538d46cbd 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueService.java @@ -88,4 +88,12 @@ public interface MesWmOutsourceIssueService { */ Boolean checkOutsourceIssueQuantity(Long id); + /** + * 根据供应商 ID 统计外协发料单数量 + * + * @param vendorId 供应商 ID + * @return 数量 + */ + Long getOutsourceIssueCountByVendorId(Long vendorId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java index 6a476a31e..b308efc93 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java @@ -258,10 +258,10 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic validateCodeUnique(saveReqVO.getId(), saveReqVO.getCode()); // 校验供应商存在 if (saveReqVO.getVendorId() != null) { - vendorService.validateVendorExists(saveReqVO.getVendorId()); + vendorService.validateVendorExistsAndEnable(saveReqVO.getVendorId()); } // 校验工单存在且类型为外协(代工) - MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderExists(saveReqVO.getWorkOrderId()); + MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(saveReqVO.getWorkOrderId()); if (ObjUtil.notEqual(workOrder.getType(), MesProWorkOrderTypeEnum.OUTSOURCE.getType())) { throw exception(WM_OUTSOURCE_ISSUE_WORK_ORDER_TYPE_INVALID); } @@ -280,4 +280,9 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic } } + @Override + public Long getOutsourceIssueCountByVendorId(Long vendorId) { + return outsourceIssueMapper.selectCountByVendorId(vendorId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java index a41b2570d..e59639bdd 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java @@ -6,12 +6,10 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutso import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptDetailMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -29,30 +27,13 @@ public class MesWmOutsourceReceiptDetailServiceImpl implements MesWmOutsourceRec @Resource private MesMdItemService itemService; - - @Resource - private MesWmWarehouseService warehouseService; - - @Resource - private MesWmWarehouseLocationService locationService; - @Resource private MesWmWarehouseAreaService areaService; @Override public Long createOutsourceReceiptDetail(MesWmOutsourceReceiptDetailSaveReqVO createReqVO) { - // 校验物料存在 - itemService.validateItemExists(createReqVO.getItemId()); - // 校验仓库、库区、库位存在 - if (createReqVO.getWarehouseId() != null) { - warehouseService.validateWarehouseExists(createReqVO.getWarehouseId()); - } - if (createReqVO.getLocationId() != null) { - locationService.validateWarehouseLocationExists(createReqVO.getLocationId()); - } - if (createReqVO.getAreaId() != null) { - areaService.validateWarehouseAreaExists(createReqVO.getAreaId()); - } + // 校验数据 + validateDetailSaveData(createReqVO); // 插入 MesWmOutsourceReceiptDetailDO detail = BeanUtils.toBean(createReqVO, MesWmOutsourceReceiptDetailDO.class); @@ -64,18 +45,8 @@ public class MesWmOutsourceReceiptDetailServiceImpl implements MesWmOutsourceRec public void updateOutsourceReceiptDetail(MesWmOutsourceReceiptDetailSaveReqVO updateReqVO) { // 校验存在 validateOutsourceReceiptDetailExists(updateReqVO.getId()); - // 校验物料存在 - itemService.validateItemExists(updateReqVO.getItemId()); - // 校验仓库、库区、库位存在 - if (updateReqVO.getWarehouseId() != null) { - warehouseService.validateWarehouseExists(updateReqVO.getWarehouseId()); - } - if (updateReqVO.getLocationId() != null) { - locationService.validateWarehouseLocationExists(updateReqVO.getLocationId()); - } - if (updateReqVO.getAreaId() != null) { - areaService.validateWarehouseAreaExists(updateReqVO.getAreaId()); - } + // 校验数据 + validateDetailSaveData(updateReqVO); // 更新 MesWmOutsourceReceiptDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceReceiptDetailDO.class); @@ -115,6 +86,16 @@ public class MesWmOutsourceReceiptDetailServiceImpl implements MesWmOutsourceRec detailMapper.deleteByLineId(lineId); } + /** + * 校验保存时的关联数据 + */ + private void validateDetailSaveData(MesWmOutsourceReceiptDetailSaveReqVO reqVO) { + // 校验物料存在 + itemService.validateItemExistsAndEnable(reqVO.getItemId()); + // 校验仓库、库区、库位的层级关系 + areaService.validateWarehouseAreaExists(reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); + } + private void validateOutsourceReceiptDetailExists(Long id) { if (detailMapper.selectById(id) == null) { throw exception(WM_OUTSOURCE_RECEIPT_DETAIL_NOT_EXISTS); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java index 72dfd83eb..aecc1515b 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java @@ -37,26 +37,22 @@ public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceRecei @Resource private MesMdItemService itemService; - @Resource @Lazy private MesWmOutsourceReceiptDetailService outsourceReceiptDetailService; - @Resource @Lazy private MesWmOutsourceReceiptService outsourceReceiptService; - @Resource @Lazy private MesProWorkOrderService workOrderService; - @Resource private MesWmBatchService batchService; @Override public Long createOutsourceReceiptLine(MesWmOutsourceReceiptLineSaveReqVO createReqVO) { // 校验物料存在 - itemService.validateItemExists(createReqVO.getItemId()); + itemService.validateItemExistsAndEnable(createReqVO.getItemId()); // 插入 MesWmOutsourceReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceReceiptLineDO.class); @@ -76,7 +72,7 @@ public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceRecei // 校验存在 validateOutsourceReceiptLineExists(updateReqVO.getId()); // 校验物料存在 - itemService.validateItemExists(updateReqVO.getItemId()); + itemService.validateItemExistsAndEnable(updateReqVO.getItemId()); // 更新 MesWmOutsourceReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceReceiptLineDO.class); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptService.java index d76e6d34f..5c4d0b19a 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptService.java @@ -99,4 +99,12 @@ public interface MesWmOutsourceReceiptService { */ void validateOutsourceReceiptAndLineExists(Long receiptId, Long lineId); + /** + * 根据供应商 ID 统计外协入库单数量 + * + * @param vendorId 供应商 ID + * @return 数量 + */ + Long getOutsourceReceiptCountByVendorId(Long vendorId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java index 90c9c0e5c..8b26d330c 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java @@ -63,14 +63,8 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe @Override public Long createOutsourceReceipt(MesWmOutsourceReceiptSaveReqVO createReqVO) { - // 校验编码唯一 - validateCodeUnique(null, createReqVO.getCode()); - // 校验供应商存在 - vendorService.validateVendorExists(createReqVO.getVendorId()); - // 校验外协工单存在 - if (createReqVO.getWorkOrderId() != null) { - workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); - } + // 校验数据 + validateOutsourceReceiptSaveData(null, createReqVO); // 插入 MesWmOutsourceReceiptDO receipt = BeanUtils.toBean(createReqVO, MesWmOutsourceReceiptDO.class); @@ -83,14 +77,8 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe public void updateOutsourceReceipt(MesWmOutsourceReceiptSaveReqVO updateReqVO) { // 校验存在 + 草稿状态 validateOutsourceReceiptExistsAndDraft(updateReqVO.getId()); - // 校验编码唯一 - validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); - // 校验供应商存在 - vendorService.validateVendorExists(updateReqVO.getVendorId()); - // 校验外协工单存在 - if (updateReqVO.getWorkOrderId() != null) { - workOrderService.validateWorkOrderExists(updateReqVO.getWorkOrderId()); - } + // 校验数据 + validateOutsourceReceiptSaveData(updateReqVO.getId(), updateReqVO); // 更新 MesWmOutsourceReceiptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceReceiptDO.class); @@ -171,7 +159,7 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe MesWmOutsourceReceiptDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); // 对比行数量与明细总数量,不满足直接抛出 if (line.getQuantity().compareTo(totalDetailQuantity) > 0) { - MesMdItemDO item = itemService.validateItemExists(line.getItemId()); + MesMdItemDO item = itemService.validateItemExistsAndEnable(line.getItemId()); throw exception(WM_OUTSOURCE_RECEIPT_DETAIL_QUANTITY_MISMATCH, item.getCode() + " " + item.getName() + " 未完成上架"); } @@ -316,6 +304,17 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe return receipt; } + private void validateOutsourceReceiptSaveData(Long id, MesWmOutsourceReceiptSaveReqVO reqVO) { + // 校验编码唯一 + validateCodeUnique(id, reqVO.getCode()); + // 校验供应商存在 + vendorService.validateVendorExistsAndEnable(reqVO.getVendorId()); + // 校验外协工单存在 + if (reqVO.getWorkOrderId() != null) { + workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); + } + } + private void validateCodeUnique(Long id, String code) { MesWmOutsourceReceiptDO receipt = outsourceReceiptMapper.selectByCode(code); if (receipt == null) { @@ -326,4 +325,9 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe } } + @Override + public Long getOutsourceReceiptCountByVendorId(Long vendorId) { + return outsourceReceiptMapper.selectCountByVendorId(vendorId); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java index 0a8c092de..a04cd6ba6 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java @@ -7,11 +7,12 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPac import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.packages.MesWmPackageLineMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -28,18 +29,19 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService { @Resource private MesWmPackageLineMapper packageLineMapper; + @Resource @Lazy private MesWmPackageService packageService; @Resource private MesMdItemService itemService; + @Resource + private MesProWorkOrderService workOrderService; @Override public Long createPackageLine(MesWmPackageLineSaveReqVO createReqVO) { - // 校验装箱单状态为草稿 - packageService.validatePackageStatusDraft(createReqVO.getPackageId()); - // 校验产品物料存在 - itemService.validateItemExists(createReqVO.getItemId()); + // 校验数据 + validateLineSaveData(createReqVO); // 插入 MesWmPackageLineDO line = BeanUtils.toBean(createReqVO, MesWmPackageLineDO.class); @@ -51,10 +53,9 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService { public void updatePackageLine(MesWmPackageLineSaveReqVO updateReqVO) { // 校验存在 MesWmPackageLineDO line = validatePackageLineExists(updateReqVO.getId()); - // 校验装箱单状态为草稿 - packageService.validatePackageStatusDraft(line.getPackageId()); - // 校验产品物料存在 - itemService.validateItemExists(updateReqVO.getItemId()); + // 校验数据 + updateReqVO.setPackageId(line.getPackageId()); + validateLineSaveData(updateReqVO); // 更新 MesWmPackageLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmPackageLineDO.class); @@ -93,6 +94,18 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService { // ========== 校验方法 ========== + /** + * 校验保存时的关联数据 + */ + private void validateLineSaveData(MesWmPackageLineSaveReqVO reqVO) { + // 校验装箱单状态为草稿 + packageService.validatePackageStatusDraft(reqVO.getPackageId()); + // 校验产品物料存在 + itemService.validateItemExistsAndEnable(reqVO.getItemId()); + // 校验工单已确认 + workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); + } + private MesWmPackageLineDO validatePackageLineExists(Long id) { MesWmPackageLineDO line = packageLineMapper.selectById(id); if (line == null) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageService.java index fff563f2a..7f841ad44 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageService.java @@ -82,19 +82,6 @@ public interface MesWmPackageService { */ void removeChildPackage(Long childId); - /** - * 可添加为子箱的装箱单列表(无父箱 + 已完成状态) - * - * @return 装箱单列表 - */ - List getChildablePackageList(); - - /** - * 获得装箱单精简列表 - * - * @return 装箱单列表 - */ - List getPackageSimpleList(); /** * 获取指定装箱单及其所有子孙箱的 ID 列表 diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java index 9fcf63578..671479ddb 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java @@ -34,6 +34,7 @@ public class MesWmPackageServiceImpl implements MesWmPackageService { @Resource private MesWmPackageMapper packageMapper; + @Resource private MesWmPackageLineService packageLineService; @Resource @@ -137,16 +138,6 @@ public class MesWmPackageServiceImpl implements MesWmPackageService { packageMapper.updateById(new MesWmPackageDO().setId(childId).setParentId(MesWmPackageDO.PARENT_ID_ROOT)); } - @Override - public List getChildablePackageList() { - return packageMapper.selectChildableList(); - } - - @Override - public List getPackageSimpleList() { - return packageMapper.selectList(); - } - @Override public List getPackageAndDescendantIds(Long packageId) { List result = CollUtil.newArrayList(packageId); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailServiceImpl.java index 337d7b4d2..55d188768 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailServiceImpl.java @@ -4,16 +4,18 @@ import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.detail.MesWmProductIssueDetailSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.productissue.MesWmProductIssueDetailMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductIssueStatusEnum; +import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -35,6 +37,10 @@ public class MesWmProductIssueDetailServiceImpl implements MesWmProductIssueDeta @Resource @Lazy private MesWmProductIssueLineService issueLineService; + @Resource + private MesWmWarehouseAreaService warehouseAreaService; + @Resource + private MesWmMaterialStockService materialStockService; @Override public Long createProductIssueDetail(MesWmProductIssueDetailSaveReqVO createReqVO) { @@ -116,8 +122,23 @@ public class MesWmProductIssueDetailServiceImpl implements MesWmProductIssueDeta private void validateProductIssueDetailSaveData(MesWmProductIssueDetailSaveReqVO reqVO) { // 校验父数据存在 MesWmProductIssueLineDO line = issueLineService.validateProductIssueLineExists(reqVO.getLineId()); + if (ObjUtil.notEqual(line.getIssueId(), reqVO.getIssueId())) { + throw exception(WM_PRODUCT_ISSUE_DETAIL_LINE_NOT_MATCH); + } + // 校验主单状态为待拣货(只有 APPROVING 状态才允许新增/修改明细) + MesWmProductIssueDO issue = issueService.validateProductIssueExists(line.getIssueId()); + if (ObjUtil.notEqual(MesWmProductIssueStatusEnum.APPROVING.getStatus(), issue.getStatus())) { + throw exception(WM_PRODUCT_ISSUE_STATUS_INVALID); + } // 校验物料匹配(明细 itemId 必须与行 itemId 一致) validateDetailItemMatch(reqVO.getItemId(), line.getItemId()); + // 校验仓库、库区、库位的关联关系 + warehouseAreaService.validateWarehouseAreaExists( + reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); + // 校验库存记录 + materialStockService.validateSelectedStock( + reqVO.getMaterialStockId(), reqVO.getItemId(), reqVO.getBatchId(), reqVO.getBatchCode(), + reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId(), reqVO.getQuantity()); } /** @@ -130,4 +151,3 @@ public class MesWmProductIssueDetailServiceImpl implements MesWmProductIssueDeta } } - diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java index 64b9cd847..88511f248 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java @@ -109,10 +109,12 @@ public class MesWmProductIssueLineServiceImpl implements MesWmProductIssueLineSe * 校验保存时的关联数据 */ private void validateProductIssueLineSaveData(MesWmProductIssueLineSaveReqVO reqVO) { - // 校验父数据存在 + 校验物料在工单 BOM 中 + // 校验父数据存在 + 草稿状态才允许新增/修改行 + issueService.validateProductIssueExistsAndPrepare(reqVO.getIssueId()); + // 校验物料在工单 BOM 中 validateItemInWorkOrderBom(reqVO.getIssueId(), reqVO.getItemId()); // 校验物料存在 - itemService.validateItemExists(reqVO.getItemId()); + itemService.validateItemExistsAndEnable(reqVO.getItemId()); } private void validateItemInWorkOrderBom(Long issueId, Long itemId) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java index afbdb906d..bb49d7d74 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java @@ -138,6 +138,11 @@ public class MesWmProductIssueServiceImpl implements MesWmProductIssueService { if (ObjUtil.notEqual(MesWmProductIssueStatusEnum.APPROVING.getStatus(), issue.getStatus())) { throw exception(WM_PRODUCT_ISSUE_STATUS_INVALID); } + // 校验拣货明细闭环:行数量 = 明细数量 + if (!checkProductIssueQuantity(id)) { + throw exception(WM_PRODUCT_ISSUE_DETAIL_QUANTITY_MISMATCH); + } + // 执行拣货(待拣货 → 待执行领出) issueMapper.updateById(new MesWmProductIssueDO() .setId(id).setStatus(MesWmProductIssueStatusEnum.APPROVED.getStatus())); @@ -151,6 +156,15 @@ public class MesWmProductIssueServiceImpl implements MesWmProductIssueService { if (ObjUtil.notEqual(MesWmProductIssueStatusEnum.APPROVED.getStatus(), issue.getStatus())) { throw exception(WM_PRODUCT_ISSUE_STATUS_INVALID); } + // 校验至少有一条明细 + List details = issueDetailService.getProductIssueDetailListByIssueId(id); + if (CollUtil.isEmpty(details)) { + throw exception(WM_PRODUCT_ISSUE_NO_DETAIL); + } + // 校验行数量 = 明细数量 + if (!checkProductIssueQuantity(id)) { + throw exception(WM_PRODUCT_ISSUE_DETAIL_QUANTITY_MISMATCH); + } // 2. 遍历所有明细,创建库存事务(扣减库存 + 记录流水) createTransactionList(issue); @@ -260,9 +274,9 @@ public class MesWmProductIssueServiceImpl implements MesWmProductIssueService { */ private void validateProductIssueSaveData(MesWmProductIssueSaveReqVO reqVO) { validateCodeUnique(reqVO.getId(), reqVO.getCode()); - workOrderService.validateWorkOrderExists(reqVO.getWorkOrderId()); + workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); if (reqVO.getWorkstationId() != null) { - workstationService.validateWorkstationExists(reqVO.getWorkstationId()); + workstationService.validateWorkstationExistsAndEnable(reqVO.getWorkstationId()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceLineService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceLineService.java index 3623070c2..874ed3d32 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceLineService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceLineService.java @@ -18,6 +18,14 @@ public interface MesWmProductProduceLineService { */ void createProductProduceLine(MesWmProductProduceLineDO line); + /** + * 校验生产入库单行存在 + * + * @param id 行 ID + * @return 行数据 + */ + MesWmProductProduceLineDO validateProductProduceLineExists(Long id); + /** * 更新生产入库单行(内部使用) * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceLineServiceImpl.java index 19222cd3d..7ac68bed7 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceLineServiceImpl.java @@ -10,6 +10,9 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.List; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + /** * MES 生产入库单行 Service 实现类 */ @@ -25,6 +28,15 @@ public class MesWmProductProduceLineServiceImpl implements MesWmProductProduceLi productProduceLineMapper.insert(line); } + @Override + public MesWmProductProduceLineDO validateProductProduceLineExists(Long id) { + MesWmProductProduceLineDO line = productProduceLineMapper.selectById(id); + if (line == null) { + throw exception(WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS); + } + return line; + } + @Override public void updateProductProduceLine(MesWmProductProduceLineDO line) { productProduceLineMapper.updateById(line); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceService.java index d612272c0..76188cf29 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceService.java @@ -41,9 +41,11 @@ public interface MesWmProductProduceService { * 待检产出({@code checkFlag=true})按检验结果拆分行,并执行入库。 * * @param feedbackId 报工记录 ID + * @param sourceLineId 来源产出行 ID(直接定位待检行) * @param qualifiedQty 合格品数量 * @param unqualifiedQty 不合格品数量 */ - void splitPendingAndFinishProduce(Long feedbackId, BigDecimal qualifiedQty, BigDecimal unqualifiedQty); + void splitPendingAndFinishProduce(Long feedbackId, Long sourceLineId, + BigDecimal qualifiedQty, BigDecimal unqualifiedQty); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java index c9de8ffbd..bc70ab9c7 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java @@ -222,7 +222,8 @@ public class MesWmProductProduceServiceImpl implements MesWmProductProduceServic @Override @Transactional(rollbackFor = Exception.class) - public void splitPendingAndFinishProduce(Long feedbackId, BigDecimal qualifiedQty, BigDecimal unqualifiedQty) { + public void splitPendingAndFinishProduce(Long feedbackId, Long sourceLineId, + BigDecimal qualifiedQty, BigDecimal unqualifiedQty) { // 1.1 查询产出单 MesWmProductProduceDO produce = productProduceMapper.selectByFeedbackId(feedbackId); if (produce == null) { @@ -233,13 +234,8 @@ public class MesWmProductProduceServiceImpl implements MesWmProductProduceServic MesWmWarehouseLocationDO virtualLocation = locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION); MesWmWarehouseAreaDO virtualArea = areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA); - // 2. 查找待检验行(checkFlag=true 时只有一行 PENDING) - List lines = productProduceLineService.getProductProduceLineListByProduceId(produce.getId()); - MesWmProductProduceLineDO pendingLine = CollUtil.findOne(lines, - l -> ObjUtil.equal(l.getQualityStatus(), MesWmQualityStatusEnum.PENDING.getStatus())); - if (pendingLine == null) { - throw exception(WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS); - } + // 2. 通过 sourceLineId 直接定位待检验行 + MesWmProductProduceLineDO pendingLine = productProduceLineService.validateProductProduceLineExists(sourceLineId); // 3A. 情况一:存在不合格品数量,需要拆分行 if (unqualifiedQty != null && unqualifiedQty.compareTo(BigDecimal.ZERO) > 0) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptLineServiceImpl.java index caecbd583..9968c5321 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptLineServiceImpl.java @@ -31,10 +31,8 @@ public class MesWmProductReceiptLineServiceImpl implements MesWmProductReceiptLi @Resource @Lazy private MesWmProductReceiptService productReceiptService; - @Resource private MesWmProductReceiptDetailService productReceiptDetailService; - @Resource private MesMdItemService itemService; @@ -111,7 +109,7 @@ public class MesWmProductReceiptLineServiceImpl implements MesWmProductReceiptLi // 校验父单据存在且为可编辑状态 productReceiptService.validateProductReceiptEditable(reqVO.getReceiptId()); // 校验物料存在 - itemService.validateItemExists(reqVO.getItemId()); + itemService.validateItemExistsAndEnable(reqVO.getItemId()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java index 23148a2fa..ae7d31290 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java @@ -48,13 +48,10 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic @Resource private MesWmProductReceiptLineService productReceiptLineService; - @Resource private MesWmProductReceiptDetailService productReceiptDetailService; - @Resource private MesWmTransactionService wmTransactionService; - @Resource private MesProWorkOrderService workOrderService; @Resource @@ -267,7 +264,7 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic validateCodeUnique(reqVO.getId(), reqVO.getCode()); // 校验工单存在 return reqVO.getWorkOrderId() != null ? - workOrderService.validateWorkOrderExists(reqVO.getWorkOrderId()) : null; + workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()) : null; } private void validateCodeUnique(Long id, String code) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesDetailServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesDetailServiceImpl.java index 64f10ad6d..8cb2e81a2 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesDetailServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesDetailServiceImpl.java @@ -1,15 +1,19 @@ package cn.iocoder.yudao.module.mes.service.wm.productsales; +import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.detail.MesWmProductSalesDetailSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesDetailMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -29,17 +33,18 @@ public class MesWmProductSalesDetailServiceImpl implements MesWmProductSalesDeta @Resource private MesMdItemService itemService; - + @Resource + @Lazy + private MesWmProductSalesLineService productSalesLineService; + @Resource + private MesWmMaterialStockService materialStockService; @Resource private MesWmWarehouseAreaService warehouseAreaService; @Override public Long createProductSalesDetail(MesWmProductSalesDetailSaveReqVO createReqVO) { - // 校验物料存在 - itemService.validateItemExists(createReqVO.getItemId()); - // 校验库区关系 - warehouseAreaService.validateWarehouseAreaExists( - createReqVO.getWarehouseId(), createReqVO.getLocationId(), createReqVO.getAreaId()); + // 校验数据 + validateProductSalesDetailSaveData(createReqVO); // 插入 MesWmProductSalesDetailDO detail = BeanUtils.toBean(createReqVO, MesWmProductSalesDetailDO.class); @@ -51,11 +56,8 @@ public class MesWmProductSalesDetailServiceImpl implements MesWmProductSalesDeta public void updateProductSalesDetail(MesWmProductSalesDetailSaveReqVO updateReqVO) { // 校验存在 validateProductSalesDetailExists(updateReqVO.getId()); - // 校验物料存在 - itemService.validateItemExists(updateReqVO.getItemId()); - // 校验库区关系 - warehouseAreaService.validateWarehouseAreaExists( - updateReqVO.getWarehouseId(), updateReqVO.getLocationId(), updateReqVO.getAreaId()); + // 校验数据 + validateProductSalesDetailSaveData(updateReqVO); // 更新 MesWmProductSalesDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductSalesDetailDO.class); @@ -103,4 +105,27 @@ public class MesWmProductSalesDetailServiceImpl implements MesWmProductSalesDeta return detail; } + private void validateProductSalesDetailSaveData(MesWmProductSalesDetailSaveReqVO reqVO) { + // 校验父数据(行)存在 + MesWmProductSalesLineDO line = productSalesLineService.getProductSalesLine(reqVO.getLineId()); + if (line == null) { + throw exception(WM_PRODUCT_SALES_LINE_NOT_EXISTS); + } + if (ObjUtil.notEqual(line.getSalesId(), reqVO.getSalesId())) { + throw exception(WM_PRODUCT_SALES_DETAIL_LINE_NOT_MATCH); + } + // 校验物料存在 + itemService.validateItemExistsAndEnable(reqVO.getItemId()); + if (ObjUtil.notEqual(line.getItemId(), reqVO.getItemId())) { + throw exception(WM_PRODUCT_SALES_DETAIL_ITEM_MISMATCH); + } + // 校验库位存在 + warehouseAreaService.validateWarehouseAreaExists( + reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); + // 校验库存记录存在且物料一致 + materialStockService.validateSelectedStock( + reqVO.getMaterialStockId(), reqVO.getItemId(), reqVO.getBatchId(), reqVO.getBatchCode(), + reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId(), reqVO.getQuantity()); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineService.java index 2e7f98cfa..d59418e24 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineService.java @@ -68,6 +68,14 @@ public interface MesWmProductSalesLineService { */ PageResult getProductSalesLinePage(MesWmProductSalesLinePageReqVO pageReqVO); + /** + * 校验销售出库单行存在 + * + * @param id 编号 + * @return 销售出库单行 + */ + MesWmProductSalesLineDO validateProductSalesLineExists(Long id); + /** * OQC 检验完成后,更新销售出库单行的 OQC 质检状态 * diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java index 79532da1c..5d112b8c7 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java @@ -1,12 +1,12 @@ package cn.iocoder.yudao.module.mes.service.wm.productsales; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLinePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLineSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLineMapper; @@ -14,19 +14,22 @@ import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO; +import cn.iocoder.yudao.module.mes.service.wm.salesnotice.MesWmSalesNoticeLineService; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.List; import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_SALES_LINE_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * MES 销售出库单行 Service 实现类 @@ -40,6 +43,7 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe @Resource private MesWmProductSalesLineMapper productSalesLineMapper; + @Resource private MesWmProductSalesDetailService productSalesDetailService; @Resource @@ -49,13 +53,14 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe @Resource @Lazy private MesWmProductSalesService productSalesService; + @Resource + @Lazy + private MesWmSalesNoticeLineService salesNoticeLineService; @Override public Long createProductSalesLine(MesWmProductSalesLineSaveReqVO createReqVO) { - // 校验物料存在 - itemService.validateItemExists(createReqVO.getItemId()); - // 根据 batchCode 解析 batchId - fillBatchId(createReqVO); + // 校验数据 + validateLineSaveData(createReqVO); // 新增 MesWmProductSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmProductSalesLineDO.class); @@ -66,11 +71,10 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe @Override public void updateProductSalesLine(MesWmProductSalesLineSaveReqVO updateReqVO) { // 校验存在 - validateProductSalesLineExists(updateReqVO.getId()); - // 校验物料存在 - itemService.validateItemExists(updateReqVO.getItemId()); - // 根据 batchCode 解析 batchId - fillBatchId(updateReqVO); + MesWmProductSalesLineDO oldLine = validateProductSalesLineExists(updateReqVO.getId()); + // 校验数据 + updateReqVO.setSalesId(oldLine.getSalesId()); + validateLineSaveData(updateReqVO); // 更新 MesWmProductSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductSalesLineDO.class); @@ -81,7 +85,9 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe @Transactional(rollbackFor = Exception.class) public void deleteProductSalesLine(Long id) { // 校验存在 - validateProductSalesLineExists(id); + MesWmProductSalesLineDO line = validateProductSalesLineExists(id); + // 校验主单为草稿状态才允许删除行 + productSalesService.validateProductSalesExistsAndDraft(line.getSalesId()); // 级联删除明细 productSalesDetailService.deleteProductSalesDetailByLineId(id); @@ -119,7 +125,8 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe return productSalesLineMapper.selectPage(pageReqVO); } - private MesWmProductSalesLineDO validateProductSalesLineExists(Long id) { + @Override + public MesWmProductSalesLineDO validateProductSalesLineExists(Long id) { MesWmProductSalesLineDO line = productSalesLineMapper.selectById(id); if (line == null) { throw exception(WM_PRODUCT_SALES_LINE_NOT_EXISTS); @@ -139,6 +146,60 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe reqVO.setBatchId(batch != null ? batch.getId() : null); } + /** + * 校验保存时的关联数据 + */ + private void validateLineSaveData(MesWmProductSalesLineSaveReqVO reqVO) { + // 校验主单存在且为草稿状态 + MesWmProductSalesDO sales = productSalesService.validateProductSalesExistsAndDraft(reqVO.getSalesId()); + // 校验物料存在 + itemService.validateItemExistsAndEnable(reqVO.getItemId()); + // 校验关联发货通知单行(存在性 + 归属 + 字段一致性) + validateSalesNoticeLine(sales, reqVO); + // 根据 batchCode 解析 batchId + fillBatchId(reqVO); + } + + /** + * 校验发货通知单行 + * + * @param sales 出库单 + * @param reqVO 出库行请求 + */ + private void validateSalesNoticeLine(MesWmProductSalesDO sales, MesWmProductSalesLineSaveReqVO reqVO) { + Long noticeLineId = reqVO.getNoticeLineId(); + // 情况一:如果出库单关联了发货通知单,则必须关联发货通知单行 + if (sales.getNoticeId() != null) { + if (noticeLineId == null) { + throw exception(WM_PRODUCT_SALES_LINE_SALES_NOTICE_LINE_REQUIRED); + } + MesWmSalesNoticeLineDO noticeLine = salesNoticeLineService.validateSalesNoticeLineExists( + noticeLineId, sales.getNoticeId()); + // 校验关键字段一致性:物料、数量、批次号、OQC 检验标识 + if (ObjUtil.notEqual(reqVO.getItemId(), noticeLine.getItemId())) { + throw exception(WM_PRODUCT_SALES_LINE_NOTICE_LINE_ITEM_MISMATCH); + } + if (noticeLine.getQuantity() != null && reqVO.getQuantity() != null + && reqVO.getQuantity().compareTo(noticeLine.getQuantity()) != 0) { + throw exception(WM_PRODUCT_SALES_LINE_NOTICE_LINE_QUANTITY_MISMATCH); + } + if (StrUtil.isNotBlank(noticeLine.getBatchCode()) + && ObjUtil.notEqual(reqVO.getBatchCode(), noticeLine.getBatchCode())) { + throw exception(WM_PRODUCT_SALES_LINE_NOTICE_LINE_BATCH_MISMATCH); + } + if (noticeLine.getOqcCheckFlag() != null + && ObjUtil.notEqual(reqVO.getOqcCheckFlag(), noticeLine.getOqcCheckFlag())) { + throw exception(WM_PRODUCT_SALES_LINE_NOTICE_LINE_OQC_MISMATCH); + } + return; + } + + // 情况二:如果出库单没有关联发货通知单,则不允许关联发货通知单行 + if (noticeLineId != null) { + throw exception(WM_PRODUCT_SALES_LINE_SALES_NOTICE_LINE_NOT_ALLOWED); + } + } + @Override @Transactional(rollbackFor = Exception.class) public void updateProductSalesLineWhenOqcFinish(Long id, Long oqcId, Integer checkResult) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java index 979d7d40c..f248e664d 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java @@ -116,4 +116,13 @@ public interface MesWmProductSalesService { */ List getProductSalesListByClientId(Long clientId); + /** + * 校验销售出库单存在且为草稿状态 + * + * @param id 编号 + * @return 销售出库单 + */ + MesWmProductSalesDO validateProductSalesExistsAndDraft(Long id); + } + diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java index 71d92b1c6..f461b58f2 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesSaveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.MesWmProductSalesShippingReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO; @@ -16,8 +17,10 @@ import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesMa import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmSalesNoticeStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; +import cn.iocoder.yudao.module.mes.service.wm.salesnotice.MesWmSalesNoticeService; import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; import org.springframework.stereotype.Service; @@ -46,13 +49,12 @@ public class MesWmProductSalesServiceImpl implements MesWmProductSalesService { @Resource private MesWmProductSalesLineService productSalesLineService; - @Resource private MesWmProductSalesDetailService productSalesDetailService; - @Resource private MesMdClientService clientService; - + @Resource + private MesWmSalesNoticeService salesNoticeService; @Resource private MesWmTransactionService wmTransactionService; @@ -218,7 +220,7 @@ public class MesWmProductSalesServiceImpl implements MesWmProductSalesService { wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId()) .setQuantity(detail.getQuantity().negate()) // 出库数量为负数 - .setBatchId(detail.getBatchId()) + .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) .setBizType(MesBizTypeConstants.WM_PRODUCT_SALES).setBizId(sales.getId()) .setBizCode(sales.getCode()).setBizLineId(detail.getLineId()))); @@ -261,7 +263,17 @@ public class MesWmProductSalesServiceImpl implements MesWmProductSalesService { // 校验编码唯一 validateCodeUnique(id, reqVO.getCode()); // 校验客户存在 - clientService.validateClientExists(reqVO.getClientId()); + clientService.validateClientExistsAndEnable(reqVO.getClientId()); + // 校验发货通知单 + if (reqVO.getNoticeId() != null) { + MesWmSalesNoticeDO notice = salesNoticeService.validateSalesNoticeExists(reqVO.getNoticeId()); + if (ObjUtil.notEqual(notice.getStatus(), MesWmSalesNoticeStatusEnum.APPROVED.getStatus())) { + throw exception(WM_SALES_NOTICE_STATUS_NOT_APPROVED); + } + if (ObjUtil.notEqual(notice.getClientId(), reqVO.getClientId())) { + throw exception(WM_SALES_NOTICE_CLIENT_MISMATCH); + } + } } private MesWmProductSalesDO validateProductSalesExists(Long id) { @@ -275,7 +287,8 @@ public class MesWmProductSalesServiceImpl implements MesWmProductSalesService { /** * 校验销售出库单存在且为草稿状态 */ - private MesWmProductSalesDO validateProductSalesExistsAndDraft(Long id) { + @Override + public MesWmProductSalesDO validateProductSalesExistsAndDraft(Long id) { MesWmProductSalesDO sales = validateProductSalesExists(id); if (ObjUtil.notEqual(MesWmProductSalesStatusEnum.PREPARE.getStatus(), sales.getStatus())) { throw exception(WM_PRODUCT_SALES_NOT_PREPARE); diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailServiceImpl.java index 8a8b94e16..4c39cb365 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.service.wm.returnissue; +import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.detail.MesWmReturnIssueDetailSaveReqVO; @@ -17,8 +18,7 @@ import java.math.BigDecimal; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_ISSUE_DETAIL_NOT_EXISTS; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_ISSUE_DETAIL_QUANTITY_EXCEED; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * MES 生产退料明细 Service 实现类 @@ -105,11 +105,21 @@ public class MesWmReturnIssueDetailServiceImpl implements MesWmReturnIssueDetail private void validateReturnIssueDetailSaveData(MesWmReturnIssueDetailSaveReqVO reqVO) { // 校验父数据存在 MesWmReturnIssueLineDO line = issueLineService.validateReturnIssueLineExists(reqVO.getLineId()); + if (ObjUtil.notEqual(line.getIssueId(), reqVO.getIssueId())) { + throw exception(WM_RETURN_ISSUE_DETAIL_LINE_NOT_MATCH); + } + if (ObjUtil.notEqual(line.getItemId(), reqVO.getItemId())) { + throw exception(WM_RETURN_ISSUE_DETAIL_ITEM_MISMATCH); + } // 校验仓库、库区、库位的关联关系 warehouseAreaService.validateWarehouseAreaExists( reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); // 校验库位物料/批次混放规则 materialStockService.checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), reqVO.getBatchId()); + // 校验库存记录 + materialStockService.validateSelectedStock( + reqVO.getMaterialStockId(), reqVO.getItemId(), reqVO.getBatchId(), reqVO.getBatchCode(), + reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId(), reqVO.getQuantity()); // 校验明细总数量不超过行数量(排除自身) validateDetailQuantityNotExceed(reqVO.getLineId(), reqVO.getQuantity(), reqVO.getId(), line); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java index 9d1ca5dd4..d38654c8f 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java @@ -117,7 +117,7 @@ public class MesWmReturnIssueLineServiceImpl implements MesWmReturnIssueLineServ // 校验父数据存在 + 草稿状态 MesWmReturnIssueDO issue = issueService.validateReturnIssueExistsAndPrepare(reqVO.getIssueId()); // 校验物料存在 - itemService.validateItemExists(reqVO.getItemId()); + itemService.validateItemExistsAndEnable(reqVO.getItemId()); return issue; } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java index 073bba123..6cd6aad09 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java @@ -167,7 +167,7 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { MesWmReturnIssueDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); // 对比行数量与明细总数量,不满足直接抛出 if (line.getQuantity().compareTo(totalDetailQuantity) > 0) { - MesMdItemDO item = itemService.validateItemExists(line.getItemId()); + MesMdItemDO item = itemService.validateItemExistsAndEnable(line.getItemId()); throw exception(WM_RETURN_ISSUE_DETAIL_QUANTITY_MISMATCH, item.getCode() + " " + item.getName() + " 未完成上架"); } @@ -288,9 +288,9 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { */ private void validateReturnIssueSaveData(MesWmReturnIssueSaveReqVO reqVO) { validateCodeUnique(reqVO.getId(), reqVO.getCode()); - workOrderService.validateWorkOrderExists(reqVO.getWorkOrderId()); + workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); if (reqVO.getWorkstationId() != null) { - workstationService.validateWorkstationExists(reqVO.getWorkstationId()); + workstationService.validateWorkstationExistsAndEnable(reqVO.getWorkstationId()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesDetailServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesDetailServiceImpl.java index 26131e8ce..68640e7b7 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesDetailServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesDetailServiceImpl.java @@ -1,14 +1,17 @@ package cn.iocoder.yudao.module.mes.service.wm.returnsales; import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail.MesWmReturnSalesDetailSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesDetailMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum; +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; import org.springframework.context.annotation.Lazy; @@ -40,16 +43,17 @@ public class MesWmReturnSalesDetailServiceImpl implements MesWmReturnSalesDetail @Resource @Lazy private MesWmReturnSalesService returnSalesService; - @Resource private MesWmWarehouseAreaService warehouseAreaService; - + @Resource + private MesWmBatchService batchService; @Resource @Lazy private MesWmMaterialStockService materialStockService; @Override public Long createReturnSalesDetail(MesWmReturnSalesDetailSaveReqVO createReqVO) { + // 校验保存数据 validateReturnSalesDetailSaveData(createReqVO); // 插入 @@ -62,6 +66,7 @@ public class MesWmReturnSalesDetailServiceImpl implements MesWmReturnSalesDetail public void updateReturnSalesDetail(MesWmReturnSalesDetailSaveReqVO updateReqVO) { // 校验存在 validateReturnSalesDetailExists(updateReqVO.getId()); + // 校验保存数据 validateReturnSalesDetailSaveData(updateReqVO); // 更新 @@ -138,6 +143,9 @@ public class MesWmReturnSalesDetailServiceImpl implements MesWmReturnSalesDetail materialStockService.checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), reqVO.getBatchId()); // 校验明细总数量不超过行数量(排除自身) validateDetailQuantityNotExceed(reqVO.getLineId(), reqVO.getQuantity(), reqVO.getId(), line); + + // 根据 batchCode 解析 batchId(必须在混放规则校验之前,因为它依赖 batchId) + fillBatchId(reqVO); } /** @@ -162,4 +170,17 @@ public class MesWmReturnSalesDetailServiceImpl implements MesWmReturnSalesDetail } } + /** + * 根据 batchCode 解析并回填 batchId + */ + private void fillBatchId(MesWmReturnSalesDetailSaveReqVO reqVO) { + if (StrUtil.isBlank(reqVO.getBatchCode())) { + return; + } + MesWmBatchDO batch = batchService.getBatchByCode(reqVO.getBatchCode()); + if (batch != null) { + reqVO.setBatchId(batch.getId()); + } + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java index 050d8952a..0aa1fd8e8 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java @@ -8,15 +8,17 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWm import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.math.BigDecimal; import java.util.List; import java.util.Objects; @@ -43,6 +45,8 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ @Resource private MesMdItemService itemService; @Resource + private MesWmBatchService batchService; + @Resource @Lazy private MesWmReturnSalesDetailService returnSalesDetailService; @@ -61,7 +65,9 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ @Override public void updateReturnSalesLine(MesWmReturnSalesLineSaveReqVO updateReqVO) { // 校验存在 - validateReturnSalesLineExists(updateReqVO.getId()); + MesWmReturnSalesLineDO oldLine = validateReturnSalesLineExists(updateReqVO.getId()); + // 固定父单 ID,防止通过接口篡改 + updateReqVO.setReturnId(oldLine.getReturnId()); validateLineSaveData(updateReqVO); // 更新 @@ -78,7 +84,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ // 校验退货单存在 + 草稿状态 returnSalesService.validateReturnSalesExistsAndPrepare(reqVO.getReturnId()); // 校验物料存在 + 批次管理 - validateItemBatchManagement(reqVO.getItemId(), reqVO.getBatchId()); + validateItemBatchManagement(reqVO.getReturnId(), reqVO.getItemId(), reqVO.getBatchId()); } @Override @@ -144,15 +150,22 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ /** * 校验物料批次管理 * - * @param itemId 物料ID - * @param batchId 批次ID + * @param returnId 退货单ID + * @param itemId 物料ID + * @param batchId 批次ID */ - private void validateItemBatchManagement(Long itemId, Long batchId) { - MesMdItemDO item = itemService.validateItemExists(itemId); + private void validateItemBatchManagement(Long returnId, Long itemId, Long batchId) { + MesMdItemDO item = itemService.validateItemExistsAndEnable(itemId); // 如果物料启用了批次管理,则必须选择批次 if (Boolean.TRUE.equals(item.getBatchFlag()) && batchId == null) { throw exception(MD_ITEM_BATCH_REQUIRED); } + // 校验批次存在且属于当前物料和客户 + if (batchId != null) { + // 从父单获取客户ID,校验批次归属 + MesWmReturnSalesDO returnSales = returnSalesService.validateReturnSalesExistsAndPrepare(returnId); + batchService.validateBatchExists(batchId, itemId, returnSales.getClientId(), null); + } } @Override diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java index e813685f2..c94bef47c 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java @@ -169,7 +169,7 @@ public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService { MesWmReturnSalesDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); // 对比行数量与明细总数量,不满足直接抛出 if (line.getQuantity().compareTo(totalDetailQuantity) > 0) { - MesMdItemDO item = itemService.validateItemExists(line.getItemId()); + MesMdItemDO item = itemService.validateItemExistsAndEnable(line.getItemId()); throw exception(WM_RETURN_SALES_DETAIL_QUANTITY_MISMATCH, item.getCode() + " " + item.getName() + " 未完成上架"); } @@ -189,7 +189,7 @@ public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService { wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() .setType(MesWmTransactionTypeEnum.IN.getType()).setItemId(detail.getItemId()) .setQuantity(detail.getQuantity()) // 入库数量为正数 - .setBatchId(detail.getBatchId()) + .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) .setBizType(MesBizTypeConstants.WM_RETURN_SALES).setBizId(returnSales.getId()) .setBizCode(returnSales.getCode()).setBizLineId(detail.getLineId()))); @@ -271,7 +271,7 @@ public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService { */ private void validateSaveData(MesWmReturnSalesSaveReqVO reqVO) { validateCodeUnique(reqVO.getId(), reqVO.getCode()); - clientService.validateClientExists(reqVO.getClientId()); + clientService.validateClientExistsAndEnable(reqVO.getClientId()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java index cea680532..985e80f94 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java @@ -3,17 +3,17 @@ package cn.iocoder.yudao.module.mes.service.wm.returnvendor; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail.MesWmReturnVendorDetailSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorDetailMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -32,12 +32,12 @@ public class MesWmReturnVendorDetailServiceImpl implements MesWmReturnVendorDeta @Resource @Lazy private MesWmReturnVendorLineService returnVendorLineService; - @Resource private MesMdItemService itemService; - @Resource private MesWmMaterialStockService materialStockService; + @Resource + private MesWmWarehouseAreaService warehouseAreaService; @Override public Long createReturnVendorDetail(MesWmReturnVendorDetailSaveReqVO createReqVO) { @@ -68,12 +68,18 @@ public class MesWmReturnVendorDetailServiceImpl implements MesWmReturnVendorDeta private void validateDetailSaveData(MesWmReturnVendorDetailSaveReqVO reqVO) { // 校验父数据(行)存在 MesWmReturnVendorLineDO line = returnVendorLineService.validateReturnVendorLineExists(reqVO.getLineId()); + if (ObjUtil.notEqual(line.getReturnId(), reqVO.getReturnId())) { + throw exception(WM_RETURN_VENDOR_DETAIL_LINE_NOT_MATCH); + } // 校验物料存在 - itemService.validateItemExists(reqVO.getItemId()); + itemService.validateItemExistsAndEnable(reqVO.getItemId()); // 校验物料与行物料一致 validateItemConsistency(reqVO.getItemId(), line); + // 校验库位存在 + warehouseAreaService.validateWarehouseAreaExists( + reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); // 校验库存记录存在且物料一致 - validateMaterialStock(reqVO.getMaterialStockId(), line); + validateMaterialStock(reqVO, line); } @Override @@ -127,15 +133,11 @@ public class MesWmReturnVendorDetailServiceImpl implements MesWmReturnVendorDeta /** * 校验库存记录存在且物料与行物料一致 */ - private void validateMaterialStock(Long materialStockId, MesWmReturnVendorLineDO line) { - if (materialStockId == null) { - return; - } - MesWmMaterialStockDO stock = materialStockService.getMaterialStock(materialStockId); - if (stock == null) { - throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); - } - if (ObjUtil.notEqual(stock.getItemId(), line.getItemId())) { + private void validateMaterialStock(MesWmReturnVendorDetailSaveReqVO reqVO, MesWmReturnVendorLineDO line) { + materialStockService.validateSelectedStock( + reqVO.getMaterialStockId(), reqVO.getItemId(), reqVO.getBatchId(), reqVO.getBatchCode(), + reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId(), reqVO.getQuantity()); + if (ObjUtil.notEqual(line.getItemId(), reqVO.getItemId())) { throw exception(WM_RETURN_VENDOR_DETAIL_ITEM_MISMATCH); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java index aa5c0532f..6b70f9277 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java @@ -5,14 +5,16 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLinePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; +import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -36,6 +38,8 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe private MesWmReturnVendorDetailService returnVendorDetailService; @Resource private MesMdItemService itemService; + @Resource + private MesWmBatchService batchService; @Override public Long createReturnVendorLine(MesWmReturnVendorLineSaveReqVO createReqVO) { @@ -51,7 +55,9 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe @Override public void updateReturnVendorLine(MesWmReturnVendorLineSaveReqVO updateReqVO) { // 校验存在 - validateReturnVendorLineExists(updateReqVO.getId()); + MesWmReturnVendorLineDO oldLine = validateReturnVendorLineExists(updateReqVO.getId()); + // 固定父单 ID,防止通过接口篡改 + updateReqVO.setReturnId(oldLine.getReturnId()); // 校验数据 validateReturnVendorLineSaveData(updateReqVO); @@ -105,9 +111,13 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe private void validateReturnVendorLineSaveData(MesWmReturnVendorLineSaveReqVO reqVO) { // 校验父数据存在且为草稿状态 - returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId()); + MesWmReturnVendorDO returnVendor = returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId()); // 校验物料存在 - itemService.validateItemExists(reqVO.getItemId()); + itemService.validateItemExistsAndEnable(reqVO.getItemId()); + // 校验批次存在且属于当前物料和供应商 + if (reqVO.getBatchId() != null) { + batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId(), null, returnVendor.getVendorId()); + } } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java index a3bed7b39..8bd7fac32 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java @@ -217,7 +217,7 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { validateReturnVendorExistsAndPrepare(reqVO.getId()); } // 校验供应商存在 - vendorService.validateVendorExists(reqVO.getVendorId()); + vendorService.validateVendorExistsAndEnable(reqVO.getVendorId()); // 校验编码唯一 validateCodeUnique(reqVO.getId(), reqVO.getCode()); } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineService.java index 17cdad419..8e9286469 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineService.java @@ -66,4 +66,21 @@ public interface MesWmSalesNoticeLineService { */ void deleteSalesNoticeLineByNoticeId(Long noticeId); + /** + * 校验发货通知单行存在 + * + * @param id 行编号 + * @return 发货通知单行 + */ + MesWmSalesNoticeLineDO validateSalesNoticeLineExists(Long id); + + /** + * 校验发货通知单行存在,并且属于指定的通知单 + * + * @param lineId 行编号 + * @param noticeId 通知单编号 + * @return 发货通知单行 + */ + MesWmSalesNoticeLineDO validateSalesNoticeLineExists(Long lineId, Long noticeId); + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java index f926cf6d2..fca67d4df 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java @@ -36,10 +36,8 @@ public class MesWmSalesNoticeLineServiceImpl implements MesWmSalesNoticeLineServ @Resource @Lazy private MesWmSalesNoticeService salesNoticeService; - @Resource private MesWmBatchService batchService; - @Resource private MesMdItemService itemService; @@ -100,7 +98,8 @@ public class MesWmSalesNoticeLineServiceImpl implements MesWmSalesNoticeLineServ salesNoticeLineMapper.deleteByNoticeId(noticeId); } - private MesWmSalesNoticeLineDO validateSalesNoticeLineExists(Long id) { + @Override + public MesWmSalesNoticeLineDO validateSalesNoticeLineExists(Long id) { MesWmSalesNoticeLineDO line = salesNoticeLineMapper.selectById(id); if (line == null) { throw exception(WM_SALES_NOTICE_LINE_NOT_EXISTS); @@ -108,12 +107,22 @@ public class MesWmSalesNoticeLineServiceImpl implements MesWmSalesNoticeLineServ return line; } + @Override + public MesWmSalesNoticeLineDO validateSalesNoticeLineExists(Long lineId, Long noticeId) { + MesWmSalesNoticeLineDO line = validateSalesNoticeLineExists(lineId); + // 进一步校验行的 noticeId 与传入的 noticeId 是否匹配 + if (noticeId != null && ObjUtil.notEqual(line.getNoticeId(), noticeId)) { + throw exception(WM_SALES_NOTICE_LINE_NOT_MATCH); + } + return line; + } + private void validateLineSaveData(MesWmSalesNoticeLineSaveReqVO reqVO) { // 校验父单据存在且为草稿状态 validateNoticeStatusDraft(reqVO.getNoticeId()); // 校验物料存在 if (reqVO.getItemId() != null) { - itemService.validateItemExists(reqVO.getItemId()); + itemService.validateItemExistsAndEnable(reqVO.getItemId()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java index 2d12ce116..5ff40fdd3 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java @@ -39,6 +39,14 @@ public interface MesWmSalesNoticeService { */ void deleteSalesNotice(Long id); + /** + * 校验发货通知单存在 + * + * @param id 编号 + * @return 发货通知单 + */ + MesWmSalesNoticeDO validateSalesNoticeExists(Long id); + /** * 获得发货通知单 * @@ -80,12 +88,4 @@ public interface MesWmSalesNoticeService { return convertMap(getSalesNoticeList(ids), MesWmSalesNoticeDO::getId); } - /** - * 按状态获得发货通知单列表 - * - * @param status 状态 - * @return 发货通知单列表 - */ - List getSalesNoticeListByStatus(Integer status); - } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java index 76080684f..7193cd346 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java @@ -37,7 +37,6 @@ public class MesWmSalesNoticeServiceImpl implements MesWmSalesNoticeService { @Resource private MesWmSalesNoticeLineService salesNoticeLineService; - @Resource private MesMdClientService clientService; @@ -112,14 +111,7 @@ public class MesWmSalesNoticeServiceImpl implements MesWmSalesNoticeService { } @Override - public List getSalesNoticeListByStatus(Integer status) { - if (status == null) { - return salesNoticeMapper.selectList(); - } - return salesNoticeMapper.selectListByStatus(status); - } - - private MesWmSalesNoticeDO validateSalesNoticeExists(Long id) { + public MesWmSalesNoticeDO validateSalesNoticeExists(Long id) { MesWmSalesNoticeDO notice = salesNoticeMapper.selectById(id); if (notice == null) { throw exception(WM_SALES_NOTICE_NOT_EXISTS); @@ -140,15 +132,15 @@ public class MesWmSalesNoticeServiceImpl implements MesWmSalesNoticeService { private void validateSalesNoticeSave(MesWmSalesNoticeSaveReqVO saveReqVO) { // 校验编码唯一 - validateNoticeCodeUnique(saveReqVO.getId(), saveReqVO.getNoticeCode()); + validateNoticeCodeUnique(saveReqVO.getId(), saveReqVO.getCode()); // 校验客户存在 if (saveReqVO.getClientId() != null) { - clientService.validateClientExists(saveReqVO.getClientId()); + clientService.validateClientExistsAndEnable(saveReqVO.getClientId()); } } - private void validateNoticeCodeUnique(Long id, String noticeCode) { - MesWmSalesNoticeDO notice = salesNoticeMapper.selectByNoticeCode(noticeCode); + private void validateNoticeCodeUnique(Long id, String code) { + MesWmSalesNoticeDO notice = salesNoticeMapper.selectByCode(code); if (notice == null) { return; } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/sn/MesWmSnServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/sn/MesWmSnServiceImpl.java index 59d30c691..0f9ebedf5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/sn/MesWmSnServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/sn/MesWmSnServiceImpl.java @@ -9,12 +9,14 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.sn.MesWmSnDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.sn.MesWmSnMapper; import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum; import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -30,12 +32,24 @@ public class MesWmSnServiceImpl implements MesWmSnService { @Resource private MesWmSnMapper snMapper; + @Resource private MesMdAutoCodeRecordService autoCodeRecordService; + @Resource + private MesMdItemService itemService; + @Resource + private MesProWorkOrderService workOrderService; @Override @Transactional(rollbackFor = Exception.class) public void generateSnCodes(MesWmSnGenerateReqVO reqVO) { + // 校验物料是否存在 + itemService.validateItemExists(reqVO.getItemId()); + // 校验工单是否存在 + if (reqVO.getWorkOrderId() != null) { + workOrderService.validateWorkOrderExists(reqVO.getWorkOrderId()); + } + List sns = new ArrayList<>(reqVO.getCount()); // 生成批次 UUID String uuid = IdUtil.fastSimpleUUID(); @@ -66,4 +80,4 @@ public class MesWmSnServiceImpl implements MesWmSnService { snMapper.deleteByUuid(uuid); } -} +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java index 0544c85f1..e1ec1bc19 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java @@ -107,12 +107,4 @@ public interface MesWmStockTakingPlanService { */ PageResult getStockTakingPlanPage(MesWmStockTakingPlanPageReqVO pageReqVO); - /** - * 根据状态获得盘点方案列表。 - * - * @param status 状态 - * @return 盘点方案列表 - */ - List getStockTakingPlanListByStatus(Integer status); - } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java index 9bb17674a..16fcf731b 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java @@ -34,6 +34,7 @@ public class MesWmStockTakingPlanServiceImpl implements MesWmStockTakingPlanServ @Resource private MesWmStockTakingPlanMapper stockTakingPlanMapper; + @Resource private MesWmStockTakingPlanParamService stockTakingPlanParamService; @@ -121,11 +122,6 @@ public class MesWmStockTakingPlanServiceImpl implements MesWmStockTakingPlanServ return stockTakingPlanMapper.selectPage(pageReqVO); } - @Override - public List getStockTakingPlanListByStatus(Integer status) { - return stockTakingPlanMapper.selectListByStatus(status); - } - private void validatePlanCodeUnique(Long id, String code) { MesWmStockTakingPlanDO plan = stockTakingPlanMapper.selectByCode(code); if (plan == null) { diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java index cd1d34c1a..f340f27f5 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java @@ -109,19 +109,17 @@ public class MesWmTransferLineServiceImpl implements MesWmTransferLineService { // 校验父数据可编辑 transferService.validateTransferEditable(reqVO.getTransferId()); // 校验产品存在 - itemService.validateItemExists(reqVO.getItemId()); + itemService.validateItemExistsAndEnable(reqVO.getItemId()); // 校验来源仓库、库区、库位的关联关系 warehouseAreaService.validateWarehouseAreaExists(reqVO.getFromWarehouseId(), reqVO.getFromLocationId(), reqVO.getFromAreaId()); // 校验库存记录存在,且转移数量不超过库存数量 - if (reqVO.getMaterialStockId() != null) { - MesWmMaterialStockDO stock = materialStockService.getMaterialStock(reqVO.getMaterialStockId()); - if (stock == null) { - throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); - } - if (stock.getQuantity() != null && reqVO.getQuantity().compareTo(stock.getQuantity()) > 0) { - throw exception(WM_TRANSFER_LINE_QUANTITY_EXCEED_STOCK); - } + MesWmMaterialStockDO stock = materialStockService.getMaterialStock(reqVO.getMaterialStockId()); + if (stock == null) { + throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); + } + if (stock.getQuantity() != null && reqVO.getQuantity().compareTo(stock.getQuantity()) > 0) { + throw exception(WM_TRANSFER_LINE_QUANTITY_EXCEED_STOCK); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationServiceImpl.java b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationServiceImpl.java index 321f712d7..9d5bd2a38 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-server/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationServiceImpl.java @@ -190,7 +190,6 @@ public class MesWmWarehouseLocationServiceImpl implements MesWmWarehouseLocation // 2.2 自动初始化 MesWmWarehouseLocationDO newLocation = MesWmWarehouseLocationDO.builder() .warehouseId(warehouse.getId()).code(code).name("虚拟线边库区") - .areaStatus(cn.iocoder.yudao.framework.common.enums.CommonStatusEnum.ENABLE.getStatus()) .frozen(false).remark("系统自动初始化的虚拟线边库区") .build(); locationMapper.insert(newLocation); diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/task/MesProTaskMapperTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/task/MesProTaskMapperTest.java new file mode 100644 index 000000000..60c057094 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/task/MesProTaskMapperTest.java @@ -0,0 +1,280 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.pro.task; + +import cn.hutool.core.collection.ListUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; +import cn.iocoder.yudao.module.mes.dal.mysql.pro.route.MesProRouteProcessMapper; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.List; +import java.util.function.Consumer; + +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * {@link MesProTaskMapper#selectPage(MesProTaskPageReqVO)} 的单元测试 + * + * @author 芋道源码 + */ +public class MesProTaskMapperTest extends BaseDbUnitTest { + + @Resource + private MesProTaskMapper taskMapper; + + @Resource + private MesProRouteProcessMapper routeProcessMapper; + + /** + * 创建 Task 时统一设置 BigDecimal 字段为 2 位小数,避免 H2 decimal(14,2) 精度不匹配 + */ + private MesProTaskDO createTaskPojo(Consumer consumer) { + return randomPojo(MesProTaskDO.class, o -> { + o.setQuantity(new BigDecimal("10.00")); + o.setProducedQuantity(new BigDecimal("5.00")); + o.setQualifyQuantity(new BigDecimal("4.00")); + o.setUnqualifyQuantity(new BigDecimal("1.00")); + o.setChangedQuantity(new BigDecimal("0.00")); + consumer.accept(o); + }); + } + + // ==================== selectPage 基础过滤 ==================== + + @Test + public void testSelectPage_byCode() { + MesProTaskDO matchTask = createTaskPojo(o -> { + o.setCode("PT202501010001"); + o.setStatus(0); + }); + taskMapper.insert(matchTask); + taskMapper.insert(cloneIgnoreId(matchTask, o -> o.setCode("OTHER_CODE"))); + + MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); + reqVO.setCode("PT2025"); + PageResult result = taskMapper.selectPage(reqVO); + + assertEquals(1, result.getTotal()); + assertPojoEquals(matchTask, result.getList().get(0)); + } + + @Test + public void testSelectPage_byName() { + MesProTaskDO matchTask = createTaskPojo(o -> { + o.setName("注塑任务-A"); + o.setStatus(0); + }); + taskMapper.insert(matchTask); + taskMapper.insert(cloneIgnoreId(matchTask, o -> o.setName("OTHER_NAME"))); + + MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); + reqVO.setName("注塑"); + PageResult result = taskMapper.selectPage(reqVO); + + assertEquals(1, result.getTotal()); + assertPojoEquals(matchTask, result.getList().get(0)); + } + + @Test + public void testSelectPage_byWorkOrderId() { + MesProTaskDO matchTask = createTaskPojo(o -> { + o.setWorkOrderId(100L); + o.setStatus(0); + }); + taskMapper.insert(matchTask); + taskMapper.insert(cloneIgnoreId(matchTask, o -> o.setWorkOrderId(999L))); + + MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); + reqVO.setWorkOrderId(100L); + PageResult result = taskMapper.selectPage(reqVO); + + assertEquals(1, result.getTotal()); + assertPojoEquals(matchTask, result.getList().get(0)); + } + + @Test + public void testSelectPage_byStatus() { + MesProTaskDO matchTask = createTaskPojo(o -> o.setStatus(1)); + taskMapper.insert(matchTask); + taskMapper.insert(cloneIgnoreId(matchTask, o -> o.setStatus(2))); + + MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); + reqVO.setStatus(1); + PageResult result = taskMapper.selectPage(reqVO); + + assertEquals(1, result.getTotal()); + assertPojoEquals(matchTask, result.getList().get(0)); + } + + @Test + public void testSelectPage_byStatuses() { + MesProTaskDO task1 = createTaskPojo(o -> o.setStatus(1)); + MesProTaskDO task2 = createTaskPojo(o -> o.setStatus(2)); + MesProTaskDO task3 = createTaskPojo(o -> o.setStatus(3)); + taskMapper.insert(task1); + taskMapper.insert(task2); + taskMapper.insert(task3); + + MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); + reqVO.setStatuses(ListUtil.of(1, 2)); + PageResult result = taskMapper.selectPage(reqVO); + + assertEquals(2, result.getTotal()); + } + + @Test + public void testSelectPage_noFilter() { + MesProTaskDO task1 = createTaskPojo(o -> o.setStatus(0)); + MesProTaskDO task2 = createTaskPojo(o -> o.setStatus(1)); + taskMapper.insert(task1); + taskMapper.insert(task2); + + MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); + PageResult result = taskMapper.selectPage(reqVO); + + assertEquals(2, result.getTotal()); + } + + // ==================== selectPage + checkFlag (MPJ LEFT JOIN) ==================== + + @Test + public void testSelectPage_checkFlagTrue() { + Long routeId = 10L; + Long processId1 = 100L; + Long processId2 = 200L; + + MesProTaskDO task1 = createTaskPojo(o -> { + o.setRouteId(routeId); + o.setProcessId(processId1); + o.setStatus(0); + }); + MesProTaskDO task2 = createTaskPojo(o -> { + o.setRouteId(routeId); + o.setProcessId(processId2); + o.setStatus(0); + }); + taskMapper.insert(task1); + taskMapper.insert(task2); + + routeProcessMapper.insert(randomPojo(MesProRouteProcessDO.class, o -> { + o.setRouteId(routeId); + o.setProcessId(processId1); + o.setCheckFlag(true); + })); + routeProcessMapper.insert(randomPojo(MesProRouteProcessDO.class, o -> { + o.setRouteId(routeId); + o.setProcessId(processId2); + o.setCheckFlag(false); + })); + + // 查询:checkFlag = true,只返回 task1 + MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); + reqVO.setCheckFlag(true); + PageResult result = taskMapper.selectPage(reqVO); + + assertEquals(1, result.getTotal()); + assertPojoEquals(task1, result.getList().get(0)); + } + + @Test + public void testSelectPage_checkFlagFalse() { + Long routeId = 20L; + Long processId1 = 300L; + Long processId2 = 400L; + + MesProTaskDO task1 = createTaskPojo(o -> { + o.setRouteId(routeId); + o.setProcessId(processId1); + o.setStatus(0); + }); + MesProTaskDO task2 = createTaskPojo(o -> { + o.setRouteId(routeId); + o.setProcessId(processId2); + o.setStatus(0); + }); + taskMapper.insert(task1); + taskMapper.insert(task2); + + routeProcessMapper.insert(randomPojo(MesProRouteProcessDO.class, o -> { + o.setRouteId(routeId); + o.setProcessId(processId1); + o.setCheckFlag(true); + })); + routeProcessMapper.insert(randomPojo(MesProRouteProcessDO.class, o -> { + o.setRouteId(routeId); + o.setProcessId(processId2); + o.setCheckFlag(false); + })); + + // 查询:checkFlag = false,只返回 task2 + MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); + reqVO.setCheckFlag(false); + PageResult result = taskMapper.selectPage(reqVO); + + assertEquals(1, result.getTotal()); + assertPojoEquals(task2, result.getList().get(0)); + } + + @Test + public void testSelectPage_checkFlagWithOtherFilter() { + Long routeId = 30L; + Long processId = 500L; + + MesProTaskDO taskMatch = createTaskPojo(o -> { + o.setRouteId(routeId); + o.setProcessId(processId); + o.setCode("PT-MATCH-001"); + o.setStatus(0); + }); + MesProTaskDO taskNoMatch = createTaskPojo(o -> { + o.setRouteId(routeId); + o.setProcessId(processId); + o.setCode("OTHER-CODE"); + o.setStatus(0); + }); + taskMapper.insert(taskMatch); + taskMapper.insert(taskNoMatch); + + routeProcessMapper.insert(randomPojo(MesProRouteProcessDO.class, o -> { + o.setRouteId(routeId); + o.setProcessId(processId); + o.setCheckFlag(true); + })); + + // 查询:checkFlag=true 且 code like 'PT-MATCH' + MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); + reqVO.setCheckFlag(true); + reqVO.setCode("PT-MATCH"); + PageResult result = taskMapper.selectPage(reqVO); + + assertEquals(1, result.getTotal()); + assertPojoEquals(taskMatch, result.getList().get(0)); + } + + @Test + public void testSelectPage_checkFlagNull_noJoin() { + Long routeId = 40L; + Long processId = 600L; + + MesProTaskDO task = createTaskPojo(o -> { + o.setRouteId(routeId); + o.setProcessId(processId); + o.setStatus(0); + }); + taskMapper.insert(task); + + MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); + PageResult result = taskMapper.selectPage(reqVO); + + assertEquals(1, result.getTotal()); + assertPojoEquals(task, result.getList().get(0)); + } + +} diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productsales/MesWmProductSalesDetailMapperTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productsales/MesWmProductSalesDetailMapperTest.java new file mode 100644 index 000000000..bd080ad66 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productsales/MesWmProductSalesDetailMapperTest.java @@ -0,0 +1,220 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDetailDO; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.List; +import java.util.function.Consumer; + +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link MesWmProductSalesDetailMapper} 的单元测试 + *

+ * 覆盖:selectListByLineId、selectListBySalesId、deleteByLineId、deleteBySalesId + */ +public class MesWmProductSalesDetailMapperTest extends BaseDbUnitTest { + + @Resource + private MesWmProductSalesDetailMapper detailMapper; + + // ==================== 辅助方法 ==================== + + /** + * 创建明细 DO,固定 BigDecimal 精度为 2 位,避免 H2 decimal(14,2) 精度不匹配 + */ + private MesWmProductSalesDetailDO createDetailPojo(Consumer consumer) { + return randomPojo(MesWmProductSalesDetailDO.class, o -> { + o.setQuantity(new BigDecimal("10.00")); + consumer.accept(o); + }); + } + + // ==================== selectListByLineId ==================== + + @Test + public void testSelectListByLineId_match() { + Long lineId = 100L; + MesWmProductSalesDetailDO match = createDetailPojo(o -> { + o.setLineId(lineId); + o.setSalesId(1L); + }); + detailMapper.insert(match); + // 插入另一条不同 lineId 的记录,不应被返回 + detailMapper.insert(cloneIgnoreId(match, o -> o.setLineId(999L))); + + List result = detailMapper.selectListByLineId(lineId); + + assertEquals(1, result.size()); + assertPojoEquals(match, result.get(0)); + } + + @Test + public void testSelectListByLineId_multipleRows() { + Long lineId = 200L; + MesWmProductSalesDetailDO detail1 = createDetailPojo(o -> { + o.setLineId(lineId); + o.setSalesId(2L); + }); + MesWmProductSalesDetailDO detail2 = createDetailPojo(o -> { + o.setLineId(lineId); + o.setSalesId(2L); + }); + detailMapper.insert(detail1); + detailMapper.insert(detail2); + + List result = detailMapper.selectListByLineId(lineId); + + assertEquals(2, result.size()); + } + + @Test + public void testSelectListByLineId_noMatch() { + MesWmProductSalesDetailDO detail = createDetailPojo(o -> { + o.setLineId(300L); + o.setSalesId(3L); + }); + detailMapper.insert(detail); + + List result = detailMapper.selectListByLineId(999L); + + assertTrue(result.isEmpty()); + } + + // ==================== selectListBySalesId ==================== + + @Test + public void testSelectListBySalesId_match() { + Long salesId = 10L; + MesWmProductSalesDetailDO match = createDetailPojo(o -> { + o.setSalesId(salesId); + o.setLineId(1L); + }); + detailMapper.insert(match); + // 插入另一条不同 salesId 的记录 + detailMapper.insert(cloneIgnoreId(match, o -> o.setSalesId(888L))); + + List result = detailMapper.selectListBySalesId(salesId); + + assertEquals(1, result.size()); + assertPojoEquals(match, result.get(0)); + } + + @Test + public void testSelectListBySalesId_multipleRows() { + Long salesId = 20L; + MesWmProductSalesDetailDO detail1 = createDetailPojo(o -> { + o.setSalesId(salesId); + o.setLineId(11L); + }); + MesWmProductSalesDetailDO detail2 = createDetailPojo(o -> { + o.setSalesId(salesId); + o.setLineId(12L); + }); + detailMapper.insert(detail1); + detailMapper.insert(detail2); + + List result = detailMapper.selectListBySalesId(salesId); + + assertEquals(2, result.size()); + } + + @Test + public void testSelectListBySalesId_noMatch() { + MesWmProductSalesDetailDO detail = createDetailPojo(o -> { + o.setSalesId(30L); + o.setLineId(2L); + }); + detailMapper.insert(detail); + + List result = detailMapper.selectListBySalesId(9999L); + + assertTrue(result.isEmpty()); + } + + // ==================== deleteByLineId ==================== + + @Test + public void testDeleteByLineId_deletesOnlyTargetLine() { + Long lineId = 400L; + MesWmProductSalesDetailDO toDelete = createDetailPojo(o -> { + o.setLineId(lineId); + o.setSalesId(4L); + }); + MesWmProductSalesDetailDO toKeep = createDetailPojo(o -> { + o.setLineId(500L); + o.setSalesId(4L); + }); + detailMapper.insert(toDelete); + detailMapper.insert(toKeep); + + detailMapper.deleteByLineId(lineId); + + // lineId=400 的记录已被逻辑删除 + List deletedResult = detailMapper.selectListByLineId(lineId); + assertTrue(deletedResult.isEmpty(), "lineId=400 的记录应被删除"); + + // lineId=500 的记录保留 + List keptResult = detailMapper.selectListByLineId(500L); + assertEquals(1, keptResult.size()); + } + + @Test + public void testDeleteByLineId_multipleRows() { + Long lineId = 600L; + detailMapper.insert(createDetailPojo(o -> { o.setLineId(lineId); o.setSalesId(5L); })); + detailMapper.insert(createDetailPojo(o -> { o.setLineId(lineId); o.setSalesId(5L); })); + + detailMapper.deleteByLineId(lineId); + + List result = detailMapper.selectListByLineId(lineId); + assertTrue(result.isEmpty(), "同 lineId 下的所有记录均应被删除"); + } + + // ==================== deleteBySalesId ==================== + + @Test + public void testDeleteBySalesId_deletesOnlyTargetSales() { + Long salesId = 700L; + MesWmProductSalesDetailDO toDelete = createDetailPojo(o -> { + o.setSalesId(salesId); + o.setLineId(6L); + }); + MesWmProductSalesDetailDO toKeep = createDetailPojo(o -> { + o.setSalesId(800L); + o.setLineId(7L); + }); + detailMapper.insert(toDelete); + detailMapper.insert(toKeep); + + detailMapper.deleteBySalesId(salesId); + + // salesId=700 的记录已被逻辑删除 + List deletedResult = detailMapper.selectListBySalesId(salesId); + assertTrue(deletedResult.isEmpty(), "salesId=700 的记录应被删除"); + + // salesId=800 的记录保留 + List keptResult = detailMapper.selectListBySalesId(800L); + assertEquals(1, keptResult.size()); + } + + @Test + public void testDeleteBySalesId_multipleRows() { + Long salesId = 900L; + detailMapper.insert(createDetailPojo(o -> { o.setSalesId(salesId); o.setLineId(8L); })); + detailMapper.insert(createDetailPojo(o -> { o.setSalesId(salesId); o.setLineId(9L); })); + detailMapper.insert(createDetailPojo(o -> { o.setSalesId(salesId); o.setLineId(10L); })); + + detailMapper.deleteBySalesId(salesId); + + List result = detailMapper.selectListBySalesId(salesId); + assertTrue(result.isEmpty(), "同 salesId 下的所有记录均应被删除"); + } + +} diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/cal/plan/MesCalPlanServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/cal/plan/MesCalPlanServiceImplTest.java new file mode 100644 index 000000000..9f0016e99 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/cal/plan/MesCalPlanServiceImplTest.java @@ -0,0 +1,119 @@ +package cn.iocoder.yudao.module.mes.service.cal.plan; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.mes.controller.admin.cal.plan.vo.MesCalPlanSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.plan.MesCalPlanDO; +import cn.iocoder.yudao.module.mes.dal.mysql.cal.plan.MesCalPlanMapper; +import cn.iocoder.yudao.module.mes.enums.cal.MesCalPlanStatusEnum; +import cn.iocoder.yudao.module.mes.enums.cal.MesCalShiftMethodEnum; +import cn.iocoder.yudao.module.mes.enums.cal.MesCalShiftTypeEnum; +import cn.iocoder.yudao.module.mes.service.cal.team.MesCalTeamShiftService; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import jakarta.annotation.Resource; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link MesCalPlanServiceImpl} 的单元测试 + * + * @author 芋道源码 + */ +@Import(MesCalPlanServiceImpl.class) +public class MesCalPlanServiceImplTest extends BaseDbUnitTest { + + @Resource + private MesCalPlanServiceImpl planService; + + @Resource + private MesCalPlanMapper planMapper; + + @MockitoBean + private MesCalPlanShiftService planShiftService; + @MockitoBean + private MesCalPlanTeamService planTeamService; + @MockitoBean + private MesCalTeamShiftService teamShiftService; + + @Test + public void testCreatePlan_singleShift_addDefaultShift() { + // 准备参数 + MesCalPlanSaveReqVO reqVO = new MesCalPlanSaveReqVO(); + reqVO.setCode("PLAN-SINGLE-001"); + reqVO.setName("单白班默认班次"); + reqVO.setCalendarType(1); + reqVO.setStartDate(LocalDateTime.of(2026, 4, 1, 0, 0)); + reqVO.setEndDate(LocalDateTime.of(2026, 4, 30, 0, 0)); + reqVO.setShiftType(MesCalShiftTypeEnum.SINGLE.getType()); + reqVO.setShiftMethod(MesCalShiftMethodEnum.DAY.getMethod()); + reqVO.setShiftCount(1); + + // 调用 + Long planId = planService.createPlan(reqVO); + + // 断言 1:计划状态为草稿 + MesCalPlanDO plan = planMapper.selectById(planId); + assertEquals(MesCalPlanStatusEnum.PREPARE.getStatus(), plan.getStatus()); + // 断言 2:自动生成默认班次 + verify(planShiftService).addDefaultPlanShift(planId, MesCalShiftTypeEnum.SINGLE.getType()); + } + + @Test + public void testConfirmPlan_syncGenerateTeamShiftRecords() { + // mock 数据:插入一条草稿状态的排班计划 + MesCalPlanDO plan = randomPojo(MesCalPlanDO.class, o -> { + o.setCalendarType(1); + o.setStartDate(LocalDateTime.of(2026, 4, 1, 0, 0)); + o.setEndDate(LocalDateTime.of(2026, 4, 3, 0, 0)); + o.setStatus(MesCalPlanStatusEnum.PREPARE.getStatus()); + o.setShiftType(MesCalShiftTypeEnum.SINGLE.getType()); + o.setShiftMethod(MesCalShiftMethodEnum.DAY.getMethod()); + o.setShiftCount(1); + }); + planMapper.insert(plan); + // mock 方法:班组数量满足要求 + when(planTeamService.getPlanTeamCountByPlanId(plan.getId())).thenReturn(1L); + + // 调用 + planService.confirmPlan(plan.getId()); + + // 断言 1:计划状态更新为已确认 + MesCalPlanDO updatePlan = planMapper.selectById(plan.getId()); + assertEquals(MesCalPlanStatusEnum.CONFIRMED.getStatus(), updatePlan.getStatus()); + // 断言 2:触发生成班组排班记录 + verify(teamShiftService).generateTeamShiftRecords(plan.getId()); + } + + @Test + public void testDeletePlan_notCascadeDeleteTeamShift() { + // mock 数据:插入一条草稿状态的排班计划 + MesCalPlanDO plan = randomPojo(MesCalPlanDO.class, o -> { + o.setCalendarType(1); + o.setStartDate(LocalDateTime.of(2026, 4, 1, 0, 0)); + o.setEndDate(LocalDateTime.of(2026, 4, 3, 0, 0)); + o.setStatus(MesCalPlanStatusEnum.PREPARE.getStatus()); + o.setShiftType(MesCalShiftTypeEnum.SINGLE.getType()); + o.setShiftMethod(MesCalShiftMethodEnum.DAY.getMethod()); + o.setShiftCount(1); + }); + planMapper.insert(plan); + + // 调用 + planService.deletePlan(plan.getId()); + + // 断言 1:计划被删除 + assertNull(planMapper.selectById(plan.getId())); + // 断言 2:级联删除班次和班组关联 + verify(planShiftService).deletePlanShiftByPlanId(plan.getId()); + verify(planTeamService).deleteByPlanId(plan.getId()); + // 断言 3:不级联删除班组排班记录 + verify(teamShiftService, never()).deleteByPlanId(plan.getId()); + } + +} diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/cal/plan/MesCalPlanShiftServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/cal/plan/MesCalPlanShiftServiceImplTest.java new file mode 100644 index 000000000..da31e70f6 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/cal/plan/MesCalPlanShiftServiceImplTest.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.mes.service.cal.plan; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.plan.MesCalPlanShiftDO; +import cn.iocoder.yudao.module.mes.dal.mysql.cal.plan.MesCalPlanShiftMapper; +import cn.iocoder.yudao.module.mes.enums.cal.MesCalShiftTypeEnum; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import jakarta.annotation.Resource; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link MesCalPlanShiftServiceImpl} 的单元测试 + * + * @author 芋道源码 + */ +@Import(MesCalPlanShiftServiceImpl.class) +public class MesCalPlanShiftServiceImplTest extends BaseDbUnitTest { + + @Resource + private MesCalPlanShiftServiceImpl planShiftService; + + @Resource + private MesCalPlanShiftMapper planShiftMapper; + + @MockitoBean + private MesCalPlanService planService; + + @Test + public void testAddDefaultPlanShift_singleShift_use18Clock() { + // 准备参数 + Long planId = 1001L; + + // 调用 + planShiftService.addDefaultPlanShift(planId, MesCalShiftTypeEnum.SINGLE.getType()); + + // 断言:生成 1 条默认班次(白班 08:00~18:00) + List shifts = planShiftMapper.selectListByPlanId(planId); + assertEquals(1, shifts.size()); + MesCalPlanShiftDO shift = shifts.get(0); + assertEquals(planId, shift.getPlanId()); + assertEquals(1, shift.getSort()); + assertEquals("白班", shift.getName()); + assertEquals("08:00", shift.getStartTime()); + assertEquals("18:00", shift.getEndTime()); + } + +} diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftServiceImplTest.java new file mode 100644 index 000000000..9f89dd075 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftServiceImplTest.java @@ -0,0 +1,108 @@ +package cn.iocoder.yudao.module.mes.service.cal.team; + +import cn.hutool.core.collection.ListUtil; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.plan.MesCalPlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.plan.MesCalPlanShiftDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.plan.MesCalPlanTeamDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.team.MesCalTeamShiftDO; +import cn.iocoder.yudao.module.mes.dal.mysql.cal.team.MesCalTeamShiftMapper; +import cn.iocoder.yudao.module.mes.enums.cal.MesCalShiftMethodEnum; +import cn.iocoder.yudao.module.mes.enums.cal.MesCalShiftTypeEnum; +import cn.iocoder.yudao.module.mes.service.cal.plan.MesCalPlanService; +import cn.iocoder.yudao.module.mes.service.cal.plan.MesCalPlanShiftService; +import cn.iocoder.yudao.module.mes.service.cal.plan.MesCalPlanTeamService; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import jakarta.annotation.Resource; + +import java.time.LocalDateTime; +import java.util.Comparator; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link MesCalTeamShiftServiceImpl} 的单元测试 + * + * @author 芋道源码 + */ +@Import(MesCalTeamShiftServiceImpl.class) +public class MesCalTeamShiftServiceImplTest extends BaseDbUnitTest { + + @Resource + private MesCalTeamShiftServiceImpl teamShiftService; + + @Resource + private MesCalTeamShiftMapper teamShiftMapper; + + @MockitoBean + private MesCalPlanService planService; + @MockitoBean + private MesCalPlanShiftService planShiftService; + @MockitoBean + private MesCalPlanTeamService planTeamService; + + @Test + public void testGenerateTeamShiftRecords_threeShift_rotateThreeStates() { + // 准备参数 + Long planId = 3001L; + // mock 方法:排班计划(三班倒、按天轮班、3 天) + MesCalPlanDO plan = MesCalPlanDO.builder() + .id(planId) + .code("PLAN-THREE-001") + .name("三班倒轮转") + .calendarType(1) + .startDate(LocalDateTime.of(2026, 4, 1, 0, 0)) + .endDate(LocalDateTime.of(2026, 4, 3, 0, 0)) + .shiftType(MesCalShiftTypeEnum.THREE.getType()) + .shiftMethod(MesCalShiftMethodEnum.DAY.getMethod()) + .shiftCount(1) + .build(); + List shifts = ListUtil.of( + MesCalPlanShiftDO.builder().id(11L).planId(planId).sort(1).name("白班").startTime("08:00").endTime("16:00").build(), + MesCalPlanShiftDO.builder().id(12L).planId(planId).sort(2).name("中班").startTime("16:00").endTime("00:00").build(), + MesCalPlanShiftDO.builder().id(13L).planId(planId).sort(3).name("夜班").startTime("00:00").endTime("08:00").build() + ); + List teams = ListUtil.of( + MesCalPlanTeamDO.builder().id(21L).planId(planId).teamId(101L).build(), + MesCalPlanTeamDO.builder().id(22L).planId(planId).teamId(102L).build(), + MesCalPlanTeamDO.builder().id(23L).planId(planId).teamId(103L).build() + ); + when(planService.getPlan(planId)).thenReturn(plan); + when(planShiftService.getPlanShiftListByPlanId(planId)).thenReturn(shifts); + when(planTeamService.getPlanTeamListByPlanId(planId)).thenReturn(teams); + + // 调用 + teamShiftService.generateTeamShiftRecords(planId); + + // 断言:3 天 × 3 班次 = 9 条排班记录,班组按天轮转 + List records = teamShiftMapper.selectListByPlanId(planId); + records.sort(Comparator.comparing(MesCalTeamShiftDO::getDay).thenComparing(MesCalTeamShiftDO::getSort)); + assertEquals(9, records.size()); + // 断言:第 1 天(shiftIndex=0):A 白班、B 中班、C 夜班 + assertRecord(records.get(0), LocalDateTime.of(2026, 4, 1, 0, 0), 1, 101L, 11L); + assertRecord(records.get(1), LocalDateTime.of(2026, 4, 1, 0, 0), 2, 102L, 12L); + assertRecord(records.get(2), LocalDateTime.of(2026, 4, 1, 0, 0), 3, 103L, 13L); + // 断言:第 2 天(shiftIndex=1):C 白班、A 中班、B 夜班 + assertRecord(records.get(3), LocalDateTime.of(2026, 4, 2, 0, 0), 1, 103L, 11L); + assertRecord(records.get(4), LocalDateTime.of(2026, 4, 2, 0, 0), 2, 101L, 12L); + assertRecord(records.get(5), LocalDateTime.of(2026, 4, 2, 0, 0), 3, 102L, 13L); + // 断言:第 3 天(shiftIndex=2):B 白班、C 中班、A 夜班 + assertRecord(records.get(6), LocalDateTime.of(2026, 4, 3, 0, 0), 1, 102L, 11L); + assertRecord(records.get(7), LocalDateTime.of(2026, 4, 3, 0, 0), 2, 103L, 12L); + assertRecord(records.get(8), LocalDateTime.of(2026, 4, 3, 0, 0), 3, 101L, 13L); + } + + private static void assertRecord(MesCalTeamShiftDO actual, LocalDateTime day, Integer sort, + Long teamId, Long shiftId) { + assertEquals(day, actual.getDay()); + assertEquals(sort, actual.getSort()); + assertEquals(teamId, actual.getTeamId()); + assertEquals(shiftId, actual.getShiftId()); + } + +} diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java index 89ba3aa05..ee01f7da2 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.mes.service.pro.feedback; import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper; import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum; @@ -23,8 +25,7 @@ import java.math.BigDecimal; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; /** @@ -61,6 +62,7 @@ public class MesProFeedbackServiceImplTest extends BaseDbUnitTest { // 准备数据:插入一条待检验状态的报工单 Long taskId = randomLongId(); Long workOrderId = randomLongId(); + Long sourceLineId = randomLongId(); MesProFeedbackDO feedback = randomPojo(MesProFeedbackDO.class, o -> { o.setStatus(MesProFeedbackStatusEnum.UNCHECK.getStatus()); o.setTaskId(taskId); @@ -87,13 +89,12 @@ public class MesProFeedbackServiceImplTest extends BaseDbUnitTest { BigDecimal laborScrapQty = BigDecimal.valueOf(5); BigDecimal materialScrapQty = BigDecimal.valueOf(10); BigDecimal otherScrapQty = BigDecimal.valueOf(5); - - feedbackService.updateProFeedbackWhenIpqcFinish(feedback.getId(), + feedbackService.updateProFeedbackWhenIpqcFinish(feedback.getId(), sourceLineId, qualifiedQty, unqualifiedQty, laborScrapQty, materialScrapQty, otherScrapQty); // 断言 1:调用了 splitPendingAndFinishProduce verify(productProduceService).splitPendingAndFinishProduce( - eq(feedback.getId()), eq(qualifiedQty), eq(unqualifiedQty)); + eq(feedback.getId()), eq(sourceLineId), eq(qualifiedQty), eq(unqualifiedQty)); // 断言 2:报工单状态更新为已完成 MesProFeedbackDO updatedFeedback = feedbackMapper.selectById(feedback.getId()); @@ -137,7 +138,7 @@ public class MesProFeedbackServiceImplTest extends BaseDbUnitTest { .thenReturn(ListUtil.of(qualifiedLine)); // 调用 - feedbackService.updateProFeedbackWhenIpqcFinish(feedback.getId(), + feedbackService.updateProFeedbackWhenIpqcFinish(feedback.getId(), randomLongId(), BigDecimal.valueOf(50), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); @@ -156,7 +157,7 @@ public class MesProFeedbackServiceImplTest extends BaseDbUnitTest { // 调用不存在的 feedbackId,应该抛异常 Long feedbackId = randomLongId(); assertThrows(Exception.class, () -> - feedbackService.updateProFeedbackWhenIpqcFinish(feedbackId, + feedbackService.updateProFeedbackWhenIpqcFinish(feedbackId, randomLongId(), BigDecimal.TEN, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO)); } @@ -171,12 +172,12 @@ public class MesProFeedbackServiceImplTest extends BaseDbUnitTest { // 调用,应该抛异常 assertThrows(Exception.class, () -> - feedbackService.updateProFeedbackWhenIpqcFinish(feedback.getId(), + feedbackService.updateProFeedbackWhenIpqcFinish(feedback.getId(), randomLongId(), BigDecimal.TEN, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO)); // 断言:不应该调用任何产出单方法 - verify(productProduceService, never()).splitPendingAndFinishProduce(anyLong(), any(), any()); + verify(productProduceService, never()).splitPendingAndFinishProduce(anyLong(), anyLong(), any(), any()); } @Test @@ -189,9 +190,208 @@ public class MesProFeedbackServiceImplTest extends BaseDbUnitTest { // 调用,应该抛异常 assertThrows(Exception.class, () -> - feedbackService.updateProFeedbackWhenIpqcFinish(feedback.getId(), + feedbackService.updateProFeedbackWhenIpqcFinish(feedback.getId(), randomLongId(), BigDecimal.TEN, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO)); } + // ==================== approveFeedback 测试 ==================== + + @Test + public void testApproveFeedback_keyNonCheck_success() { + // 准备数据:关键非质检工序,常规审批 + Long routeId = randomLongId(); + Long processId = randomLongId(); + MesProFeedbackDO feedback = randomPojo(MesProFeedbackDO.class, o -> { + o.setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus()); + o.setFeedbackQuantity(BigDecimal.valueOf(100)); + o.setQualifiedQuantity(BigDecimal.valueOf(80)); + o.setUnqualifiedQuantity(BigDecimal.valueOf(20)); + o.setUncheckQuantity(BigDecimal.ZERO); + o.setRouteId(routeId); + o.setProcessId(processId); + }); + feedbackMapper.insert(feedback); + + // mock: 工序配置 key=true, check=false + MesProRouteProcessDO routeProcess = MesProRouteProcessDO.builder() + .routeId(routeId).processId(processId) + .keyFlag(true).checkFlag(false).build(); + when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId)) + .thenReturn(routeProcess); + + // mock: 产品产出单 + MesWmProductProduceDO produce = randomPojo(MesWmProductProduceDO.class); + when(productProduceService.generateProductProduce(any(), eq(false))).thenReturn(produce); + + // mock: 产出行(用于 updateTaskAndWorkOrderByFeedback) + MesWmProductProduceLineDO qualifiedLine = MesWmProductProduceLineDO.builder() + .quantity(BigDecimal.valueOf(80)) + .qualityStatus(MesWmQualityStatusEnum.PASS.getStatus()).build(); + when(produceLineService.getProductProduceLineListByFeedbackId(feedback.getId())) + .thenReturn(ListUtil.of(qualifiedLine)); + + // 调用 + boolean result = feedbackService.approveFeedback(feedback.getId()); + + // 断言 1:返回 true(已完成) + assertTrue(result); + + // 断言 2:状态为已完成,uncheckQuantity 清零 + MesProFeedbackDO updated = feedbackMapper.selectById(feedback.getId()); + assertEquals(MesProFeedbackStatusEnum.FINISHED.getStatus(), updated.getStatus()); + assertEquals(0, BigDecimal.ZERO.compareTo(updated.getUncheckQuantity())); + + // 断言 3:调用了产出单生成 + 入库 + 任务/工单更新 + verify(productProduceService).generateProductProduce(any(), eq(false)); + verify(productProduceService).finishProductProduce(produce.getId()); + verify(taskService).updateProducedQuantity(eq(feedback.getTaskId()), + any(BigDecimal.class), any(BigDecimal.class), any(BigDecimal.class)); + verify(workOrderService).updateProducedQuantity(eq(feedback.getWorkOrderId()), + any(BigDecimal.class)); + } + + @Test + public void testApproveFeedback_keyCheck_enterUncheck() { + // 准备数据:关键质检工序,应进入待检验 + Long routeId = randomLongId(); + Long processId = randomLongId(); + MesProFeedbackDO feedback = randomPojo(MesProFeedbackDO.class, o -> { + o.setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus()); + o.setFeedbackQuantity(BigDecimal.valueOf(50)); + o.setUncheckQuantity(BigDecimal.valueOf(50)); // 质检工序 uncheckQuantity > 0 + o.setRouteId(routeId); + o.setProcessId(processId); + }); + feedbackMapper.insert(feedback); + + // mock: key=true, check=true + MesProRouteProcessDO routeProcess = MesProRouteProcessDO.builder() + .routeId(routeId).processId(processId) + .keyFlag(true).checkFlag(true).build(); + when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId)) + .thenReturn(routeProcess); + + // 调用 + boolean result = feedbackService.approveFeedback(feedback.getId()); + + // 断言 1:返回 false(待检验) + assertFalse(result); + + // 断言 2:状态为待检验 + MesProFeedbackDO updated = feedbackMapper.selectById(feedback.getId()); + assertEquals(MesProFeedbackStatusEnum.UNCHECK.getStatus(), updated.getStatus()); + + // 断言 3:生成了待检产出单,但没有 finishProductProduce + verify(productProduceService).generateProductProduce(any(), eq(true)); + verify(productProduceService, never()).finishProductProduce(anyLong()); + + // 断言 4:没有更新任务/工单数量(等 IPQC 回调) + verify(taskService, never()).updateProducedQuantity(anyLong(), any(), any(), any()); + verify(workOrderService, never()).updateProducedQuantity(anyLong(), any()); + } + + @Test + public void testApproveFeedback_nonKey_directFinish() { + // 准备数据:非关键工序,直接完结 + Long routeId = randomLongId(); + Long processId = randomLongId(); + MesProFeedbackDO feedback = randomPojo(MesProFeedbackDO.class, o -> { + o.setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus()); + o.setFeedbackQuantity(BigDecimal.valueOf(30)); + o.setUncheckQuantity(BigDecimal.ZERO); + o.setRouteId(routeId); + o.setProcessId(processId); + }); + feedbackMapper.insert(feedback); + + // mock: key=false, check=false + MesProRouteProcessDO routeProcess = MesProRouteProcessDO.builder() + .routeId(routeId).processId(processId) + .keyFlag(false).checkFlag(false).build(); + when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId)) + .thenReturn(routeProcess); + + // 调用 + boolean result = feedbackService.approveFeedback(feedback.getId()); + + // 断言 1:返回 true(已完成) + assertTrue(result); + + // 断言 2:状态为已完成 + MesProFeedbackDO updated = feedbackMapper.selectById(feedback.getId()); + assertEquals(MesProFeedbackStatusEnum.FINISHED.getStatus(), updated.getStatus()); + + // 断言 3:不生成产出单,不更新任务/工单 + verify(productProduceService, never()).generateProductProduce(any(), anyBoolean()); + verify(taskService, never()).updateProducedQuantity(anyLong(), any(), any(), any()); + } + + @Test + public void testApproveFeedback_nonCheck_uncheckQuantityReject() { + // 准备数据:非质检工序,但 uncheckQuantity > 0(异常数据),应被拦截 + Long routeId = randomLongId(); + Long processId = randomLongId(); + MesProFeedbackDO feedback = randomPojo(MesProFeedbackDO.class, o -> { + o.setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus()); + o.setFeedbackQuantity(BigDecimal.valueOf(10)); + o.setUncheckQuantity(BigDecimal.valueOf(10)); // 非质检工序不应有待检数量 + o.setRouteId(routeId); + o.setProcessId(processId); + }); + feedbackMapper.insert(feedback); + + // mock: key=true, check=false(非质检) + MesProRouteProcessDO routeProcess = MesProRouteProcessDO.builder() + .routeId(routeId).processId(processId) + .keyFlag(true).checkFlag(false).build(); + when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId)) + .thenReturn(routeProcess); + + // 调用,应该抛异常 + assertThrows(Exception.class, () -> + feedbackService.approveFeedback(feedback.getId())); + + // 断言:不应该执行任何后续操作 + verify(productProduceService, never()).generateProductProduce(any(), anyBoolean()); + verify(itemConsumeService, never()).generateItemConsume(any()); + } + + @Test + public void testApproveFeedback_nonKeyCheck_directFinishAndCleanUncheck() { + // 准备数据:非关键 + 质检工序(!key+check),uncheckQuantity > 0 + // 应放行(checkFlag=true 不拦截 uncheckQuantity),直接完结并清零 uncheckQuantity + Long routeId = randomLongId(); + Long processId = randomLongId(); + MesProFeedbackDO feedback = randomPojo(MesProFeedbackDO.class, o -> { + o.setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus()); + o.setFeedbackQuantity(BigDecimal.valueOf(20)); + o.setUncheckQuantity(BigDecimal.valueOf(20)); + o.setRouteId(routeId); + o.setProcessId(processId); + }); + feedbackMapper.insert(feedback); + + // mock: key=false, check=true + MesProRouteProcessDO routeProcess = MesProRouteProcessDO.builder() + .routeId(routeId).processId(processId) + .keyFlag(false).checkFlag(true).build(); + when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId)) + .thenReturn(routeProcess); + + // 调用 + boolean result = feedbackService.approveFeedback(feedback.getId()); + + // 断言 1:返回 true(直接完成,不走 UNCHECK) + assertTrue(result); + + // 断言 2:状态为已完成,uncheckQuantity 被清零 + MesProFeedbackDO updated = feedbackMapper.selectById(feedback.getId()); + assertEquals(MesProFeedbackStatusEnum.FINISHED.getStatus(), updated.getStatus()); + assertEquals(0, BigDecimal.ZERO.compareTo(updated.getUncheckQuantity())); + + // 断言 3:非关键工序不生成产出单 + verify(productProduceService, never()).generateProductProduce(any(), anyBoolean()); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImplTest.java new file mode 100644 index 000000000..008a90d0a --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImplTest.java @@ -0,0 +1,288 @@ +package cn.iocoder.yudao.module.mes.service.qc.indicatorresult; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.map.MapUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO; +import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcIndicatorResultMapper; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcResultValueTypeEnum; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; +import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; +import cn.iocoder.yudao.module.mes.service.qc.ipqc.MesQcIpqcService; +import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService; +import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcService; +import cn.iocoder.yudao.module.mes.service.qc.rqc.MesQcRqcService; +import cn.iocoder.yudao.module.system.api.dict.DictDataApi; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anySet; +import static org.mockito.Mockito.*; + +/** + * {@link MesQcIndicatorResultServiceImpl} 的单元测试 + * + * @author 芋道源码 + */ +@Import(MesQcIndicatorResultServiceImpl.class) +public class MesQcIndicatorResultServiceImplTest extends BaseDbUnitTest { + + @Resource + private MesQcIndicatorResultServiceImpl indicatorResultService; + + @Resource + private MesQcIndicatorResultMapper resultMapper; + + @MockitoBean + private MesQcIndicatorResultDetailService resultDetailService; + @MockitoBean + private MesQcIndicatorService indicatorService; + @MockitoBean + private MesQcIqcService iqcService; + @MockitoBean + private MesQcIpqcService ipqcService; + @MockitoBean + private MesQcOqcService oqcService; + @MockitoBean + private MesQcRqcService rqcService; + @MockitoBean + private DictDataApi dictDataApi; + + @Test + public void testCreateIndicatorResult_success() { + // 准备参数 + MesQcIndicatorResultSaveReqVO reqVO = buildReqVO("plain text value", MesQcResultValueTypeEnum.TEXT.getType()); + // mock 方法 + mockIqcAndIndicator(reqVO, MesQcResultValueTypeEnum.TEXT.getType()); + + // 调用 + Long resultId = indicatorResultService.createIndicatorResult(reqVO); + + // 断言 + assertNotNull(resultId); + MesQcIndicatorResultDO dbResult = resultMapper.selectById(resultId); + assertNotNull(dbResult); + assertEquals(reqVO.getCode(), dbResult.getCode()); + assertEquals(reqVO.getQcId(), dbResult.getQcId()); + assertEquals(reqVO.getQcType(), dbResult.getQcType()); + assertEquals(100L, dbResult.getItemId()); // 从 mock IQC 获取 + verify(resultDetailService).createDetailList(anyList()); + } + + @Test + public void testCreateIndicatorResult_fileValueInvalid() { + // 准备参数 + MesQcIndicatorResultSaveReqVO reqVO = buildReqVO("not-a-url", MesQcResultValueTypeEnum.FILE.getType()); + // mock 方法 + mockIqcAndIndicator(reqVO, MesQcResultValueTypeEnum.FILE.getType()); + + // 调用,并断言异常 + assertServiceException(() -> indicatorResultService.createIndicatorResult(reqVO), + QC_RESULT_VALUE_FORMAT_INVALID, "检测项[检测项A]要求文件 URL,实际值=not-a-url"); + + // 断言:未入库 + assertEquals(0, resultMapper.selectCount()); + verify(resultDetailService, never()).createDetailList(anyList()); + } + + @Test + public void testUpdateIndicatorResult_success() { + // mock 数据 + MesQcIndicatorResultDO dbResult = randomPojo(MesQcIndicatorResultDO.class, o -> { + o.setQcType(MesQcTypeEnum.IQC.getType()); + }); + resultMapper.insert(dbResult); + // 准备参数 + MesQcIndicatorResultSaveReqVO reqVO = buildReqVO("updated text", MesQcResultValueTypeEnum.TEXT.getType()); + reqVO.setId(dbResult.getId()); + // mock 方法 + MesQcIndicatorDO indicator = new MesQcIndicatorDO(); + indicator.setId(reqVO.getItems().get(0).getIndicatorId()); + indicator.setName("检测项A"); + indicator.setResultType(MesQcResultValueTypeEnum.TEXT.getType()); + when(indicatorService.validateIndicatorListExists(anySet())) + .thenReturn(MapUtil.of(indicator.getId(), indicator)); + + // 调用 + indicatorResultService.updateIndicatorResult(reqVO); + + // 断言 + MesQcIndicatorResultDO updatedResult = resultMapper.selectById(dbResult.getId()); + assertEquals(reqVO.getCode(), updatedResult.getCode()); + // qcId/qcType/itemId 不允许改挂,应保持原值 + assertEquals(dbResult.getQcId(), updatedResult.getQcId()); + assertEquals(dbResult.getQcType(), updatedResult.getQcType()); + assertEquals(dbResult.getItemId(), updatedResult.getItemId()); + verify(resultDetailService).createOrUpdateDetailList(anyList()); + } + + @Test + public void testUpdateIndicatorResult_notExists() { + // 准备参数 + MesQcIndicatorResultSaveReqVO reqVO = buildReqVO("text", MesQcResultValueTypeEnum.TEXT.getType()); + reqVO.setId(randomLongId()); + + // 调用,并断言异常 + assertServiceException(() -> indicatorResultService.updateIndicatorResult(reqVO), + QC_RESULT_NOT_EXISTS); + } + + @Test + public void testDeleteIndicatorResult_success() { + // mock 数据 + MesQcIndicatorResultDO dbResult = randomPojo(MesQcIndicatorResultDO.class); + resultMapper.insert(dbResult); + + // 调用 + indicatorResultService.deleteIndicatorResult(dbResult.getId()); + + // 断言 + assertNull(resultMapper.selectById(dbResult.getId())); + verify(resultDetailService).deleteDetailByResultId(dbResult.getId()); + } + + @Test + public void testDeleteIndicatorResult_notExists() { + // 调用,并断言异常 + assertServiceException(() -> indicatorResultService.deleteIndicatorResult(randomLongId()), + QC_RESULT_NOT_EXISTS); + } + + @Test + public void testGetIndicatorResult() { + // mock 数据 + MesQcIndicatorResultDO dbResult = randomPojo(MesQcIndicatorResultDO.class); + resultMapper.insert(dbResult); + + // 调用 + MesQcIndicatorResultDO result = indicatorResultService.getIndicatorResult(dbResult.getId()); + + // 断言 + assertPojoEquals(dbResult, result); + } + + @Test + public void testGetIndicatorResultPage() { + // mock 数据 + MesQcIndicatorResultDO dbResult = randomPojo(MesQcIndicatorResultDO.class, o -> { + o.setQcId(1L); + o.setQcType(MesQcTypeEnum.IQC.getType()); + o.setCode("SPL-001"); + o.setItemId(100L); + }); + resultMapper.insert(dbResult); + // 测试 qcId 不匹配 + resultMapper.insert(cloneIgnoreId(dbResult, o -> o.setQcId(2L))); + // 测试 qcType 不匹配 + resultMapper.insert(cloneIgnoreId(dbResult, o -> o.setQcType(MesQcTypeEnum.IPQC.getType()))); + // 测试 code 不匹配 + resultMapper.insert(cloneIgnoreId(dbResult, o -> o.setCode("SPL-999"))); + // 测试 itemId 不匹配 + resultMapper.insert(cloneIgnoreId(dbResult, o -> o.setItemId(999L))); + // 准备参数 + MesQcIndicatorResultPageReqVO pageReqVO = new MesQcIndicatorResultPageReqVO(); + pageReqVO.setQcId(1L); + pageReqVO.setQcType(MesQcTypeEnum.IQC.getType()); + pageReqVO.setCode("SPL-001"); + pageReqVO.setItemId(100L); + + // 调用 + PageResult pageResult = indicatorResultService.getIndicatorResultPage(pageReqVO); + + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbResult, pageResult.getList().get(0)); + } + + @Test + public void testGetIndicatorResultCountByQcIdAndType() { + // mock 数据 + MesQcIndicatorResultDO result1 = randomPojo(MesQcIndicatorResultDO.class, o -> { + o.setQcId(1L); + o.setQcType(MesQcTypeEnum.IQC.getType()); + }); + resultMapper.insert(result1); + MesQcIndicatorResultDO result2 = randomPojo(MesQcIndicatorResultDO.class, o -> { + o.setQcId(1L); + o.setQcType(MesQcTypeEnum.IQC.getType()); + }); + resultMapper.insert(result2); + // 不匹配 + resultMapper.insert(randomPojo(MesQcIndicatorResultDO.class, o -> { + o.setQcId(2L); + o.setQcType(MesQcTypeEnum.IPQC.getType()); + })); + + // 调用 + Long count = indicatorResultService.getIndicatorResultCountByQcIdAndType(1L, MesQcTypeEnum.IQC.getType()); + + // 断言 + assertEquals(2L, count); + } + + @Test + public void testValidateIndicatorResultExistsByQcIdAndType_success() { + // mock 数据 + resultMapper.insert(randomPojo(MesQcIndicatorResultDO.class, o -> { + o.setQcId(1L); + o.setQcType(MesQcTypeEnum.IQC.getType()); + })); + + // 调用(不抛异常即通过) + indicatorResultService.validateIndicatorResultExistsByQcIdAndType(1L, MesQcTypeEnum.IQC.getType()); + } + + @Test + public void testValidateIndicatorResultExistsByQcIdAndType_notExists() { + // 调用,并断言异常 + assertServiceException( + () -> indicatorResultService.validateIndicatorResultExistsByQcIdAndType(randomLongId(), MesQcTypeEnum.IQC.getType()), + QC_FINISH_INDICATOR_RESULT_REQUIRED); + } + + // ==================== 辅助方法 ==================== + + private void mockIqcAndIndicator(MesQcIndicatorResultSaveReqVO reqVO, Integer resultType) { + MesQcIqcDO iqc = new MesQcIqcDO(); + iqc.setId(reqVO.getQcId()); + iqc.setItemId(100L); + when(iqcService.validateIqcExists(reqVO.getQcId())).thenReturn(iqc); + + MesQcIndicatorDO indicator = new MesQcIndicatorDO(); + indicator.setId(reqVO.getItems().get(0).getIndicatorId()); + indicator.setName("检测项A"); + indicator.setResultType(resultType); + when(indicatorService.validateIndicatorListExists(anySet())) + .thenReturn(MapUtil.of(indicator.getId(), indicator)); + } + + private MesQcIndicatorResultSaveReqVO buildReqVO(String value, Integer resultType) { + MesQcIndicatorResultSaveReqVO.Item item = new MesQcIndicatorResultSaveReqVO.Item(); + item.setIndicatorId(10L); + item.setValue(value); + + MesQcIndicatorResultSaveReqVO reqVO = new MesQcIndicatorResultSaveReqVO(); + reqVO.setCode("SPL-001"); + reqVO.setQcId(1L); + reqVO.setQcType(MesQcTypeEnum.IQC.getType()); + reqVO.setItems(ListUtil.of(item)); + return reqVO; + } + +} diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImplTest.java index b71081fef..9d653aeec 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImplTest.java +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImplTest.java @@ -1,16 +1,32 @@ package cn.iocoder.yudao.module.mes.service.qc.ipqc; +import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.ipqc.MesQcIpqcMapper; import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; import cn.iocoder.yudao.module.mes.service.pro.feedback.MesProFeedbackService; +import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService; +import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService; +import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; +import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -21,6 +37,7 @@ import java.math.BigDecimal; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -54,11 +71,22 @@ public class MesQcIpqcServiceImplTest extends BaseDbUnitTest { private AdminUserApi adminUserApi; @MockBean private MesProFeedbackService feedbackService; + @MockitoBean + private MesProRouteProductService routeProductService; + @MockitoBean + private MesProRouteProcessService routeProcessService; + @MockitoBean + private MesProTaskService taskService; + @MockitoBean + private MesQcIndicatorResultService indicatorResultService; + @MockitoBean + private MesWmProductProduceLineService productProduceLineService; @Test public void testFinishIpqc_writeBack_feedback() { // 准备数据:插入一条草稿状态的 IPQC 单,来源为报工单(PRO_FEEDBACK=304) Long sourceDocId = randomLongId(); + Long sourceLineId = randomLongId(); BigDecimal qualifiedQty = BigDecimal.valueOf(80); BigDecimal unqualifiedQty = BigDecimal.valueOf(20); BigDecimal laborScrapQty = BigDecimal.valueOf(5); @@ -70,7 +98,7 @@ public class MesQcIpqcServiceImplTest extends BaseDbUnitTest { o.setCheckResult(1); // 非空,满足 finishIpqc 的校验 o.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK); o.setSourceDocId(sourceDocId); - o.setSourceLineId(null); // 报工场景下预留不使用 + o.setSourceLineId(sourceLineId); o.setQualifiedQuantity(qualifiedQty); o.setUnqualifiedQuantity(unqualifiedQty); o.setLaborScrapQuantity(laborScrapQty); @@ -86,10 +114,11 @@ public class MesQcIpqcServiceImplTest extends BaseDbUnitTest { MesQcIpqcDO updatedIpqc = ipqcMapper.selectById(ipqc.getId()); assertEquals(MesQcStatusEnum.FINISHED.getStatus(), updatedIpqc.getStatus()); - // 断言 2:调用了 feedbackService.completeFeedbackFromIpqc,传递正确参数 + // 断言 2:调用了 feedbackService,传递 sourceLineId // 注意:数量经过 DB 存取后 scale 可能变化(例如 80 → 80.00),所以用 any() 匹配 verify(feedbackService).updateProFeedbackWhenIpqcFinish( eq(sourceDocId), + eq(sourceLineId), any(BigDecimal.class), any(BigDecimal.class), any(BigDecimal.class), @@ -101,12 +130,13 @@ public class MesQcIpqcServiceImplTest extends BaseDbUnitTest { public void testFinishIpqc_writeBack_feedback_withNullQuantities() { // 准备数据:合格品/不合格品/废品数量为 null 的场景,应该 defaultIfNull 为 0 Long sourceDocId = randomLongId(); + Long sourceLineId = randomLongId(); MesQcIpqcDO ipqc = randomPojo(MesQcIpqcDO.class, o -> { o.setStatus(MesQcStatusEnum.DRAFT.getStatus()); o.setCheckResult(1); o.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK); o.setSourceDocId(sourceDocId); - o.setSourceLineId(null); + o.setSourceLineId(sourceLineId); o.setQualifiedQuantity(null); o.setUnqualifiedQuantity(null); o.setLaborScrapQuantity(null); @@ -121,6 +151,7 @@ public class MesQcIpqcServiceImplTest extends BaseDbUnitTest { // 断言:所有数量参数都是 BigDecimal.ZERO(defaultIfNull 处理) verify(feedbackService).updateProFeedbackWhenIpqcFinish( eq(sourceDocId), + eq(sourceLineId), eq(BigDecimal.ZERO), eq(BigDecimal.ZERO), eq(BigDecimal.ZERO), @@ -149,7 +180,7 @@ public class MesQcIpqcServiceImplTest extends BaseDbUnitTest { // 断言 2:不应该调用 feedbackService verify(feedbackService, never()).updateProFeedbackWhenIpqcFinish( - anyLong(), any(), any(), any(), any(), any()); + anyLong(), anyLong(), any(), any(), any(), any(), any()); } @Test @@ -211,4 +242,355 @@ public class MesQcIpqcServiceImplTest extends BaseDbUnitTest { assertThrows(Exception.class, () -> ipqcService.finishIpqc(ipqc.getId())); } + // ==================== processId 推导行为测试 ==================== + + /** + * 工位有工序 + 该工序在产品工艺路线中 → processId 应该被设置为工位工序 + */ + @Test + public void testCreateIpqc_processId_workstationHasProcess() { + // 准备参数 + Long workstationId = randomLongId(); + Long workOrderId = randomLongId(); + Long productId = randomLongId(); + Long processId = randomLongId(); + Long routeId = randomLongId(); + Long templateId = randomLongId(); + + MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); + reqVO.setCode("IPQC-TEST-001"); + reqVO.setWorkstationId(workstationId); + reqVO.setWorkOrderId(workOrderId); + reqVO.setInspectorUserId(randomLongId()); + + // mock 工位返回有工序 + MesMdWorkstationDO workstation = new MesMdWorkstationDO(); + workstation.setId(workstationId); + workstation.setProcessId(processId); + when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); + // mock 工单 + MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); + workOrder.setId(workOrderId); + workOrder.setProductId(productId); + when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); + when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); + // mock 模板匹配 + MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); + templateItem.setTemplateId(templateId); + when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); + // mock 工艺路线 + MesProRouteProductDO routeProduct = new MesProRouteProductDO(); + routeProduct.setRouteId(routeId); + when(routeProductService.getRouteProductByItemId(productId)).thenReturn(routeProduct); + // mock 工序在路线中 + when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId)) + .thenReturn(new MesProRouteProcessDO()); + + // 调用 + Long ipqcId = ipqcService.createIpqc(reqVO); + + // 断言:processId 应该是工位工序 + MesQcIpqcDO ipqc = ipqcMapper.selectById(ipqcId); + assertEquals(processId, ipqc.getProcessId()); + } + + /** + * 工位没有工序(processId=null)→ processId 应该留 null(不回退到任务工序) + */ + @Test + public void testCreateIpqc_processId_workstationNoProcess_shouldBeNull() { + // 准备参数 + Long workstationId = randomLongId(); + Long workOrderId = randomLongId(); + Long productId = randomLongId(); + Long taskId = randomLongId(); + Long templateId = randomLongId(); + + MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); + reqVO.setCode("IPQC-TEST-002"); + reqVO.setWorkstationId(workstationId); + reqVO.setWorkOrderId(workOrderId); + reqVO.setTaskId(taskId); // 故意传入 taskId,验证不会回退 + reqVO.setInspectorUserId(randomLongId()); + + // mock 工位没有工序 + MesMdWorkstationDO workstation = new MesMdWorkstationDO(); + workstation.setId(workstationId); + workstation.setProcessId(null); // 无工序 + when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); + // mock 工单 + MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); + workOrder.setId(workOrderId); + workOrder.setProductId(productId); + when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); + when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); + // mock 任务 + MesProTaskDO task = new MesProTaskDO(); + task.setId(taskId); + task.setWorkOrderId(workOrderId); + task.setWorkstationId(workstationId); + task.setItemId(productId); + when(taskService.validateTaskNotFinished(taskId)).thenReturn(task); + // mock 模板匹配 + MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); + templateItem.setTemplateId(templateId); + when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); + + // 调用 + Long ipqcId = ipqcService.createIpqc(reqVO); + + // 断言:processId 应该是 null,即使传入了 taskId 也不应该回退 + MesQcIpqcDO ipqc = ipqcMapper.selectById(ipqcId); + assertNull(ipqc.getProcessId(), + "工位无工序时 processId 应为 null,不应回退到任务工序"); + // 断言:不应该读取任务的 processId + verify(routeProductService, never()).getRouteProductByItemId(any()); + } + + /** + * 工位有工序但该工序不在产品工艺路线中 → processId 应该留 null + */ + @Test + public void testCreateIpqc_processId_processNotInRoute() { + // 准备参数 + Long workstationId = randomLongId(); + Long workOrderId = randomLongId(); + Long productId = randomLongId(); + Long processId = randomLongId(); + Long routeId = randomLongId(); + Long templateId = randomLongId(); + + MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); + reqVO.setCode("IPQC-TEST-003"); + reqVO.setWorkstationId(workstationId); + reqVO.setWorkOrderId(workOrderId); + reqVO.setInspectorUserId(randomLongId()); + + // mock 工位有工序 + MesMdWorkstationDO workstation = new MesMdWorkstationDO(); + workstation.setId(workstationId); + workstation.setProcessId(processId); + when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); + // mock 工单 + MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); + workOrder.setId(workOrderId); + workOrder.setProductId(productId); + when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); + when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); + // mock 模板匹配 + MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); + templateItem.setTemplateId(templateId); + when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); + // mock 工艺路线存在 + MesProRouteProductDO routeProduct = new MesProRouteProductDO(); + routeProduct.setRouteId(routeId); + when(routeProductService.getRouteProductByItemId(productId)).thenReturn(routeProduct); + // mock 工序不在路线中 + when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId)) + .thenReturn(null); + + // 调用 + Long ipqcId = ipqcService.createIpqc(reqVO); + + // 断言:processId 应该是 null + MesQcIpqcDO ipqc = ipqcMapper.selectById(ipqcId); + assertNull(ipqc.getProcessId()); + } + + // ==================== sourceLineId 校验测试 ==================== + + /** + * sourceDocType=PRO_FEEDBACK 时 sourceLineId 为空 → 创建失败 + */ + @Test + public void testCreateIpqc_sourceLineId_required() { + // 准备参数 + Long workstationId = randomLongId(); + Long workOrderId = randomLongId(); + Long productId = randomLongId(); + Long feedbackId = randomLongId(); + Long templateId = randomLongId(); + + MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); + reqVO.setCode("IPQC-SL-001"); + reqVO.setWorkstationId(workstationId); + reqVO.setWorkOrderId(workOrderId); + reqVO.setInspectorUserId(randomLongId()); + reqVO.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK); + reqVO.setSourceDocId(feedbackId); + reqVO.setSourceLineId(null); // 不传 sourceLineId + + // mock + MesMdWorkstationDO workstation = new MesMdWorkstationDO(); + workstation.setId(workstationId); + workstation.setProcessId(null); + when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); + MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); + workOrder.setId(workOrderId); + workOrder.setProductId(productId); + when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); + when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); + MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); + templateItem.setTemplateId(templateId); + when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); + when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO()); + + // 调用,断言异常 + ServiceException ex = assertThrows(ServiceException.class, () -> ipqcService.createIpqc(reqVO)); + assertEquals(QC_IPQC_SOURCE_LINE_REQUIRED.getCode(), ex.getCode()); + } + + /** + * sourceLineId 不属于该报工的产出行 → 创建失败 + */ + @Test + public void testCreateIpqc_sourceLineId_notBelong() { + // 准备参数 + Long workstationId = randomLongId(); + Long workOrderId = randomLongId(); + Long productId = randomLongId(); + Long feedbackId = randomLongId(); + Long sourceLineId = randomLongId(); + Long templateId = randomLongId(); + + MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); + reqVO.setCode("IPQC-SL-002"); + reqVO.setWorkstationId(workstationId); + reqVO.setWorkOrderId(workOrderId); + reqVO.setInspectorUserId(randomLongId()); + reqVO.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK); + reqVO.setSourceDocId(feedbackId); + reqVO.setSourceLineId(sourceLineId); + + // mock + MesMdWorkstationDO workstation = new MesMdWorkstationDO(); + workstation.setId(workstationId); + workstation.setProcessId(null); + when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); + MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); + workOrder.setId(workOrderId); + workOrder.setProductId(productId); + when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); + when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); + MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); + templateItem.setTemplateId(templateId); + when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); + when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO()); + // mock:产出行存在但 feedbackId 不匹配 + MesWmProductProduceLineDO line = new MesWmProductProduceLineDO(); + line.setId(sourceLineId); + line.setFeedbackId(randomLongId()); // 不同的 feedbackId + line.setQualityStatus(MesWmQualityStatusEnum.PENDING.getStatus()); + when(productProduceLineService.validateProductProduceLineExists(sourceLineId)).thenReturn(line); + + // 调用,断言异常 + ServiceException ex = assertThrows(ServiceException.class, () -> ipqcService.createIpqc(reqVO)); + assertEquals(QC_IPQC_SOURCE_LINE_NOT_BELONG.getCode(), ex.getCode()); + } + + /** + * sourceLineId 对应的产出行不是待检验状态 → 创建失败 + */ + @Test + public void testCreateIpqc_sourceLineId_notPending() { + // 准备参数 + Long workstationId = randomLongId(); + Long workOrderId = randomLongId(); + Long productId = randomLongId(); + Long feedbackId = randomLongId(); + Long sourceLineId = randomLongId(); + Long templateId = randomLongId(); + + MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); + reqVO.setCode("IPQC-SL-003"); + reqVO.setWorkstationId(workstationId); + reqVO.setWorkOrderId(workOrderId); + reqVO.setInspectorUserId(randomLongId()); + reqVO.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK); + reqVO.setSourceDocId(feedbackId); + reqVO.setSourceLineId(sourceLineId); + + // mock + MesMdWorkstationDO workstation = new MesMdWorkstationDO(); + workstation.setId(workstationId); + workstation.setProcessId(null); + when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); + MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); + workOrder.setId(workOrderId); + workOrder.setProductId(productId); + when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); + when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); + MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); + templateItem.setTemplateId(templateId); + when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); + when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO()); + // mock:产出行存在且归属正确,但不是 PENDING 状态 + MesWmProductProduceLineDO line = new MesWmProductProduceLineDO(); + line.setId(sourceLineId); + line.setFeedbackId(feedbackId); + line.setQualityStatus(MesWmQualityStatusEnum.PASS.getStatus()); // 已合格,非待检 + when(productProduceLineService.validateProductProduceLineExists(sourceLineId)).thenReturn(line); + + // 调用,断言异常 + ServiceException ex = assertThrows(ServiceException.class, () -> ipqcService.createIpqc(reqVO)); + assertEquals(QC_IPQC_SOURCE_LINE_NOT_PENDING.getCode(), ex.getCode()); + } + + /** + * sourceLineId 校验全部通过 → 创建成功 + */ + @Test + public void testCreateIpqc_sourceLineId_success() { + // 准备参数 + Long workstationId = randomLongId(); + Long workOrderId = randomLongId(); + Long productId = randomLongId(); + Long feedbackId = randomLongId(); + Long sourceLineId = randomLongId(); + Long templateId = randomLongId(); + + MesQcIpqcSaveReqVO reqVO = new MesQcIpqcSaveReqVO(); + reqVO.setCode("IPQC-SL-004"); + reqVO.setWorkstationId(workstationId); + reqVO.setWorkOrderId(workOrderId); + reqVO.setInspectorUserId(randomLongId()); + reqVO.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK); + reqVO.setSourceDocId(feedbackId); + reqVO.setSourceLineId(sourceLineId); + + // mock + MesMdWorkstationDO workstation = new MesMdWorkstationDO(); + workstation.setId(workstationId); + workstation.setProcessId(null); + when(workstationService.validateWorkstationExists(workstationId)).thenReturn(workstation); + MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); + workOrder.setId(workOrderId); + workOrder.setProductId(productId); + when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); + when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); + MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); + templateItem.setTemplateId(templateId); + when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); + MesProFeedbackDO feedback = new MesProFeedbackDO(); + feedback.setId(feedbackId); + feedback.setCode("FB-001"); + when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(feedback); + // mock:产出行存在、归属正确、PENDING 状态 + MesWmProductProduceLineDO line = new MesWmProductProduceLineDO(); + line.setId(sourceLineId); + line.setFeedbackId(feedbackId); + line.setQualityStatus(MesWmQualityStatusEnum.PENDING.getStatus()); + when(productProduceLineService.validateProductProduceLineExists(sourceLineId)).thenReturn(line); + + // 调用 + Long ipqcId = ipqcService.createIpqc(reqVO); + + // 断言:创建成功,sourceDocCode 回写 + MesQcIpqcDO ipqc = ipqcMapper.selectById(ipqcId); + assertNotNull(ipqc); + assertEquals(feedbackId, ipqc.getSourceDocId()); + assertEquals(sourceLineId, ipqc.getSourceLineId()); + assertEquals("FB-001", ipqc.getSourceDocCode()); + } + } diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImplTest.java index 9e2984c39..305556a62 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImplTest.java +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImplTest.java @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordServ import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; import cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt.MesWmOutsourceReceiptService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -55,6 +56,8 @@ public class MesQcIqcServiceImplTest extends BaseDbUnitTest { private MesQcTemplateItemService templateItemService; @MockBean private AdminUserApi adminUserApi; + @MockitoBean + private MesQcIndicatorResultService indicatorResultService; @Test public void testFinishIqc_writeBack_arrivalNotice() { diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImplTest.java index 25e5e850d..fcc022b8c 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImplTest.java +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImplTest.java @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordServ import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesLineService; import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -56,6 +57,8 @@ public class MesQcOqcServiceImplTest extends BaseDbUnitTest { private MesQcDefectRecordService defectRecordService; @MockBean private AdminUserApi adminUserApi; + @MockitoBean + private MesQcIndicatorResultService indicatorResultService; @Test public void testFinishOqc_writeBack_productSales() { diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImplTest.java index 3e4b8d93e..55a19d682 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImplTest.java +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImplTest.java @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordServ import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; import cn.iocoder.yudao.module.mes.service.wm.returnissue.MesWmReturnIssueLineService; import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesLineService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; @@ -56,6 +57,8 @@ public class MesQcRqcServiceImplTest extends BaseDbUnitTest { private MesQcDefectRecordService defectRecordService; @MockBean private AdminUserApi adminUserApi; + @MockitoBean + private MesQcIndicatorResultService indicatorResultService; @Test public void testFinishRqc_successWithReturnIssue() { diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImplTest.java index d5275a867..097222549 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImplTest.java +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImplTest.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalN import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum; +import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; @@ -37,6 +38,8 @@ public class MesWmArrivalNoticeServiceImplTest extends BaseDbUnitTest { @MockBean private MesWmArrivalNoticeLineService arrivalNoticeLineService; + @MockitoBean + private MesMdVendorService vendorService; @Test public void testUpdateArrivalNoticeWhenIqcFinish_success_allLinesChecked() { diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImplTest.java new file mode 100644 index 000000000..5814c4ce9 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImplTest.java @@ -0,0 +1,110 @@ +package cn.iocoder.yudao.module.mes.service.wm.materialstock; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.function.Consumer; + +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +/** + * {@link MesWmMaterialStockServiceImpl} 的单元测试 + * + * @author 芋道源码 + */ +@Import(MesWmMaterialStockServiceImpl.class) +public class MesWmMaterialStockServiceImplTest extends BaseDbUnitTest { + + @Resource + private MesWmMaterialStockServiceImpl materialStockService; + + @Resource + private MesWmMaterialStockMapper materialStockMapper; + + @MockitoBean + private MesMdItemService itemService; + @MockitoBean + private MesMdItemTypeService itemTypeService; + @MockitoBean + private MesWmWarehouseAreaService areaService; + @MockitoBean + private MesWmWarehouseService warehouseService; + + @Test + public void testGetMaterialStockPage_virtualFilterOnly() { + // 准备数据:虚拟仓库存 + 普通仓库存 + Long virtualWarehouseId = 100L; + Long normalWarehouseId = 200L; + MesWmMaterialStockDO virtualStock = createMaterialStockPojo(o -> o.setWarehouseId(virtualWarehouseId)); + MesWmMaterialStockDO normalStock = createMaterialStockPojo(o -> o.setWarehouseId(normalWarehouseId)); + materialStockMapper.insert(virtualStock); + materialStockMapper.insert(normalStock); + mockVirtualWarehouse(virtualWarehouseId); + + // 调用:只看虚拟仓 + MesWmMaterialStockPageReqVO reqVO = new MesWmMaterialStockPageReqVO(); + reqVO.setVirtualFilter(MesWmMaterialStockPageReqVO.VIRTUAL_FILTER_ONLY); + PageResult result = materialStockService.getMaterialStockPage(reqVO); + + // 断言:只返回虚拟仓库存,且 total 与列表一致 + assertEquals(1, result.getTotal()); + assertEquals(1, result.getList().size()); + assertEquals(virtualStock.getId(), result.getList().get(0).getId()); + } + + @Test + public void testGetMaterialStockPage_virtualFilterExclude() { + // 准备数据:虚拟仓库存 + 普通仓库存 + Long virtualWarehouseId = 100L; + Long normalWarehouseId = 200L; + MesWmMaterialStockDO virtualStock = createMaterialStockPojo(o -> o.setWarehouseId(virtualWarehouseId)); + MesWmMaterialStockDO normalStock = createMaterialStockPojo(o -> o.setWarehouseId(normalWarehouseId)); + materialStockMapper.insert(virtualStock); + materialStockMapper.insert(normalStock); + mockVirtualWarehouse(virtualWarehouseId); + + // 调用:排除虚拟仓 + MesWmMaterialStockPageReqVO reqVO = new MesWmMaterialStockPageReqVO(); + reqVO.setVirtualFilter(MesWmMaterialStockPageReqVO.VIRTUAL_FILTER_EXCLUDE); + PageResult result = materialStockService.getMaterialStockPage(reqVO); + + // 断言:只返回普通仓库存,且 total 与列表一致 + assertEquals(1, result.getTotal()); + assertEquals(1, result.getList().size()); + assertEquals(normalStock.getId(), result.getList().get(0).getId()); + } + + private MesWmMaterialStockDO createMaterialStockPojo(Consumer consumer) { + return randomPojo(MesWmMaterialStockDO.class, o -> { + o.setQuantity(new BigDecimal("10.00")); + o.setReceiptTime(LocalDateTime.of(2026, 1, 1, 0, 0)); + o.setFrozen(false); + o.setDeleted(false); + consumer.accept(o); + }); + } + + private void mockVirtualWarehouse(Long virtualWarehouseId) { + MesWmWarehouseDO virtualWarehouse = new MesWmWarehouseDO(); + virtualWarehouse.setId(virtualWarehouseId); + when(warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE)) + .thenReturn(virtualWarehouse); + } + +} diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java index 51cd7093b..e7bf99a86 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.service.wm.productproduce; import cn.hutool.core.collection.ListUtil; +import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDetailDO; @@ -17,18 +18,18 @@ import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionServic import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; -import javax.annotation.Resource; import java.math.BigDecimal; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; /** @@ -45,27 +46,28 @@ public class MesWmProductProduceServiceImplTest extends BaseDbUnitTest { @Resource private MesWmProductProduceMapper productProduceMapper; - @MockBean + @MockitoBean private MesWmProductProduceLineService productProduceLineService; - @MockBean + @MockitoBean private MesWmProductProduceDetailService productProduceDetailService; - @MockBean + @MockitoBean private MesProWorkOrderService workOrderService; - @MockBean + @MockitoBean private MesWmBatchService batchService; - @MockBean + @MockitoBean private MesWmTransactionService wmTransactionService; - @MockBean + @MockitoBean private MesWmWarehouseService warehouseService; - @MockBean + @MockitoBean private MesWmWarehouseLocationService locationService; - @MockBean + @MockitoBean private MesWmWarehouseAreaService areaService; @Test public void testSplitPendingAndFinishProduce_withUnqualified() { // 准备数据:插入一个 PREPARE 状态的产出单 Long feedbackId = randomLongId(); + Long sourceLineId = 100L; Long itemId = randomLongId(); Long batchId = randomLongId(); String batchCode = "BATCH-001"; @@ -85,19 +87,17 @@ public class MesWmProductProduceServiceImplTest extends BaseDbUnitTest { when(locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION)).thenReturn(loc); when(areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA)).thenReturn(area); - // mock: 返回一条 PENDING 的产出行 + // mock: 通过 sourceLineId 直接定位 PENDING 产出行 MesWmProductProduceLineDO pendingLine = MesWmProductProduceLineDO.builder() - .id(100L).produceId(produce.getId()).feedbackId(feedbackId) + .id(sourceLineId).produceId(produce.getId()).feedbackId(feedbackId) .itemId(itemId).quantity(BigDecimal.valueOf(100)) .batchId(batchId).batchCode(batchCode) .qualityStatus(MesWmQualityStatusEnum.PENDING.getStatus()) .build(); - when(productProduceLineService.getProductProduceLineListByProduceId(produce.getId())) - .thenReturn(ListUtil.of(pendingLine)); + when(productProduceLineService.validateProductProduceLineExists(sourceLineId)) + .thenReturn(pendingLine); - // mock: finishProductProduce 内部会再查一次行和明细(用于创建库存事务) - // 由于 finishProductProduce 在拆分行后调用,此时行已经变了,但由于 line/detail 是 mock 的, - // 我们需要 mock 已拆分后的行给 finishProductProduce + // mock: finishProductProduce 内部查行和明细(用于创建库存事务) MesWmProductProduceLineDO qualifiedLine = MesWmProductProduceLineDO.builder() .id(100L).produceId(produce.getId()).itemId(itemId) .quantity(BigDecimal.valueOf(80)) @@ -108,10 +108,8 @@ public class MesWmProductProduceServiceImplTest extends BaseDbUnitTest { .quantity(BigDecimal.valueOf(20)) .qualityStatus(MesWmQualityStatusEnum.FAIL.getStatus()) .build(); - // finishProductProduce 内部第二次调用 getProductProduceLineListByProduceId when(productProduceLineService.getProductProduceLineListByProduceId(produce.getId())) - .thenReturn(ListUtil.of(pendingLine)) // 第 1 次:splitPendingAndFinishProduce 查待检行 - .thenReturn(ListUtil.of(qualifiedLine, unqualifiedLine)); // 第 2 次:finishProductProduce 查所有行 + .thenReturn(ListUtil.of(qualifiedLine, unqualifiedLine)); // mock: finishProductProduce 中按行查明细 MesWmProductProduceDetailDO qualifiedDetail = MesWmProductProduceDetailDO.builder() @@ -124,7 +122,8 @@ public class MesWmProductProduceServiceImplTest extends BaseDbUnitTest { .thenReturn(ListUtil.of(unqualifiedDetail)); // 调用 - productProduceService.splitPendingAndFinishProduce(feedbackId, BigDecimal.valueOf(80), BigDecimal.valueOf(20)); + productProduceService.splitPendingAndFinishProduce(feedbackId, sourceLineId, + BigDecimal.valueOf(80), BigDecimal.valueOf(20)); // 断言 1:不合格品行 - 新建了一行 ArgumentCaptor lineCaptor = ArgumentCaptor.forClass(MesWmProductProduceLineDO.class); @@ -156,6 +155,7 @@ public class MesWmProductProduceServiceImplTest extends BaseDbUnitTest { public void testSplitPendingAndFinishProduce_allQualified() { // 准备数据:全部合格品场景 Long feedbackId = randomLongId(); + Long sourceLineId = 200L; Long itemId = randomLongId(); MesWmProductProduceDO produce = randomPojo(MesWmProductProduceDO.class, o -> { @@ -173,30 +173,31 @@ public class MesWmProductProduceServiceImplTest extends BaseDbUnitTest { when(locationService.getWarehouseLocationByCode(any())).thenReturn(loc); when(areaService.getWarehouseAreaByCode(any())).thenReturn(area); + // mock: 通过 sourceLineId 直接定位 PENDING 产出行 MesWmProductProduceLineDO pendingLine = MesWmProductProduceLineDO.builder() - .id(200L).produceId(produce.getId()).feedbackId(feedbackId) + .id(sourceLineId).produceId(produce.getId()).feedbackId(feedbackId) .itemId(itemId).quantity(BigDecimal.valueOf(50)) .qualityStatus(MesWmQualityStatusEnum.PENDING.getStatus()) .build(); + when(productProduceLineService.validateProductProduceLineExists(sourceLineId)) + .thenReturn(pendingLine); - // 第 1 次查行(拆分阶段)返回 PENDING 行;第 2 次查行(finishProductProduce)返回已更新的合格行 + // mock: finishProductProduce 查行和明细 MesWmProductProduceLineDO qualifiedLine = MesWmProductProduceLineDO.builder() .id(200L).produceId(produce.getId()).itemId(itemId) .quantity(BigDecimal.valueOf(50)) .qualityStatus(MesWmQualityStatusEnum.PASS.getStatus()) .build(); when(productProduceLineService.getProductProduceLineListByProduceId(produce.getId())) - .thenReturn(ListUtil.of(pendingLine)) .thenReturn(ListUtil.of(qualifiedLine)); - - // mock: finishProductProduce 中按行查明细 MesWmProductProduceDetailDO detail = MesWmProductProduceDetailDO.builder() .lineId(200L).quantity(BigDecimal.valueOf(50)).build(); when(productProduceDetailService.getProductProduceDetailListByLineId(200L)) .thenReturn(ListUtil.of(detail)); // 调用:不合格品数量 = 0 - productProduceService.splitPendingAndFinishProduce(feedbackId, BigDecimal.valueOf(50), BigDecimal.ZERO); + productProduceService.splitPendingAndFinishProduce(feedbackId, sourceLineId, + BigDecimal.valueOf(50), BigDecimal.ZERO); // 断言 1:没有新建行(不合格品数量为 0) verify(productProduceLineService, never()).createProductProduceLine(any()); @@ -218,14 +219,18 @@ public class MesWmProductProduceServiceImplTest extends BaseDbUnitTest { public void testSplitPendingAndFinishProduce_produceNotExists() { // 调用不存在的 feedbackId,应该抛异常 Long feedbackId = randomLongId(); - assertThrows(Exception.class, () -> - productProduceService.splitPendingAndFinishProduce(feedbackId, BigDecimal.TEN, BigDecimal.ZERO)); + Long sourceLineId = randomLongId(); + ServiceException ex = assertThrows(ServiceException.class, () -> + productProduceService.splitPendingAndFinishProduce(feedbackId, sourceLineId, + BigDecimal.TEN, BigDecimal.ZERO)); + assertEquals(WM_PRODUCT_PRODUCE_NOT_EXISTS.getCode(), ex.getCode()); } @Test - public void testSplitPendingAndFinishProduce_noPendingLine() { - // 准备数据:产出单存在,但没有 PENDING 行 + public void testSplitPendingAndFinishProduce_lineNotExists() { + // 准备数据:产出单存在,但 sourceLineId 对应的行不存在 Long feedbackId = randomLongId(); + Long sourceLineId = randomLongId(); MesWmProductProduceDO produce = randomPojo(MesWmProductProduceDO.class, o -> { o.setFeedbackId(feedbackId); o.setStatus(MesWmProductProduceStatusEnum.PREPARE.getStatus()); @@ -240,17 +245,15 @@ public class MesWmProductProduceServiceImplTest extends BaseDbUnitTest { when(locationService.getWarehouseLocationByCode(any())).thenReturn(loc); when(areaService.getWarehouseAreaByCode(any())).thenReturn(area); - // mock: 返回一条 PASS 状态的行(不是 PENDING) - MesWmProductProduceLineDO passLine = MesWmProductProduceLineDO.builder() - .id(300L).produceId(produce.getId()) - .qualityStatus(MesWmQualityStatusEnum.PASS.getStatus()) - .build(); - when(productProduceLineService.getProductProduceLineListByProduceId(produce.getId())) - .thenReturn(ListUtil.of(passLine)); + // mock: validateProductProduceLineExists 抛异常 + when(productProduceLineService.validateProductProduceLineExists(sourceLineId)) + .thenThrow(new ServiceException(WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS)); - // 调用,应该抛异常(找不到 PENDING 行) - assertThrows(Exception.class, () -> - productProduceService.splitPendingAndFinishProduce(feedbackId, BigDecimal.TEN, BigDecimal.ZERO)); + // 调用,应该抛异常 + ServiceException ex = assertThrows(ServiceException.class, () -> + productProduceService.splitPendingAndFinishProduce(feedbackId, sourceLineId, + BigDecimal.TEN, BigDecimal.ZERO)); + assertEquals(WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS.getCode(), ex.getCode()); } } diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImplTest.java b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImplTest.java index fef292404..674a1d432 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImplTest.java +++ b/yudao-module-mes/yudao-module-mes-server/src/test/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImplTest.java @@ -5,12 +5,14 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSale import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper; import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; -import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; -import javax.annotation.Resource; import java.math.BigDecimal; import java.util.List; @@ -32,12 +34,18 @@ public class MesWmReturnSalesLineServiceImplTest extends BaseDbUnitTest { @Resource private MesWmReturnSalesLineMapper returnSalesLineMapper; - @MockBean + @MockitoBean private MesWmReturnSalesService returnSalesService; - @MockBean + @MockitoBean private MesMdItemService itemService; + @MockitoBean + private MesWmBatchService batchService; + + @MockitoBean + private MesWmReturnSalesDetailService returnSalesDetailService; + @Test public void testUpdateReturnSalesLineWhenRqcFinish_allPass() { // 准备参数:全部合格 diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/resources/application-unit-test.yaml b/yudao-module-mes/yudao-module-mes-server/src/test/resources/application-unit-test.yaml index 1df2760c3..db5aa6f05 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/test/resources/application-unit-test.yaml +++ b/yudao-module-mes/yudao-module-mes-server/src/test/resources/application-unit-test.yaml @@ -10,7 +10,7 @@ spring: # 数据源配置项 datasource: name: ruoyi-vue-pro - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value,day; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 driver-class-name: org.h2.Driver username: sa password: diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/resources/sql/clean.sql b/yudao-module-mes/yudao-module-mes-server/src/test/resources/sql/clean.sql index eda0d8c6d..8cb28c31e 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/test/resources/sql/clean.sql +++ b/yudao-module-mes/yudao-module-mes-server/src/test/resources/sql/clean.sql @@ -1,3 +1,7 @@ +DELETE FROM "mes_cal_team_shift"; +DELETE FROM "mes_cal_plan_team"; +DELETE FROM "mes_cal_plan_shift"; +DELETE FROM "mes_cal_plan"; DELETE FROM "mes_md_auto_code_rule"; DELETE FROM "mes_md_auto_code_part"; DELETE FROM "mes_md_auto_code_record"; @@ -13,3 +17,7 @@ DELETE FROM "mes_wm_item_receipt"; DELETE FROM "mes_wm_item_receipt_line"; DELETE FROM "mes_wm_item_receipt_detail"; DELETE FROM "mes_wm_batch"; +DELETE FROM "mes_wm_material_stock"; +DELETE FROM "mes_pro_task"; +DELETE FROM "mes_pro_route_process"; +DELETE FROM "mes_qc_indicator_result"; diff --git a/yudao-module-mes/yudao-module-mes-server/src/test/resources/sql/create_tables.sql b/yudao-module-mes/yudao-module-mes-server/src/test/resources/sql/create_tables.sql index a37c9e977..fd7361362 100644 --- a/yudao-module-mes/yudao-module-mes-server/src/test/resources/sql/create_tables.sql +++ b/yudao-module-mes/yudao-module-mes-server/src/test/resources/sql/create_tables.sql @@ -1,3 +1,84 @@ +-- ---------------------------- +-- MES 排班计划 +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "mes_cal_plan" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(64) DEFAULT NULL, + "name" varchar(255) DEFAULT NULL, + "calendar_type" tinyint DEFAULT NULL, + "start_date" timestamp DEFAULT NULL, + "end_date" timestamp DEFAULT NULL, + "shift_type" tinyint DEFAULT NULL, + "shift_method" tinyint DEFAULT NULL, + "shift_count" int DEFAULT NULL, + "status" tinyint DEFAULT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT 0, + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- MES 排班计划班次 +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "mes_cal_plan_shift" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "plan_id" bigint DEFAULT NULL, + "sort" int DEFAULT NULL, + "name" varchar(64) DEFAULT NULL, + "start_time" varchar(10) DEFAULT NULL, + "end_time" varchar(10) DEFAULT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT 0, + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- MES 排班计划班组 +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "mes_cal_plan_team" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "plan_id" bigint DEFAULT NULL, + "team_id" bigint DEFAULT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT 0, + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- MES 班组排班 +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "mes_cal_team_shift" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "plan_id" bigint DEFAULT NULL, + "team_id" bigint DEFAULT NULL, + "shift_id" bigint DEFAULT NULL, + "day" timestamp DEFAULT NULL, + "sort" int DEFAULT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT 0, + PRIMARY KEY ("id") +); + -- ---------------------------- -- MES 编码规则表 -- ---------------------------- @@ -300,7 +381,6 @@ CREATE TABLE IF NOT EXISTS "mes_wm_product_produce_detail" ( PRIMARY KEY ("id") ); - -- ---------------------------- -- MES 出货检验单(OQC) -- ---------------------------- @@ -309,8 +389,8 @@ CREATE TABLE IF NOT EXISTS "mes_qc_oqc" ( "code" varchar(64) NOT NULL, "name" varchar(500) NOT NULL, "template_id" bigint NOT NULL, - "source_doc_id" bigint DEFAULT NULL, "source_doc_type" int DEFAULT NULL, + "source_doc_id" bigint DEFAULT NULL, "source_line_id" bigint DEFAULT NULL, "source_doc_code" varchar(64) DEFAULT NULL, "client_id" bigint NOT NULL, @@ -351,8 +431,8 @@ CREATE TABLE IF NOT EXISTS "mes_qc_rqc" ( "code" varchar(64) NOT NULL, "name" varchar(500) NOT NULL, "template_id" bigint NOT NULL, - "source_doc_id" bigint DEFAULT NULL, "source_doc_type" int DEFAULT NULL, + "source_doc_id" bigint DEFAULT NULL, "source_line_id" bigint DEFAULT NULL, "source_doc_code" varchar(64) DEFAULT NULL, "type" int DEFAULT NULL, @@ -361,17 +441,17 @@ CREATE TABLE IF NOT EXISTS "mes_qc_rqc" ( "check_quantity" decimal(14,2) DEFAULT NULL, "qualified_quantity" decimal(14,2) DEFAULT 0.00, "unqualified_quantity" decimal(14,2) DEFAULT 0.00, + "critical_rate" decimal(14,2) DEFAULT 0.00, + "major_rate" decimal(14,2) DEFAULT 0.00, + "minor_rate" decimal(14,2) DEFAULT 0.00, + "critical_quantity" int DEFAULT 0, + "major_quantity" int DEFAULT 0, + "minor_quantity" int DEFAULT 0, "check_result" tinyint DEFAULT NULL, "inspect_date" timestamp DEFAULT NULL, "inspector_user_id" bigint DEFAULT NULL, "status" tinyint NOT NULL DEFAULT 0, "remark" varchar(500) DEFAULT '', - "critical_quantity" int DEFAULT 0, - "major_quantity" int DEFAULT 0, - "minor_quantity" int DEFAULT 0, - "critical_rate" decimal(14,2) DEFAULT 0.00, - "major_rate" decimal(14,2) DEFAULT 0.00, - "minor_rate" decimal(14,2) DEFAULT 0.00, "creator" varchar(64) DEFAULT '', "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, "updater" varchar(64) DEFAULT '', @@ -387,6 +467,7 @@ CREATE TABLE IF NOT EXISTS "mes_qc_rqc" ( CREATE TABLE IF NOT EXISTS "mes_wm_product_sales_line" ( "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, "sales_id" bigint NOT NULL, + "notice_line_id" bigint DEFAULT NULL, "item_id" bigint NOT NULL, "quantity" decimal(20,6) NOT NULL, "batch_id" bigint DEFAULT NULL, @@ -438,6 +519,7 @@ CREATE TABLE IF NOT EXISTS "mes_wm_return_sales_line" ( "item_id" bigint NOT NULL, "quantity" decimal(12,2) NOT NULL DEFAULT 0.00, "batch_id" bigint DEFAULT NULL, + "batch_code" varchar(255) DEFAULT NULL, "rqc_id" bigint DEFAULT NULL, "rqc_check_flag" bit NOT NULL DEFAULT FALSE, "quality_status" int DEFAULT NULL, @@ -618,3 +700,133 @@ CREATE TABLE IF NOT EXISTS "mes_wm_batch" ( "tenant_id" bigint NOT NULL DEFAULT 0, PRIMARY KEY ("id") ); + +-- ---------------------------- +-- MES 库存台账 +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "mes_wm_material_stock" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "item_type_id" bigint DEFAULT NULL, + "item_id" bigint DEFAULT NULL, + "batch_id" bigint DEFAULT NULL, + "batch_code" varchar(255) DEFAULT NULL, + "warehouse_id" bigint DEFAULT NULL, + "location_id" bigint DEFAULT NULL, + "area_id" bigint DEFAULT NULL, + "vendor_id" bigint DEFAULT NULL, + "quantity" decimal(14,2) DEFAULT NULL, + "receipt_time" timestamp DEFAULT NULL, + "frozen" bit DEFAULT FALSE, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT 0, + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- MES 生产任务 +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "mes_pro_task" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(64) DEFAULT NULL, + "name" varchar(255) DEFAULT NULL, + "work_order_id" bigint DEFAULT NULL, + "workstation_id" bigint DEFAULT NULL, + "route_id" bigint DEFAULT NULL, + "process_id" bigint DEFAULT NULL, + "item_id" bigint DEFAULT NULL, + "quantity" decimal(14,2) DEFAULT NULL, + "produced_quantity" decimal(14,2) DEFAULT NULL, + "qualify_quantity" decimal(14,2) DEFAULT NULL, + "unqualify_quantity" decimal(14,2) DEFAULT NULL, + "changed_quantity" decimal(14,2) DEFAULT NULL, + "client_id" bigint DEFAULT NULL, + "start_time" timestamp DEFAULT NULL, + "duration" int DEFAULT NULL, + "end_time" timestamp DEFAULT NULL, + "color_code" varchar(20) DEFAULT NULL, + "finish_date" timestamp DEFAULT NULL, + "cancel_date" timestamp DEFAULT NULL, + "status" int DEFAULT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT 0, + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- MES 工艺路线工序 +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "mes_pro_route_process" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "route_id" bigint DEFAULT NULL, + "process_id" bigint DEFAULT NULL, + "sort" int DEFAULT NULL, + "next_process_id" bigint DEFAULT NULL, + "link_type" int DEFAULT NULL, + "prepare_time" int DEFAULT NULL, + "wait_time" int DEFAULT NULL, + "color_code" varchar(20) DEFAULT NULL, + "key_flag" bit DEFAULT FALSE, + "check_flag" bit DEFAULT FALSE, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT 0, + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- MES 销售出库明细 +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "mes_wm_product_sales_detail" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "line_id" bigint NOT NULL, + "sales_id" bigint NOT NULL, + "item_id" bigint NOT NULL, + "quantity" decimal(14,2) DEFAULT NULL, + "material_stock_id" bigint DEFAULT NULL, + "batch_id" bigint DEFAULT NULL, + "batch_code" varchar(255) DEFAULT NULL, + "warehouse_id" bigint DEFAULT NULL, + "location_id" bigint DEFAULT NULL, + "area_id" bigint DEFAULT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT 0, + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- MES 检验结果记录 +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "mes_qc_indicator_result" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(64) DEFAULT NULL, + "qc_id" bigint DEFAULT NULL, + "qc_type" int DEFAULT NULL, + "item_id" bigint DEFAULT NULL, + "sn" varchar(128) DEFAULT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL DEFAULT 0, + PRIMARY KEY ("id") +);