生产单excel/xml异步导入提前计算板件数量/面积逻辑补充

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