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.ToString;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
@@ -200,6 +201,11 @@ public class OrderImportTempDataDO {
|
||||
*/
|
||||
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.mq.rabbitmq.constant.RabbitMqConstants;
|
||||
import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator;
|
||||
import com.cf.imes.framework.redis.config.ChenfengCacheProperties;
|
||||
import com.cf.imes.framework.redis.constants.RedisKeyConstants;
|
||||
import com.cf.imes.framework.redis.util.RedisLockUtil;
|
||||
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderImportAsyncReqVO;
|
||||
import com.cf.imes.module.executor.dal.dataobject.orderImport.OrderImportTaskDO;
|
||||
import com.cf.imes.module.executor.dal.mysql.orderImport.OrderImportTaskMapper;
|
||||
@@ -31,9 +28,7 @@ import org.springframework.web.multipart.MultipartFile;
|
||||
import jakarta.annotation.Resource;
|
||||
import java.io.InputStream;
|
||||
|
||||
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId;
|
||||
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_FILE_ANALYZE_ERROR;
|
||||
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORGAN_LOCK_ERROR;
|
||||
|
||||
/**
|
||||
* 默认excel生产单导入处理器
|
||||
@@ -62,12 +57,6 @@ public class DefaultExcelOrderImportHandler implements AbstractExcelOrderImportH
|
||||
@Resource
|
||||
private DictDataApi dictDataApi;
|
||||
|
||||
@Resource
|
||||
private RedisLockUtil redisLockUtil;
|
||||
|
||||
@Resource
|
||||
private ChenfengCacheProperties chenfengCacheProperties;
|
||||
|
||||
@Resource
|
||||
private PlateGoodMapper plateGoodMapper;
|
||||
|
||||
@@ -81,12 +70,7 @@ public class DefaultExcelOrderImportHandler implements AbstractExcelOrderImportH
|
||||
public void prepareAndConvert(OrderImportAsyncReqVO importAsyncReqVO, MultipartFile file) {
|
||||
// 创建任务
|
||||
Long taskId = createImportTask(file.getOriginalFilename());
|
||||
String importLockKey = String.format(RedisKeyConstants.ORDER_IMPORT_LOCK_KEY, getUserOrganId());
|
||||
// 检查机构导入锁
|
||||
boolean lockResult = redisLockUtil.acquireLock(importLockKey, String.valueOf(taskId), chenfengCacheProperties.getLockTimeout());
|
||||
if (!lockResult) {
|
||||
throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR);
|
||||
}
|
||||
|
||||
DefaultOrderImportExcelListener excelListener =
|
||||
new DefaultOrderImportExcelListener(orderImportTempDataMapper, orderService, dictDataApi, snowFlakeGenerator, plateGoodMapper, importAsyncReqVO.getOrderId(), taskId);
|
||||
|
||||
@@ -94,13 +78,9 @@ public class DefaultExcelOrderImportHandler implements AbstractExcelOrderImportH
|
||||
// 读取excel
|
||||
EasyExcelFactory.read(inputStream, excelListener).headRowNumber(-1).sheet().doRead();
|
||||
} catch (ServiceException sev) {
|
||||
// 导入锁解锁
|
||||
redisLockUtil.releaseLock(importLockKey, taskId.toString());
|
||||
throw sev;
|
||||
} catch (Exception e) {
|
||||
log.error(ORDER_IMPORT_FILE_ANALYZE_ERROR.getMsg(), e);
|
||||
// 导入锁解锁
|
||||
redisLockUtil.releaseLock(importLockKey, taskId.toString());
|
||||
throw new ServiceException(ORDER_IMPORT_FILE_ANALYZE_ERROR);
|
||||
}
|
||||
|
||||
|
||||
+1
-10
@@ -71,23 +71,14 @@ public class DefaultXmlOrderImportHandler implements AbstractXmlOrderImportHandl
|
||||
public void prepareAndConvert(OrderImportAsyncReqVO importAsyncReqVO, MultipartFile file) {
|
||||
// 创建任务
|
||||
Long taskId = createImportTask(file.getOriginalFilename());
|
||||
String importLockKey = String.format(RedisKeyConstants.ORDER_IMPORT_LOCK_KEY, getUserOrganId());
|
||||
// 检查机构导入锁
|
||||
boolean lockResult = redisLockUtil.acquireLock(importLockKey, String.valueOf(taskId), chenfengCacheProperties.getLockTimeout());
|
||||
if (!lockResult) {
|
||||
throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR);
|
||||
}
|
||||
|
||||
try {
|
||||
DefaultOrderImportXmlParserHandler defaultOrderImportXmlParserHandler = new DefaultOrderImportXmlParserHandler(orderImportTempDataMapper, orderService, snowFlakeGenerator, plateGoodMapper, importAsyncReqVO.getOrderId(), taskId);
|
||||
defaultOrderImportXmlParserHandler.analyzeFile(file);
|
||||
} catch (ServiceException sev) {
|
||||
// 导入锁解锁
|
||||
redisLockUtil.releaseLock(importLockKey, taskId.toString());
|
||||
throw sev;
|
||||
} catch (Exception e) {
|
||||
log.error(ORDER_IMPORT_FILE_ANALYZE_ERROR.getMsg(), e);
|
||||
// 导入锁解锁
|
||||
redisLockUtil.releaseLock(importLockKey, taskId.toString());
|
||||
throw new ServiceException(ORDER_IMPORT_FILE_ANALYZE_ERROR);
|
||||
}
|
||||
|
||||
|
||||
+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.service.order.OrderService;
|
||||
import com.cf.imes.module.executor.util.fileConversion.admin.ToolUtil;
|
||||
import com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO.PlateXmlVO;
|
||||
import com.cf.imes.module.system.api.dict.DictDataApi;
|
||||
import com.cf.imes.module.system.api.dict.dto.DictDataRespDTO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import javax.xml.stream.Location;
|
||||
import java.lang.reflect.Field;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
@@ -536,8 +535,15 @@ public final class DefaultOrderImportExcelListener extends AnalysisEventListener
|
||||
}
|
||||
// 若商品类型为板材,需检查房间、柜体、板名称、成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边、排版面、纹路、开门方向不能为空
|
||||
boolean isPlate = StringUtils.equals(vo.getGoodType(), "板材");
|
||||
BigDecimal area = null;
|
||||
if (isPlate) {
|
||||
checkPlate(vo);
|
||||
|
||||
// 计算面积
|
||||
area = BigDecimal.valueOf(Double.parseDouble(vo.getGoodsWidth()))
|
||||
.multiply(BigDecimal.valueOf(Double.parseDouble(vo.getGoodsHeight())))
|
||||
.movePointLeft(6)
|
||||
.setScale(2, RoundingMode.HALF_UP);
|
||||
}
|
||||
|
||||
// 校验通过生成临时表实体
|
||||
@@ -568,6 +574,7 @@ public final class DefaultOrderImportExcelListener extends AnalysisEventListener
|
||||
.groupName(vo.getCombinationName())
|
||||
.detail(JsonUtils.zipString(JSON.toJSONString(vo)))
|
||||
.num(Double.parseDouble(vo.getGoodsNumber()))
|
||||
.area(area)
|
||||
.createTime(LocalDateTime.now())
|
||||
.sort(sort++)
|
||||
.build();
|
||||
@@ -631,7 +638,7 @@ public final class DefaultOrderImportExcelListener extends AnalysisEventListener
|
||||
} else {
|
||||
plateGoodDOs = plateGoodMapper.selectGood(plate.getMaterial(), plate.getColor(),
|
||||
BigDecimal.valueOf(Long.parseLong(plate.getThickness())),
|
||||
plate.getBrand(), plate.getName(), OrganContextHolder.getOrganId());
|
||||
plate.getBrand(), plate.getGoodsName(), OrganContextHolder.getOrganId());
|
||||
}
|
||||
|
||||
if (CollUtil.isNotEmpty(plateGoodDOs)) {
|
||||
|
||||
+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.ListUtil;
|
||||
import cn.hutool.core.date.LocalDateTimeUtil;
|
||||
import cn.hutool.core.map.MapUtil;
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.excel.util.ListUtils;
|
||||
@@ -79,7 +78,6 @@ import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@@ -125,7 +123,7 @@ public class DefaultOrderImportXmlParserHandler {
|
||||
private Set<String> groupCodeSet = new HashSet<>();
|
||||
private Map<String, RoomXmlVO> roomMap = 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":
|
||||
endIslet();
|
||||
break;
|
||||
case "Plates":
|
||||
endPlates();
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
@@ -517,7 +518,7 @@ public class DefaultOrderImportXmlParserHandler {
|
||||
String roomName = roomXmlVO.getName();
|
||||
|
||||
// 缓存roomCode+bodyCode
|
||||
String roomBodyKey = bodyCode + roomCode;
|
||||
String roomBodyKey = roomCode + bodyCode;
|
||||
RoomBoxXmlVO roomBoxXmlVO = roomBodyMap.get(roomBodyKey);
|
||||
if (ObjectUtil.isNull(roomBoxXmlVO)) {
|
||||
roomBodyMap.put(roomBodyKey, boxXmlVO);
|
||||
@@ -628,14 +629,12 @@ public class DefaultOrderImportXmlParserHandler {
|
||||
|
||||
// 相同的itemCode不重复创建临时Goods数据
|
||||
String currentItemCode = plateXmlVO.getItemCode();
|
||||
Long existInnerGoodsId = existGoodsIdMap.get(currentItemCode);
|
||||
if(ObjectUtil.isNull(existInnerGoodsId)) {
|
||||
Long innerGoodsId = (Long) snowFlakeGenerator.nextId(null);
|
||||
plateItemCode = String.valueOf(innerGoodsId);
|
||||
existGoodsIdMap.put(currentItemCode, innerGoodsId);
|
||||
OrderImportTempDataDO existInnerGoods = existGoodsMap.get(currentItemCode);
|
||||
if(ObjectUtil.isNull(existInnerGoods)) {
|
||||
plateItemCode = String.valueOf(snowFlakeGenerator.nextId(null));
|
||||
|
||||
// 添加到临时表
|
||||
cachedDataList.add(OrderImportTempDataDO.builder()
|
||||
// 暂存goods
|
||||
OrderImportTempDataDO goods = OrderImportTempDataDO.builder()
|
||||
.id((Long) snowFlakeGenerator.nextId(null))
|
||||
.orderId(orderId)
|
||||
.taskId(taskId)
|
||||
@@ -644,9 +643,12 @@ public class DefaultOrderImportXmlParserHandler {
|
||||
.createTime(LocalDateTime.now())
|
||||
.detail(JsonUtils.zipString(JSON.toJSONString(plateXmlVO)))
|
||||
.sort(sort++)
|
||||
.build());
|
||||
.num(0.0)
|
||||
.area(BigDecimal.ZERO)
|
||||
.build();
|
||||
existGoodsMap.put(plateItemCode, goods);
|
||||
} else {
|
||||
plateItemCode = String.valueOf(existInnerGoodsId);
|
||||
plateItemCode = existInnerGoods.getInnerGoodsId();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -812,6 +814,16 @@ public class DefaultOrderImportXmlParserHandler {
|
||||
.sort(sort++)
|
||||
.build());
|
||||
|
||||
// 累加板材下板件数量、面积
|
||||
OrderImportTempDataDO orderImportTempDataDO = existGoodsMap.get(plateItemCode);
|
||||
if (orderImportTempDataDO != null) {
|
||||
orderImportTempDataDO.setNum(orderImportTempDataDO.getNum() + 1);
|
||||
Double length = changeUnit(blockXmlVO.getLength(), blockXmlVO.getUnit(), DictTypeConstants.UNIT_LENGTH);
|
||||
Double width = changeUnit(blockXmlVO.getWidth(), blockXmlVO.getUnit(), DictTypeConstants.UNIT_LENGTH);
|
||||
BigDecimal area = BigDecimal.valueOf((length / 1000) * (width / 1000));
|
||||
orderImportTempDataDO.setArea(orderImportTempDataDO.getArea().add(area));
|
||||
}
|
||||
|
||||
// 清空全局参数
|
||||
points.clear();
|
||||
}
|
||||
@@ -1430,6 +1442,15 @@ public class DefaultOrderImportXmlParserHandler {
|
||||
inIslet = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Plates标签结束
|
||||
*/
|
||||
private void endPlates() {
|
||||
for (Map.Entry<String, OrderImportTempDataDO> entry : existGoodsMap.entrySet()) {
|
||||
cachedDataList.add(entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析关联配件
|
||||
*
|
||||
@@ -1695,7 +1716,6 @@ public class DefaultOrderImportXmlParserHandler {
|
||||
// 板件列表存在柜体没有缓存的
|
||||
if (ObjectUtil.isNull(roomBoxXmlVO)) {
|
||||
|
||||
|
||||
// 检查roomCode
|
||||
if (!bodyEmpty) {
|
||||
throw ServiceExceptionUtil.exception(ORDER_IMPORT_BODYCODE_NOT_EXIST_VALID_ERROR, se, boxCode);
|
||||
@@ -1726,6 +1746,11 @@ public class DefaultOrderImportXmlParserHandler {
|
||||
.sort(sort++)
|
||||
.build());
|
||||
|
||||
roomBodyMap.put(roomBodyKey, RoomBoxXmlVO.builder()
|
||||
.code(roomCode)
|
||||
.name(roomName)
|
||||
.build());
|
||||
|
||||
}
|
||||
|
||||
// // 校验板件的房间、柜体、加工组编号
|
||||
@@ -2065,4 +2090,18 @@ public class DefaultOrderImportXmlParserHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 长度面积数值按单位转换
|
||||
*
|
||||
* @param lengthStr
|
||||
* @param unit
|
||||
* @param type
|
||||
* @return
|
||||
*/
|
||||
public Double changeUnit(String lengthStr, String unit, String type) {
|
||||
String dictData = DictFrameworkUtils.parseDictDataValue(type, unit);
|
||||
Double length = Double.parseDouble(lengthStr);
|
||||
return length * Double.parseDouble(dictData);
|
||||
}
|
||||
}
|
||||
|
||||
+2
@@ -1,12 +1,14 @@
|
||||
package com.cf.imes.module.executor.util.fileConversion.admin.files.xml.VO;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class RoomBoxXmlVO implements Serializable {
|
||||
|
||||
Reference in New Issue
Block a user