excel、xml异步导入调整:同步板材库匹配逻辑

This commit is contained in:
gaoqr
2025-04-17 16:39:56 +08:00
parent 71f939168a
commit b3bb0fff73
10 changed files with 271 additions and 254 deletions
@@ -97,6 +97,7 @@ public class ErrorCodeConstants {
public static final ErrorCode ORDER_IMPORT_GROUPCODE_NOT_EXIST_VALID_ERROR = new ErrorCode(1_002_031_013, "导入校验异常:板件{}下加工组编码{}不存在于加工组编码列表中"); public static final ErrorCode ORDER_IMPORT_GROUPCODE_NOT_EXIST_VALID_ERROR = new ErrorCode(1_002_031_013, "导入校验异常:板件{}下加工组编码{}不存在于加工组编码列表中");
public static final ErrorCode ORDER_IMPORT_ROOMCODE_NOT_EXIST_VALID_ERROR = new ErrorCode(1_002_031_014, "导入校验异常:板件{}下房间编码{}不存在于房间编码列表中"); public static final ErrorCode ORDER_IMPORT_ROOMCODE_NOT_EXIST_VALID_ERROR = new ErrorCode(1_002_031_014, "导入校验异常:板件{}下房间编码{}不存在于房间编码列表中");
public static final ErrorCode ORDER_IMPORT_BODYCODE_NOT_EXIST_VALID_ERROR = new ErrorCode(1_002_031_015, "导入校验异常:板件{}下柜体编码{}不存在于柜体编码列表中"); public static final ErrorCode ORDER_IMPORT_BODYCODE_NOT_EXIST_VALID_ERROR = new ErrorCode(1_002_031_015, "导入校验异常:板件{}下柜体编码{}不存在于柜体编码列表中");
public static final ErrorCode ORDER_IMPORT_PLATEGOODS_NOT_EXIST_VALID_ERROR = new ErrorCode(1_002_031_016, "导入校验异常:第{}行的板材不存在,请确保板材管理中存在对应商品编号或商品(名称+材质+颜色+厚度+品牌)组合的板材后导入");
// ========== manage板材/配件 1_004_001_000 ========== // ========== manage板材/配件 1_004_001_000 ==========
public static final ErrorCode PARTS_NOT_EXISTS = new ErrorCode(1_004_001_000, "配件不存在"); public static final ErrorCode PARTS_NOT_EXISTS = new ErrorCode(1_004_001_000, "配件不存在");
@@ -11,6 +11,7 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderImportAs
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;
import com.cf.imes.module.executor.dal.mysql.orderImport.OrderImportTempDataMapper; import com.cf.imes.module.executor.dal.mysql.orderImport.OrderImportTempDataMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper;
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.executor.enums.OrderImportTypeEnum; import com.cf.imes.module.executor.enums.OrderImportTypeEnum;
@@ -67,6 +68,9 @@ public class DefaultExcelOrderImportHandler implements AbstractExcelOrderImportH
@Resource @Resource
private ChenfengCacheProperties chenfengCacheProperties; private ChenfengCacheProperties chenfengCacheProperties;
@Resource
private PlateGoodMapper plateGoodMapper;
@Override @Override
public String getFactoryName() { public String getFactoryName() {
return "default"; return "default";
@@ -84,7 +88,7 @@ public class DefaultExcelOrderImportHandler implements AbstractExcelOrderImportH
throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR); throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR);
} }
DefaultOrderImportExcelListener excelListener = DefaultOrderImportExcelListener excelListener =
new DefaultOrderImportExcelListener(orderImportTempDataMapper, orderService, dictDataApi, snowFlakeGenerator, importAsyncReqVO.getOrderId(), taskId); new DefaultOrderImportExcelListener(orderImportTempDataMapper, orderService, dictDataApi, snowFlakeGenerator, plateGoodMapper, importAsyncReqVO.getOrderId(), taskId);
try (InputStream inputStream = file.getInputStream()) { try (InputStream inputStream = file.getInputStream()) {
// 读取excel // 读取excel
@@ -10,6 +10,7 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderImportAs
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;
import com.cf.imes.module.executor.dal.mysql.orderImport.OrderImportTempDataMapper; import com.cf.imes.module.executor.dal.mysql.orderImport.OrderImportTempDataMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper;
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.executor.enums.OrderImportTypeEnum; import com.cf.imes.module.executor.enums.OrderImportTypeEnum;
@@ -58,6 +59,9 @@ public class DefaultXmlOrderImportHandler implements AbstractXmlOrderImportHandl
@Resource @Resource
private ChenfengCacheProperties chenfengCacheProperties; private ChenfengCacheProperties chenfengCacheProperties;
@Resource
private PlateGoodMapper plateGoodMapper;
@Override @Override
public String getFactoryName() { public String getFactoryName() {
return "default"; return "default";
@@ -74,7 +78,7 @@ public class DefaultXmlOrderImportHandler implements AbstractXmlOrderImportHandl
throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR); throw new ServiceException(ORDER_IMPORT_ORGAN_LOCK_ERROR);
} }
try { try {
DefaultOrderImportXmlParserHandler defaultOrderImportXmlParserHandler = new DefaultOrderImportXmlParserHandler(orderImportTempDataMapper, orderService, snowFlakeGenerator, 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) {
// 导入锁解锁 // 导入锁解锁
@@ -1,5 +1,6 @@
package com.cf.imes.module.executor.util.fileConversion.admin.files.excel; package com.cf.imes.module.executor.util.fileConversion.admin.files.excel;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
@@ -16,7 +17,9 @@ import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.framework.web.core.util.WebFrameworkUtils; import com.cf.imes.framework.web.core.util.WebFrameworkUtils;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.orderImport.OrderImportTempDataDO; import com.cf.imes.module.executor.dal.dataobject.orderImport.OrderImportTempDataDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO;
import com.cf.imes.module.executor.dal.mysql.orderImport.OrderImportTempDataMapper; import com.cf.imes.module.executor.dal.mysql.orderImport.OrderImportTempDataMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper;
import com.cf.imes.module.executor.enums.CategoryEnum; import com.cf.imes.module.executor.enums.CategoryEnum;
import com.cf.imes.module.executor.enums.DataTypeEnum; import com.cf.imes.module.executor.enums.DataTypeEnum;
import com.cf.imes.module.executor.enums.DictTypeConstants; import com.cf.imes.module.executor.enums.DictTypeConstants;
@@ -27,12 +30,15 @@ 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.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
@@ -47,6 +53,7 @@ import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_EMPTY; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_EMPTY;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_LENGTH_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_LENGTH_ERROR;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_MOBILE_FORMAT_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_MOBILE_FORMAT_ERROR;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_PLATEGOODS_NOT_EXIST_VALID_ERROR;
/** /**
* 默认生产单excel导入监听器 * 默认生产单excel导入监听器
@@ -80,6 +87,8 @@ public final class DefaultOrderImportExcelListener extends AnalysisEventListener
private SnowFlakeGenerator snowFlakeGenerator; private SnowFlakeGenerator snowFlakeGenerator;
private PlateGoodMapper plateGoodMapper;
/** /**
* 补板用 * 补板用
*/ */
@@ -111,11 +120,12 @@ public final class DefaultOrderImportExcelListener extends AnalysisEventListener
private static final String EMPTY_STRING = new String(); private static final String EMPTY_STRING = new String();
public DefaultOrderImportExcelListener(OrderImportTempDataMapper orderImportTempDataMapper, OrderService orderService, DictDataApi dictDataApi, SnowFlakeGenerator snowFlakeGenerator, Long orderId, Long taskId) { public DefaultOrderImportExcelListener(OrderImportTempDataMapper orderImportTempDataMapper, OrderService orderService, DictDataApi dictDataApi, SnowFlakeGenerator snowFlakeGenerator, PlateGoodMapper plateGoodMapper, Long orderId, Long taskId) {
this.orderImportTempDataMapper = orderImportTempDataMapper; this.orderImportTempDataMapper = orderImportTempDataMapper;
this.orderService = orderService; this.orderService = orderService;
this.dictDataApi = dictDataApi; this.dictDataApi = dictDataApi;
this.snowFlakeGenerator = snowFlakeGenerator; this.snowFlakeGenerator = snowFlakeGenerator;
this.plateGoodMapper = plateGoodMapper;
this.orderId = orderId; this.orderId = orderId;
this.taskId = taskId; this.taskId = taskId;
// 是否补板 // 是否补板
@@ -603,6 +613,34 @@ public final class DefaultOrderImportExcelListener extends AnalysisEventListener
isNotEmptyAndDict(vo.getTexture(), DictTypeConstants.GRAIN_TYPE, "纹路"); isNotEmptyAndDict(vo.getTexture(), DictTypeConstants.GRAIN_TYPE, "纹路");
isNotEmptyAndDict(vo.getOpenDoorType(), DictTypeConstants.DOOR_OPENING_DIRECTIONS, "开门方向"); isNotEmptyAndDict(vo.getOpenDoorType(), DictTypeConstants.DOOR_OPENING_DIRECTIONS, "开门方向");
// 查询板材库是否有对应
queryPlateExists(vo);
}
/**
* 查询板材库是否有对应物料编码
* 不存在再使用material、coatingObverse、thickness、brand、name查询是否存在匹配,还是不存在提示板材库先添加
*
* @param plate
*/
private void queryPlateExists(OrderPlateImportExcelVO plate) {
PlateGoodDO plateGoodDO = null;
List<PlateGoodDO> plateGoodDOs;
if (StringUtils.isNotEmpty(plate.getGoodsId())) {
plateGoodDOs = plateGoodMapper.selectGoodOne(plate.getGoodsId(), OrganContextHolder.getOrganId());
} else {
plateGoodDOs = plateGoodMapper.selectGood(plate.getMaterial(), plate.getColor(),
BigDecimal.valueOf(Long.parseLong(plate.getThickness())),
plate.getBrand(), plate.getName(), OrganContextHolder.getOrganId());
}
if (CollUtil.isNotEmpty(plateGoodDOs)) {
plateGoodDO = plateGoodDOs.get(0);
}
if (ObjectUtil.isNull(plateGoodDO)) {
throw ServiceExceptionUtil.exception(ORDER_IMPORT_PLATEGOODS_NOT_EXIST_VALID_ERROR, rowIndex + 1);
}
} }
/** /**
@@ -16,7 +16,9 @@ import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.framework.web.core.util.WebFrameworkUtils; import com.cf.imes.framework.web.core.util.WebFrameworkUtils;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.orderImport.OrderImportTempDataDO; import com.cf.imes.module.executor.dal.dataobject.orderImport.OrderImportTempDataDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO;
import com.cf.imes.module.executor.dal.mysql.orderImport.OrderImportTempDataMapper; import com.cf.imes.module.executor.dal.mysql.orderImport.OrderImportTempDataMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper;
import com.cf.imes.module.executor.enums.DataTypeEnum; import com.cf.imes.module.executor.enums.DataTypeEnum;
import com.cf.imes.module.executor.enums.DictTypeConstants; import com.cf.imes.module.executor.enums.DictTypeConstants;
import com.cf.imes.module.executor.enums.OrderImportTmpDataTypeEnum; import com.cf.imes.module.executor.enums.OrderImportTmpDataTypeEnum;
@@ -56,6 +58,7 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.xml.stream.Location;
import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.Attribute; import javax.xml.stream.events.Attribute;
@@ -64,6 +67,7 @@ import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent; import javax.xml.stream.events.XMLEvent;
import java.io.InputStream; import java.io.InputStream;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.math.BigDecimal;
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;
@@ -75,6 +79,7 @@ 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;
@@ -86,6 +91,7 @@ import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_EMPTY; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_EMPTY;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_LENGTH_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_LENGTH_ERROR;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_MOBILE_FORMAT_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORDER_FIELD_MOBILE_FORMAT_ERROR;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_PLATEGOODS_NOT_EXIST_VALID_ERROR;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ROOMCODE_NOT_EXIST_VALID_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ROOMCODE_NOT_EXIST_VALID_ERROR;
import static com.cf.imes.module.executor.enums.OrderImportConstants.NOT_ASSIGNED; import static com.cf.imes.module.executor.enums.OrderImportConstants.NOT_ASSIGNED;
import static com.cf.imes.module.executor.enums.OrderImportConstants.NOT_ASSIGNED_CODE; import static com.cf.imes.module.executor.enums.OrderImportConstants.NOT_ASSIGNED_CODE;
@@ -119,6 +125,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
/** /**
* 补板用 * 补板用
@@ -174,6 +181,8 @@ public class DefaultOrderImportXmlParserHandler {
private SnowFlakeGenerator snowFlakeGenerator; private SnowFlakeGenerator snowFlakeGenerator;
private PlateGoodMapper plateGoodMapper;
// 基础常量 // 基础常量
private static final String FIELD_AXISXROTATE = "axisXrotate"; private static final String FIELD_AXISXROTATE = "axisXrotate";
private static final String FIELD_AXISYROTATE = "axisYrotate"; private static final String FIELD_AXISYROTATE = "axisYrotate";
@@ -193,10 +202,11 @@ public class DefaultOrderImportXmlParserHandler {
private static final String FIELD_THICKNESS = "thickness"; private static final String FIELD_THICKNESS = "thickness";
private static final String FIELD_ORDERCODE = "orderCode"; private static final String FIELD_ORDERCODE = "orderCode";
public DefaultOrderImportXmlParserHandler(OrderImportTempDataMapper orderImportTempDataMapper, OrderService orderService, SnowFlakeGenerator snowFlakeGenerator, Long orderId, Long taskId) { public DefaultOrderImportXmlParserHandler(OrderImportTempDataMapper orderImportTempDataMapper, OrderService orderService, SnowFlakeGenerator snowFlakeGenerator, PlateGoodMapper plateGoodMapper, Long orderId, Long taskId) {
this.orderImportTempDataMapper = orderImportTempDataMapper; this.orderImportTempDataMapper = orderImportTempDataMapper;
this.orderService = orderService; this.orderService = orderService;
this.snowFlakeGenerator = snowFlakeGenerator; this.snowFlakeGenerator = snowFlakeGenerator;
this.plateGoodMapper = plateGoodMapper;
this.orderId = orderId; this.orderId = orderId;
this.taskId = taskId; this.taskId = taskId;
// 是否补板 // 是否补板
@@ -244,7 +254,7 @@ public class DefaultOrderImportXmlParserHandler {
analyzeGroupXml(attributes); analyzeGroupXml(attributes);
break; break;
case "Plate": case "Plate":
analyzePlateXml(attributes); analyzePlateXml(attributes, en.getLocation());
break; break;
case "Block": case "Block":
analyzeBlockXml(attributes); analyzeBlockXml(attributes);
@@ -602,29 +612,40 @@ public class DefaultOrderImportXmlParserHandler {
* @param attributes * @param attributes
* @throws Exception * @throws Exception
*/ */
private void analyzePlateXml(Iterator<Attribute> attributes) throws Exception { private void analyzePlateXml(Iterator<Attribute> attributes, Location location) throws Exception {
// 从标签属性生成plate对象 // 从标签属性生成plate对象
PlateXmlVO plateXmlVO = getJavaBeanFromXmlAttr(PlateXmlVO.class, attributes); PlateXmlVO plateXmlVO = getJavaBeanFromXmlAttr(PlateXmlVO.class, attributes);
if (ObjectUtil.isNull(plateXmlVO)) { if (ObjectUtil.isNull(plateXmlVO)) {
plateXmlVO = new PlateXmlVO(); plateXmlVO = new PlateXmlVO();
} }
// 校验板材数据 // 校验板材数据
checkPlate(plateXmlVO); checkPlate(plateXmlVO, location);
// 每解析到一次plate,设置一次全局plateItemCode给block列表用 // 每解析到一次plate,设置一次全局plateItemCode给block列表用
plateItemCode = String.valueOf(snowFlakeGenerator.nextId(null)); plateItemCode = String.valueOf(snowFlakeGenerator.nextId(null));
// 添加到临时表 // 相同的itemCode不重复创建临时Goods数据
cachedDataList.add(OrderImportTempDataDO.builder() String currentItemCode = plateXmlVO.getItemCode();
.id((Long) snowFlakeGenerator.nextId(null)) Long existInnerGoodsId = existGoodsIdMap.get(currentItemCode);
.orderId(orderId) if(ObjectUtil.isNull(existInnerGoodsId)) {
.taskId(taskId) Long innerGoodsId = (Long) snowFlakeGenerator.nextId(null);
.type(OrderImportTmpDataTypeEnum.GOODS.getType()) plateItemCode = String.valueOf(innerGoodsId);
.innerGoodsId(plateItemCode) existGoodsIdMap.put(currentItemCode, innerGoodsId);
.createTime(LocalDateTime.now())
.detail(JsonUtils.zipString(JSON.toJSONString(plateXmlVO))) // 添加到临时表
.sort(sort++) cachedDataList.add(OrderImportTempDataDO.builder()
.build()); .id((Long) snowFlakeGenerator.nextId(null))
.orderId(orderId)
.taskId(taskId)
.type(OrderImportTmpDataTypeEnum.GOODS.getType())
.innerGoodsId(plateItemCode)
.createTime(LocalDateTime.now())
.detail(JsonUtils.zipString(JSON.toJSONString(plateXmlVO)))
.sort(sort++)
.build());
} else {
plateItemCode = String.valueOf(existInnerGoodsId);
}
} }
@@ -633,7 +654,7 @@ public class DefaultOrderImportXmlParserHandler {
* *
* @param plate * @param plate
*/ */
private void checkPlate(PlateXmlVO plate) { private void checkPlate(PlateXmlVO plate, Location location) {
isEmptyAndBack(plate::getName, "plate:name"); isEmptyAndBack(plate::getName, "plate:name");
isEmptyAndBack(plate::getMaterial, "plate:material"); isEmptyAndBack(plate::getMaterial, "plate:material");
@@ -651,6 +672,37 @@ public class DefaultOrderImportXmlParserHandler {
notEmptyPositiveNumber(plate::getArea, "area", Double.class); notEmptyPositiveNumber(plate::getArea, "area", Double.class);
isEmptyAddAndInvalid(plate::getUnitArea, plate::setUnitArea, "", DictTypeConstants.UNIT_AREA, "unitArea"); isEmptyAddAndInvalid(plate::getUnitArea, plate::setUnitArea, "", DictTypeConstants.UNIT_AREA, "unitArea");
notEmptyPositiveNumber(plate::getCount, FIELD_COUNT, Integer.class); notEmptyPositiveNumber(plate::getCount, FIELD_COUNT, Integer.class);
// 查询板材库是否有对应
queryPlateExists(plate,location);
}
/**
* 查询板材库是否有对应物料编码
* 不存在再使用material、coatingObverse、thickness、brand、name查询是否存在匹配,还是不存在提示板材库先添加
*
* @param plate
*/
private void queryPlateExists(PlateXmlVO plate, Location location) {
PlateGoodDO plateGoodDO = null;
List<PlateGoodDO> plateGoodDOs;
if (StringUtils.isNotEmpty(plate.getItemCode())) {
plateGoodDOs = plateGoodMapper.selectGoodOne(plate.getItemCode(), OrganContextHolder.getOrganId());
} else {
plateGoodDOs = plateGoodMapper.selectGood(plate.getMaterial(), plate.getCoatingObverse(),
BigDecimal.valueOf(Long.parseLong(plate.getThickness())),
plate.getBrand(), plate.getName(), OrganContextHolder.getOrganId());
}
if (CollUtil.isNotEmpty(plateGoodDOs)) {
plateGoodDO = plateGoodDOs.get(0);
}
if (ObjectUtil.isNotNull(plateGoodDO)) {
plate.setItemCode(plateGoodDO.getGoodsId());
} else {
throw ServiceExceptionUtil.exception(ORDER_IMPORT_PLATEGOODS_NOT_EXIST_VALID_ERROR, location.getLineNumber());
}
} }
/** /**
@@ -1642,7 +1694,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);
@@ -8,7 +8,7 @@ import com.cf.imes.framework.common.exception.ErrorCode;
*/ */
public class ErrorCodeConstants { public class ErrorCodeConstants {
// ========== 生产单导入 1_005_000 ========== // ========== 生产单导入 1_005_000 ==========
public static final ErrorCode ORDER_IMPORT_PLATE_GOODS_NOT_EXISTS = new ErrorCode(1_005_000_000, "{}小板数据不存在:{}"); public static final ErrorCode ORDER_IMPORT_PLATE_GOODS_NOT_EXISTS = new ErrorCode(1_005_000_000, "{}生产单商品板材数据不存在:{}");
public static final ErrorCode ORDER_IMPORT_ORGANID_NOT_EXISTS = new ErrorCode(1_005_000_001, "不存在组织id,导入终止"); public static final ErrorCode ORDER_IMPORT_ORGANID_NOT_EXISTS = new ErrorCode(1_005_000_001, "不存在组织id,导入终止");
public static final ErrorCode ORDER_IMPORT_FAIL = new ErrorCode(1_005_000_002, "导入失败"); public static final ErrorCode ORDER_IMPORT_FAIL = new ErrorCode(1_005_000_002, "导入失败");
public static final ErrorCode WEBCAD_ORDER_NOT_EXISTS_ERROR = new ErrorCode(1_005_000_004, "导入失败:生产单号【{}】不存在"); public static final ErrorCode WEBCAD_ORDER_NOT_EXISTS_ERROR = new ErrorCode(1_005_000_004, "导入失败:生产单号【{}】不存在");
@@ -20,4 +20,5 @@ public class ErrorCodeConstants {
public static final ErrorCode WEBCAD_ORDER_IMPORT_ORG_SEALEDGE_ANALYZE_ERROR = new ErrorCode(1_005_000_010, "导入失败:组织封边对应配置解析异常,请检查配置"); public static final ErrorCode WEBCAD_ORDER_IMPORT_ORG_SEALEDGE_ANALYZE_ERROR = new ErrorCode(1_005_000_010, "导入失败:组织封边对应配置解析异常,请检查配置");
public static final ErrorCode WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_CHECK_ERROR = new ErrorCode(1_005_000_011, "导入失败:生产单【{}】下板件数量已达到20000片,无法继续导入"); public static final ErrorCode WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_CHECK_ERROR = new ErrorCode(1_005_000_011, "导入失败:生产单【{}】下板件数量已达到20000片,无法继续导入");
public static final ErrorCode WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_REACH_THRESHOLD_ERROR = new ErrorCode(1_005_000_012, "部分导入成功,生产单【{}】下板件数量已达到20000片,本次拆单超出部分不计入生产单"); public static final ErrorCode WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_REACH_THRESHOLD_ERROR = new ErrorCode(1_005_000_012, "部分导入成功,生产单【{}】下板件数量已达到20000片,本次拆单超出部分不计入生产单");
public static final ErrorCode ORDER_IMPORT_PLATE_GOODS_NOMATCH_ERROR = new ErrorCode(1_005_000_013, "导入失败,板材库中无板材匹配,商品编码:{},商品名称:{},材质:{},颜色:{},厚度:{},品牌:{}");
} }
@@ -37,7 +37,7 @@ public interface OrderImportTempDataMapper extends BaseMapperX<OrderImportTempDa
List<OrderImportTempDataGoodsIdGroupDO> selectGoodsIdGroup(@Param("reqVO") OrderImportTempDataReqVO reqVO); List<OrderImportTempDataGoodsIdGroupDO> selectGoodsIdGroup(@Param("reqVO") OrderImportTempDataReqVO reqVO);
/** /**
* 基于商品名称、材料、纹理、颜色、规格、商品高、商品宽、商品厚、品牌分组的商品总数查询 * 基于商品名称、材料、颜色、商品厚、品牌分组的商品总数查询
* *
* @param reqVO * @param reqVO
* @return * @return
@@ -14,13 +14,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cf.imes.framework.common.enums.OrderPlateTypeEnum; import com.cf.imes.framework.common.enums.OrderPlateTypeEnum;
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.common.util.object.BeanUtils;
import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd; import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd;
import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator; import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator;
import com.cf.imes.framework.mybatis.core.injector.BaseBatchMapper; import com.cf.imes.framework.mybatis.core.injector.BaseBatchMapper;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaUpdateWrapperX; import com.cf.imes.framework.mybatis.core.query.LambdaUpdateWrapperX;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.executor.enums.DictTypeConstants; import com.cf.imes.module.executor.enums.DictTypeConstants;
import com.cf.imes.module.executor.enums.OrderImportConstants; import com.cf.imes.module.executor.enums.OrderImportConstants;
import com.cf.imes.module.executor.enums.OrderImportStatusEnum; import com.cf.imes.module.executor.enums.OrderImportStatusEnum;
@@ -38,7 +36,6 @@ import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTempDataGoo
import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTempDataGoodsIdGroupDO; import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTempDataGoodsIdGroupDO;
import com.cf.imes.module.plan.dal.dataobject.orderItem.OrderItemDO; import com.cf.imes.module.plan.dal.dataobject.orderItem.OrderItemDO;
import com.cf.imes.module.plan.dal.dataobject.orderParts.OrderPartsDO; import com.cf.imes.module.plan.dal.dataobject.orderParts.OrderPartsDO;
import com.cf.imes.module.plan.dal.dataobject.orderParts.PartsDO;
import com.cf.imes.module.plan.dal.dataobject.ordermodel.OrderModelDO; import com.cf.imes.module.plan.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.plan.dal.dataobject.plate.PlateDO; import com.cf.imes.module.plan.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.plan.dal.dataobject.plate.PlateGoodDO; import com.cf.imes.module.plan.dal.dataobject.plate.PlateGoodDO;
@@ -70,6 +67,7 @@ import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static com.cf.imes.module.plan.enums.ErrorCodeConstants.ORDER_IMPORT_PLATE_GOODS_NOMATCH_ERROR;
import static com.cf.imes.module.plan.enums.ErrorCodeConstants.ORDER_IMPORT_PLATE_GOODS_NOT_EXISTS; import static com.cf.imes.module.plan.enums.ErrorCodeConstants.ORDER_IMPORT_PLATE_GOODS_NOT_EXISTS;
import static com.cf.imes.module.plan.service.order.OrderInputProcessor.ORDER_PARTS_REMARK_MODEL; import static com.cf.imes.module.plan.service.order.OrderInputProcessor.ORDER_PARTS_REMARK_MODEL;
import static com.cf.imes.module.plan.service.order.OrderInputProcessor.ORDER_PLATE_MODEL; import static com.cf.imes.module.plan.service.order.OrderInputProcessor.ORDER_PLATE_MODEL;
@@ -326,11 +324,7 @@ public class DefaultExcelOrderImportFactory {
.eq(OrderImportTempDataDO::getType, PLATE_TYPE) .eq(OrderImportTempDataDO::getType, PLATE_TYPE)
.eqIfPresent(OrderImportTempDataDO::getGoodsName, orderImportTempDataGoodsGroupDO.getGoodsName()) .eqIfPresent(OrderImportTempDataDO::getGoodsName, orderImportTempDataGoodsGroupDO.getGoodsName())
.eqIfPresent(OrderImportTempDataDO::getMaterial, orderImportTempDataGoodsGroupDO.getMaterial()) .eqIfPresent(OrderImportTempDataDO::getMaterial, orderImportTempDataGoodsGroupDO.getMaterial())
.eqIfPresent(OrderImportTempDataDO::getWave, orderImportTempDataGoodsGroupDO.getWave())
.eqIfPresent(OrderImportTempDataDO::getColor, orderImportTempDataGoodsGroupDO.getColor()) .eqIfPresent(OrderImportTempDataDO::getColor, orderImportTempDataGoodsGroupDO.getColor())
.eqIfPresent(OrderImportTempDataDO::getSpec, orderImportTempDataGoodsGroupDO.getSpec())
.eqIfPresent(OrderImportTempDataDO::getWidth, orderImportTempDataGoodsGroupDO.getWidth())
.eqIfPresent(OrderImportTempDataDO::getHeight, orderImportTempDataGoodsGroupDO.getHeight())
.eqIfPresent(OrderImportTempDataDO::getThickness, orderImportTempDataGoodsGroupDO.getThickness()) .eqIfPresent(OrderImportTempDataDO::getThickness, orderImportTempDataGoodsGroupDO.getThickness())
.eqIfPresent(OrderImportTempDataDO::getBrand, orderImportTempDataGoodsGroupDO.getBrand()) .eqIfPresent(OrderImportTempDataDO::getBrand, orderImportTempDataGoodsGroupDO.getBrand())
.set(OrderImportTempDataDO::getInnerGoodsId, innerGoodsId)); .set(OrderImportTempDataDO::getInnerGoodsId, innerGoodsId));
@@ -677,146 +671,146 @@ public class DefaultExcelOrderImportFactory {
Page<OrderImportTempDataDO> page = new Page<>(1, BATCH_THRESHOLD_NUMBER); Page<OrderImportTempDataDO> page = new Page<>(1, BATCH_THRESHOLD_NUMBER);
orderImportTempDataMapper.selectList(page, new LambdaQueryWrapperX<OrderImportTempDataDO>() orderImportTempDataMapper.selectList(page, new LambdaQueryWrapperX<OrderImportTempDataDO>()
.eq(OrderImportTempDataDO::getTaskId, taskId) .eq(OrderImportTempDataDO::getTaskId, taskId)
.eq(OrderImportTempDataDO::getType, PLATE_TYPE) .eq(OrderImportTempDataDO::getType, PLATE_TYPE)
.eq(OrderImportTempDataDO::getRoomName, roomName) .eq(OrderImportTempDataDO::getRoomName, roomName)
.eq(OrderImportTempDataDO::getBodyName, bodyName) .eq(OrderImportTempDataDO::getBodyName, bodyName)
.eqIfPresent(OrderImportTempDataDO::getGroupTypeName, groupTypeName) .eqIfPresent(OrderImportTempDataDO::getGroupTypeName, groupTypeName)
.eqIfPresent(OrderImportTempDataDO::getGroupName, groupName) .eqIfPresent(OrderImportTempDataDO::getGroupName, groupName)
.eq(OrderImportTempDataDO::getOrganId, organId), new ResultHandler<>() { .eq(OrderImportTempDataDO::getOrganId, organId), new ResultHandler<>() {
int count = 0; int count = 0;
@Override @Override
public void handleResult(ResultContext<? extends OrderImportTempDataDO> resultContext) { public void handleResult(ResultContext<? extends OrderImportTempDataDO> resultContext) {
OrderImportTempDataDO tempDataDO = resultContext.getResultObject(); OrderImportTempDataDO tempDataDO = resultContext.getResultObject();
int num = tempDataDO.getNum().intValue(); int num = tempDataDO.getNum().intValue();
String detail = JsonUtils.unzipString(tempDataDO.getDetail()); String detail = JsonUtils.unzipString(tempDataDO.getDetail());
OrderPlateImportExcelVO combination = JSON.parseObject(detail, OrderPlateImportExcelVO.class); OrderPlateImportExcelVO combination = JSON.parseObject(detail, OrderPlateImportExcelVO.class);
// 根据数量生成num个小板数据 // 根据数量生成num个小板数据
for (int i = 0; i < num; i++) { for (int i = 0; i < num; i++) {
long plateNo = idWorker.nextId(); long plateNo = idWorker.nextId();
long obtainingTime = idWorker.obtainingTime(); long obtainingTime = idWorker.obtainingTime();
long goodsId = Long.parseLong(tempDataDO.getInnerGoodsId()); long goodsId = Long.parseLong(tempDataDO.getInnerGoodsId());
// 成品宽 // 成品宽
String width = combination.getWidth(); String width = combination.getWidth();
// 成品长 // 成品长
String height = combination.getHeight(); String height = combination.getHeight();
// 计算面积 // 计算面积
BigDecimal area = BigDecimal.valueOf(Double.parseDouble(width)) BigDecimal area = BigDecimal.valueOf(Double.parseDouble(width))
.multiply(BigDecimal.valueOf(Double.parseDouble(height))) .multiply(BigDecimal.valueOf(Double.parseDouble(height)))
.movePointLeft(6) .movePointLeft(6)
.setScale(2, RoundingMode.HALF_UP); .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();// 排版面
DictDataRespDTO grainDTO = dictDataApi.parseDictData(DictTypeConstants.GRAIN_TYPE, combination.getTexture()).getData();// 纹路 DictDataRespDTO grainDTO = dictDataApi.parseDictData(DictTypeConstants.GRAIN_TYPE, combination.getTexture()).getData();// 纹路
DictDataRespDTO doorDTO = dictDataApi.parseDictData(DictTypeConstants.DOOR_OPENING_DIRECTIONS, combination.getOpenDoorType()).getData(); DictDataRespDTO doorDTO = dictDataApi.parseDictData(DictTypeConstants.DOOR_OPENING_DIRECTIONS, combination.getOpenDoorType()).getData();
PlateDO plateDO = PlateDO.builder() PlateDO plateDO = PlateDO.builder()
.id(plateId) .id(plateId)
.orderId(orderId) .orderId(orderId)
.name(combination.getName()) .name(combination.getName())
.plateNo(combination.getPlateNo()) .plateNo(combination.getPlateNo())
.type(OrderPlateTypeEnum.LAYERBOARD.getType()) .type(OrderPlateTypeEnum.LAYERBOARD.getType())
.goodsId(goodsId) .goodsId(goodsId)
.width(BigDecimal.valueOf(Double.parseDouble(width))) .width(BigDecimal.valueOf(Double.parseDouble(width)))
.plateNo(((obtainingTime) + Long.toString(plateNo).substring(2))) .plateNo(((obtainingTime) + Long.toString(plateNo).substring(2)))
.height(BigDecimal.valueOf(Double.parseDouble(height))) .height(BigDecimal.valueOf(Double.parseDouble(height)))
.thickness(BigDecimal.valueOf(Double.parseDouble(combination.getThickness()))) .thickness(BigDecimal.valueOf(Double.parseDouble(combination.getThickness())))
.splitWidth(BigDecimal.valueOf(NumberUtil.parseDouble(combination.getSplitWidth()))) .splitWidth(BigDecimal.valueOf(NumberUtil.parseDouble(combination.getSplitWidth())))
.splitHeight(BigDecimal.valueOf(NumberUtil.parseDouble(combination.getSplitHeight()))) .splitHeight(BigDecimal.valueOf(NumberUtil.parseDouble(combination.getSplitHeight())))
.splitThickness(BigDecimal.valueOf(Double.parseDouble(tempDataDO.getThickness()))) .splitThickness(BigDecimal.valueOf(Double.parseDouble(tempDataDO.getThickness())))
.sealLeft(BigDecimal.valueOf(Double.parseDouble(combination.getSealLeft()))) .sealLeft(BigDecimal.valueOf(Double.parseDouble(combination.getSealLeft())))
.sealRight(BigDecimal.valueOf(Double.parseDouble(combination.getSealRight()))) .sealRight(BigDecimal.valueOf(Double.parseDouble(combination.getSealRight())))
.sealUp(BigDecimal.valueOf(Double.parseDouble(combination.getSealUp()))) .sealUp(BigDecimal.valueOf(Double.parseDouble(combination.getSealUp())))
.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(area)
.openDoorType(Integer.valueOf(doorDTO.getValue())) .openDoorType(Integer.valueOf(doorDTO.getValue()))
.isSpecialShaped(false) .isSpecialShaped(false)
.isSculpt(false) .isSculpt(false)
.remark(remarkExtract(combination.remarkJSON())) .remark(remarkExtract(combination.remarkJSON()))
.roomName(roomName) .roomName(roomName)
.bodyName(bodyName) .bodyName(bodyName)
.customPlateNoBuilder(new StringBuilder()) .customPlateNoBuilder(new StringBuilder())
.organId(organId) .organId(organId)
.holeArrange(0) .holeArrange(0)
.holeFace(0) .holeFace(0)
.unregularPointCount(0) .unregularPointCount(0)
.frontHoleCount(0) .frontHoleCount(0)
.backHoleCount(0) .backHoleCount(0)
.sideHoleCount(0) .sideHoleCount(0)
.frontModelCount(0) .frontModelCount(0)
.backModelCount(0) .backModelCount(0)
.isDoor(false) .isDoor(false)
.offsetX(BIG_ZERO) .offsetX(BIG_ZERO)
.offsetY(BIG_ZERO) .offsetY(BIG_ZERO)
.isArcAcross(false) .isArcAcross(false)
.moduleTypeId(0L) .moduleTypeId(0L)
.isRowHole(false) .isRowHole(false)
.isOptimized(false) .isOptimized(false)
.isCutted(0) .isCutted(0)
.isCancel(false) .isCancel(false)
.filterType(EMPTY_STRING) .filterType(EMPTY_STRING)
.deleted(false) .deleted(false)
.build(); .build();
plateDO.setCreator(operatorName); plateDO.setCreator(operatorName);
plateDO.setUpdater(operatorName); plateDO.setUpdater(operatorName);
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
plateDO.setCreateTime(now); plateDO.setCreateTime(now);
plateDO.setUpdateTime(now); plateDO.setUpdateTime(now);
// 生成自定义板编号 // 生成自定义板编号
generateCustomPlateNo(plateDO); generateCustomPlateNo(plateDO);
// 批量插入order_plate // 批量插入order_plate
plateDOS.add(plateDO); plateDOS.add(plateDO);
orderInfoBatchInsertWithinThreshold(plateMapper, plateDOS, false); orderInfoBatchInsertWithinThreshold(plateMapper, plateDOS, false);
OrderItemDO orderItemDO = OrderItemDO.builder() OrderItemDO orderItemDO = OrderItemDO.builder()
.orderId(orderId) .orderId(orderId)
.type(OrderItemTypeEnum.PLATE_ITEM.getStatus()) .type(OrderItemTypeEnum.PLATE_ITEM.getStatus())
.roomId(orderBodyDO.getRoomId()) .roomId(orderBodyDO.getRoomId())
.bodyId(orderBodyDO.getId()) .bodyId(orderBodyDO.getId())
.plateId(plateId) .plateId(plateId)
.num(1.0) .num(1.0)
.groupId(StringUtils.isNotEmpty(groupTypeName) ? groupId : 0L) .groupId(StringUtils.isNotEmpty(groupTypeName) ? groupId : 0L)
.organId(organId) .organId(organId)
.packageId(0L) .packageId(0L)
.partsId(0L) .partsId(0L)
.build(); .build();
// 批量插入order_item // 批量插入order_item
orderItemDOS.add(orderItemDO); orderItemDOS.add(orderItemDO);
orderInfoBatchInsertWithinThreshold(orderItemMapper, orderItemDOS, false); orderInfoBatchInsertWithinThreshold(orderItemMapper, orderItemDOS, false);
// 批量插入CAD板件信息 // 批量插入CAD板件信息
OrderModelDO orderModelDO = OrderModelDO.builder() OrderModelDO orderModelDO = OrderModelDO.builder()
.orderId(orderId) .orderId(orderId)
.batchId(batchId) .batchId(batchId)
.plateId(plateId) .plateId(plateId)
.typographicFace(Integer.valueOf(typographyDTO.getValue())) .typographicFace(Integer.valueOf(typographyDTO.getValue()))
.texture(plateDO.getTexture()) .texture(plateDO.getTexture())
.openDoorType(plateDO.getOpenDoorType()) .openDoorType(plateDO.getOpenDoorType())
.build(); .build();
// 查询大板id用于小板轮廓goodsId // 查询大板id用于小板轮廓goodsId
GoodsDO goodsDO = goodsMapper.selectById(goodsId); GoodsDO goodsDO = goodsMapper.selectById(goodsId);
if (ObjectUtil.isNull(goodsDO)) { if (ObjectUtil.isNull(goodsDO)) {
throw ServiceExceptionUtil.exception(ORDER_IMPORT_PLATE_GOODS_NOT_EXISTS, orderId, goodsId); throw ServiceExceptionUtil.exception(ORDER_IMPORT_PLATE_GOODS_NOT_EXISTS, orderId, goodsId);
}
orderModelDO.setGoodsId(goodsDO.getGoodsId());
orderModelDO.setPlateGoodsId(goodsId);
orderModelDO.setOrganId(organId);
orderModelDO.setCreator(operatorName);
orderModelDO.setUpdater(operatorName);
orderModelDOS.add(orderModelDO);
// 批量插入造型数据
orderModelsBatchInsertWithinThreshold(false);
}
} }
orderModelDO.setGoodsId(goodsDO.getGoodsId());
orderModelDO.setPlateGoodsId(goodsId);
orderModelDO.setOrganId(organId);
orderModelDO.setCreator(operatorName);
orderModelDO.setUpdater(operatorName);
orderModelDOS.add(orderModelDO);
// 批量插入造型数据
orderModelsBatchInsertWithinThreshold(false);
}
}
}); });
@@ -1285,20 +1279,24 @@ public class DefaultExcelOrderImportFactory {
private void analyzePlateGoods(GoodsDO goodsDO) { private void analyzePlateGoods(GoodsDO goodsDO) {
PlateGoodDO plateGoodDO = null; PlateGoodDO plateGoodDO = null;
List<PlateGoodDO> existPlateGoodDOS = new ArrayList<>(); List<PlateGoodDO> existPlateGoodDOS = new ArrayList<>();
if (StringUtils.isNotEmpty(goodsDO.getGoodsId())) { String goodsId = goodsDO.getGoodsId();
String goodsName = goodsDO.getGoodsName();
String material = goodsDO.getMaterial();
String color = goodsDO.getColor();
BigDecimal thickness = goodsDO.getThickness();
String brand = goodsDO.getBrand();
if (StringUtils.isNotEmpty(goodsId)) {
// goodsId查询是否存在大板 // goodsId查询是否存在大板
plateGoodDO = getPlateGood(goodsDO.getGoodsId()); plateGoodDO = getPlateGood(goodsId);
} else { } else {
// 没有goodsId,大板属性匹配大板 // 没有goodsId,大板属性匹配大板
existPlateGoodDOS = plateGoodMapper.selectList(new LambdaQueryWrapperX<PlateGoodDO>() existPlateGoodDOS = plateGoodMapper.selectList(new LambdaQueryWrapperX<PlateGoodDO>()
.eq(PlateGoodDO::getGoodsName, goodsDO.getGoodsName()) .eq(PlateGoodDO::getGoodsName, goodsName)
.eq(PlateGoodDO::getMaterial, goodsDO.getMaterial()) .eq(PlateGoodDO::getMaterial, material)
.eq(PlateGoodDO::getColor, goodsDO.getColor()) .eq(PlateGoodDO::getColor, color)
.eqIfPresent(PlateGoodDO::getTexture, goodsDO.getTexture()) .eq(PlateGoodDO::getThickness, thickness)
.eqIfPresent(PlateGoodDO::getWidth, goodsDO.getWidth()) .eqIfPresent(PlateGoodDO::getBrand, brand)
.eqIfPresent(PlateGoodDO::getHeight, goodsDO.getHeight())
.eq(PlateGoodDO::getThickness, goodsDO.getThickness())
.eqIfPresent(PlateGoodDO::getSpec, goodsDO.getSpec())
.eq(PlateGoodDO::getDeleted, 0) .eq(PlateGoodDO::getDeleted, 0)
.eq(PlateGoodDO::getOrganId, organId)); .eq(PlateGoodDO::getOrganId, organId));
} }
@@ -1310,21 +1308,7 @@ public class DefaultExcelOrderImportFactory {
// 存在大板 // 存在大板
goodsDO.setGoodsId(plateGoodDO.getGoodsId()); goodsDO.setGoodsId(plateGoodDO.getGoodsId());
} else { } else {
// 不存在大板,新增 throw ServiceExceptionUtil.exception(ORDER_IMPORT_PLATE_GOODS_NOMATCH_ERROR, goodsId, goodsName, material, color, thickness, brand);
long plateNo = idWorker.nextId();
long obtainingTime = idWorker.obtainingTime();
// 大板id设置到orderGoodsDO
String goodsId = StringUtils.isEmpty(goodsDO.getGoodsId()) ? (obtainingTime) + Long.toString(plateNo).substring(2) : goodsDO.getGoodsId();
goodsDO.setGoodsId(goodsId);
plateGoodDO = BeanUtils.toBean(goodsDO, PlateGoodDO.class)
.setId((Long) snowFlakeGenerator.nextId(null))
.setGoodsId(goodsId);
// 批量插入plategood
plateGoodDOS.add(plateGoodDO);
orderInfoBatchInsertWithinThreshold(plateGoodMapper, plateGoodDOS, false);
} }
} }
@@ -14,13 +14,10 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.common.util.object.BeanUtils;
import com.cf.imes.framework.dict.core.util.DictFrameworkUtils; import com.cf.imes.framework.dict.core.util.DictFrameworkUtils;
import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd; import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd;
import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator; import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator;
import com.cf.imes.framework.mybatis.core.injector.BaseBatchMapper; import com.cf.imes.framework.mybatis.core.injector.BaseBatchMapper;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.executor.enums.DictTypeConstants; import com.cf.imes.module.executor.enums.DictTypeConstants;
import com.cf.imes.module.executor.enums.OrderImportStatusEnum; import com.cf.imes.module.executor.enums.OrderImportStatusEnum;
import com.cf.imes.module.executor.enums.OrderImportTmpDataTypeEnum; import com.cf.imes.module.executor.enums.OrderImportTmpDataTypeEnum;
@@ -61,7 +58,6 @@ import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTempDataPar
import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTempDataPartRoomBodyGroupGroupDO; import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTempDataPartRoomBodyGroupGroupDO;
import com.cf.imes.module.plan.dal.dataobject.orderItem.OrderItemDO; import com.cf.imes.module.plan.dal.dataobject.orderItem.OrderItemDO;
import com.cf.imes.module.plan.dal.dataobject.orderParts.OrderPartsDO; import com.cf.imes.module.plan.dal.dataobject.orderParts.OrderPartsDO;
import com.cf.imes.module.plan.dal.dataobject.orderParts.PartsDO;
import com.cf.imes.module.plan.dal.dataobject.ordermodel.OrderModelDO; import com.cf.imes.module.plan.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.plan.dal.dataobject.plate.PlateDO; import com.cf.imes.module.plan.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.plan.dal.dataobject.plate.PlateGoodDO; import com.cf.imes.module.plan.dal.dataobject.plate.PlateGoodDO;
@@ -283,7 +279,7 @@ public class DefaultXmlOrderImportFactory {
log.info("====================【生产单默认xml导入处理回显结束】===================="); log.info("====================【生产单默认xml导入处理回显结束】====================");
// 删除临时数据 // 删除临时数据
deleteTempData(); // deleteTempData();
// 完成所有流程后更新任务为导入成功 // 完成所有流程后更新任务为导入成功
updateTaskSuccess(); updateTaskSuccess();
} catch (Exception e) { } catch (Exception e) {
@@ -408,8 +404,6 @@ public class DefaultXmlOrderImportFactory {
goodsDO.setCreateTime(now); goodsDO.setCreateTime(now);
goodsDO.setUpdateTime(now); goodsDO.setUpdateTime(now);
// 解析大板
analyzePlateGoods(goodsDO);
goodsDOS.add(goodsDO); goodsDOS.add(goodsDO);
rawGoodsDOS.add(rawGoodsDO); rawGoodsDOS.add(rawGoodsDO);
// 批量插入rawgoods、goods // 批量插入rawgoods、goods
@@ -1865,58 +1859,6 @@ public class DefaultXmlOrderImportFactory {
return sb.toString(); return sb.toString();
} }
/**
* 解析大板
* 大板库没有新增,有就赋值goodsId
*
* @param goodsDO
*/
private void analyzePlateGoods(GoodsDO goodsDO) {
PlateGoodDO plateGoodDO = null;
List<PlateGoodDO> existPlateGoodDOS = new ArrayList<>();
if (StringUtils.isNotEmpty(goodsDO.getGoodsId())) {
// goodsId查询是否存在大板
plateGoodDO = getPlateGood(goodsDO.getGoodsId());
} else {
// 没有goodsId,大板属性匹配大板
existPlateGoodDOS = plateGoodMapper.selectList(new LambdaQueryWrapperX<PlateGoodDO>()
.eq(PlateGoodDO::getGoodsName, goodsDO.getGoodsName())
.eq(PlateGoodDO::getMaterial, goodsDO.getMaterial())
.eq(PlateGoodDO::getColor, goodsDO.getColor())
.eqIfPresent(PlateGoodDO::getTexture, goodsDO.getTexture())
.eqIfPresent(PlateGoodDO::getWidth, goodsDO.getWidth())
.eqIfPresent(PlateGoodDO::getHeight, goodsDO.getHeight())
.eq(PlateGoodDO::getThickness, goodsDO.getThickness())
.eqIfPresent(PlateGoodDO::getSpec, goodsDO.getSpec())
.eq(PlateGoodDO::getDeleted, 0)
.eq(PlateGoodDO::getOrganId, organId));
}
if (CollUtil.isNotEmpty(existPlateGoodDOS)) {
// 存在大板
goodsDO.setGoodsId(existPlateGoodDOS.get(0).getGoodsId());
} else if (plateGoodDO != null) {
// 存在大板
goodsDO.setGoodsId(plateGoodDO.getGoodsId());
} else {
// 不存在大板,新增
long plateNo = idWorker.nextId();
long obtainingTime = idWorker.obtainingTime();
// 大板id设置到orderGoodsDO
String goodsId = StringUtils.isEmpty(goodsDO.getGoodsId()) ? (obtainingTime) + Long.toString(plateNo).substring(2) : goodsDO.getGoodsId();
goodsDO.setGoodsId(goodsId);
plateGoodDO = BeanUtils.toBean(goodsDO, PlateGoodDO.class)
.setId((Long) snowFlakeGenerator.nextId(null))
.setGoodsId(goodsId);
// 批量插入plategood
plateGoodDOS.add(plateGoodDO);
orderInfoBatchInsertWithinThreshold(plateGoodMapper, plateGoodDOS, false);
}
}
/** /**
* 查询大板信息 * 查询大板信息
* *
@@ -25,16 +25,12 @@
select count(1) from ( select count(1) from (
select goods_name, select goods_name,
material, material,
wave,
color, color,
spec,
height,
width,
thickness, thickness,
brand brand
from order_import_temp_data from order_import_temp_data
where task_id = #{reqVO.taskId} and type = #{reqVO.type} and outer_goods_id = #{reqVO.goodsId} where task_id = #{reqVO.taskId} and type = #{reqVO.type} and outer_goods_id = #{reqVO.goodsId}
group by goods_name,material, wave, color, spec, height, width, thickness, brand) temp group by goods_name,material, color, thickness, brand) temp
</select> </select>
<select id="selectCountPartGoodsGroup" resultType="java.lang.Integer"> <select id="selectCountPartGoodsGroup" resultType="java.lang.Integer">
@@ -61,11 +57,7 @@
<select id="selectPlateGoodsGroup" resultType="com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTempDataGoodsGroupDO"> <select id="selectPlateGoodsGroup" resultType="com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTempDataGoodsGroupDO">
select goods_name, select goods_name,
material, material,
wave,
color, color,
spec,
height,
width,
thickness, thickness,
brand brand
<if test="reqVO.doPaging"> <if test="reqVO.doPaging">
@@ -73,7 +65,7 @@
</if> </if>
from order_import_temp_data from order_import_temp_data
where task_id = #{reqVO.taskId} and type = #{reqVO.type} and outer_goods_id = #{reqVO.goodsId} where task_id = #{reqVO.taskId} and type = #{reqVO.type} and outer_goods_id = #{reqVO.goodsId}
group by goods_name, material, wave, color, spec, height, width, thickness, brand group by goods_name, material, color, thickness, brand
<if test="reqVO.doPaging"> <if test="reqVO.doPaging">
order by sortn order by sortn
limit #{reqVO.offset}, #{reqVO.size} limit #{reqVO.offset}, #{reqVO.size}