Commit 4355a7a5f232a053d8a3e40ac01cfd1bc42c431e

Authored by YunaiV
1 parent 6ddbb294

review(mes):qc-template 的实现代码

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;
33 33 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
34 34 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
35 35  
  36 +// TODO @AI:拆分为多个 controller,和别的模块;
36 37 @Tag(name = "管理后台 - MES 质检方案")
37 38 @RestController
38 39 @RequestMapping("/mes/qc/template")
... ...
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 {
31 31 @ExcelProperty("标准值")
32 32 private BigDecimal standardValue;
33 33  
34   - @Schema(description = "单位", example = "mm")
35   - @ExcelProperty("单位")
36   - private String unit;
  34 + @Schema(description = "计量单位ID", example = "1")
  35 + private Long unitMeasureId;
37 36  
38 37 @Schema(description = "误差上限", example = "10.5000")
39 38 @ExcelProperty("误差上限")
... ... @@ -72,4 +71,10 @@ public class MesQcTemplateIndicatorRespVO {
72 71 @ExcelProperty("检测工具")
73 72 private String indicatorTool;
74 73  
  74 + // ========== JOIN mes_md_unit_measure ==========
  75 +
  76 + @Schema(description = "计量单位名称", example = "mm")
  77 + @ExcelProperty("单位")
  78 + private String unitMeasureName;
  79 +
75 80 }
... ...
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 {
17 17 @NotNull(message = "质检方案ID不能为空")
18 18 private Long templateId;
19 19  
20   - /**
21   - * TODO @芋艿:等 qc_indicator 完成后,改为选择器,此处改为 @NotNull 强校验
22   - */
23   - @Schema(description = "质检指标ID(关联 mes_qc_indicator)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
24   - @NotNull(message = "质检指标ID不能为空")
  20 + @Schema(description = "质检指标ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  21 + @NotNull(message = "质检指标不能为空")
25 22 private Long indicatorId;
26 23  
27   - @Schema(description = "检测方法/检测要求", example = "目视检查外观")
  24 + @Schema(description = "检测方法", example = "目视检查外观")
28 25 private String checkMethod;
29 26  
30 27 @Schema(description = "标准值", example = "10.0000")
31 28 private BigDecimal standardValue;
32 29  
33   - @Schema(description = "单位", example = "mm")
34   - private String unit;
  30 + @Schema(description = "计量单位ID", example = "1")
  31 + private Long unitMeasureId;
35 32  
36 33 @Schema(description = "误差上限", example = "10.5000")
37 34 private BigDecimal thresholdMax;
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateDO.java
1 1 package cn.iocoder.yudao.module.mes.dal.dataobject.qc;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.type.IntegerListTypeHandler;
  5 +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
4 6 import com.baomidou.mybatisplus.annotation.KeySequence;
  7 +import com.baomidou.mybatisplus.annotation.TableField;
5 8 import com.baomidou.mybatisplus.annotation.TableId;
6 9 import com.baomidou.mybatisplus.annotation.TableName;
7 10 import lombok.*;
8 11  
  12 +import java.util.List;
  13 +
9 14 /**
10 15 * MES 质检方案 DO
11 16 *
12 17 * @author 芋道源码
13 18 */
14   -@TableName("mes_qc_template")
  19 +@TableName(value = "mes_qc_template", autoResultMap = true)
15 20 @KeySequence("mes_qc_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
16 21 @Data
17 22 @EqualsAndHashCode(callSuper = true)
... ... @@ -34,20 +39,17 @@ public class MesQcTemplateDO extends BaseDO {
34 39 * 方案名称
35 40 */
36 41 private String name;
37   - // TODO @AI:List<Integer> types;以这个为主;然后 type int 1 - IQC、2 - IPQC、3 - OQC、4 - RQC;前端传过来逗号分隔的字符串,后端转换成 List<Integer> 存储到数据库中;查询时也是一样,数据库存储逗号分隔的字符串,后端转换成 List<Integer> 返回给前端。
38 42 /**
39   - * 检测种类(逗号分隔:IQC,IPQC,OQC,RQC)
  43 + * 检测种类
40 44 *
41   - * 字典类型 mes_qc_type
  45 + * 字典 {@link DictTypeConstants#MES_QC_TYPE}
42 46 */
43   - private String types;
44   - // TODO @AI:Boolean
  47 + @TableField(typeHandler = IntegerListTypeHandler.class)
  48 + private List<Integer> types;
45 49 /**
46   - * 是否启用(Y/N)
47   - *
48   - * 字典类型 sys_yes_no
  50 + * 是否启用
49 51 */
50   - private String enableFlag;
  52 + private Boolean enableFlag;
51 53 /**
52 54 * 备注
53 55 */
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateIndicatorDO.java
1 1 package cn.iocoder.yudao.module.mes.dal.dataobject.qc;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
4 5 import com.baomidou.mybatisplus.annotation.KeySequence;
5 6 import com.baomidou.mybatisplus.annotation.TableId;
6 7 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -28,31 +29,32 @@ public class MesQcTemplateIndicatorDO extends BaseDO {
28 29 */
29 30 @TableId
30 31 private Long id;
31   - // TODO @AI:关联字段
32 32 /**
33   - * 质检方案ID
  33 + * 质检方案编号
  34 + *
  35 + * 关联 {@link MesQcTemplateDO#getId()}
34 36 */
35 37 private Long templateId;
36   - // TODO @AI:关联字段
37 38 /**
38   - * 质检指标ID(关联 mes_qc_indicator,通过 JOIN 查询指标信息)
  39 + * 质检指标编号
39 40 *
40   - * TODO @芋艿:等 qc_indicator 完成后,完善关联查询和前端选择器
  41 + * 关联 {@link MesQcIndicatorDO#getId()}
41 42 */
42 43 private Long indicatorId;
43 44 /**
44   - * 检测方法/检测要求
  45 + * 检测方法
45 46 */
46 47 private String checkMethod;
47 48 /**
48 49 * 标准值
49 50 */
50 51 private BigDecimal standardValue;
51   - // TODO @AI:应该关联单位那个表;
52 52 /**
53   - * 单位
  53 + * 计量单位编号
  54 + *
  55 + * 关联 {@link MesMdUnitMeasureDO#getId()}
54 56 */
55   - private String unit;
  57 + private Long unitMeasureId;
56 58 /**
57 59 * 误差上限
58 60 */
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/MesQcTemplateItemDO.java
1 1 package cn.iocoder.yudao.module.mes.dal.dataobject.qc;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
4 5 import com.baomidou.mybatisplus.annotation.KeySequence;
5 6 import com.baomidou.mybatisplus.annotation.TableId;
6 7 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -28,14 +29,16 @@ public class MesQcTemplateItemDO extends BaseDO {
28 29 */
29 30 @TableId
30 31 private Long id;
31   - // TODO @AI:关联字段
32 32 /**
33   - * 质检方案ID
  33 + * 质检方案编号
  34 + *
  35 + * 关联 {@link MesQcTemplateDO#getId()}
34 36 */
35 37 private Long templateId;
36   - // TODO @AI:关联字段
37 38 /**
38   - * 产品物料ID(关联 mes_md_item,通过 ID 查询物料信息)
  39 + * 产品物料编号
  40 + *
  41 + * 关联 {@link MesMdItemDO#getId()}
39 42 */
40 43 private Long itemId;
41 44 /**
... ...
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&lt;MesQcTemplateDO&gt; {
22 22 .likeIfPresent(MesQcTemplateDO::getCode, reqVO.getCode())
23 23 .likeIfPresent(MesQcTemplateDO::getName, reqVO.getName())
24 24 .orderByDesc(MesQcTemplateDO::getId);
25   - // types: 取第一个值做 LIKE 匹配(简单实现,支持单值过滤)
26   - // TODO @AI:find in set;你看看 mybatisutils 有类似的;
  25 + // types: 用 FIND_IN_SET 精确匹配逗号分隔字段(取第一个值过滤)
  26 + // TODO @AI:MyBatisUtils 的 findInSet
27 27 if (reqVO.getTypes() != null && !reqVO.getTypes().isEmpty()) {
28   - query.like(MesQcTemplateDO::getTypes, String.valueOf(reqVO.getTypes().get(0)));
29   - }
30   - // TODO @AI:是不是里面就是 boolean
31   - // enableFlag: 转为 Y/N 已经改成 boolean 了,数据库里也是 boolean
32   - if (reqVO.getEnableFlag() != null) {
33   - query.eq(MesQcTemplateDO::getEnableFlag, Boolean.TRUE.equals(reqVO.getEnableFlag()) ? "Y" : "N");
  28 + query.apply("FIND_IN_SET({0}, types) > 0", reqVO.getTypes().get(0));
34 29 }
  30 + query.eqIfPresent(MesQcTemplateDO::getEnableFlag, reqVO.getEnableFlag());
35 31 return selectPage(reqVO, query);
36 32 }
37 33  
... ...
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;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.ObjUtil;
5   -import cn.hutool.core.util.StrUtil;
6 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
8 7 import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.MesQcTemplatePageReqVO;
... ... @@ -31,7 +30,6 @@ import org.springframework.stereotype.Service;
31 30 import org.springframework.transaction.annotation.Transactional;
32 31 import org.springframework.validation.annotation.Validated;
33 32  
34   -import java.util.Arrays;
35 33 import java.util.Collection;
36 34 import java.util.Collections;
37 35 import java.util.List;
... ... @@ -68,11 +66,8 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService {
68 66 public Long createTemplate(MesQcTemplateSaveReqVO createReqVO) {
69 67 // 校验编码唯一
70 68 validateTemplateCodeUnique(null, createReqVO.getCode());
71   -
72   - // 插入
  69 + // 插入(types 由 IntegerListTypeHandler 自动做 List↔逗号字符串转换,enableFlag Boolean↔bit 自动映射)
73 70 MesQcTemplateDO template = BeanUtils.toBean(createReqVO, MesQcTemplateDO.class);
74   - template.setTypes(convertTypesToString(createReqVO.getTypes()));
75   - template.setEnableFlag(Boolean.TRUE.equals(createReqVO.getEnableFlag()) ? "Y" : "N");
76 71 templateMapper.insert(template);
77 72 return template.getId();
78 73 }
... ... @@ -83,11 +78,8 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService {
83 78 validateTemplateExists(updateReqVO.getId());
84 79 // 校验编码唯一
85 80 validateTemplateCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
86   -
87 81 // 更新
88 82 MesQcTemplateDO updateObj = BeanUtils.toBean(updateReqVO, MesQcTemplateDO.class);
89   - updateObj.setTypes(convertTypesToString(updateReqVO.getTypes()));
90   - updateObj.setEnableFlag(Boolean.TRUE.equals(updateReqVO.getEnableFlag()) ? "Y" : "N");
91 83 templateMapper.updateById(updateObj);
92 84 }
93 85  
... ... @@ -96,7 +88,6 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService {
96 88 public void deleteTemplate(Long id) {
97 89 // 校验存在
98 90 validateTemplateExists(id);
99   -
100 91 // 删除主表
101 92 templateMapper.deleteById(id);
102 93 // 级联删除检测指标项
... ... @@ -121,20 +112,25 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService {
121 112 }
122 113 }
123 114  
  115 + // TODO @AI:返回 DO;交给 controller 拼接
124 116 @Override
125 117 public MesQcTemplateRespVO getTemplate(Long id) {
126 118 MesQcTemplateDO do0 = templateMapper.selectById(id);
127 119 if (do0 == null) {
128 120 return null;
129 121 }
130   - return convertTemplateRespVO(do0);
  122 + // types/enableFlag 由 TypeHandler/MyBatis-Plus 自动映射,直接 toBean 即可
  123 + return BeanUtils.toBean(do0, MesQcTemplateRespVO.class);
131 124 }
132 125  
  126 + // TODO @AI:返回 DO;交给 controller 拼接
133 127 @Override
134 128 public PageResult<MesQcTemplateRespVO> getTemplatePage(MesQcTemplatePageReqVO pageReqVO) {
135 129 PageResult<MesQcTemplateDO> pageResult = templateMapper.selectPage(pageReqVO);
136 130 return new PageResult<>(
137   - pageResult.getList().stream().map(this::convertTemplateRespVO).collect(Collectors.toList()),
  131 + pageResult.getList().stream()
  132 + .map(do0 -> BeanUtils.toBean(do0, MesQcTemplateRespVO.class))
  133 + .collect(Collectors.toList()),
138 134 pageResult.getTotal()
139 135 );
140 136 }
... ... @@ -152,47 +148,12 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService {
152 148 return templateMapper.selectByIds(ids);
153 149 }
154 150  
155   - /**
156   - * DO → RespVO:转换 types(String → List<Integer>)和 enableFlag(Y/N → Boolean)
157   - */
158   - private MesQcTemplateRespVO convertTemplateRespVO(MesQcTemplateDO do0) {
159   - MesQcTemplateRespVO vo = BeanUtils.toBean(do0, MesQcTemplateRespVO.class);
160   - vo.setTypes(convertTypesToList(do0.getTypes()));
161   - vo.setEnableFlag("Y".equals(do0.getEnableFlag()));
162   - return vo;
163   - }
164   -
165   - /**
166   - * List<Integer> → 逗号分隔字符串(如 [1,3] → "1,3")
167   - */
168   - private String convertTypesToString(List<Integer> types) {
169   - if (CollUtil.isEmpty(types)) {
170   - return null;
171   - }
172   - return types.stream().map(String::valueOf).collect(Collectors.joining(","));
173   - }
174   -
175   - /**
176   - * 逗号分隔字符串 → List<Integer>(如 "1,3" → [1,3])
177   - */
178   - private List<Integer> convertTypesToList(String types) {
179   - if (StrUtil.isBlank(types)) {
180   - return Collections.emptyList();
181   - }
182   - return Arrays.stream(types.split(","))
183   - .map(String::trim)
184   - .filter(StrUtil::isNotBlank)
185   - .map(Integer::parseInt)
186   - .collect(Collectors.toList());
187   - }
188   -
189 151 // ========== 质检方案-检测指标项 ==========
190 152  
191 153 @Override
192 154 public Long createTemplateIndicator(MesQcTemplateIndicatorSaveReqVO createReqVO) {
193 155 // 校验方案存在
194 156 validateTemplateExists(createReqVO.getTemplateId());
195   -
196 157 // 插入
197 158 MesQcTemplateIndicatorDO indicator = BeanUtils.toBean(createReqVO, MesQcTemplateIndicatorDO.class);
198 159 templateIndicatorMapper.insert(indicator);
... ... @@ -203,7 +164,6 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService {
203 164 public void updateTemplateIndicator(MesQcTemplateIndicatorSaveReqVO updateReqVO) {
204 165 // 校验存在
205 166 validateTemplateIndicatorExists(updateReqVO.getId());
206   -
207 167 // 更新
208 168 MesQcTemplateIndicatorDO updateObj = BeanUtils.toBean(updateReqVO, MesQcTemplateIndicatorDO.class);
209 169 templateIndicatorMapper.updateById(updateObj);
... ... @@ -242,10 +202,11 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService {
242 202 }
243 203  
244 204 /**
245   - * DO → RespVO:JOIN mes_qc_indicator 补充检测项信息
  205 + * DO → RespVO:JOIN mes_qc_indicator 补充检测项信息,JOIN mes_md_unit_measure 补充单位名称
246 206 */
247 207 private MesQcTemplateIndicatorRespVO convertIndicatorRespVO(MesQcTemplateIndicatorDO do0) {
248 208 MesQcTemplateIndicatorRespVO vo = BeanUtils.toBean(do0, MesQcTemplateIndicatorRespVO.class);
  209 + // JOIN 质检指标
249 210 if (do0.getIndicatorId() != null) {
250 211 MesQcIndicatorDO indicator = indicatorMapper.selectById(do0.getIndicatorId());
251 212 if (indicator != null) {
... ... @@ -255,6 +216,13 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService {
255 216 vo.setIndicatorTool(indicator.getTool());
256 217 }
257 218 }
  219 + // JOIN 计量单位
  220 + if (do0.getUnitMeasureId() != null) {
  221 + MesMdUnitMeasureDO unit = unitMeasureMapper.selectById(do0.getUnitMeasureId());
  222 + if (unit != null) {
  223 + vo.setUnitMeasureName(unit.getName());
  224 + }
  225 + }
258 226 return vo;
259 227 }
260 228  
... ... @@ -266,7 +234,6 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService {
266 234 validateTemplateExists(createReqVO.getTemplateId());
267 235 // 校验产品在此方案中唯一
268 236 validateTemplateItemNotDuplicate(null, createReqVO.getTemplateId(), createReqVO.getItemId());
269   -
270 237 // 插入
271 238 MesQcTemplateItemDO item = BeanUtils.toBean(createReqVO, MesQcTemplateItemDO.class);
272 239 templateItemMapper.insert(item);
... ... @@ -279,7 +246,6 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService {
279 246 validateTemplateItemExists(updateReqVO.getId());
280 247 // 校验产品在此方案中唯一
281 248 validateTemplateItemNotDuplicate(updateReqVO.getId(), updateReqVO.getTemplateId(), updateReqVO.getItemId());
282   -
283 249 // 更新
284 250 MesQcTemplateItemDO updateObj = BeanUtils.toBean(updateReqVO, MesQcTemplateItemDO.class);
285 251 templateItemMapper.updateById(updateObj);
... ...