liu
21 小时以前 381e02b9eccbe953b31d09f2af1c2ce77c816140
fix(mes): 隔离设备物料并支持销售产品映射
已添加1个文件
已修改5个文件
90 ■■■■■ 文件已修改
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemPageReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemRespVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImplTest.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java
@@ -81,6 +81,14 @@
        return success(buildItemVO(item));
    }
    @GetMapping("/get-by-mdm-item-id")
    @Operation(summary = "根据 MDM ç‰©æ–™ç¼–号获得 MES ç‰©æ–™äº§å“")
    @Parameter(name = "mdmItemId", description = "MDM ç‰©æ–™ç¼–号", required = true, example = "1024")
    public CommonResult<MesMdItemRespVO> getItemByMdmItemId(@RequestParam("mdmItemId") Long mdmItemId) {
        MesMdItemDO item = itemService.getItemByMdmItemId(mdmItemId);
        return success(buildItemVO(item));
    }
    @GetMapping("/page")
    @Operation(summary = "获得物料产品分页")
    public CommonResult<PageResult<MesMdItemRespVO>> getItemPage(@Valid MesMdItemPageReqVO pageReqVO) {
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemPageReqVO.java
@@ -30,6 +30,9 @@
    @Schema(description = "物料分类编号", example = "1")
    private Long itemTypeId;
    @Schema(description = "排除的物料分类编码(同时排除其子分类)", example = "EQUIPMENT")
    private String excludeItemTypeCode;
    @Schema(description = "状态", example = "0")
    private Integer status;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemRespVO.java
@@ -20,6 +20,9 @@
    @ExcelProperty("物料编号")
    private Long id;
    @Schema(description = "MDM ç‰©æ–™ç¼–号", example = "1024")
    private Long mdmItemId;
    /** æŽ’序,数值越小越靠前 */
    private Integer sort;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java
@@ -26,14 +26,19 @@
@Mapper
public interface MesMdItemMapper extends BaseMapperX<MesMdItemDO> {
    default PageResult<MesMdItemDO> selectPage(MesMdItemPageReqVO reqVO, Collection<Long> itemTypeIds) {
        return selectPage(reqVO, new LambdaQueryWrapperX<MesMdItemDO>()
    default PageResult<MesMdItemDO> selectPage(MesMdItemPageReqVO reqVO, Collection<Long> itemTypeIds,
                                               Collection<Long> excludedItemTypeIds) {
        LambdaQueryWrapperX<MesMdItemDO> query = new LambdaQueryWrapperX<MesMdItemDO>()
                .inIfPresent(MesMdItemDO::getId, reqVO.getIds())
                .likeIfPresent(MesMdItemDO::getCode, reqVO.getCode())
                .likeIfPresent(MesMdItemDO::getName, reqVO.getName())
                .inIfPresent(MesMdItemDO::getItemTypeId, itemTypeIds)
                .eqIfPresent(MesMdItemDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(MesMdItemDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(MesMdItemDO::getCreateTime, reqVO.getCreateTime());
        if (CollUtil.isNotEmpty(excludedItemTypeIds)) {
            query.notIn(MesMdItemDO::getItemTypeId, excludedItemTypeIds);
        }
        return selectPage(reqVO, query
                .orderByAsc(MesMdItemDO::getSort)
                .orderByDesc(MesMdItemDO::getId));
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java
@@ -2,6 +2,7 @@
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.md.item.vo.MesMdItemPageReqVO;
@@ -290,8 +291,19 @@
            List<MesMdItemTypeDO> children = itemTypeService.getItemTypeChildrenList(pageReqVO.getItemTypeId());
            itemTypeIds.addAll(convertSet(children, MesMdItemTypeDO::getId));
        }
        // ç”Ÿäº§ç‰©æ–™ç®¡ç†ç­‰é¡µé¢å¯æŒ‰åˆ†ç±»ç¼–码排除设备及其子分类;底层设备主数据仍保留给设备仓和库存流水使用。
        Set<Long> excludedItemTypeIds = null;
        if (StrUtil.isNotBlank(pageReqVO.getExcludeItemTypeCode())) {
            MesMdItemTypeDO excludedType = itemTypeService.getItemTypeByCode(pageReqVO.getExcludeItemTypeCode());
            if (excludedType != null) {
                excludedItemTypeIds = new HashSet<>();
                excludedItemTypeIds.add(excludedType.getId());
                List<MesMdItemTypeDO> children = itemTypeService.getItemTypeChildrenList(excludedType.getId());
                excludedItemTypeIds.addAll(convertSet(children, MesMdItemTypeDO::getId));
            }
        }
        // åˆ†é¡µæŸ¥è¯¢
        return itemMapper.selectPage(pageReqVO, itemTypeIds);
        return itemMapper.selectPage(pageReqVO, itemTypeIds, excludedItemTypeIds);
    }
    @Override
@@ -419,4 +431,4 @@
        return item;
    }
}
}
yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImplTest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package cn.iocoder.yudao.module.mes.service.md.item;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemPageReqVO;
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.mysql.md.item.MesMdItemMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.List;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class MesMdItemServiceImplTest {
    @InjectMocks
    private MesMdItemServiceImpl itemService;
    @Mock
    private MesMdItemMapper itemMapper;
    @Mock
    private MesMdItemTypeService itemTypeService;
    @Test
    void getItemPage_excludesEquipmentAndItsChildren() {
        MesMdItemPageReqVO reqVO = new MesMdItemPageReqVO();
        reqVO.setExcludeItemTypeCode("EQUIPMENT");
        MesMdItemTypeDO equipment = new MesMdItemTypeDO().setId(100L).setCode("EQUIPMENT");
        MesMdItemTypeDO equipmentChild = new MesMdItemTypeDO().setId(101L).setParentId(100L);
        PageResult<MesMdItemDO> expected = new PageResult<>(List.of(), 0L);
        when(itemTypeService.getItemTypeByCode("EQUIPMENT")).thenReturn(equipment);
        when(itemTypeService.getItemTypeChildrenList(100L)).thenReturn(List.of(equipmentChild));
        when(itemMapper.selectPage(reqVO, null, Set.of(100L, 101L))).thenReturn(expected);
        PageResult<MesMdItemDO> result = itemService.getItemPage(reqVO);
        assertSame(expected, result);
        verify(itemMapper).selectPage(reqVO, null, Set.of(100L, 101L));
    }
}