Commit 9231dae783f875670d4b90b7f101ad1e28d5d410

Authored by YunaiV
1 parent 35b28b3c

feat(mes): 优化工作站模块,新增获取车间列表和车间 Map 方法,重构表单弹窗逻辑

yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java
... ... @@ -349,4 +349,27 @@ public class CollectionUtils {
349 349 return (LinkedHashSet<T>) toCollection(LinkedHashSet.class, elementType, value);
350 350 }
351 351  
  352 + public static boolean dfs(Long node, Map<Long, Set<Long>> graph) {
  353 + return dfs(node, graph, new HashSet<>(), new HashSet<>());
  354 + }
  355 +
  356 + private static boolean dfs(Long node, Map<Long, Set<Long>> graph, Set<Long> visited, Set<Long> inStack) {
  357 + if (inStack.contains(node)) {
  358 + return true;
  359 + }
  360 + if (visited.contains(node)) {
  361 + return false;
  362 + }
  363 + visited.add(node);
  364 + inStack.add(node);
  365 + Set<Long> neighbors = graph.getOrDefault(node, Collections.emptySet());
  366 + for (Long neighbor : neighbors) {
  367 + if (dfs(neighbor, graph, visited, inStack)) {
  368 + return true;
  369 + }
  370 + }
  371 + inStack.remove(node);
  372 + return false;
  373 + }
  374 +
352 375 }
353 376 \ No newline at end of file
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/workstation/MesMdWorkstationController.java
... ... @@ -30,6 +30,7 @@ import java.io.IOException;
30 30 import java.util.Collections;
31 31 import java.util.List;
32 32 import java.util.Map;
  33 +import java.util.Set;
33 34  
34 35 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
35 36 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
... ... @@ -110,14 +111,14 @@ public class MesMdWorkstationController {
110 111  
111 112 // ==================== 拼接 VO ====================
112 113  
  114 + @SuppressWarnings("CodeBlock2Expr")
113 115 private List<MesMdWorkstationRespVO> buildWorkstationRespVOList(List<MesMdWorkstationDO> list) {
114 116 if (CollUtil.isEmpty(list)) {
115 117 return Collections.emptyList();
116 118 }
117 119 // 1. 批量获取车间信息
118   - Map<Long, MesMdWorkshopDO> workshopMap = convertMap(
119   - workshopService.getWorkshopListByStatus(null),
120   - MesMdWorkshopDO::getId);
  120 + Map<Long, MesMdWorkshopDO> workshopMap = workshopService.getWorkshopMap(
  121 + convertSet(list, MesMdWorkstationDO::getWorkshopId));
121 122 // 2. 拼接 VO
122 123 return BeanUtils.toBean(list, MesMdWorkstationRespVO.class, vo -> {
123 124 MapUtils.findAndThen(workshopMap, vo.getWorkshopId(),
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/workstation/MesMdWorkshopDO.java
... ... @@ -40,14 +40,12 @@ public class MesMdWorkshopDO extends BaseDO {
40 40 * 面积(平方米)
41 41 */
42 42 private BigDecimal area;
43   - // DONE @AI:通过 @ 去关联
44 43 /**
45 44 * 负责人用户编号
46 45 *
47 46 * 关联 AdminUserDO 的 id
48 47 */
49 48 private Long chargeUserId;
50   - // DONE @AI:通过 @ 去关联
51 49 /**
52 50 * 状态
53 51 *
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/workstation/MesMdWorkstationDO.java
... ... @@ -38,28 +38,24 @@ public class MesMdWorkstationDO extends BaseDO {
38 38 * 工作站地点
39 39 */
40 40 private String address;
41   - // DONE @AI:通过 @ 去关联,按照别的模块
42 41 /**
43 42 * 所在车间编号
44 43 *
45 44 * 关联 {@link MesMdWorkshopDO#getId()}
46 45 */
47 46 private Long workshopId;
48   - // DONE @AI:通过 @ 去关联,按照别的模块
49 47 /**
50 48 * 工序编号
51 49 *
52 50 * TODO @芋艿:等 pro 模块,关联工序表
53 51 */
54 52 private Long processId;
55   - // DONE @AI:通过 @ 去关联,按照别的模块
56 53 /**
57 54 * 线边库编号
58 55 *
59 56 * TODO @芋艿:等 wm 模块,关联仓库表
60 57 */
61 58 private Long warehouseId;
62   - // DONE @AI:通过 @ 去关联,按照别的模块
63 59 /**
64 60 * 库区编号
65 61 *
... ... @@ -72,7 +68,6 @@ public class MesMdWorkstationDO extends BaseDO {
72 68 * TODO @芋艿:等 wm 模块,关联库位表
73 69 */
74 70 private Long areaId;
75   - // DONE @AI:通过 @ 去关联,按照别的模块
76 71 /**
77 72 * 状态
78 73 *
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/workstation/MesMdWorkstationMachineDO.java
... ... @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
6 6 import com.baomidou.mybatisplus.annotation.TableName;
7 7 import lombok.*;
8 8  
9   -// DONE @AI:设备资源表;已修正所有中文注释
10 9 /**
11 10 * MES 设备资源 DO
12 11 *
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/workstation/MesMdWorkstationToolDO.java
... ... @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
6 6 import com.baomidou.mybatisplus.annotation.TableName;
7 7 import lombok.*;
8 8  
9   -// DONE @AI:工装夹具资源表;已修正所有中文注释
10 9 /**
11 10 * MES 工装夹具资源 DO
12 11 *
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/workstation/MesMdWorkstationWorkerDO.java
... ... @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
6 6 import com.baomidou.mybatisplus.annotation.TableName;
7 7 import lombok.*;
8 8  
9   -// DONE @AI:人力资源表;已修正所有中文注释
10 9 /**
11 10 * MES 人力资源 DO
12 11 *
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomServiceImpl.java
1 1 package cn.iocoder.yudao.module.mes.service.md.item;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
4 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 6 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.bom.MesMdProductBomPageReqVO;
6 7 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.bom.MesMdProductBomSaveReqVO;
... ... @@ -92,6 +93,7 @@ public class MesMdProductBomServiceImpl implements MesMdProductBomService {
92 93 }
93 94 }
94 95  
  96 + // TODO @AI:hasXXXCycle 这样?
95 97 /**
96 98 * 检测新增边 (itemId -> bomItemId) 后,BOM 图是否存在闭环
97 99 *
... ... @@ -108,36 +110,14 @@ public class MesMdProductBomServiceImpl implements MesMdProductBomService {
108 110 // 1.3 添加待新增的边
109 111 graph.computeIfAbsent(itemId, k -> new HashSet<>()).add(bomItemId);
110 112 // 2. DFS 检测环
111   - Set<Long> visited = new HashSet<>();
112   - Set<Long> inStack = new HashSet<>();
113 113 for (Long node : graph.keySet()) {
114   - if (dfs(node, graph, visited, inStack)) {
  114 + if (CollectionUtils.dfs(node, graph)) {
115 115 return true;
116 116 }
117 117 }
118 118 return false;
119 119 }
120 120  
121   - // DONE @AI:dfs 为 BOM 环检测的私有方法,属于业务逻辑,保留在 ServiceImpl 中
122   - private boolean dfs(Long node, Map<Long, Set<Long>> graph, Set<Long> visited, Set<Long> inStack) {
123   - if (inStack.contains(node)) {
124   - return true;
125   - }
126   - if (visited.contains(node)) {
127   - return false;
128   - }
129   - visited.add(node);
130   - inStack.add(node);
131   - Set<Long> neighbors = graph.getOrDefault(node, Collections.emptySet());
132   - for (Long neighbor : neighbors) {
133   - if (dfs(neighbor, graph, visited, inStack)) {
134   - return true;
135   - }
136   - }
137   - inStack.remove(node);
138   - return false;
139   - }
140   -
141 121 @Override
142 122 public MesMdProductBomDO getProductBom(Long id) {
143 123 return productBomMapper.selectById(id);
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkshopService.java
... ... @@ -6,9 +6,12 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.workstation.vo.workshop.M
6 6 import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkshopDO;
7 7 import jakarta.validation.Valid;
8 8  
  9 +import java.util.Collection;
9 10 import java.util.List;
  11 +import java.util.Map;
  12 +
  13 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
10 14  
11   -// DONE @AI:方法注释
12 15 /**
13 16 * MES 车间 Service 接口
14 17 *
... ... @@ -55,6 +58,24 @@ public interface MesMdWorkshopService {
55 58 PageResult<MesMdWorkshopDO> getWorkshopPage(MesMdWorkshopPageReqVO pageReqVO);
56 59  
57 60 /**
  61 + * 获得车间列表
  62 + *
  63 + * @param ids 编号列表
  64 + * @return 车间列表
  65 + */
  66 + List<MesMdWorkshopDO> getWorkshopList(Collection<Long> ids);
  67 +
  68 + /**
  69 + * 获得车间 Map
  70 + *
  71 + * @param ids 编号列表
  72 + * @return 车间 Map
  73 + */
  74 + default Map<Long, MesMdWorkshopDO> getWorkshopMap(Collection<Long> ids) {
  75 + return convertMap(getWorkshopList(ids), MesMdWorkshopDO::getId);
  76 + }
  77 +
  78 + /**
58 79 * 获得指定状态的车间列表
59 80 *
60 81 * @param status 状态
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/workstation/MesMdWorkshopServiceImpl.java
... ... @@ -14,6 +14,7 @@ import org.springframework.context.annotation.Lazy;
14 14 import org.springframework.stereotype.Service;
15 15 import org.springframework.validation.annotation.Validated;
16 16  
  17 +import java.util.Collection;
17 18 import java.util.List;
18 19  
19 20 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
... ... @@ -113,6 +114,11 @@ public class MesMdWorkshopServiceImpl implements MesMdWorkshopService {
113 114 }
114 115  
115 116 @Override
  117 + public List<MesMdWorkshopDO> getWorkshopList(Collection<Long> ids) {
  118 + return workshopMapper.selectByIds(ids);
  119 + }
  120 +
  121 + @Override
116 122 public List<MesMdWorkshopDO> getWorkshopListByStatus(Integer status) {
117 123 return workshopMapper.selectListByStatus(status);
118 124 }
... ...