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,4 +349,27 @@ public class CollectionUtils {
349 return (LinkedHashSet<T>) toCollection(LinkedHashSet.class, elementType, value); 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 \ No newline at end of file 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,6 +30,7 @@ import java.io.IOException;
30 import java.util.Collections; 30 import java.util.Collections;
31 import java.util.List; 31 import java.util.List;
32 import java.util.Map; 32 import java.util.Map;
  33 +import java.util.Set;
33 34
34 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; 35 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
35 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 36 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -110,14 +111,14 @@ public class MesMdWorkstationController { @@ -110,14 +111,14 @@ public class MesMdWorkstationController {
110 111
111 // ==================== 拼接 VO ==================== 112 // ==================== 拼接 VO ====================
112 113
  114 + @SuppressWarnings("CodeBlock2Expr")
113 private List<MesMdWorkstationRespVO> buildWorkstationRespVOList(List<MesMdWorkstationDO> list) { 115 private List<MesMdWorkstationRespVO> buildWorkstationRespVOList(List<MesMdWorkstationDO> list) {
114 if (CollUtil.isEmpty(list)) { 116 if (CollUtil.isEmpty(list)) {
115 return Collections.emptyList(); 117 return Collections.emptyList();
116 } 118 }
117 // 1. 批量获取车间信息 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 // 2. 拼接 VO 122 // 2. 拼接 VO
122 return BeanUtils.toBean(list, MesMdWorkstationRespVO.class, vo -> { 123 return BeanUtils.toBean(list, MesMdWorkstationRespVO.class, vo -> {
123 MapUtils.findAndThen(workshopMap, vo.getWorkshopId(), 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,14 +40,12 @@ public class MesMdWorkshopDO extends BaseDO {
40 * 面积(平方米) 40 * 面积(平方米)
41 */ 41 */
42 private BigDecimal area; 42 private BigDecimal area;
43 - // DONE @AI:通过 @ 去关联  
44 /** 43 /**
45 * 负责人用户编号 44 * 负责人用户编号
46 * 45 *
47 * 关联 AdminUserDO 的 id 46 * 关联 AdminUserDO 的 id
48 */ 47 */
49 private Long chargeUserId; 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,28 +38,24 @@ public class MesMdWorkstationDO extends BaseDO {
38 * 工作站地点 38 * 工作站地点
39 */ 39 */
40 private String address; 40 private String address;
41 - // DONE @AI:通过 @ 去关联,按照别的模块  
42 /** 41 /**
43 * 所在车间编号 42 * 所在车间编号
44 * 43 *
45 * 关联 {@link MesMdWorkshopDO#getId()} 44 * 关联 {@link MesMdWorkshopDO#getId()}
46 */ 45 */
47 private Long workshopId; 46 private Long workshopId;
48 - // DONE @AI:通过 @ 去关联,按照别的模块  
49 /** 47 /**
50 * 工序编号 48 * 工序编号
51 * 49 *
52 * TODO @芋艿:等 pro 模块,关联工序表 50 * TODO @芋艿:等 pro 模块,关联工序表
53 */ 51 */
54 private Long processId; 52 private Long processId;
55 - // DONE @AI:通过 @ 去关联,按照别的模块  
56 /** 53 /**
57 * 线边库编号 54 * 线边库编号
58 * 55 *
59 * TODO @芋艿:等 wm 模块,关联仓库表 56 * TODO @芋艿:等 wm 模块,关联仓库表
60 */ 57 */
61 private Long warehouseId; 58 private Long warehouseId;
62 - // DONE @AI:通过 @ 去关联,按照别的模块  
63 /** 59 /**
64 * 库区编号 60 * 库区编号
65 * 61 *
@@ -72,7 +68,6 @@ public class MesMdWorkstationDO extends BaseDO { @@ -72,7 +68,6 @@ public class MesMdWorkstationDO extends BaseDO {
72 * TODO @芋艿:等 wm 模块,关联库位表 68 * TODO @芋艿:等 wm 模块,关联库位表
73 */ 69 */
74 private Long areaId; 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,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
7 import lombok.*; 7 import lombok.*;
8 8
9 -// DONE @AI:设备资源表;已修正所有中文注释  
10 /** 9 /**
11 * MES 设备资源 DO 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,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
7 import lombok.*; 7 import lombok.*;
8 8
9 -// DONE @AI:工装夹具资源表;已修正所有中文注释  
10 /** 9 /**
11 * MES 工装夹具资源 DO 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,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
7 import lombok.*; 7 import lombok.*;
8 8
9 -// DONE @AI:人力资源表;已修正所有中文注释  
10 /** 9 /**
11 * MES 人力资源 DO 10 * MES 人力资源 DO
12 * 11 *
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomServiceImpl.java
1 package cn.iocoder.yudao.module.mes.service.md.item; 1 package cn.iocoder.yudao.module.mes.service.md.item;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.bom.MesMdProductBomPageReqVO; 6 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.bom.MesMdProductBomPageReqVO;
6 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.bom.MesMdProductBomSaveReqVO; 7 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.bom.MesMdProductBomSaveReqVO;
@@ -92,6 +93,7 @@ public class MesMdProductBomServiceImpl implements MesMdProductBomService { @@ -92,6 +93,7 @@ public class MesMdProductBomServiceImpl implements MesMdProductBomService {
92 } 93 }
93 } 94 }
94 95
  96 + // TODO @AI:hasXXXCycle 这样?
95 /** 97 /**
96 * 检测新增边 (itemId -> bomItemId) 后,BOM 图是否存在闭环 98 * 检测新增边 (itemId -> bomItemId) 后,BOM 图是否存在闭环
97 * 99 *
@@ -108,36 +110,14 @@ public class MesMdProductBomServiceImpl implements MesMdProductBomService { @@ -108,36 +110,14 @@ public class MesMdProductBomServiceImpl implements MesMdProductBomService {
108 // 1.3 添加待新增的边 110 // 1.3 添加待新增的边
109 graph.computeIfAbsent(itemId, k -> new HashSet<>()).add(bomItemId); 111 graph.computeIfAbsent(itemId, k -> new HashSet<>()).add(bomItemId);
110 // 2. DFS 检测环 112 // 2. DFS 检测环
111 - Set<Long> visited = new HashSet<>();  
112 - Set<Long> inStack = new HashSet<>();  
113 for (Long node : graph.keySet()) { 113 for (Long node : graph.keySet()) {
114 - if (dfs(node, graph, visited, inStack)) { 114 + if (CollectionUtils.dfs(node, graph)) {
115 return true; 115 return true;
116 } 116 }
117 } 117 }
118 return false; 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 @Override 121 @Override
142 public MesMdProductBomDO getProductBom(Long id) { 122 public MesMdProductBomDO getProductBom(Long id) {
143 return productBomMapper.selectById(id); 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,9 +6,12 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.workstation.vo.workshop.M
6 import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkshopDO; 6 import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkshopDO;
7 import jakarta.validation.Valid; 7 import jakarta.validation.Valid;
8 8
  9 +import java.util.Collection;
9 import java.util.List; 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 * MES 车间 Service 接口 16 * MES 车间 Service 接口
14 * 17 *
@@ -55,6 +58,24 @@ public interface MesMdWorkshopService { @@ -55,6 +58,24 @@ public interface MesMdWorkshopService {
55 PageResult<MesMdWorkshopDO> getWorkshopPage(MesMdWorkshopPageReqVO pageReqVO); 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 * @param status 状态 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,6 +14,7 @@ import org.springframework.context.annotation.Lazy;
14 import org.springframework.stereotype.Service; 14 import org.springframework.stereotype.Service;
15 import org.springframework.validation.annotation.Validated; 15 import org.springframework.validation.annotation.Validated;
16 16
  17 +import java.util.Collection;
17 import java.util.List; 18 import java.util.List;
18 19
19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 20 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -113,6 +114,11 @@ public class MesMdWorkshopServiceImpl implements MesMdWorkshopService { @@ -113,6 +114,11 @@ public class MesMdWorkshopServiceImpl implements MesMdWorkshopService {
113 } 114 }
114 115
115 @Override 116 @Override
  117 + public List<MesMdWorkshopDO> getWorkshopList(Collection<Long> ids) {
  118 + return workshopMapper.selectByIds(ids);
  119 + }
  120 +
  121 + @Override
116 public List<MesMdWorkshopDO> getWorkshopListByStatus(Integer status) { 122 public List<MesMdWorkshopDO> getWorkshopListByStatus(Integer status) {
117 return workshopMapper.selectListByStatus(status); 123 return workshopMapper.selectListByStatus(status);
118 } 124 }