diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateController.java index bd63231..6795961 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/MesQcTemplateController.java @@ -33,6 +33,7 @@ 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; +// TODO @AI:拆分为多个 controller,和别的模块; @Tag(name = "管理后台 - MES 质检方案") @RestController @RequestMapping("/mes/qc/template") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorRespVO.java index bf79cbc..67d3838 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorRespVO.java @@ -31,9 +31,8 @@ public class MesQcTemplateIndicatorRespVO { @ExcelProperty("标准值") private BigDecimal standardValue; - @Schema(description = "单位", example = "mm") - @ExcelProperty("单位") - private String unit; + @Schema(description = "计量单位ID", example = "1") + private Long unitMeasureId; @Schema(description = "误差上限", example = "10.5000") @ExcelProperty("误差上限") @@ -72,4 +71,10 @@ public class MesQcTemplateIndicatorRespVO { @ExcelProperty("检测工具") private String indicatorTool; + // ========== JOIN mes_md_unit_measure ========== + + @Schema(description = "计量单位名称", example = "mm") + @ExcelProperty("单位") + private String unitMeasureName; + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorSaveReqVO.java index 0e39f86..7563c79 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/template/vo/indicator/MesQcTemplateIndicatorSaveReqVO.java @@ -17,21 +17,18 @@ public class MesQcTemplateIndicatorSaveReqVO { @NotNull(message = "质检方案ID不能为空") private Long templateId; - /** - * TODO @芋艿:等 qc_indicator 完成后,改为选择器,此处改为 @NotNull 强校验 - */ - @Schema(description = "质检指标ID(关联 mes_qc_indicator)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "质检指标ID不能为空") + @Schema(description = "质检指标ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "质检指标不能为空") private Long indicatorId; - @Schema(description = "检测方法/检测要求", example = "目视检查外观") + @Schema(description = "检测方法", example = "目视检查外观") private String checkMethod; @Schema(description = "标准值", example = "10.0000") private BigDecimal standardValue; - @Schema(description = "单位", example = "mm") - private String unit; + @Schema(description = "计量单位ID", example = "1") + private Long unitMeasureId; @Schema(description = "误差上限", example = "10.5000") private BigDecimal thresholdMax; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateDO.java index 8a901f3..0eb5624 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateDO.java @@ -1,17 +1,22 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.qc; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.framework.mybatis.core.type.IntegerListTypeHandler; +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.*; +import java.util.List; + /** * MES 质检方案 DO * * @author 芋道源码 */ -@TableName("mes_qc_template") +@TableName(value = "mes_qc_template", autoResultMap = true) @KeySequence("mes_qc_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data @EqualsAndHashCode(callSuper = true) @@ -34,20 +39,17 @@ public class MesQcTemplateDO extends BaseDO { * 方案名称 */ private String name; - // TODO @AI:List types;以这个为主;然后 type int 1 - IQC、2 - IPQC、3 - OQC、4 - RQC;前端传过来逗号分隔的字符串,后端转换成 List 存储到数据库中;查询时也是一样,数据库存储逗号分隔的字符串,后端转换成 List 返回给前端。 /** - * 检测种类(逗号分隔:IQC,IPQC,OQC,RQC) + * 检测种类 * - * 字典类型 mes_qc_type + * 字典 {@link DictTypeConstants#MES_QC_TYPE} */ - private String types; - // TODO @AI:Boolean + @TableField(typeHandler = IntegerListTypeHandler.class) + private List types; /** - * 是否启用(Y/N) - * - * 字典类型 sys_yes_no + * 是否启用 */ - private String enableFlag; + private Boolean enableFlag; /** * 备注 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateIndicatorDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateIndicatorDO.java index 1e29801..15e0d33 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateIndicatorDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateIndicatorDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.qc; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -28,31 +29,32 @@ public class MesQcTemplateIndicatorDO extends BaseDO { */ @TableId private Long id; - // TODO @AI:关联字段 /** - * 质检方案ID + * 质检方案编号 + * + * 关联 {@link MesQcTemplateDO#getId()} */ private Long templateId; - // TODO @AI:关联字段 /** - * 质检指标ID(关联 mes_qc_indicator,通过 JOIN 查询指标信息) + * 质检指标编号 * - * TODO @芋艿:等 qc_indicator 完成后,完善关联查询和前端选择器 + * 关联 {@link MesQcIndicatorDO#getId()} */ private Long indicatorId; /** - * 检测方法/检测要求 + * 检测方法 */ private String checkMethod; /** * 标准值 */ private BigDecimal standardValue; - // TODO @AI:应该关联单位那个表; /** - * 单位 + * 计量单位编号 + * + * 关联 {@link MesMdUnitMeasureDO#getId()} */ - private String unit; + private Long unitMeasureId; /** * 误差上限 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateItemDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateItemDO.java index e2bbae0..711794b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateItemDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateItemDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.qc; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -28,14 +29,16 @@ public class MesQcTemplateItemDO extends BaseDO { */ @TableId private Long id; - // TODO @AI:关联字段 /** - * 质检方案ID + * 质检方案编号 + * + * 关联 {@link MesQcTemplateDO#getId()} */ private Long templateId; - // TODO @AI:关联字段 /** - * 产品物料ID(关联 mes_md_item,通过 ID 查询物料信息) + * 产品物料编号 + * + * 关联 {@link MesMdItemDO#getId()} */ private Long itemId; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/MesQcTemplateMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/MesQcTemplateMapper.java index 8ebb94c..c63ab8f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/MesQcTemplateMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/MesQcTemplateMapper.java @@ -22,16 +22,12 @@ public interface MesQcTemplateMapper extends BaseMapperX { .likeIfPresent(MesQcTemplateDO::getCode, reqVO.getCode()) .likeIfPresent(MesQcTemplateDO::getName, reqVO.getName()) .orderByDesc(MesQcTemplateDO::getId); - // types: 取第一个值做 LIKE 匹配(简单实现,支持单值过滤) - // TODO @AI:find in set;你看看 mybatisutils 有类似的; + // types: 用 FIND_IN_SET 精确匹配逗号分隔字段(取第一个值过滤) + // TODO @AI:MyBatisUtils 的 findInSet if (reqVO.getTypes() != null && !reqVO.getTypes().isEmpty()) { - query.like(MesQcTemplateDO::getTypes, String.valueOf(reqVO.getTypes().get(0))); - } - // TODO @AI:是不是里面就是 boolean - // enableFlag: 转为 Y/N 已经改成 boolean 了,数据库里也是 boolean - if (reqVO.getEnableFlag() != null) { - query.eq(MesQcTemplateDO::getEnableFlag, Boolean.TRUE.equals(reqVO.getEnableFlag()) ? "Y" : "N"); + query.apply("FIND_IN_SET({0}, types) > 0", reqVO.getTypes().get(0)); } + query.eqIfPresent(MesQcTemplateDO::getEnableFlag, reqVO.getEnableFlag()); return selectPage(reqVO, query); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/MesQcTemplateServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/MesQcTemplateServiceImpl.java index c65ecf5..a5cd802 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/MesQcTemplateServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/MesQcTemplateServiceImpl.java @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.mes.service.qc; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; -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.template.vo.MesQcTemplatePageReqVO; @@ -31,7 +30,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -68,11 +66,8 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService { public Long createTemplate(MesQcTemplateSaveReqVO createReqVO) { // 校验编码唯一 validateTemplateCodeUnique(null, createReqVO.getCode()); - - // 插入 + // 插入(types 由 IntegerListTypeHandler 自动做 List↔逗号字符串转换,enableFlag Boolean↔bit 自动映射) MesQcTemplateDO template = BeanUtils.toBean(createReqVO, MesQcTemplateDO.class); - template.setTypes(convertTypesToString(createReqVO.getTypes())); - template.setEnableFlag(Boolean.TRUE.equals(createReqVO.getEnableFlag()) ? "Y" : "N"); templateMapper.insert(template); return template.getId(); } @@ -83,11 +78,8 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService { validateTemplateExists(updateReqVO.getId()); // 校验编码唯一 validateTemplateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); - // 更新 MesQcTemplateDO updateObj = BeanUtils.toBean(updateReqVO, MesQcTemplateDO.class); - updateObj.setTypes(convertTypesToString(updateReqVO.getTypes())); - updateObj.setEnableFlag(Boolean.TRUE.equals(updateReqVO.getEnableFlag()) ? "Y" : "N"); templateMapper.updateById(updateObj); } @@ -96,7 +88,6 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService { public void deleteTemplate(Long id) { // 校验存在 validateTemplateExists(id); - // 删除主表 templateMapper.deleteById(id); // 级联删除检测指标项 @@ -121,20 +112,25 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService { } } + // TODO @AI:返回 DO;交给 controller 拼接 @Override public MesQcTemplateRespVO getTemplate(Long id) { MesQcTemplateDO do0 = templateMapper.selectById(id); if (do0 == null) { return null; } - return convertTemplateRespVO(do0); + // types/enableFlag 由 TypeHandler/MyBatis-Plus 自动映射,直接 toBean 即可 + return BeanUtils.toBean(do0, MesQcTemplateRespVO.class); } + // TODO @AI:返回 DO;交给 controller 拼接 @Override public PageResult getTemplatePage(MesQcTemplatePageReqVO pageReqVO) { PageResult pageResult = templateMapper.selectPage(pageReqVO); return new PageResult<>( - pageResult.getList().stream().map(this::convertTemplateRespVO).collect(Collectors.toList()), + pageResult.getList().stream() + .map(do0 -> BeanUtils.toBean(do0, MesQcTemplateRespVO.class)) + .collect(Collectors.toList()), pageResult.getTotal() ); } @@ -152,47 +148,12 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService { return templateMapper.selectByIds(ids); } - /** - * DO → RespVO:转换 types(String → List)和 enableFlag(Y/N → Boolean) - */ - private MesQcTemplateRespVO convertTemplateRespVO(MesQcTemplateDO do0) { - MesQcTemplateRespVO vo = BeanUtils.toBean(do0, MesQcTemplateRespVO.class); - vo.setTypes(convertTypesToList(do0.getTypes())); - vo.setEnableFlag("Y".equals(do0.getEnableFlag())); - return vo; - } - - /** - * List → 逗号分隔字符串(如 [1,3] → "1,3") - */ - private String convertTypesToString(List types) { - if (CollUtil.isEmpty(types)) { - return null; - } - return types.stream().map(String::valueOf).collect(Collectors.joining(",")); - } - - /** - * 逗号分隔字符串 → List(如 "1,3" → [1,3]) - */ - private List convertTypesToList(String types) { - if (StrUtil.isBlank(types)) { - return Collections.emptyList(); - } - return Arrays.stream(types.split(",")) - .map(String::trim) - .filter(StrUtil::isNotBlank) - .map(Integer::parseInt) - .collect(Collectors.toList()); - } - // ========== 质检方案-检测指标项 ========== @Override public Long createTemplateIndicator(MesQcTemplateIndicatorSaveReqVO createReqVO) { // 校验方案存在 validateTemplateExists(createReqVO.getTemplateId()); - // 插入 MesQcTemplateIndicatorDO indicator = BeanUtils.toBean(createReqVO, MesQcTemplateIndicatorDO.class); templateIndicatorMapper.insert(indicator); @@ -203,7 +164,6 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService { public void updateTemplateIndicator(MesQcTemplateIndicatorSaveReqVO updateReqVO) { // 校验存在 validateTemplateIndicatorExists(updateReqVO.getId()); - // 更新 MesQcTemplateIndicatorDO updateObj = BeanUtils.toBean(updateReqVO, MesQcTemplateIndicatorDO.class); templateIndicatorMapper.updateById(updateObj); @@ -242,10 +202,11 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService { } /** - * DO → RespVO:JOIN mes_qc_indicator 补充检测项信息 + * DO → RespVO:JOIN mes_qc_indicator 补充检测项信息,JOIN mes_md_unit_measure 补充单位名称 */ private MesQcTemplateIndicatorRespVO convertIndicatorRespVO(MesQcTemplateIndicatorDO do0) { MesQcTemplateIndicatorRespVO vo = BeanUtils.toBean(do0, MesQcTemplateIndicatorRespVO.class); + // JOIN 质检指标 if (do0.getIndicatorId() != null) { MesQcIndicatorDO indicator = indicatorMapper.selectById(do0.getIndicatorId()); if (indicator != null) { @@ -255,6 +216,13 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService { vo.setIndicatorTool(indicator.getTool()); } } + // JOIN 计量单位 + if (do0.getUnitMeasureId() != null) { + MesMdUnitMeasureDO unit = unitMeasureMapper.selectById(do0.getUnitMeasureId()); + if (unit != null) { + vo.setUnitMeasureName(unit.getName()); + } + } return vo; } @@ -266,7 +234,6 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService { validateTemplateExists(createReqVO.getTemplateId()); // 校验产品在此方案中唯一 validateTemplateItemNotDuplicate(null, createReqVO.getTemplateId(), createReqVO.getItemId()); - // 插入 MesQcTemplateItemDO item = BeanUtils.toBean(createReqVO, MesQcTemplateItemDO.class); templateItemMapper.insert(item); @@ -279,7 +246,6 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService { validateTemplateItemExists(updateReqVO.getId()); // 校验产品在此方案中唯一 validateTemplateItemNotDuplicate(updateReqVO.getId(), updateReqVO.getTemplateId(), updateReqVO.getItemId()); - // 更新 MesQcTemplateItemDO updateObj = BeanUtils.toBean(updateReqVO, MesQcTemplateItemDO.class); templateItemMapper.updateById(updateObj);