mirror of
http://192.168.1.205:9980/cf_devdept2/cf_imes_server.git
synced 2026-08-12 21:02:08 +08:00
1、生产管理:计算用板量、未排单、已排单、优化相关移除order_plan_item,使用orders、order_goods新结构记录板件数量和面积;2、新增webcad导入支持板件数量和面积统计,订单商品规格/品牌支持可空;3、新增生产系统api导入支持板件数量和面积统计;
This commit is contained in:
+2
@@ -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, "导入失败:材质【{}】板件数量已发生改变,请重新导入");
|
||||
}
|
||||
|
||||
+30
@@ -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;
|
||||
}
|
||||
+25
@@ -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;
|
||||
}
|
||||
|
||||
+5
@@ -284,4 +284,9 @@ public class PlateDO extends BaseDO {
|
||||
|
||||
@TableField(exist = false)
|
||||
private StringBuilder customPlateNoBuilder;
|
||||
|
||||
/**
|
||||
* 排单id
|
||||
*/
|
||||
private Long planId;
|
||||
}
|
||||
+1
-1
@@ -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";
|
||||
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
+109
-16
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+120
-16
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空所有列表
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user