mirror of
http://192.168.1.205:9980/cf_devdept2/cf_imes_server.git
synced 2026-08-12 21:02:08 +08:00
生产单excel/xml异步导入提前计算板件数量/面积逻辑补充
This commit is contained in:
+6
@@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
|
|||||||
+1
-21
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-10
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-3
@@ -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)) {
|
||||||
|
|||||||
+53
-14
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -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 {
|
||||||
|
|||||||
+5
@@ -70,4 +70,9 @@ public class OrderImportTaskDO extends BaseDO {
|
|||||||
* 导入文件名称
|
* 导入文件名称
|
||||||
*/
|
*/
|
||||||
private String fileName;
|
private String fileName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重试次数
|
||||||
|
*/
|
||||||
|
private int retryCount;
|
||||||
}
|
}
|
||||||
|
|||||||
+6
@@ -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;
|
||||||
|
|
||||||
|
|||||||
+10
@@ -131,4 +131,14 @@ public class OrderImportTempDataGoodsGroupDO implements Serializable {
|
|||||||
* 统计总数
|
* 统计总数
|
||||||
*/
|
*/
|
||||||
private int count;
|
private int count;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 板材板件数量
|
||||||
|
*/
|
||||||
|
private int goodsPlateNum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 板材板件面积
|
||||||
|
*/
|
||||||
|
private Double goodsPlateArea;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -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;
|
||||||
/**
|
/**
|
||||||
* 是否造型
|
* 是否造型
|
||||||
|
|||||||
+10
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
+26
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+52
-43
@@ -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;
|
||||||
|
|||||||
+50
-40
@@ -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)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+48
-6
@@ -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下所有临时数据
|
||||||
*/
|
*/
|
||||||
|
|||||||
+45
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新为导入成功
|
* 更新为导入成功
|
||||||
*/
|
*/
|
||||||
|
|||||||
+3
-1
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user