1、生产管理:计算用板量、未排单、已排单、优化相关移除order_plan_item,使用orders、order_goods新结构记录板件数量和面积;2、新增webcad导入支持板件数量和面积统计,订单商品规格/品牌支持可空;3、新增生产系统api导入支持板件数量和面积统计;

This commit is contained in:
gaoqr
2025-07-02 09:02:09 +08:00
parent e9493755b0
commit ff8356d7c5
36 changed files with 1368 additions and 866 deletions
@@ -22,4 +22,6 @@ public class ErrorCodeConstants {
public static final ErrorCode WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_REACH_THRESHOLD_ERROR = new ErrorCode(1_005_000_012, "部分导入成功,生产单【{}】下板件数量已达到{}片,本次拆单超出部分不计入生产单");
public static final ErrorCode ORDER_IMPORT_PLATE_GOODS_NOMATCH_ERROR = new ErrorCode(1_005_000_013, "导入失败,板材库中无板材匹配,商品编码:{},商品名称:{},材质:{},颜色:{},厚度:{},品牌:{}");
public static final ErrorCode WEBCAD_ORDER_IMPORT_PEEK_NOT_EXIST_ERROR = new ErrorCode(1_005_000_014, "导入失败:数据源不存在,请检查消息可靠性");
public static final ErrorCode WEBCAD_ORDER_IMPORT_ORDER_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_005_000_015, "导入失败:生产单号【{}】板件数量已发生改变,请重新导入");
public static final ErrorCode WEBCAD_ORDER_IMPORT_GOODS_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_005_000_015, "导入失败:材质【{}】板件数量已发生改变,请重新导入");
}
@@ -107,4 +107,34 @@ public class GoodsDO extends BaseDO {
*/
private Boolean deleted;
/**
* 板件数量
*/
private Integer plateNum;
/**
* 已排单小板数量
*/
private Integer plannedPlateNum;
/**
* 板件总面积
*/
private Double area;
/**
* 已排单面积
*/
private Double plannedPlateArea;
/**
* 版本号:乐观锁用
*/
private int version;
/**
* 是否当前导入前已存在的大板
*/
@TableField(exist = false)
private boolean exist;
}
@@ -132,4 +132,29 @@ public class OrderDO extends BaseDO {
*/
@TableField(value = "custom_plateno_seq", typeHandler = CompressStringTypeHandler.class)
private String customPlatenoSeq;
/**
* 板件数量
*/
private Integer plateNum;
/**
* 已排单小板数量
*/
private Integer plannedPlateNum;
/**
* 板件总面积
*/
private Double area;
/**
* 已排单面积
*/
private Double plannedPlateArea;
/**
* 版本号:乐观锁用
*/
private int version;
}
@@ -284,4 +284,9 @@ public class PlateDO extends BaseDO {
@TableField(exist = false)
private StringBuilder customPlateNoBuilder;
/**
* 排单id
*/
private Long planId;
}
@@ -47,7 +47,7 @@ public class OrderInputProcessor {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static final String ORDER_PLATE_MODEL = "imes_order_plate_model";
public static final String ORDER_PLATE_MODEL = "imes_order_plate_model_0";
public static final String ORDER_PARTS_REMARK_MODEL = "imes_order_parts_remark_model";
@@ -177,7 +177,7 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
WebCadDataReqVO webCadDataReqVO = mapper.readValue(parser, WebCadDataReqVO.class);
WebCadOrderImportFactory webCadOrderImportFactory = new WebCadOrderImportFactory(organId, orderDO, snowFlakeGenerator, orderBodyMapper, plateMapper,
WebCadOrderImportFactory webCadOrderImportFactory = new WebCadOrderImportFactory(organId, orderDO, snowFlakeGenerator, orderMapper, orderBodyMapper, plateMapper,
idWorker, orderInputProcessor, goodsMapper, rawGoodsMapper, customPlateNoGenerateService, systemConfigApi, webCadImportProperties.getCadImportPlateNumThreshold(), jdbcTemplate);
webCadOrderImportFactory.analyzeTempData(webCadDataReqVO);
} else {
@@ -2,6 +2,7 @@ package com.cf.imes.module.plan.service.orderImport.factory;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -11,6 +12,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONReader;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.cf.imes.framework.common.exception.ErrorCode;
import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil;
@@ -54,6 +56,7 @@ 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.plate.PlateMapper;
import com.cf.imes.module.plan.dal.mysql.rawgoods.RawGoodsMapper;
import com.cf.imes.module.plan.enums.ErrorCodeConstants;
import com.cf.imes.module.plan.service.customplateno.CustomPlateNoGenerateService;
import com.cf.imes.module.plan.service.customplateno.vo.CustomPlateNoGenerateConfigVO;
import com.cf.imes.module.plan.service.order.OrderInputProcessor;
@@ -79,6 +82,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_GET_ORG_SEALEDGE_ERROR;
import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_CHECK_ERROR;
@@ -156,8 +160,8 @@ public class WebCadOrderImportAsyncFactory {
// 房间名+柜体名+加工组名
private Map<String, OrderGroupDO> orderGroupMap = new HashMap<>();
// 板材缓存:{商品编号:order_goods}
private Map<String, Long> materialMap = new HashMap<>();
// 板材缓存:{商品编号:GoodsDO}
private Map<String, GoodsDO> materialMap = new HashMap<>();
// 已存在房间缓存:{ roomName: roomId }
private Map<String, Long> existRoomIdMap = new HashMap<>();
@@ -185,6 +189,8 @@ public class WebCadOrderImportAsyncFactory {
// 当前拆单导入的板件数量(初始包含前n次导入的板件总数)
private int currentPlateNum;
private BigDecimal currentPlateArea = new BigDecimal(0);
// cad拆单板件数量阈值
private int cadImportPlateNumThreshold;
@@ -287,6 +293,12 @@ public class WebCadOrderImportAsyncFactory {
saveData();
log.debug("====================【cad拆单全局保存结束】====================");
// 新增/更新order_goods
insertOrUpdatePlateNumGoods();
// 更新生产单板件数量
updateOrderPlateNum();
// 更新导入任务为成功
updateTaskSuccess(taskId);
@@ -380,6 +392,18 @@ public class WebCadOrderImportAsyncFactory {
throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_CHECK_ERROR, orderId, cadImportPlateNumThreshold);
} else {
currentPlateNum = existPlateCount.intValue();
// 统计当前板件总面积
List<Map<String, Object>> orderPlateSumResult = plateMapper.selectMaps(new QueryWrapper<PlateDO>()
.select("sum(area) as area")
.eq("organ_id", organId)
.eq("order_id", orderId)
.eq("deleted", false));
if (CollUtil.isNotEmpty(orderPlateSumResult)) {
Map<String, Object> resultMap = orderPlateSumResult.get(0);
if(ObjectUtil.isNotNull(resultMap)) {
currentPlateArea = (BigDecimal) resultMap.get("area");
}
}
}
}
@@ -397,19 +421,22 @@ public class WebCadOrderImportAsyncFactory {
String plateGoodsGoodsId = materialReqVO.getGoodsId();
Long orderGoodsId;
Long existOrderGoodsId = materialMap.get(plateGoodsGoodsId);
if (ObjectUtil.isNull(existOrderGoodsId)) {
GoodsDO existOrderGoods = materialMap.get(plateGoodsGoodsId);
if (ObjectUtil.isNull(existOrderGoods)) {
// 检查生产单下是否已经有板材下的order_goods,有不再创建
List<Long> existOrderGoodIds = goodsMapper.selectList(new LambdaQueryWrapper<GoodsDO>()
List<GoodsDO> existOrderGoodIds = goodsMapper.selectList(new LambdaQueryWrapper<GoodsDO>()
.eq(GoodsDO::getGoodsId, plateGoodsGoodsId)
.eq(GoodsDO::getOrderId, orderId)
.eq(GoodsDO::getOrganId, organId)
.eq(GoodsDO::getDeleted, false)
.select(GoodsDO::getId)).stream().map(GoodsDO::getId).toList();
.select(GoodsDO::getId, GoodsDO::getVersion, GoodsDO::getPlateNum, GoodsDO::getPlannedPlateNum));
if (CollUtil.isNotEmpty(existOrderGoodIds)) {
// 缓存goodCode和orderGoodsId的对应关系
materialMap.put(plateGoodsGoodsId, existOrderGoodIds.get(0));
GoodsDO existGoodsDO = existOrderGoodIds.get(0);
existGoodsDO.setExist(true);
materialMap.put(plateGoodsGoodsId, existGoodsDO);
continue;
}
// 创建设计端商品
@@ -424,8 +451,8 @@ public class WebCadOrderImportAsyncFactory {
.color(materialReqVO.getColor())
.colorBlack(EMPTY_STRING)
.thickness(materialReqVO.getThickness())
.spec(materialReqVO.getSpec())
.brand(materialReqVO.getBrand())
.spec(getEmpty(materialReqVO.getSpec()))
.brand(getEmpty(materialReqVO.getBrand()))
.price(0.00)
.deleted(false)
.organId(organId)
@@ -450,13 +477,19 @@ public class WebCadOrderImportAsyncFactory {
.width(BigDecimal.valueOf(getZeroDouble(materialReqVO.getWidth())))
.height(BigDecimal.valueOf(getZeroDouble(materialReqVO.getHeight())))
.thickness(BigDecimal.valueOf(materialReqVO.getThickness()))
.spec(materialReqVO.getSpec())
.brand(materialReqVO.getBrand())
.spec(getEmpty(materialReqVO.getSpec()))
.brand(getEmpty(materialReqVO.getBrand()))
.remark(EMPTY_STRING)
.planId(0L)
.price(0.00)
.deleted(false)
.organId(organId)
.exist(false)
.plateNum(0)
.plannedPlateNum(0)
.area(0.00)
.plannedPlateArea(0.00)
.version(0)
.build();
goodsDO.setCreator(operatorName);
goodsDO.setUpdater(operatorName);
@@ -467,13 +500,12 @@ public class WebCadOrderImportAsyncFactory {
rawGoodsDOS.add(rawGoodsDO);
// 缓存goodCode和orderGoodsId的对应关系
materialMap.put(plateGoodsGoodsId, orderGoodsId);
materialMap.put(plateGoodsGoodsId, goodsDO);
}
}
reader.endArray();
orderInfoBatchInsertWithinThreshold(rawGoodsMapper, rawGoodsDOS, true);
orderInfoBatchInsertWithinThreshold(goodsMapper, goodsDOS, true);
}
/**
@@ -700,8 +732,15 @@ public class WebCadOrderImportAsyncFactory {
remark.deleteCharAt(remark.length() - 1);
}
Double area = block.getArea();
String splitHeight = block.getSpliteHeight();
String spliteWidth = block.getSpliteWidth();
// 累加goods的板件总数
GoodsDO goodsDO = materialMap.get(block.getGoodsCode());
goodsDO.setPlateNum(goodsDO.getPlateNum() + 1);
goodsDO.setArea(goodsDO.getArea() + area);
// 创建order_plate
PlateDO plateDO = PlateDO.builder()
.id(plateId)
@@ -709,14 +748,14 @@ public class WebCadOrderImportAsyncFactory {
.name(block.getName())
.plateNo(obtainingTime + Long.toString(plateNo).substring(2))
.type(block.getType())
.goodsId(materialMap.get(block.getGoodsCode()))
.goodsId(goodsDO.getId())
.width(BigDecimal.valueOf(block.getWidth()))
.height(BigDecimal.valueOf(block.getHeight()))
.thickness(BigDecimal.valueOf(block.getThickness()))
.splitHeight(BigDecimal.valueOf(NumberUtil.parseDouble(StringUtils.isNotEmpty(splitHeight) ? splitHeight : String.valueOf(block.getKaiLiaoHeight()))))
.splitThickness(BigDecimal.valueOf(NumberUtil.parseDouble(block.getSpliteThickness())))
.splitWidth(BigDecimal.valueOf(NumberUtil.parseDouble(StringUtils.isNotEmpty(spliteWidth) ? spliteWidth : String.valueOf(block.getKaiLiaoWidth()))))
.area(BigDecimal.valueOf(block.getArea()))
.area(BigDecimal.valueOf(area))
.texture(block.getTexture())
.holeFace(block.getHoleFace())
.isDoor(block.getIsDoor())
@@ -750,6 +789,7 @@ public class WebCadOrderImportAsyncFactory {
.remark(remark.toString())
.deleted(false)
.organId(organId)
.planId(0L)
.build();
plateDO.setCreator(operatorName);
plateDO.setUpdater(operatorName);
@@ -759,6 +799,7 @@ public class WebCadOrderImportAsyncFactory {
//批量保存板件
// 达到板件数量阈值,停止入库,更新全局参数停止后续入库
currentPlateNum += 1;
currentPlateArea.add(BigDecimal.valueOf(area));
if (currentPlateNum > cadImportPlateNumThreshold) {
plateNumReachThreshold = true;
return;
@@ -1747,7 +1788,7 @@ public class WebCadOrderImportAsyncFactory {
private void orderPlateBatchInsertWithinThreshold(List<PlateDO> list, boolean isLast) {
// 达到批量的阈值就做一次插入
if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) {
String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int index) throws SQLException {
@@ -2092,4 +2133,56 @@ public class WebCadOrderImportAsyncFactory {
private void updateTaskSuccess(Long taskId) {
orderImportTaskMapper.update(new LambdaUpdateWrapper<OrderImportTaskDO>().eq(OrderImportTaskDO::getId, taskId).set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_SUCCESS.getStatus()));
}
/**
* 更新生产单的板件总数
*/
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);
}
}
/**
* 新增order_goods/更新已有order_goods的板件总数
*/
private void insertOrUpdatePlateNumGoods() {
if (MapUtil.isNotEmpty(materialMap)) {
// 分类新增和更新的goods
List<GoodsDO> insertGoods = new ArrayList<>();
List<GoodsDO> updateGoods = new ArrayList<>();
materialMap.forEach((k, v) -> {
if (v.isExist()) {
updateGoods.add(v);
} else {
insertGoods.add(v);
}
});
// 批量插入order_goods
orderInfoBatchInsertWithinThreshold(goodsMapper, insertGoods, true);
// 批量更新order_goods的plateNum
for (GoodsDO updateDo : updateGoods) {
int updated = goodsMapper.update(new LambdaUpdateWrapper<GoodsDO>()
.eq(GoodsDO::getId, updateDo.getId())
.eq(GoodsDO::getOrganId, organId)
.eq(GoodsDO::getVersion, updateDo.getVersion())
.set(GoodsDO::getPlateNum, updateDo.getPlateNum())
.set(GoodsDO::getVersion, updateDo.getVersion() + 1));
if (updated == 0) {
throw ServiceExceptionUtil.exception(ErrorCodeConstants.WEBCAD_ORDER_IMPORT_GOODS_UPDATE_CONCURRENCY_ERROR, updateDo.getId());
}
}
}
}
}
@@ -1,6 +1,7 @@
package com.cf.imes.module.plan.service.orderImport.factory;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -10,6 +11,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.cf.imes.framework.common.exception.ErrorCode;
import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil;
import com.cf.imes.framework.common.pojo.CommonResult;
@@ -44,9 +46,11 @@ import com.cf.imes.module.plan.dal.elasticsearch.Point;
import com.cf.imes.module.plan.dal.elasticsearch.PointDetail;
import com.cf.imes.module.plan.dal.elasticsearch.PointList;
import com.cf.imes.module.plan.dal.mysql.goods.GoodsMapper;
import com.cf.imes.module.plan.dal.mysql.order.OrderMapper;
import com.cf.imes.module.plan.dal.mysql.orderBody.OrderBodyMapper;
import com.cf.imes.module.plan.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.plan.dal.mysql.rawgoods.RawGoodsMapper;
import com.cf.imes.module.plan.enums.ErrorCodeConstants;
import com.cf.imes.module.plan.service.customplateno.CustomPlateNoGenerateService;
import com.cf.imes.module.plan.service.customplateno.vo.CustomPlateNoGenerateConfigVO;
import com.cf.imes.module.plan.service.order.OrderInputProcessor;
@@ -92,6 +96,8 @@ public class WebCadOrderImportFactory {
private SnowFlakeGenerator snowFlakeGenerator;
private OrderMapper orderMapper;
private OrderBodyMapper orderBodyMapper;
private PlateMapper plateMapper;
@@ -141,8 +147,8 @@ public class WebCadOrderImportFactory {
// 房间名+柜体名+加工组名:加工组
private Map<String, OrderGroupDO> orderGroupMap = new HashMap<>();
// 板材缓存:{商品编号:order_goods}
private Map<String, Long> materialMap = new HashMap<>();
// 板材缓存:{商品编号:GoodsDO}
private Map<String, GoodsDO> materialMap = new HashMap<>();
// 已存在房间缓存:{ roomName: roomId }
private Map<String, Long> existRoomIdMap = new HashMap<>();
@@ -170,6 +176,8 @@ public class WebCadOrderImportFactory {
// 当前拆单导入的板件数量(初始包含前n次导入的板件总数)
private int currentPlateNum;
private BigDecimal currentPlateArea = new BigDecimal(0);
// cad拆单板件数量阈值
private int cadImportPlateNumThreshold;
@@ -179,6 +187,7 @@ public class WebCadOrderImportFactory {
public WebCadOrderImportFactory(Long organId,
OrderDO orderDO,
SnowFlakeGenerator snowFlakeGenerator,
OrderMapper orderMapper,
OrderBodyMapper orderBodyMapper,
PlateMapper plateMapper,
SnowflakeIdWorker3rd idWorker,
@@ -193,6 +202,7 @@ public class WebCadOrderImportFactory {
this.orderDO = orderDO;
this.orderId = orderDO.getId();
this.snowFlakeGenerator = snowFlakeGenerator;
this.orderMapper = orderMapper;
this.orderBodyMapper = orderBodyMapper;
this.plateMapper = plateMapper;
this.idWorker = idWorker;
@@ -247,6 +257,12 @@ public class WebCadOrderImportFactory {
saveData();
log.debug("====================【cad拆单全局保存结束】====================");
// 新增/更新order_goods
insertOrUpdatePlateNumGoods();
// 更新生产单板件数量
updateOrderPlateNum();
// 所有自定义板编号生成完成后更新配置到生产单
customPlateNoGenerateService.updateCustomPlateNoGenerateConfig(plateNoGenerateConfigVO, orderDO);
@@ -321,6 +337,18 @@ public class WebCadOrderImportFactory {
throw ServiceExceptionUtil.exception(WEBCAD_ORDER_IMPORT_ORDER_PLATENUM_CHECK_ERROR, orderId, cadImportPlateNumThreshold);
} else {
currentPlateNum = existPlateCount.intValue();
// 统计当前板件总面积
List<Map<String, Object>> orderPlateSumResult = plateMapper.selectMaps(new QueryWrapper<PlateDO>()
.select("sum(area) as area")
.eq("organ_id", organId)
.eq("order_id", orderId)
.eq("deleted", false));
if (CollUtil.isNotEmpty(orderPlateSumResult)) {
Map<String, Object> resultMap = orderPlateSumResult.get(0);
if(ObjectUtil.isNotNull(resultMap)) {
currentPlateArea = (BigDecimal) resultMap.get("area");
}
}
}
}
@@ -337,22 +365,32 @@ public class WebCadOrderImportFactory {
// 检查生产单下是否已经有goodsId下的order_goods,有不再创建
materialMap = goodsMapper.selectMaps(
new QueryWrapper<GoodsDO>()
.select("goods_id,MIN(id) as id")
.select("goods_id ,MIN(id) as id, plate_num, planned_plate_num, area, planned_plate_area version")
.eq("order_id", orderId)
.eq("organ_id", organId)
.eq("deleted", false)
.in("goods_id", materialReqVOS.stream().map(WebCadDataMaterialReqVO::getGoodsId).collect(Collectors.toList()))
.groupBy("goods_id")).stream()
.groupBy("goods_id, plate_num, planned_plate_num, area, planned_plate_area, version")).stream()
.collect(Collectors.toMap(
m -> String.valueOf(m.get("goods_id")),
m -> ((Number) m.get("id")).longValue()
m -> {
GoodsDO goodsDO = new GoodsDO();
goodsDO.setId(NumberUtil.parseLong(String.valueOf(m.get("id"))));
goodsDO.setExist(true);
goodsDO.setPlateNum(NumberUtil.parseInt(String.valueOf(m.get("plate_num"))));
goodsDO.setPlannedPlateNum(NumberUtil.parseInt(String.valueOf(m.get("planned_plate_num"))));
goodsDO.setArea(NumberUtil.parseDouble(String.valueOf(m.get("area"))));
goodsDO.setPlannedPlateArea(NumberUtil.parseDouble(String.valueOf(m.get("planned_plate_area"))));
goodsDO.setVersion(NumberUtil.parseInt(String.valueOf(m.get("version"))));
return goodsDO;
}
));
for (WebCadDataMaterialReqVO materialReqVO : materialReqVOS) {
String plateGoodsGoodsId = materialReqVO.getGoodsId();
Long existOrderGoodsId = materialMap.get(plateGoodsGoodsId);
if (ObjectUtil.isNull(existOrderGoodsId)) {
GoodsDO existOrderGoods = materialMap.get(plateGoodsGoodsId);
if (ObjectUtil.isNull(existOrderGoods)) {
// 创建设计端商品
Long rawGoodsId = (Long) snowFlakeGenerator.nextId(null);
RawGoodsDO rawGoodsDO = RawGoodsDO.builder()
@@ -365,8 +403,8 @@ public class WebCadOrderImportFactory {
.color(materialReqVO.getColor())
.colorBlack(EMPTY_STRING)
.thickness(materialReqVO.getThickness())
.spec(materialReqVO.getSpec())
.brand(materialReqVO.getBrand())
.spec(getEmpty(materialReqVO.getSpec()))
.brand(getEmpty(materialReqVO.getBrand()))
.price(0.00)
.deleted(false)
.organId(organId)
@@ -387,24 +425,29 @@ public class WebCadOrderImportFactory {
.width(BigDecimal.valueOf(getZeroDouble(materialReqVO.getWidth())))
.height(BigDecimal.valueOf(getZeroDouble(materialReqVO.getHeight())))
.thickness(BigDecimal.valueOf(materialReqVO.getThickness()))
.spec(materialReqVO.getSpec())
.brand(materialReqVO.getBrand())
.spec(getEmpty(materialReqVO.getSpec()))
.brand(getEmpty(materialReqVO.getBrand()))
.remark(EMPTY_STRING)
.planId(0L)
.price(0.00)
.deleted(false)
.organId(organId)
.exist(false)
.plateNum(0)
.plannedPlateNum(0)
.area(0.00)
.plannedPlateArea(0.00)
.version(0)
.build();
goodsDOS.add(goodsDO);
rawGoodsDOS.add(rawGoodsDO);
// 缓存goodCode和orderGoodsId的对应关系
materialMap.put(plateGoodsGoodsId, orderGoodsId);
materialMap.put(plateGoodsGoodsId, goodsDO);
}
}
orderInfoBatchInsertWithinThreshold(rawGoodsMapper, rawGoodsDOS, true);
orderInfoBatchInsertWithinThreshold(goodsMapper, goodsDOS, true);
}
/**
@@ -579,6 +622,7 @@ public class WebCadOrderImportFactory {
boolean isModel = block.isModel() || sideModel || has2DModel || hasSide2DModel || block.isHas3DModel();
// 是否排孔
boolean isRawHole = (block.getFrontHoleCount() + block.getBackHoleCount()) > 0;
Double area = block.getArea();
// 柜体长宽深
orderBodyDO.setWidth(block.getCabinetWidth());
@@ -600,6 +644,12 @@ public class WebCadOrderImportFactory {
remark.deleteCharAt(remark.length() - 1);
}
// 累加goods的板件总数
GoodsDO goodsDO = materialMap.get(block.getGoodsCode());
goodsDO.setPlateNum(goodsDO.getPlateNum() + 1);
goodsDO.setArea(goodsDO.getArea() + area);
String splitHeight = block.getSpliteHeight();
String spliteWidth = block.getSpliteWidth();
// 创建order_plate
@@ -609,14 +659,14 @@ public class WebCadOrderImportFactory {
.name(block.getName())
.plateNo(obtainingTime + Long.toString(plateNo).substring(2))
.type(block.getType())
.goodsId(materialMap.get(block.getGoodsCode()))
.goodsId(goodsDO.getId())
.width(BigDecimal.valueOf(block.getWidth()))
.height(BigDecimal.valueOf(block.getHeight()))
.thickness(BigDecimal.valueOf(block.getThickness()))
.splitHeight(BigDecimal.valueOf(NumberUtil.parseDouble(StringUtils.isNotEmpty(splitHeight) ? splitHeight : String.valueOf(block.getKaiLiaoHeight()))))
.splitThickness(BigDecimal.valueOf(NumberUtil.parseDouble(block.getSpliteThickness())))
.splitWidth(BigDecimal.valueOf(NumberUtil.parseDouble(StringUtils.isNotEmpty(spliteWidth) ? spliteWidth : String.valueOf(block.getKaiLiaoWidth()))))
.area(BigDecimal.valueOf(block.getArea()))
.area(BigDecimal.valueOf(area))
.texture(block.getTexture())
.holeFace(block.getHoleFace())
.isDoor(block.getIsDoor())
@@ -650,6 +700,7 @@ public class WebCadOrderImportFactory {
.remark(remark.toString())
.deleted(false)
.organId(organId)
.planId(0L)
.build();
plateDO.setCreator(operatorName);
plateDO.setUpdater(operatorName);
@@ -659,6 +710,7 @@ public class WebCadOrderImportFactory {
//批量保存板件
// 达到板件数量阈值,停止入库,更新全局参数停止后续入库
currentPlateNum += 1;
currentPlateArea.add(BigDecimal.valueOf(area));
if (currentPlateNum > cadImportPlateNumThreshold) {
plateNumReachThreshold = true;
return;
@@ -1636,7 +1688,7 @@ public class WebCadOrderImportFactory {
private void orderPlateBatchInsertWithinThreshold(List<PlateDO> list, boolean isLast) {
// 达到批量的阈值就做一次插入
if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) {
String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int index) throws SQLException {
@@ -1947,6 +1999,58 @@ public class WebCadOrderImportFactory {
return resultList;
}
/**
* 更新生产单的板件总数
*/
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);
}
}
/**
* 新增order_goods/更新已有order_goods的板件总数
*/
private void insertOrUpdatePlateNumGoods() {
if (MapUtil.isNotEmpty(materialMap)) {
// 分类新增和更新的goods
List<GoodsDO> insertGoods = new ArrayList<>();
List<GoodsDO> updateGoods = new ArrayList<>();
materialMap.forEach((k, v) -> {
if (v.isExist()) {
updateGoods.add(v);
} else {
insertGoods.add(v);
}
});
// 批量插入order_goods
orderInfoBatchInsertWithinThreshold(goodsMapper, insertGoods, true);
// 批量更新order_goods的plateNum
for (GoodsDO updateDo : updateGoods) {
int updated = goodsMapper.update(new LambdaUpdateWrapper<GoodsDO>()
.eq(GoodsDO::getId, updateDo.getId())
.eq(GoodsDO::getOrganId, organId)
.eq(GoodsDO::getVersion, updateDo.getVersion())
.set(GoodsDO::getPlateNum, updateDo.getPlateNum())
.set(GoodsDO::getVersion, updateDo.getVersion() + 1));
if (updated == 0) {
throw ServiceExceptionUtil.exception(ErrorCodeConstants.WEBCAD_ORDER_IMPORT_GOODS_UPDATE_CONCURRENCY_ERROR, updateDo.getId());
}
}
}
}
/**
* 清空所有列表
*/