yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/MesProRouteProcessController.java
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process.MesProProcessBomItemVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process.MesProProcessOutputItemVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process.MesProRouteProcessRespVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process.MesProRouteProcessSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; @@ -146,48 +147,52 @@ list.forEach(item -> { if (item.getNextProcessId() != null) processIds.add(item.getNextProcessId()); }); Map<Long, MesProProcessDO> processMap = convertMap( processService.getProcessList(new ArrayList<>(processIds)), MesProProcessDO::getId); // 2. æ¹éè·å产åºäº§åç©æä¿¡æ¯ï¼è§£æéå·åéçåç¬¦ä¸²ï¼ Set<Long> allOutputItemIds = new HashSet<>(); Map<Long, List<Long>> voOutputItemIdsMap = new HashMap<>(); for (int i = 0; i < list.size(); i++) { String outputItemIdStr = list.get(i).getOutputItemId(); if (outputItemIdStr != null && !outputItemIdStr.isBlank()) { List<Long> ids = Arrays.stream(outputItemIdStr.split(",")) .map(String::trim).filter(s -> !s.isEmpty()) .map(Long::valueOf).collect(Collectors.toList()); voOutputItemIdsMap.put((long) i, ids); allOutputItemIds.addAll(ids); // 2. è§£æäº§åºé ç½®ï¼JSON æ°ç» æ æ§çéå·åéï¼ï¼æ¶éå ¨é¨ç©æ/产åç¼å· List<List<MesProProcessOutputItemVO>> outputsPerRow = new ArrayList<>(); Set<Long> allItemIds = new HashSet<>(); for (MesProRouteProcessDO row : list) { List<MesProProcessOutputItemVO> outs = parseOutputsRaw(row.getOutputItemId()); outputsPerRow.add(outs); for (MesProProcessOutputItemVO out : outs) { if (out.getItemId() != null) { allItemIds.add(out.getItemId()); } if (out.getProductId() != null) { allItemIds.add(out.getProductId()); } } } Map<Long, MesMdItemDO> outputItemMap = allOutputItemIds.isEmpty() ? Collections.emptyMap() : mdItemService.getItemMap(allOutputItemIds); // 3. æ¼æ¥ VO List<MesProRouteProcessRespVO> result = BeanUtils.toBean(list, MesProRouteProcessRespVO.class); Map<Long, MesMdItemDO> outputItemMap = allItemIds.isEmpty() ? Collections.emptyMap() : mdItemService.getItemMap(allItemIds); // 3. æ¼æ¥ VOï¼å æ output_item_id 置空ï¼é¿å String 转 Long æ NumberFormatExceptionï¼äº§åºåç¬å¡«å ï¼ List<MesProRouteProcessDO> safeList = BeanUtils.toBean(list, MesProRouteProcessDO.class); safeList.forEach(row -> row.setOutputItemId(null)); List<MesProRouteProcessRespVO> result = BeanUtils.toBean(safeList, MesProRouteProcessRespVO.class); for (int i = 0; i < result.size(); i++) { MesProRouteProcessRespVO vo = result.get(i); MapUtils.findAndThen(processMap, vo.getProcessId(), process -> vo.setProcessCode(process.getCode()).setProcessName(process.getName())); MapUtils.findAndThen(processMap, vo.getNextProcessId(), nextProcess -> vo.setNextProcessName(nextProcess.getName())); // 产åºäº§åï¼æ¯æå¤éï¼ List<Long> ids = voOutputItemIdsMap.getOrDefault((long) i, Collections.emptyList()); if (!ids.isEmpty()) { vo.setOutputItemIds(ids); List<String> names = ids.stream() .map(id -> { MesMdItemDO item = outputItemMap.get(id); return item != null ? item.getName() : String.valueOf(id); }).collect(Collectors.toList()); vo.setOutputItemNames(String.join(", ", names)); // ååå ¼å®¹ï¼ç¬¬ä¸ä¸ªäº§åºäº§å Long firstId = ids.get(0); vo.setOutputItemId(firstId); MesMdItemDO firstItem = outputItemMap.get(firstId); if (firstItem != null) { vo.setOutputItemCode(firstItem.getCode()); vo.setOutputItemName(firstItem.getName()); } // 产åºç©æï¼æ¯æå¤éï¼å«å½å±äº§åï¼ List<MesProProcessOutputItemVO> outs = outputsPerRow.get(i); for (MesProProcessOutputItemVO out : outs) { fillOutputItemInfo(out, outputItemMap); } if (!outs.isEmpty()) { List<Long> ids = outs.stream().map(MesProProcessOutputItemVO::getItemId) .filter(Objects::nonNull).collect(Collectors.toList()); vo.setOutputItemIds(ids); vo.setOutputItemNames(outs.stream().map(MesProProcessOutputItemVO::getItemName) .filter(Objects::nonNull).collect(Collectors.joining(", "))); // ååå ¼å®¹ï¼ç¬¬ä¸ä¸ªäº§åºç©æ MesProProcessOutputItemVO first = outs.get(0); vo.setOutputItemId(first.getItemId()); vo.setOutputItemCode(first.getItemCode()); vo.setOutputItemName(first.getItemName()); } // å端主ç¨ï¼outputsï¼å«å½å±äº§åï¼ vo.setOutputs(outs); } return result; } @@ -199,4 +204,73 @@ return buildRouteProcessRespVOList(ListUtil.of(routeProcess)).get(0); } /** * è§£æ output_item_id 为产åºé ç½®å表ï¼ä¸å«åç§°ï¼ * å ¼å®¹ JSON æ°ç» [{"itemId":231,"productId":231}] ä¸éå·åé "231,232" ä¸¤ç§æ ¼å¼ */ private List<MesProProcessOutputItemVO> parseOutputsRaw(String raw) { List<MesProProcessOutputItemVO> result = new ArrayList<>(); if (raw == null || raw.isBlank()) { return result; } String text = raw.trim(); if (text.startsWith("[")) { try { cn.hutool.json.JSONArray array = cn.hutool.json.JSONUtil.parseArray(text); for (Object element : array) { if (!(element instanceof cn.hutool.json.JSONObject)) { continue; } cn.hutool.json.JSONObject m = (cn.hutool.json.JSONObject) element; Long itemId = m.getLong("itemId"); if (itemId == null) { continue; } MesProProcessOutputItemVO vo = new MesProProcessOutputItemVO(); vo.setItemId(itemId); vo.setProductId(m.getLong("productId")); result.add(vo); } return result; } catch (Exception ignored) { // è§£æå¤±è´¥æéå·å åº result.clear(); } } for (String s : text.split(",")) { String t = s.trim(); if (t.isEmpty()) { continue; } try { MesProProcessOutputItemVO vo = new MesProProcessOutputItemVO(); vo.setItemId(Long.valueOf(t)); result.add(vo); } catch (NumberFormatException ignored) { // è·³è¿éæ³å¼ } } return result; } /** * å¡«å 产åºç©æçç¼ç ãåç§°ä¸å½å±äº§ååç§° */ private void fillOutputItemInfo(MesProProcessOutputItemVO vo, Map<Long, MesMdItemDO> itemMap) { if (vo.getItemId() == null) { return; } MesMdItemDO item = itemMap.get(vo.getItemId()); if (item != null) { vo.setItemCode(item.getCode()); vo.setItemName(item.getName()); } if (vo.getProductId() != null) { MesMdItemDO product = itemMap.get(vo.getProductId()); if (product != null) { vo.setProductName(product.getName()); } } } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProProcessOutputItemVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ package cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; /** * å·¥åºäº§åºç©æå½å± VO * * ä¸ä¸ªå·¥åºå¯ä»¥äº§åºå¤ä¸ªç©æï¼æ¯ä¸ªç©æå¯å½å±å°æä¸ªäº§åï¼æãéç¨ãï¼ã * ä¸å端 RouteOutputAttribution ç»ä»¶ç { itemId, productId } ç»æå¯¹åºã */ @Schema(description = "å·¥åºäº§åºç©æå½å± VO") @Data public class MesProProcessOutputItemVO { @Schema(description = "产åºç©æç¼å·", example = "231") private Long itemId; @Schema(description = "产åºç©æç¼ç ", example = "ITEM_20261102008") private String itemCode; @Schema(description = "产åºç©æåç§°", example = "é¢ç»çº¿") private String itemName; @Schema(description = "å½å±äº§åç¼å·ï¼ä¸ºç©ºè¡¨ç¤ºå¤äº§åéç¨", example = "231") private Long productId; @Schema(description = "å½å±äº§ååç§°") private String productName; @Schema(description = "æåº", example = "1") private Integer sort; @Schema(description = "夿³¨") private String remark; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessRespVO.java
@@ -83,6 +83,9 @@ @Schema(description = "å·¥åºææBOMå表") private List<MesProProcessBomItemVO> bomItems; @Schema(description = "产åºç©æå½å±é ç½®ï¼å«å½å±äº§åï¼") private List<MesProProcessOutputItemVO> outputs; @Schema(description = "å建æ¶é´") private LocalDateTime createTime; yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessSaveReqVO.java
@@ -54,6 +54,9 @@ @Schema(description = "产åºäº§åç©æç¼å·å表ï¼å¤éï¼ä¸ºç©ºæ¶é»è®¤ç¨å·¥åæåï¼", example = "[100, 101]") private List<Long> outputItemIds; @Schema(description = "产åºç©æå½å±é ç½®ï¼å«å½å±äº§åï¼å端主ç¨ï¼") private List<MesProProcessOutputItemVO> outputs; @Schema(description = "夿³¨") private String remark; yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java
@@ -30,6 +30,7 @@ import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.util.MesOutputItemUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -251,7 +252,11 @@ items.add(bom); } } processBomMap.put(Long.valueOf(process.getOutputItemId().split(",")[0].trim()), items); Long outputItemId = MesOutputItemUtils.firstItemId(process.getOutputItemId()); if (outputItemId == null) { continue; } processBomMap.put(outputItemId, items); } // 2. åæåä¸éå·¥åºï¼sort æå¤§ï¼ä½ä¸ºå±å¼èµ·ç¹ï¼éå±åå鿍 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderProcessController.java
@@ -18,6 +18,7 @@ import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService; import cn.iocoder.yudao.module.mes.util.MesOutputItemUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -135,15 +136,12 @@ processIds.addAll(nextProcessIds); Map<Long, MesProProcessDO> processMap = CollUtil.isNotEmpty(processIds) ? processService.getProcessMap(processIds) : Collections.emptyMap(); // è·å产åºç©æï¼è§£æéå·åéçåç¬¦ä¸²ï¼ // è·å产åºç©æï¼å ¼å®¹ JSON å½å±é ç½®ä¸æ§éå·åéæ ¼å¼ï¼ Set<Long> allOutputItemIds = new HashSet<>(); Map<Long, List<Long>> voOutputItemIdsMap = new HashMap<>(); for (int i = 0; i < list.size(); i++) { String outputItemIdStr = list.get(i).getOutputItemId(); if (outputItemIdStr != null && !outputItemIdStr.isBlank()) { List<Long> ids = Arrays.stream(outputItemIdStr.split(",")) .map(String::trim).filter(s -> !s.isEmpty()) .map(Long::valueOf).collect(Collectors.toList()); List<Long> ids = MesOutputItemUtils.parseItemIds(list.get(i).getOutputItemId()); if (!ids.isEmpty()) { voOutputItemIdsMap.put((long) i, ids); allOutputItemIds.addAll(ids); } @@ -175,8 +173,10 @@ }); })); // 3. æ¼æ¥ VO List<MesProWorkOrderProcessRespVO> result = BeanUtils.toBean(list, MesProWorkOrderProcessRespVO.class); // 3. æ¼æ¥ VOï¼å 置空 output_item_idï¼é¿å String 转 Long å¼å¸¸ï¼äº§åºä¸é¢åç¬å¡«å ï¼ List<MesProWorkOrderProcessDO> safeList = BeanUtils.toBean(list, MesProWorkOrderProcessDO.class); safeList.forEach(row -> row.setOutputItemId(null)); List<MesProWorkOrderProcessRespVO> result = BeanUtils.toBean(safeList, MesProWorkOrderProcessRespVO.class); for (int i = 0; i < result.size(); i++) { MesProWorkOrderProcessRespVO vo = result.get(i); MapUtils.findAndThen(processMap, vo.getProcessId(), process -> { yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
@@ -30,6 +30,7 @@ import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService; import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessSaveReqVO; import cn.iocoder.yudao.module.mes.util.MesOutputItemUtils; import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -576,9 +577,7 @@ process.setCheckFlag(rp.getCheckFlag()); process.setBackflushFlag(rp.getBackflushFlag()); if (rp.getOutputItemId() != null && !rp.getOutputItemId().isBlank()) { process.setOutputItemIds(Arrays.stream(rp.getOutputItemId().split(",")) .map(String::trim).filter(s -> !s.isEmpty()) .map(Long::valueOf).collect(Collectors.toList())); process.setOutputItemIds(MesOutputItemUtils.parseItemIds(rp.getOutputItemId())); } process.setColorCode(rp.getColorCode()); // å¸¦å ¥å·¥åºææBOM yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java
@@ -2,6 +2,7 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process.MesProProcessOutputItemVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process.MesProRouteProcessSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductBomDO; @@ -14,9 +15,11 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -63,12 +66,8 @@ // 2. æå ¥ MesProRouteProcessDO routeProcess = BeanUtils.toBean(createReqVO, MesProRouteProcessDO.class); if (CollUtil.isNotEmpty(createReqVO.getOutputItemIds())) { routeProcess.setOutputItemId( createReqVO.getOutputItemIds().stream() .map(String::valueOf) .collect(Collectors.joining(","))); } // 产åºé ç½®ï¼å«å½å±äº§åï¼åºåå为 JSON åå ¥ output_item_idï¼å ¼å®¹æ§ç outputItemIds å¹³éºæ ¼å¼ routeProcess.setOutputItemId(serializeOutputs(createReqVO.getOutputs(), createReqVO.getOutputItemIds())); routeProcessMapper.insert(routeProcess); // 3. æ´æ°å·¥åºé¾ @@ -98,11 +97,10 @@ // 2. æ´æ° MesProRouteProcessDO updateObj = BeanUtils.toBean(updateReqVO, MesProRouteProcessDO.class); if (CollUtil.isNotEmpty(updateReqVO.getOutputItemIds())) { updateObj.setOutputItemId( updateReqVO.getOutputItemIds().stream() .map(String::valueOf) .collect(Collectors.joining(","))); // 产åºé ç½®ï¼åªè¦å端æ¾å¼ä¼ äº outputs / outputItemIds å°±è¦çï¼ä¼ 空æ°ç»è¡¨ç¤ºæ¸ ç©ºï¼ if (updateReqVO.getOutputs() != null || updateReqVO.getOutputItemIds() != null) { String serialized = serializeOutputs(updateReqVO.getOutputs(), updateReqVO.getOutputItemIds()); updateObj.setOutputItemId(serialized == null ? "" : serialized); } routeProcessMapper.updateById(updateObj); @@ -245,4 +243,38 @@ routeProcessMapper.deleteByRouteId(routeId); } /** * 产åºé ç½®åºååå° output_item_id åæ®µï¼JSON æ°ç»ï¼ * æ ¼å¼ï¼[{"itemId":231,"productId":231}] */ private String serializeOutputs(List<MesProProcessOutputItemVO> outputs, List<Long> outputItemIds) { List<Map<String, Object>> list = new ArrayList<>(); if (CollUtil.isNotEmpty(outputs)) { for (MesProProcessOutputItemVO vo : outputs) { if (vo == null || vo.getItemId() == null) { continue; } Map<String, Object> m = new LinkedHashMap<>(); m.put("itemId", vo.getItemId()); if (vo.getProductId() != null) { m.put("productId", vo.getProductId()); } list.add(m); } } else if (CollUtil.isNotEmpty(outputItemIds)) { for (Long id : outputItemIds) { if (id == null) { continue; } Map<String, Object> m = new LinkedHashMap<>(); m.put("itemId", id); list.add(m); } } if (list.isEmpty()) { return null; } return cn.hutool.json.JSONUtil.toJsonStr(list); } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
@@ -36,6 +36,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderParamRecordService; import cn.iocoder.yudao.module.mes.util.MesOutputItemUtils; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -151,8 +152,9 @@ MesProRouteProcessDO routeProcess = routeProcessService .getRouteProcessByRouteIdAndProcessId(createReqVO.getRouteId(), createReqVO.getProcessId()); if (routeProcess != null && routeProcess.getOutputItemId() != null) { itemId = Long.valueOf(routeProcess.getOutputItemId().split(",")[0].trim()); } else { itemId = MesOutputItemUtils.firstItemId(routeProcess.getOutputItemId()); } if (itemId == null) { itemId = workOrder.getProductId(); } } @@ -563,7 +565,8 @@ List<Long> taskIds = new java.util.ArrayList<>(); for (MesProRouteProcessDO rp : routeProcesses) { cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO proc = procMap.get(rp.getProcessId()); Long itemId = rp.getOutputItemId() != null ? Long.valueOf(rp.getOutputItemId().split(",")[0].trim()) : workOrder.getProductId(); Long outputItemId = rp.getOutputItemId() != null ? MesOutputItemUtils.firstItemId(rp.getOutputItemId()) : null; Long itemId = outputItemId != null ? outputItemId : workOrder.getProductId(); cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO item = itemService.validateItemExists(itemId); MesProTaskDO task = new MesProTaskDO() .setWorkOrderId(workOrder.getId()) yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/schedule/MesProBatchScheduleService.java
@@ -22,6 +22,7 @@ import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService; import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; import cn.iocoder.yudao.module.mes.service.cal.holiday.MesCalHolidayService; import cn.iocoder.yudao.module.mes.util.MesOutputItemUtils; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -252,9 +253,9 @@ } Long itemId = order.getProductId(); if (process.getOutputItemId() != null && !process.getOutputItemId().isBlank()) { String[] output = process.getOutputItemId().split(","); if (output.length != 1) throw new IllegalArgumentException("å¤äº§åºå·¥åºè¯·ä½¿ç¨æå·¥æäº§ç¡®è®¤åäº§åºæ°é"); itemId = Long.valueOf(output[0].trim()); List<Long> outputIds = MesOutputItemUtils.parseItemIds(process.getOutputItemId()); if (outputIds.size() != 1) throw new IllegalArgumentException("å¤äº§åºå·¥åºè¯·ä½¿ç¨æå·¥æäº§ç¡®è®¤åäº§åºæ°é"); itemId = outputIds.get(0); } var item = itemService.validateItemExists(itemId); if (!Objects.equals(item.getStatus(), 0)) throw new IllegalArgumentException("å·¥åºäº§åºäº§åå·²åç¨"); yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/util/MesOutputItemUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,77 @@ package cn.iocoder.yudao.module.mes.util; import cn.hutool.core.collection.CollUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import java.util.ArrayList; import java.util.List; /** * MES å·¥åºäº§åºç©æé 置解æå·¥å · * * <p>mes_pro_route_process.output_item_id / mes_pro_work_order_process.output_item_id åæ®µ * åæ¶å ¼å®¹ä¸¤ç§å卿 ¼å¼ï¼ * <ul> * <li>æ°æ ¼å¼ï¼å«å½å±äº§åï¼ï¼[{"itemId":231,"productId":231}]</li> * <li>æ§æ ¼å¼ï¼çº¯ç©æç¼å·ï¼éå·åéï¼ï¼231,232</li> * </ul> * * @author è¶ çº§ç®¡çå */ public class MesOutputItemUtils { private MesOutputItemUtils() { } /** * è§£æå段ä¸çå ¨é¨äº§åºç©æç¼å·ï¼ä¸å«å½å±äº§åï¼ */ public static List<Long> parseItemIds(String raw) { List<Long> ids = new ArrayList<>(); if (raw == null || raw.isBlank()) { return ids; } String text = raw.trim(); if (text.startsWith("[")) { try { JSONArray array = JSONUtil.parseArray(text); for (Object element : array) { if (!(element instanceof JSONObject)) { continue; } Long itemId = ((JSONObject) element).getLong("itemId"); if (itemId != null) { ids.add(itemId); } } return ids; } catch (Exception ignored) { // è§£æå¤±è´¥æéå·åéå åº ids.clear(); } } for (String s : text.split(",")) { String t = s.trim(); if (t.isEmpty()) { continue; } try { ids.add(Long.valueOf(t)); } catch (NumberFormatException ignored) { // è·³è¿éæ³å¼ } } return ids; } /** * å第ä¸ä¸ªäº§åºç©æç¼å·ï¼è§£æä¸å°è¿å null */ public static Long firstItemId(String raw) { List<Long> ids = parseItemIds(raw); return CollUtil.isEmpty(ids) ? null : ids.get(0); } }