diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderImport/OrderImportTempDataDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderImport/OrderImportTempDataDO.java index 0ed53adfe..62d2c5af8 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderImport/OrderImportTempDataDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderImport/OrderImportTempDataDO.java @@ -11,6 +11,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; +import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -200,6 +201,11 @@ public class OrderImportTempDataDO { */ private Double num; + /** + * 面积 + */ + private BigDecimal area; + /** * 创建时间 */ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderImport/handler/excel/DefaultExcelOrderImportHandler.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderImport/handler/excel/DefaultExcelOrderImportHandler.java index 7b250a3f7..eb5a7e5bc 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderImport/handler/excel/DefaultExcelOrderImportHandler.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderImport/handler/excel/DefaultExcelOrderImportHandler.java @@ -4,9 +4,6 @@ import com.alibaba.excel.EasyExcelFactory; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.mq.rabbitmq.constant.RabbitMqConstants; import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator; -import com.cf.imes.framework.redis.config.ChenfengCacheProperties; -import com.cf.imes.framework.redis.constants.RedisKeyConstants; -import com.cf.imes.framework.redis.util.RedisLockUtil; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderImportAsyncReqVO; import com.cf.imes.module.executor.dal.dataobject.orderImport.OrderImportTaskDO; import com.cf.imes.module.executor.dal.mysql.orderImport.OrderImportTaskMapper; @@ -31,9 +28,7 @@ import org.springframework.web.multipart.MultipartFile; import jakarta.annotation.Resource; import java.io.InputStream; -import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_FILE_ANALYZE_ERROR; -import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORGAN_LOCK_ERROR; /** * 默认excel生产单导入处理器 @@ -62,12 +57,6 @@ public class DefaultExcelOrderImportHandler implements AbstractExcelOrderImportH @Resource private DictDataApi dictDataApi; - @Resource - private RedisLockUtil redisLockUtil; - - @Resource - private ChenfengCacheProperties chenfengCacheProperties; - @Resource private PlateGoodMapper plateGoodMapper; @@ -81,12 +70,7 @@ public class DefaultExcelOrderImportHandler implements AbstractExcelOrderImportH public void prepareAndConvert(OrderImportAsyncReqVO importAsyncReqVO, MultipartFile file) { // 创建任务 Long taskId = createImportTask(file.getOriginalFilename()); - String importLockKey = String.format(RedisKeyConstants.ORDER_IMPORT_LOCK_KEY, getUserOrganId()); - // 检查机构导入锁 - boolean lockResult = redisLockUtil.acquireLock(importLockKey, String.valueOf(taskId), chenfengCacheProperties.getLockTimeout()); - if (!lockResult) { - throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR); - } + DefaultOrderImportExcelListener excelListener = new DefaultOrderImportExcelListener(orderImportTempDataMapper, orderService, dictDataApi, snowFlakeGenerator, plateGoodMapper, importAsyncReqVO.getOrderId(), taskId); @@ -94,13 +78,9 @@ public class DefaultExcelOrderImportHandler implements AbstractExcelOrderImportH // 读取excel EasyExcelFactory.read(inputStream, excelListener).headRowNumber(-1).sheet().doRead(); } catch (ServiceException sev) { - // 导入锁解锁 - redisLockUtil.releaseLock(importLockKey, taskId.toString()); throw sev; } catch (Exception e) { log.error(ORDER_IMPORT_FILE_ANALYZE_ERROR.getMsg(), e); - // 导入锁解锁 - redisLockUtil.releaseLock(importLockKey, taskId.toString()); throw new ServiceException(ORDER_IMPORT_FILE_ANALYZE_ERROR); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderImport/handler/xml/DefaultXmlOrderImportHandler.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderImport/handler/xml/DefaultXmlOrderImportHandler.java index 53c634b80..89f9bf484 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderImport/handler/xml/DefaultXmlOrderImportHandler.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderImport/handler/xml/DefaultXmlOrderImportHandler.java @@ -71,23 +71,14 @@ public class DefaultXmlOrderImportHandler implements AbstractXmlOrderImportHandl public void prepareAndConvert(OrderImportAsyncReqVO importAsyncReqVO, MultipartFile file) { // 创建任务 Long taskId = createImportTask(file.getOriginalFilename()); - String importLockKey = String.format(RedisKeyConstants.ORDER_IMPORT_LOCK_KEY, getUserOrganId()); - // 检查机构导入锁 - boolean lockResult = redisLockUtil.acquireLock(importLockKey, String.valueOf(taskId), chenfengCacheProperties.getLockTimeout()); - if (!lockResult) { - throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR); - } + try { DefaultOrderImportXmlParserHandler defaultOrderImportXmlParserHandler = new DefaultOrderImportXmlParserHandler(orderImportTempDataMapper, orderService, snowFlakeGenerator, plateGoodMapper, importAsyncReqVO.getOrderId(), taskId); defaultOrderImportXmlParserHandler.analyzeFile(file); } catch (ServiceException sev) { - // 导入锁解锁 - redisLockUtil.releaseLock(importLockKey, taskId.toString()); throw sev; } catch (Exception e) { log.error(ORDER_IMPORT_FILE_ANALYZE_ERROR.getMsg(), e); - // 导入锁解锁 - redisLockUtil.releaseLock(importLockKey, taskId.toString()); throw new ServiceException(ORDER_IMPORT_FILE_ANALYZE_ERROR); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/DefaultOrderImportExcelListener.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/DefaultOrderImportExcelListener.java index 1416cafb2..7931c813a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/DefaultOrderImportExcelListener.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/DefaultOrderImportExcelListener.java @@ -30,15 +30,14 @@ import com.cf.imes.module.executor.enums.OrderStatusEnum; import com.cf.imes.module.executor.enums.QuarrelEnum; import com.cf.imes.module.executor.service.order.OrderService; import com.cf.imes.module.executor.util.fileConversion.admin.ToolUtil; -import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.PlateXmlVO; import com.cf.imes.module.system.api.dict.DictDataApi; import com.cf.imes.module.system.api.dict.dto.DictDataRespDTO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import javax.xml.stream.Location; import java.lang.reflect.Field; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -536,8 +535,15 @@ public final class DefaultOrderImportExcelListener extends AnalysisEventListener } // 若商品类型为板材,需检查房间、柜体、板名称、成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边、排版面、纹路、开门方向不能为空 boolean isPlate = StringUtils.equals(vo.getGoodType(), "板材"); + BigDecimal area = null; if (isPlate) { checkPlate(vo); + + // 计算面积 + area = BigDecimal.valueOf(Double.parseDouble(vo.getGoodsWidth())) + .multiply(BigDecimal.valueOf(Double.parseDouble(vo.getGoodsHeight()))) + .movePointLeft(6) + .setScale(2, RoundingMode.HALF_UP); } // 校验通过生成临时表实体 @@ -568,6 +574,7 @@ public final class DefaultOrderImportExcelListener extends AnalysisEventListener .groupName(vo.getCombinationName()) .detail(JsonUtils.zipString(JSON.toJSONString(vo))) .num(Double.parseDouble(vo.getGoodsNumber())) + .area(area) .createTime(LocalDateTime.now()) .sort(sort++) .build(); @@ -631,7 +638,7 @@ public final class DefaultOrderImportExcelListener extends AnalysisEventListener } else { plateGoodDOs = plateGoodMapper.selectGood(plate.getMaterial(), plate.getColor(), BigDecimal.valueOf(Long.parseLong(plate.getThickness())), - plate.getBrand(), plate.getName(), OrganContextHolder.getOrganId()); + plate.getBrand(), plate.getGoodsName(), OrganContextHolder.getOrganId()); } if (CollUtil.isNotEmpty(plateGoodDOs)) { diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/DefaultOrderImportXmlParserHandler.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/DefaultOrderImportXmlParserHandler.java index 25b98247f..7bc130bea 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/DefaultOrderImportXmlParserHandler.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/DefaultOrderImportXmlParserHandler.java @@ -3,7 +3,6 @@ package com.cf.imes.module.executor.util.fileConversion.admin.files.xml; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.util.ListUtils; @@ -79,7 +78,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.function.Supplier; @@ -125,7 +123,7 @@ public class DefaultOrderImportXmlParserHandler { private Set groupCodeSet = new HashSet<>(); private Map roomMap = new HashMap<>(); private Map roomBodyMap = new HashMap<>(); - private Map existGoodsIdMap = new HashMap<>(); // 物料编码:已创建的innerGoodsId + private Map existGoodsMap = new HashMap<>(); // 物料编码:已创建的innerGoodsId /** * 补板用 @@ -370,6 +368,9 @@ public class DefaultOrderImportXmlParserHandler { case "Islet": endIslet(); break; + case "Plates": + endPlates(); + break; default: } } @@ -517,7 +518,7 @@ public class DefaultOrderImportXmlParserHandler { String roomName = roomXmlVO.getName(); // 缓存roomCode+bodyCode - String roomBodyKey = bodyCode + roomCode; + String roomBodyKey = roomCode + bodyCode; RoomBoxXmlVO roomBoxXmlVO = roomBodyMap.get(roomBodyKey); if (ObjectUtil.isNull(roomBoxXmlVO)) { roomBodyMap.put(roomBodyKey, boxXmlVO); @@ -628,14 +629,12 @@ public class DefaultOrderImportXmlParserHandler { // 相同的itemCode不重复创建临时Goods数据 String currentItemCode = plateXmlVO.getItemCode(); - Long existInnerGoodsId = existGoodsIdMap.get(currentItemCode); - if(ObjectUtil.isNull(existInnerGoodsId)) { - Long innerGoodsId = (Long) snowFlakeGenerator.nextId(null); - plateItemCode = String.valueOf(innerGoodsId); - existGoodsIdMap.put(currentItemCode, innerGoodsId); + OrderImportTempDataDO existInnerGoods = existGoodsMap.get(currentItemCode); + if(ObjectUtil.isNull(existInnerGoods)) { + plateItemCode = String.valueOf(snowFlakeGenerator.nextId(null)); - // 添加到临时表 - cachedDataList.add(OrderImportTempDataDO.builder() + // 暂存goods + OrderImportTempDataDO goods = OrderImportTempDataDO.builder() .id((Long) snowFlakeGenerator.nextId(null)) .orderId(orderId) .taskId(taskId) @@ -644,9 +643,12 @@ public class DefaultOrderImportXmlParserHandler { .createTime(LocalDateTime.now()) .detail(JsonUtils.zipString(JSON.toJSONString(plateXmlVO))) .sort(sort++) - .build()); + .num(0.0) + .area(BigDecimal.ZERO) + .build(); + existGoodsMap.put(plateItemCode, goods); } else { - plateItemCode = String.valueOf(existInnerGoodsId); + plateItemCode = existInnerGoods.getInnerGoodsId(); } } @@ -812,6 +814,16 @@ public class DefaultOrderImportXmlParserHandler { .sort(sort++) .build()); + // 累加板材下板件数量、面积 + OrderImportTempDataDO orderImportTempDataDO = existGoodsMap.get(plateItemCode); + if (orderImportTempDataDO != null) { + orderImportTempDataDO.setNum(orderImportTempDataDO.getNum() + 1); + Double length = changeUnit(blockXmlVO.getLength(), blockXmlVO.getUnit(), DictTypeConstants.UNIT_LENGTH); + Double width = changeUnit(blockXmlVO.getWidth(), blockXmlVO.getUnit(), DictTypeConstants.UNIT_LENGTH); + BigDecimal area = BigDecimal.valueOf((length / 1000) * (width / 1000)); + orderImportTempDataDO.setArea(orderImportTempDataDO.getArea().add(area)); + } + // 清空全局参数 points.clear(); } @@ -1430,6 +1442,15 @@ public class DefaultOrderImportXmlParserHandler { inIslet = false; } + /** + * Plates标签结束 + */ + private void endPlates() { + for (Map.Entry entry : existGoodsMap.entrySet()) { + cachedDataList.add(entry.getValue()); + } + } + /** * 解析关联配件 * @@ -1695,7 +1716,6 @@ public class DefaultOrderImportXmlParserHandler { // 板件列表存在柜体没有缓存的 if (ObjectUtil.isNull(roomBoxXmlVO)) { - // 检查roomCode if (!bodyEmpty) { throw ServiceExceptionUtil.exception(ORDER_IMPORT_BODYCODE_NOT_EXIST_VALID_ERROR, se, boxCode); @@ -1726,6 +1746,11 @@ public class DefaultOrderImportXmlParserHandler { .sort(sort++) .build()); + roomBodyMap.put(roomBodyKey, RoomBoxXmlVO.builder() + .code(roomCode) + .name(roomName) + .build()); + } // // 校验板件的房间、柜体、加工组编号 @@ -2065,4 +2090,18 @@ public class DefaultOrderImportXmlParserHandler { } } } + + /** + * 长度面积数值按单位转换 + * + * @param lengthStr + * @param unit + * @param type + * @return + */ + public Double changeUnit(String lengthStr, String unit, String type) { + String dictData = DictFrameworkUtils.parseDictDataValue(type, unit); + Double length = Double.parseDouble(lengthStr); + return length * Double.parseDouble(dictData); + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RoomBoxXmlVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RoomBoxXmlVO.java index b0f3288e5..9dc988a0f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RoomBoxXmlVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/xml/VO/RoomBoxXmlVO.java @@ -1,12 +1,14 @@ package com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data +@Builder @AllArgsConstructor @NoArgsConstructor public class RoomBoxXmlVO implements Serializable { diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTaskDO.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTaskDO.java index d4993bf91..0eb2f4dd0 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTaskDO.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTaskDO.java @@ -70,4 +70,9 @@ public class OrderImportTaskDO extends BaseDO { * 导入文件名称 */ private String fileName; + + /** + * 重试次数 + */ + private int retryCount; } diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTempDataDO.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTempDataDO.java index a584980fd..8e329affa 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTempDataDO.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTempDataDO.java @@ -12,6 +12,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; +import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -209,6 +210,11 @@ public class OrderImportTempDataDO { */ private Double num; + /** + * 面积 + */ + private BigDecimal area; + @TableField(exist = false) private int plateNum; diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTempDataGoodsGroupDO.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTempDataGoodsGroupDO.java index 47c9782f4..d2edc264d 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTempDataGoodsGroupDO.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/orderImport/OrderImportTempDataGoodsGroupDO.java @@ -131,4 +131,14 @@ public class OrderImportTempDataGoodsGroupDO implements Serializable { * 统计总数 */ private int count; + + /** + * 板材板件数量 + */ + private int goodsPlateNum; + + /** + * 板材板件面积 + */ + private Double goodsPlateArea; } diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/plate/PlateDO.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/plate/PlateDO.java index ab010cec4..fc6251200 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/plate/PlateDO.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/dal/dataobject/plate/PlateDO.java @@ -233,11 +233,13 @@ public class PlateDO extends BaseDO { /** * 是否二维刀路 */ + @TableField(value = "is_2v") private Boolean is2v; /** * 是否侧面二维刀路 */ + @TableField(value = "is_side_2v") private Boolean isSide2v; /** * 是否造型 diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/OrderImportTaskService.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/OrderImportTaskService.java index 1d8d462a4..54f3e653d 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/OrderImportTaskService.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/OrderImportTaskService.java @@ -1,5 +1,7 @@ package com.cf.imes.module.plan.service.orderImport; +import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTaskDO; + /** * @author Gqr * @since 2025/5/13 16:41 @@ -21,4 +23,12 @@ public interface OrderImportTaskService { * @param organId */ void updateExceptionTaskStatus(Long taskId, Long organId); + + /** + * 确认导入任务,更新任务状态 + * + * @param taskId + * @return + */ + OrderImportTaskDO confirmOrderImport(Long taskId); } diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/OrderImportTaskServiceImpl.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/OrderImportTaskServiceImpl.java index 0c2ed1853..e703d9981 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/OrderImportTaskServiceImpl.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/OrderImportTaskServiceImpl.java @@ -1,10 +1,12 @@ package com.cf.imes.module.plan.service.orderImport; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.cf.imes.module.executor.enums.OrderImportStatusEnum; import com.cf.imes.module.executor.enums.OrderImportTaskStatusEnum; import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTaskDO; import com.cf.imes.module.plan.dal.mysql.orderImport.OrderImportTaskMapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -18,6 +20,7 @@ import static com.cf.imes.module.plan.enums.ErrorCodeConstants.ORDER_IMPORT_FAIL * @since 2025/5/13 16:41 */ @Service +@Slf4j public class OrderImportTaskServiceImpl implements OrderImportTaskService { @Resource private OrderImportTaskMapper orderImportTaskMapper; @@ -41,4 +44,27 @@ public class OrderImportTaskServiceImpl implements OrderImportTaskService { .set(OrderImportTaskDO::getOrganId, organId) .set(OrderImportTaskDO::getResult, ORDER_IMPORT_FAIL.getMsg())); } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) + public OrderImportTaskDO confirmOrderImport(Long taskId) { + OrderImportTaskDO orderImportTaskDO = orderImportTaskMapper.selectById(taskId); + if (ObjectUtil.isNotNull(orderImportTaskDO)) { + // 更新状态为消创建接收成功 + orderImportTaskMapper.update(new LambdaUpdateWrapper().eq(OrderImportTaskDO::getId, taskId).set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CREATE_RECEIVE.getStatus())); + } else { + String taskNotExistNotify = String.format("%s不存在的导入任务,消费中止", taskId); + // 更新状态为消费成功,导入失败 + orderImportTaskMapper.update( + new LambdaUpdateWrapper() + .eq(OrderImportTaskDO::getId, taskId) + .set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CREATE_RECEIVE.getStatus()) + .set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_FAIL.getStatus()) + .set(OrderImportTaskDO::getResult, taskNotExistNotify) + .set(OrderImportTaskDO::getRetryCount, orderImportTaskDO.getRetryCount() + 1) + ); + log.error(String.format("====================【%s】====================", taskNotExistNotify)); + } + return orderImportTaskDO; + } } diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/consumer/DefaultExcelOrderImportConsumer.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/consumer/DefaultExcelOrderImportConsumer.java index 1349564e2..9bd88c2f7 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/consumer/DefaultExcelOrderImportConsumer.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/consumer/DefaultExcelOrderImportConsumer.java @@ -6,14 +6,16 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.cf.imes.framework.common.enums.OrderPackageStatusEnum; -import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; +import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd; +import com.cf.imes.framework.redis.config.ChenfengCacheProperties; import com.cf.imes.module.executor.enums.OrderStatusEnum; import com.cf.imes.module.plan.dal.mysql.orderParts.PartsMapper; import com.cf.imes.module.plan.dal.mysql.plate.PlateGoodMapper; import com.cf.imes.module.plan.service.customplateno.CustomPlateNoGenerateService; import com.cf.imes.module.plan.service.order.OrderInputProcessor; +import com.cf.imes.module.plan.service.orderImport.OrderImportTaskService; import com.cf.imes.module.plan.service.orderImport.factory.DefaultExcelOrderImportFactory; import com.cf.imes.framework.mq.rabbitmq.constant.RabbitMqConstants; import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator; @@ -46,11 +48,14 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import jakarta.annotation.Resource; + import java.time.LocalDate; import java.util.Objects; import java.util.Optional; +import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_NOT_EXISTS; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORGAN_LOCK_ERROR; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.ORDER_IMPORT_FAIL; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.ORDER_IMPORT_ORGANID_NOT_EXISTS; @@ -63,6 +68,8 @@ import static com.cf.imes.module.plan.enums.ErrorCodeConstants.ORDER_IMPORT_ORGA @Component @Slf4j public class DefaultExcelOrderImportConsumer { + @Resource + private OrderImportTaskService orderImportTaskService; @Resource private OrderImportTaskMapper orderImportTaskMapper; @@ -118,6 +125,9 @@ public class DefaultExcelOrderImportConsumer { @Resource private CustomPlateNoGenerateService customPlateNoGenerateService; + @Resource + private ChenfengCacheProperties chenfengCacheProperties; + @RabbitListener(queues = RabbitMqConstants.ORDER_IMPORT_DEFAULT_EXCEL_QUEUE) @DS("imes_prod") @Transactional(rollbackFor = Exception.class) @@ -125,13 +135,27 @@ public class DefaultExcelOrderImportConsumer { log.info("====================【生产单默认excel导入收到消息:{}】====================", message); Long organId = null; Long taskId = Long.parseLong(message); + boolean lockResult = true; + OrderImportTaskDO orderImportTaskDO = null; + try { + // 手动确认消息接收 + channel.basicAck(deliveryTag, false); + organId = OrganContextHolder.getOrganId(); if (ObjectUtil.isNull(organId)) { - throw ServiceExceptionUtil.exception(ORDER_IMPORT_ORGANID_NOT_EXISTS); + throw exception(ORDER_IMPORT_ORGANID_NOT_EXISTS); } + + // 检查机构导入锁 + String importLockKey = String.format(RedisKeyConstants.ORDER_IMPORT_LOCK_KEY, organId); + lockResult = redisLockUtil.acquireLock(importLockKey, String.valueOf(taskId), chenfengCacheProperties.getLockTimeout()); + if (!lockResult) { + throw exception(ORDER_IMPORT_ORGAN_LOCK_ERROR); + } + // 确认任务,更新状态为消费成功,没有找到任务中断后续消费 - OrderImportTaskDO orderImportTaskDO = confirmOrderImport(taskId); + orderImportTaskDO = orderImportTaskService.confirmOrderImport(taskId); if (ObjectUtil.isNull(orderImportTaskDO)) { return; } @@ -140,62 +164,47 @@ public class DefaultExcelOrderImportConsumer { // 创建工厂 log.info("====================【生产单默认excel导入处理临时数据开始】===================="); DefaultExcelOrderImportFactory defaultExcelOrderImportFactory = new DefaultExcelOrderImportFactory(taskId, orderDO, organId, orderImportTaskDO.getCreator(), - snowFlakeGenerator, idWorker, orderImportTaskMapper, orderImportTempDataMapper, dictDataApi, goodsMapper, rawGoodsMapper, orderPartsMapper, + snowFlakeGenerator, idWorker, orderImportTaskMapper, orderImportTempDataMapper, dictDataApi, orderMapper, goodsMapper, rawGoodsMapper, orderPartsMapper, orderBodyMapper, orderGroupMapper, plateMapper, orderItemMapper, plateGoodMapper, orderInputProcessor, partsMapper, customPlateNoGenerateService); // 解析临时表数据 defaultExcelOrderImportFactory.analyzeTempData(); log.info("====================【生产单默认excel导入处理临时数据结束】===================="); } catch (Exception e) { - // 确认消息进入死信队列 - channel.basicNack(deliveryTag, false, false); log.error(ORDER_IMPORT_FAIL.getMsg(), e); + updateImportTaskFail(orderImportTaskDO, e); throw e; } finally { - // 手动确认消息接收 - channel.basicAck(deliveryTag, false); - // 导入锁解锁 - redisLockUtil.releaseLock(String.format(RedisKeyConstants.ORDER_IMPORT_LOCK_KEY, organId), message); + if (lockResult) { + // 导入锁解锁 + redisLockUtil.releaseLock(String.format(RedisKeyConstants.ORDER_IMPORT_LOCK_KEY, organId), message); + } } } /** - * 确认导入任务,更新任务状态 + * 更新导入任务为失败 * - * @param taskId + * @param orderImportTaskDO + * @param ex */ - private OrderImportTaskDO confirmOrderImport(Long taskId) { - boolean taskExist = false; - OrderImportTaskDO orderImportTaskDO = null; - // 线程每1s查询一次,查三次没有就提示任务不存在 - for (int i = 0; i < 3; i++) { - orderImportTaskDO = orderImportTaskMapper.selectById(taskId); - if (ObjectUtil.isNotNull(orderImportTaskDO)) { - taskExist = true; - break; - } else { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - log.error("====================【线程中断异常】===================="); - } - } + public void updateImportTaskFail(OrderImportTaskDO orderImportTaskDO, Exception ex) { + if (orderImportTaskDO == null) { + return; } - if (taskExist) { - // 更新状态为消费成功 - orderImportTaskMapper.update(new LambdaUpdateWrapper().eq(OrderImportTaskDO::getId, taskId).set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CONSUME_SUCCESS.getStatus())); + String msg; + if (ex instanceof ServiceException) { + msg = ex.getMessage(); } else { - String taskNotExistNotify = String.format("%s不存在的导入任务,消费中止", taskId); - // 更新状态为消费成功,导入失败 - orderImportTaskMapper.update( - new LambdaUpdateWrapper() - .eq(OrderImportTaskDO::getId, taskId) - .set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CONSUME_SUCCESS.getStatus()) - .set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_FAIL.getStatus()) - .set(OrderImportTaskDO::getResult, taskNotExistNotify) - ); - log.error(String.format("====================【%s】====================", taskNotExistNotify)); + msg = ORDER_IMPORT_FAIL.getMsg(); } - return orderImportTaskDO; + orderImportTaskMapper.update( + new LambdaUpdateWrapper() + .eq(OrderImportTaskDO::getId, orderImportTaskDO.getId()) + .set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CREATE_RECEIVE.getStatus()) + .set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_FAIL.getStatus()) + .set(OrderImportTaskDO::getResult, msg) + .set(OrderImportTaskDO::getRetryCount, orderImportTaskDO.getRetryCount() + 1) + ); } /** @@ -216,7 +225,7 @@ public class DefaultExcelOrderImportConsumer { Long existOrderId = orderImportTempDataDO.getOrderId(); // 校验生产单id OrderDO orderDO = orderMapper.selectById(existOrderId); - Optional.ofNullable(orderDO).orElseThrow(() -> ServiceExceptionUtil.exception(ORDER_IMPORT_ORDER_NOT_EXISTS, existOrderId)); + Optional.ofNullable(orderDO).orElseThrow(() -> exception(ORDER_IMPORT_ORDER_NOT_EXISTS, existOrderId)); // 更新补板生产单属性 updateOrder(orderDO); return orderDO; diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/consumer/DefaultXmlOrderImportConsumer.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/consumer/DefaultXmlOrderImportConsumer.java index f73093e69..3045d50c8 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/consumer/DefaultXmlOrderImportConsumer.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/consumer/DefaultXmlOrderImportConsumer.java @@ -6,12 +6,14 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.cf.imes.framework.common.enums.OrderPackageStatusEnum; +import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd; import com.cf.imes.framework.mq.rabbitmq.constant.RabbitMqConstants; import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator; import com.cf.imes.framework.organ.core.context.OrganContextHolder; +import com.cf.imes.framework.redis.config.ChenfengCacheProperties; import com.cf.imes.framework.redis.constants.RedisKeyConstants; import com.cf.imes.framework.redis.util.RedisLockUtil; import com.cf.imes.module.executor.enums.OrderImportStatusEnum; @@ -35,6 +37,7 @@ import com.cf.imes.module.plan.dal.mysql.plate.PlateMapper; import com.cf.imes.module.plan.dal.mysql.rawgoods.RawGoodsMapper; import com.cf.imes.module.plan.service.customplateno.CustomPlateNoGenerateService; import com.cf.imes.module.plan.service.order.OrderInputProcessor; +import com.cf.imes.module.plan.service.orderImport.OrderImportTaskService; import com.cf.imes.module.plan.service.orderImport.factory.DefaultXmlOrderImportFactory; import com.rabbitmq.client.Channel; import lombok.extern.slf4j.Slf4j; @@ -50,7 +53,9 @@ import java.time.LocalDate; import java.util.Objects; import java.util.Optional; +import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_NOT_EXISTS; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORGAN_LOCK_ERROR; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.ORDER_IMPORT_FAIL; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.ORDER_IMPORT_ORGANID_NOT_EXISTS; @@ -63,6 +68,9 @@ import static com.cf.imes.module.plan.enums.ErrorCodeConstants.ORDER_IMPORT_ORGA @Component @Slf4j public class DefaultXmlOrderImportConsumer { + @Resource + private OrderImportTaskService orderImportTaskService; + @Resource private OrderImportTaskMapper orderImportTaskMapper; @@ -114,6 +122,9 @@ public class DefaultXmlOrderImportConsumer { @Resource private CustomPlateNoGenerateService customPlateNoGenerateService; + @Resource + private ChenfengCacheProperties chenfengCacheProperties; + @RabbitListener(queues = RabbitMqConstants.ORDER_IMPORT_DEFAULT_XML_QUEUE) @DS("imes_prod") @Transactional(rollbackFor = Exception.class) @@ -121,13 +132,27 @@ public class DefaultXmlOrderImportConsumer { log.info("====================【生产单默认xml导入收到消息:{}】====================", message); Long organId = null; Long taskId = Long.parseLong(message); + boolean lockResult = true; + OrderImportTaskDO orderImportTaskDO = null; + try { + // 手动确认消息接收 + channel.basicAck(deliveryTag, false); + organId = OrganContextHolder.getOrganId(); if (ObjectUtil.isNull(organId)) { throw ServiceExceptionUtil.exception(ORDER_IMPORT_ORGANID_NOT_EXISTS); } + + // 检查机构导入锁 + String importLockKey = String.format(RedisKeyConstants.ORDER_IMPORT_LOCK_KEY, organId); + lockResult = redisLockUtil.acquireLock(importLockKey, String.valueOf(taskId), chenfengCacheProperties.getLockTimeout()); + if (!lockResult) { + throw exception(ORDER_IMPORT_ORGAN_LOCK_ERROR); + } + // 确认任务,更新状态为消费成功,没有找到任务中断后续消费 - OrderImportTaskDO orderImportTaskDO = confirmOrderImport(taskId); + orderImportTaskDO = orderImportTaskService.confirmOrderImport(taskId); if (ObjectUtil.isNull(orderImportTaskDO)) { return; } @@ -136,62 +161,47 @@ public class DefaultXmlOrderImportConsumer { log.info("====================【生产单默认xml导入处理临时数据开始】===================="); // 创建工厂 DefaultXmlOrderImportFactory defaultExcelOrderImportFactory = new DefaultXmlOrderImportFactory(taskId, orderDO, organId, orderImportTaskDO.getCreator(), - snowFlakeGenerator, idWorker, orderImportTaskMapper, orderImportTempDataMapper, goodsMapper, rawGoodsMapper, orderPartsMapper, + snowFlakeGenerator, idWorker, orderImportTaskMapper, orderImportTempDataMapper, orderMapper, goodsMapper, rawGoodsMapper, orderPartsMapper, orderBodyMapper, orderGroupMapper, plateMapper, orderItemMapper, plateGoodMapper, orderInputProcessor, partsMapper, customPlateNoGenerateService); // 解析临时表数据 defaultExcelOrderImportFactory.analyzeTempData(); log.info("====================【生产单默认xml导入处理临时数据结束】===================="); } catch (Exception e) { - // 确认消息进入死信队列 - channel.basicNack(deliveryTag, false, false); log.error( ORDER_IMPORT_FAIL.getMsg(), e); + updateImportTaskFail(orderImportTaskDO, e); throw e; } finally { - // 手动确认消息接收 - channel.basicAck(deliveryTag, false); - // 导入锁解锁 - redisLockUtil.releaseLock(String.format(RedisKeyConstants.ORDER_IMPORT_LOCK_KEY, organId), message); + if (lockResult) { + // 导入锁解锁 + redisLockUtil.releaseLock(String.format(RedisKeyConstants.ORDER_IMPORT_LOCK_KEY, organId), message); + } } } /** - * 确认导入任务,更新任务状态 + * 更新导入任务为失败 * - * @param taskId + * @param orderImportTaskDO + * @param ex */ - private OrderImportTaskDO confirmOrderImport(Long taskId) { - boolean taskExist = false; - OrderImportTaskDO orderImportTaskDO = null; - // 线程每1s查询一次,查三次没有就提示任务不存在 - for (int i = 0; i < 3; i++) { - orderImportTaskDO = orderImportTaskMapper.selectById(taskId); - if (ObjectUtil.isNotNull(orderImportTaskDO)) { - taskExist = true; - break; - } else { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - log.error("====================【线程中断异常】===================="); - } - } + public void updateImportTaskFail(OrderImportTaskDO orderImportTaskDO, Exception ex) { + if (orderImportTaskDO == null) { + return; } - if (taskExist) { - // 更新状态为消费成功 - orderImportTaskMapper.update(new LambdaUpdateWrapper().eq(OrderImportTaskDO::getId, taskId).set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CONSUME_SUCCESS.getStatus())); + String msg; + if (ex instanceof ServiceException) { + msg = ex.getMessage(); } else { - String taskNotExistNotify = String.format("%s不存在的导入任务,消费中止", taskId); - // 更新状态为消费成功,导入失败 - orderImportTaskMapper.update( - new LambdaUpdateWrapper() - .eq(OrderImportTaskDO::getId, taskId) - .set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CONSUME_SUCCESS.getStatus()) - .set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_FAIL.getStatus()) - .set(OrderImportTaskDO::getResult, taskNotExistNotify) - ); - log.error(String.format("====================【%s】====================", taskNotExistNotify)); + msg = ORDER_IMPORT_FAIL.getMsg(); } - return orderImportTaskDO; + orderImportTaskMapper.update( + new LambdaUpdateWrapper() + .eq(OrderImportTaskDO::getId, orderImportTaskDO.getId()) + .set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CREATE_RECEIVE.getStatus()) + .set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_FAIL.getStatus()) + .set(OrderImportTaskDO::getResult, msg) + .set(OrderImportTaskDO::getRetryCount, orderImportTaskDO.getRetryCount() + 1) + ); } /** diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/DefaultExcelOrderImportFactory.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/DefaultExcelOrderImportFactory.java index 5aa64bedf..e5a165025 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/DefaultExcelOrderImportFactory.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/DefaultExcelOrderImportFactory.java @@ -42,6 +42,7 @@ import com.cf.imes.module.plan.dal.dataobject.plate.PlateGoodDO; import com.cf.imes.module.plan.dal.dataobject.rawgoods.RawGoodsDO; import com.cf.imes.module.plan.dal.elasticsearch.OrderPartsRemark; import com.cf.imes.module.plan.dal.mysql.goods.GoodsMapper; +import com.cf.imes.module.plan.dal.mysql.order.OrderMapper; import com.cf.imes.module.plan.dal.mysql.orderBody.OrderBodyMapper; import com.cf.imes.module.plan.dal.mysql.orderGroup.OrderGroupMapper; import com.cf.imes.module.plan.dal.mysql.orderImport.OrderImportTaskMapper; @@ -52,6 +53,7 @@ import com.cf.imes.module.plan.dal.mysql.orderParts.PartsMapper; import com.cf.imes.module.plan.dal.mysql.plate.PlateGoodMapper; import com.cf.imes.module.plan.dal.mysql.plate.PlateMapper; import com.cf.imes.module.plan.dal.mysql.rawgoods.RawGoodsMapper; +import com.cf.imes.module.plan.enums.ErrorCodeConstants; import com.cf.imes.module.plan.service.customplateno.CustomPlateNoGenerateService; import com.cf.imes.module.plan.service.customplateno.vo.CustomPlateNoGenerateConfigVO; import com.cf.imes.module.plan.service.order.OrderInputProcessor; @@ -119,6 +121,12 @@ public class DefaultExcelOrderImportFactory { private static final int PLATE_TYPE = OrderImportTmpDataTypeEnum.PLATE.getType(); private static final int PART_TYPE = OrderImportTmpDataTypeEnum.PART.getType(); + // 当前导入的板件数量 + private int currentPlateNum; + + // 当前导入的板件面积 + private BigDecimal currentPlateArea = new BigDecimal(0); + private SnowFlakeGenerator snowFlakeGenerator; private SnowflakeIdWorker3rd idWorker; @@ -129,6 +137,8 @@ public class DefaultExcelOrderImportFactory { private DictDataApi dictDataApi; + private OrderMapper orderMapper; + private GoodsMapper goodsMapper; private RawGoodsMapper rawGoodsMapper; @@ -162,6 +172,7 @@ public class DefaultExcelOrderImportFactory { OrderImportTaskMapper orderImportTaskMapper, OrderImportTempDataMapper orderImportTempDataMapper, DictDataApi dictDataApi, + OrderMapper orderMapper, GoodsMapper goodsMapper, RawGoodsMapper rawGoodsMapper, OrderPartsMapper orderPartsMapper, @@ -183,6 +194,7 @@ public class DefaultExcelOrderImportFactory { this.orderImportTaskMapper = orderImportTaskMapper; this.orderImportTempDataMapper = orderImportTempDataMapper; this.dictDataApi = dictDataApi; + this.orderMapper = orderMapper; this.goodsMapper = goodsMapper; this.rawGoodsMapper = rawGoodsMapper; this.orderPartsMapper = orderPartsMapper; @@ -224,6 +236,10 @@ public class DefaultExcelOrderImportFactory { // 删除临时数据 deleteTempData(); + + // 更新生产单板件数量 + updateOrderPlateNum(); + // 完成所有流程后更新任务为导入成功 updateTaskSuccess(); } catch (Exception e) { @@ -696,11 +712,7 @@ public class DefaultExcelOrderImportFactory { String width = combination.getWidth(); // 成品长 String height = combination.getHeight(); - // 计算面积 - BigDecimal area = BigDecimal.valueOf(Double.parseDouble(width)) - .multiply(BigDecimal.valueOf(Double.parseDouble(height))) - .movePointLeft(6) - .setScale(2, RoundingMode.HALF_UP); + Long plateId = (Long) snowFlakeGenerator.nextId(null); // 排版面 纹路 开门方向转换 DictDataRespDTO typographyDTO = dictDataApi.parseDictData(DictTypeConstants.TYPOGRAPHY_TYPE, combination.getTypographicFace()).getData();// 排版面 @@ -727,10 +739,12 @@ public class DefaultExcelOrderImportFactory { .sealDown(BigDecimal.valueOf(Double.parseDouble(combination.getSealDown()))) .holeFace(Integer.valueOf(typographyDTO.getValue())) .texture(Integer.valueOf(grainDTO.getValue())) - .area(area) + .area(tempDataDO.getArea()) .openDoorType(Integer.valueOf(doorDTO.getValue())) .isSpecialShaped(false) .isSculpt(false) + .is2v(false) + .isSide2v(false) .remark(remarkExtract(combination.remarkJSON())) .roomName(roomName) .bodyName(bodyName) @@ -755,6 +769,7 @@ public class DefaultExcelOrderImportFactory { .isCancel(false) .filterType(EMPTY_STRING) .deleted(false) + .planId(0L) .build(); plateDO.setCreator(operatorName); plateDO.setUpdater(operatorName); @@ -762,6 +777,9 @@ public class DefaultExcelOrderImportFactory { plateDO.setCreateTime(now); plateDO.setUpdateTime(now); + currentPlateNum += 1; + currentPlateArea = currentPlateArea.add(tempDataDO.getArea()); + // 生成自定义板编号 generateCustomPlateNo(plateDO); @@ -1175,6 +1193,12 @@ public class DefaultExcelOrderImportFactory { .price(0.00) .remark(EMPTY_STRING) .deleted(false) + .exist(false) + .plateNum(groupDO.getGoodsPlateNum()) + .plannedPlateNum(0) + .area(groupDO.getGoodsPlateArea()) + .plannedPlateArea(0.00) + .version(0) .build(); goodsDO.setCreator(operatorName); goodsDO.setUpdater(operatorName); @@ -1362,6 +1386,24 @@ public class DefaultExcelOrderImportFactory { // partsDOS.clear(); } + /** + * 更新生产单的板件总数 + */ + private void updateOrderPlateNum() { + int version = orderDO.getVersion(); + Long orderId = orderDO.getId(); + int updated = orderMapper.update(new LambdaUpdateWrapper() + .eq(OrderDO::getId, orderId) + .eq(OrderDO::getOrganId, organId) + .eq(OrderDO::getVersion, version) + .set(OrderDO::getPlateNum, currentPlateNum) + .set(OrderDO::getArea, currentPlateArea) + .set(OrderDO::getVersion, version + 1)); + if (updated == 0) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORDER_UPDATE_CONCURRENCY_ERROR, orderId); + } + } + /** * 移除taskId下所有临时数据 */ diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/DefaultXmlOrderImportFactory.java b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/DefaultXmlOrderImportFactory.java index e6adb9014..f5a8c0aea 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/DefaultXmlOrderImportFactory.java +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/java/com/cf/imes/module/plan/service/orderImport/factory/DefaultXmlOrderImportFactory.java @@ -74,6 +74,7 @@ import com.cf.imes.module.plan.dal.elasticsearch.Point; import com.cf.imes.module.plan.dal.elasticsearch.PointDetail; import com.cf.imes.module.plan.dal.elasticsearch.PointList; import com.cf.imes.module.plan.dal.mysql.goods.GoodsMapper; +import com.cf.imes.module.plan.dal.mysql.order.OrderMapper; import com.cf.imes.module.plan.dal.mysql.orderBody.OrderBodyMapper; import com.cf.imes.module.plan.dal.mysql.orderGroup.OrderGroupMapper; import com.cf.imes.module.plan.dal.mysql.orderImport.OrderImportTaskMapper; @@ -84,6 +85,7 @@ import com.cf.imes.module.plan.dal.mysql.orderParts.PartsMapper; import com.cf.imes.module.plan.dal.mysql.plate.PlateGoodMapper; import com.cf.imes.module.plan.dal.mysql.plate.PlateMapper; import com.cf.imes.module.plan.dal.mysql.rawgoods.RawGoodsMapper; +import com.cf.imes.module.plan.enums.ErrorCodeConstants; import com.cf.imes.module.plan.service.customplateno.CustomPlateNoGenerateService; import com.cf.imes.module.plan.service.customplateno.vo.CustomPlateNoGenerateConfigVO; import com.cf.imes.module.plan.service.order.OrderInputProcessor; @@ -160,6 +162,12 @@ public class DefaultXmlOrderImportFactory { private static final int PART_HARDWARE_TYPE = OrderImportTmpDataTypeEnum.PART_HARDWARE.getType(); private static final int PART_ASSEMBLY_TYPE = OrderImportTmpDataTypeEnum.PART_ASSEMBLY.getType(); + // 当前导入的板件数量 + private int currentPlateNum; + + // 当前导入的板件面积 + private BigDecimal currentPlateArea = new BigDecimal(0); + private SnowFlakeGenerator snowFlakeGenerator; private SnowflakeIdWorker3rd idWorker; @@ -168,6 +176,8 @@ public class DefaultXmlOrderImportFactory { private OrderImportTempDataMapper orderImportTempDataMapper; + private OrderMapper orderMapper; + private GoodsMapper goodsMapper; private RawGoodsMapper rawGoodsMapper; @@ -200,6 +210,7 @@ public class DefaultXmlOrderImportFactory { SnowflakeIdWorker3rd idWorker, OrderImportTaskMapper orderImportTaskMapper, OrderImportTempDataMapper orderImportTempDataMapper, + OrderMapper orderMapper, GoodsMapper goodsMapper, RawGoodsMapper rawGoodsMapper, OrderPartsMapper orderPartsMapper, @@ -220,6 +231,7 @@ public class DefaultXmlOrderImportFactory { this.idWorker = idWorker; this.orderImportTaskMapper = orderImportTaskMapper; this.orderImportTempDataMapper = orderImportTempDataMapper; + this.orderMapper = orderMapper; this.goodsMapper = goodsMapper; this.rawGoodsMapper = rawGoodsMapper; this.orderPartsMapper = orderPartsMapper; @@ -280,6 +292,10 @@ public class DefaultXmlOrderImportFactory { // 删除临时数据 deleteTempData(); + + // 更新生产单板件数量 + updateOrderPlateNum(); + // 完成所有流程后更新任务为导入成功 updateTaskSuccess(); } catch (Exception e) { @@ -395,6 +411,11 @@ public class DefaultXmlOrderImportFactory { .brand(plateXmlVO.getBrand()) .spec(plateXmlVO.getSpecs()) .remark(plateXmlVO.getMemo()) + .plateNum(goodsTempData.getNum().intValue()) + .plannedPlateNum(0) + .area(goodsTempData.getArea().doubleValue()) + .plannedPlateArea(0.0) + .version(0) .planId(0L) .price(0.00) .deleted(false) @@ -525,6 +546,8 @@ public class DefaultXmlOrderImportFactory { .openDoorType(doorType) .isSculpt(false) .isSpecialShaped(convertToBoolean(blockXmlVO.getUnregular())) + .is2v(false) + .isSide2v(false) .customPlateNoBuilder(new StringBuilder()) .organId(organId) .holeArrange(0) @@ -551,6 +574,7 @@ public class DefaultXmlOrderImportFactory { .sealDown(BigDecimal.ZERO) .remark(EMPTY_STRING) .deleted(false) + .planId(0L) .build(); plateDO.setCreator(operatorName); plateDO.setUpdater(operatorName); @@ -558,6 +582,9 @@ public class DefaultXmlOrderImportFactory { plateDO.setCreateTime(now); plateDO.setUpdateTime(now); + currentPlateNum += 1; + currentPlateArea = currentPlateArea.add(plateDO.getArea()); + // 生成自定义板编号 generateCustomPlateNo(plateDO); @@ -1915,6 +1942,24 @@ public class DefaultXmlOrderImportFactory { orderImportTempDataMapper.delete(new LambdaQueryWrapper().eq(OrderImportTempDataDO::getTaskId, taskId)); } + /** + * 更新生产单的板件总数 + */ + private void updateOrderPlateNum() { + int version = orderDO.getVersion(); + Long orderId = orderDO.getId(); + int updated = orderMapper.update(new LambdaUpdateWrapper() + .eq(OrderDO::getId, orderId) + .eq(OrderDO::getOrganId, organId) + .eq(OrderDO::getVersion, version) + .set(OrderDO::getPlateNum, currentPlateNum) + .set(OrderDO::getArea, currentPlateArea) + .set(OrderDO::getVersion, version + 1)); + if (updated == 0) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORDER_UPDATE_CONCURRENCY_ERROR, orderId); + } + } + /** * 更新为导入成功 */ diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/mapper/orderImport/OrderImportTempDataMapper.xml b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/mapper/orderImport/OrderImportTempDataMapper.xml index cfc0b64cd..b0d5ff61d 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/mapper/orderImport/OrderImportTempDataMapper.xml +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/mapper/orderImport/OrderImportTempDataMapper.xml @@ -59,7 +59,9 @@ material, color, thickness, - brand + brand, + sum(num) as goodsPlateNum, + sum(area) as goodsPlateArea ,min(sort) as sortn