plateNo修改

This commit is contained in:
lym
2024-06-19 15:48:00 +08:00
parent 301c959082
commit ebd9bfec25
7 changed files with 264 additions and 55 deletions
@@ -40,11 +40,11 @@ public class GoodsDO extends BaseDO {
/**
* 设计端商品ID
*/
private Long rawGoodsId;
private String rawGoodsId;
/**
* 商品 ID
*/
private Long goodsId;
private String goodsId;
/**
* 商品名称
*/
@@ -6,6 +6,8 @@ import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO;
import org.apache.ibatis.annotations.Mapper;
import java.math.BigDecimal;
/**
* 板材信息 Mapper plate
*
@@ -14,12 +16,28 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface PlateGoodMapper extends BaseMapperX<PlateGoodDO> {
// 查询单个生产单中信息
default PlateGoodDO selectGoodOne(Long id, Long organId) {
// goodsId匹配
default PlateGoodDO selectGoodOne(String id, Long organId) {
return selectOne(new LambdaQueryWrapper<PlateGoodDO>()
.eq(PlateGoodDO::getGoodsId, id)
.eq(PlateGoodDO::getDeleted, 0)
.eq(PlateGoodDO::getOrganId, organId));
}
// 其他信息匹配
default PlateGoodDO selectGood(String goodsName, String material, String color, Integer texture, BigDecimal width,
BigDecimal thickness, BigDecimal height, String brand, String spec, Long organId) {
return selectOne(new LambdaQueryWrapper<PlateGoodDO>()
.eq(PlateGoodDO::getGoodsName, goodsName)
.eq(PlateGoodDO::getMaterial, material)
.eq(PlateGoodDO::getColor, color)
.eq(PlateGoodDO::getTexture, texture)
.eq(PlateGoodDO::getWidth, width)
.eq(PlateGoodDO::getHeight, height)
.eq(PlateGoodDO::getThickness, thickness)
.eq(PlateGoodDO::getBrand, brand)
.eq(PlateGoodDO::getSpec, spec)
.eq(PlateGoodDO::getDeleted, 0)
.eq(PlateGoodDO::getOrganId, organId));
}
}
@@ -305,6 +305,7 @@ public class OrderServiceImpl implements OrderService {
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteBodyByOrder(Long orderId, Collection<Long> bodyIds) {
validateOrderExists(orderId, OrganContextHolder.getOrganId());
// 校验生产单的状态 1 为新单状态,才可以修改
@@ -373,26 +374,38 @@ public class OrderServiceImpl implements OrderService {
List<PlateGoodDO> plateGoodLists = new ArrayList<>();
for (GoodsDO goodsDO : goodsLists) {
PlateGoodDO plateGoodDO;
if (goodsDO.getGoodsId() != null) { // 有goodsId
PlateGoodDO plateGoodDO = plateGoodMapper.selectGoodOne(goodsDO.getGoodsId(), SecurityFrameworkUtils.getLoginUser().getOrganId());
if (plateGoodDO != null) {//存在
goodsDO.setGoodsId(plateGoodDO.getId());
}
plateGoodDO = plateGoodMapper.selectGoodOne(goodsDO.getGoodsId(), SecurityFrameworkUtils.getLoginUser().getOrganId());
}else { // 没有goodsId 其他信息匹配
plateGoodDO = plateGoodMapper.selectGood(goodsDO.getGoodsName(), goodsDO.getMaterial(), goodsDO.getColor(),
goodsDO.getTexture(), goodsDO.getWidth(), goodsDO.getWidth(), goodsDO.getHeight(), goodsDO.getSpec(),
goodsDO.getBrand(), SecurityFrameworkUtils.getLoginUser().getOrganId());
}
if (plateGoodDO != null) {//存在板材
goodsDO.setGoodsId(plateGoodDO.getGoodsId());
break;
}else { // 不存在板材
Long plateGoods = (Long) identifierGenerator.nextId(null);
Long goodsId = (Long) identifierGenerator.nextId(null);
plateGoodDO = BeanUtils.toBean(goodsDO, PlateGoodDO.class)
.setId(plateGoods)
.setGoodsId(String.valueOf(goodsId));
// 判断是否存在raw_goods_id
System.out.println("goodsDO.getGoodsId() " + goodsDO.getGoodsId());
if (goodsDO.getGoodsId() != null) {
plateGoodDO.setGoodsId(goodsDO.getGoodsId());
}else {
goodsDO.setGoodsId(plateGoodDO.getGoodsId());
}
plateGoodLists.add(plateGoodDO);
}
Long plateGoods = (Long) identifierGenerator.nextId(null);
PlateGoodDO plateGoodDO = BeanUtils.toBean(goodsDO, PlateGoodDO.class)
.setId(plateGoods)
.setGoodsId(String.valueOf(goodsDO.getGoodsId()));
goodsDO.setGoodsId(plateGoodDO.getId());
plateGoodLists.add(plateGoodDO);
}
map.put("goodsDO", goodsLists);
map.put("plateGoodDOLists", plateGoodLists);
System.err.println(" map " + map);
return map;
}
@@ -501,13 +514,18 @@ public class OrderServiceImpl implements OrderService {
Map<String, List<?>> listMap = excelTypeRealize.changeDate(list, orderDO.getId());
List<RawGoodsDO> rawGoodsDO = (List<RawGoodsDO>) listMap.get("rawGoodsDOS");
List<GoodsDO> goodsDO = (List<GoodsDO>) listMap.get("goodsDOS");
List<PlateGoodDO> plateGoodDOS = (List<PlateGoodDO>) listMap.get("plateGoodDOS");
// List<PlateGoodDO> plateGoodDOS = (List<PlateGoodDO>) listMap.get("plateGoodDOS");
List<OrderBodyDO> bodyDO = (List<OrderBodyDO>) listMap.get("orderBodyDOS");
List<OrderGroupDO> groupDO = (List<OrderGroupDO>) listMap.get("orderGroupDOS");
List<PlateDO> plateDO = (List<PlateDO>) listMap.get("plateDOS");
List<OrderPartsDO> partsDO = (List<OrderPartsDO>) listMap.get("orderPartsDOS");
List<OrderItemDO> itemDO = (List<OrderItemDO>) listMap.get("orderItemDOS");
List<OrderModelDO> orderModelDOS = (List<OrderModelDO>) listMap.get("orderModelDOS");
// 板材库匹配
Map<String, List<?>> map = getPlateGoods(goodsDO);// 检验商品板材信息是否存在
goodsDO = (List<GoodsDO>) map.get("goodsDO");
List<PlateGoodDO> plateGoodDOS = (List<PlateGoodDO>) map.get("plateGoodDOLists");
validateCustomOrderNoExists(orderDO.getCustomOrderNo());
orderInputProcessor.batchInsert(rawGoodsDO, bodyDO, groupDO, partsDO, plateDO, null, itemDO, orderDO, goodsDO, plateGoodDOS);
orderInputProcessor.batchSaveModel(orderModelDOS);
@@ -0,0 +1,25 @@
package com.cf.imes.module.executor.util;
import java.util.concurrent.atomic.AtomicInteger;
public class MinuteCounter {
private static final int MASK = 0x7FFFFFFF;
private final AtomicInteger atom;
public MinuteCounter() {
atom = new AtomicInteger(0);
}
public final int incrementAndGet() {
return atom.incrementAndGet() & MASK;
}
public int get() {
return atom.get() & MASK;
}
public void set(int newValue) {
atom.set(newValue & MASK);
}
}
@@ -0,0 +1,131 @@
package com.cf.imes.module.executor.util.fileConversion.admin;
import com.cf.imes.module.executor.util.MinuteCounter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
/**
* @ClassName: SnowflakeIdWorker3rd
* @Description:snowflake算法改进
* @author: yonnie
* @date: 2024/06/18 14:10:47
* @version V1.0
*
* 将产生的Id类型更改为Integer 32bit <br>
* 把时间戳的单位改为分钟,使用25bit的时间戳
* 7bit作为自增值即 2^7 = 128
*/
@Slf4j
@Component
public class SnowflakeIdWorker3rd {
/** 初始时间 (2024-01-01: 1704038400) */
// private final int twepoch = 28400640;// 1704038400000L/1000/60;
private final int twepoch = 1704038400;
/** 序列在id中占位数 */
private final long sequenceBits = 7L;
/** 时间截向左移7bit */
private final long timestampLeftShift = sequenceBits;
/** 生成序列的MASK (0x7F) */
private final int sequenceMask = -1 ^ (-1 << sequenceBits);
/** 分钟内序 (0~127) */
private int sequence = 0;
private int laterSequence = 0;
/** 上次生成ID的时间戳 */
private int lastTimestamp = -1;
private final MinuteCounter counter = new MinuteCounter();
/** 预支时间标志 */
boolean isAdvance = false;
// ==============================Constructors=====================================
public SnowflakeIdWorker3rd() {
}
// ==============================Test=============================================
/** 测试 */
public static void main(String[] args) {
SnowflakeIdWorker3rd idWorker = new SnowflakeIdWorker3rd();
for (int i = 0; i < 1000; i++) {
long id = idWorker.nextId();
System.out.println(i + ": " + id + " " + "2406" + Long.toString(id).substring(2));
}
// long id = idWorker.nextId();
// System.out.println(id);
}
// ==============================Methods==========================================
/**
* 获取当前年月
* @return null
*/
public static int obtainingTime() {
LocalDate now = LocalDate.now();
int year = now.getYear();
String year_last_two_digits = String.valueOf(year).substring(2);
int month = now.getMonthValue();
String formatted_date = year_last_two_digits + String.format("%02d", month);
return Integer.parseInt(formatted_date);
}
/**
* 获得下一个ID (该方法是线程安全)
*
* @return SnowflakeId
*/
public synchronized int nextId() {
int timestamp = timeGen();
// 如果当前时间小于上一次ID生成的时间戳,说明系统时钟修改过
if (timestamp < lastTimestamp) {
throw new RuntimeException(String.format(
"Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
}
if (timestamp > counter.get()) {
counter.set(timestamp);
isAdvance = false;
}
// 如果是同时间生成的,则进行分钟内序列
if (lastTimestamp == timestamp || isAdvance) {
if (!isAdvance) {
sequence = (sequence + 1) & sequenceMask;
}
// 分钟内自增列溢出
if (sequence == 0) {
// 预支下一分获得新的时间戳
isAdvance = true;
int laterTimestamp = counter.get();
if (laterSequence == 0) {
laterTimestamp = counter.incrementAndGet();
}
int nextId = ((laterTimestamp - twepoch) << timestampLeftShift) | laterSequence;
laterSequence = (laterSequence + 1) & sequenceMask;
return nextId;
}
} else { // 时间戳改变,分钟内序列置0
sequence = 0;
laterSequence = 0;
}
// 上次生成ID的时间截
lastTimestamp = timestamp;
// 移位并或运算拼成32位的ID
return ((timestamp - twepoch) << timestampLeftShift) | sequence;
}
/**
* 返回以分钟为单位的当前时
*
* @return 当前时间(分钟)
*/
protected int timeGen() {
// String timestamp = String.valueOf(System.currentTimeMillis() / 1000 / 60);
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
return Integer.valueOf(timestamp);
}
}
@@ -13,6 +13,7 @@ import com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.executor.dal.dataobject.rawgoods.RawGoodsDO;
import com.cf.imes.module.executor.enums.*;
import com.cf.imes.module.executor.util.fileConversion.admin.SnowflakeIdWorker3rd;
import com.cf.imes.module.executor.util.deviseData.dataTwo.*;
import com.cf.imes.module.system.api.dict.DictDataApi;
import lombok.extern.slf4j.Slf4j;
@@ -39,6 +40,9 @@ public class ApiTypeRealize {
@Resource
private DictDataApi dictDataApi;
@Resource
SnowflakeIdWorker3rd idWorker;
private Integer num = 0;
private Integer groupNum = 0;
@@ -85,7 +89,9 @@ public class ApiTypeRealize {
Map<Integer, OrderBodyDO> bodyInfoChange = bodyInfoChange(dataBody, orderId);
// System.out.println(" bodyInfoChange " + bodyInfoChange);
// 加工组 少异形数量、板材数量
Map<String, Map<Integer, ?>> group = groupInfoChange(dataModule, orderId, bodyInfoChange);
Map<String, Map<Integer, ?>> group =
groupInfoChange(dataModule, orderId, bodyInfoChange);
Map<Integer, OrderGroupDO> orderGroupDO = (Map<Integer, OrderGroupDO>) group.get("orderGroup");
map.put("groupDO", orderGroupDO.values().stream().collect(Collectors.toList()));
Map<Integer, List<Integer>> groupLists = (Map<Integer, List<Integer>>) group.get("lists");
@@ -276,7 +282,7 @@ public class ApiTypeRealize {
RawGoodsDO rawGoodsDO = RawGoodsDO.builder()
.id((Long) identifierGenerator.nextId(null))
.orderId(orderId)
.rawGoodsId(String.valueOf(goods.getLong("GoodsID")))
.rawGoodsId(goods.getString("GoodsID"))
.goodsName(goods.getString("GoodsName"))
.material(goods.getString("Material"))
.color(goods.getString("Color"))
@@ -291,8 +297,8 @@ public class ApiTypeRealize {
GoodsDO goodsDO = GoodsDO.builder()
.id((Long) identifierGenerator.nextId(null))
.orderId(orderId)
.rawGoodsId(rawGoodsDO.getId())
.goodsId(goods.getLong("GoodsID"))
.rawGoodsId(String.valueOf(rawGoodsDO.getId()))
.goodsId(goods.getString("GoodsID")) // 先填这个,后面改
.goodsName(goods.getString("GoodsName"))
.material(goods.getString("Material"))
.color(goods.getString("Color"))
@@ -401,7 +407,7 @@ public class ApiTypeRealize {
.unit(parts.getString("Units"))
.price(parts.getDouble("Price"))
.isComposite(parts.getBoolean("IsComposite"))
.remark(partsRemarkChange(parts))
.remark(parts.getString("Remark"))
.build();
partsInfos.put(parts.getInteger("DataID"), partsInfo);
@@ -443,6 +449,7 @@ public class ApiTypeRealize {
String remark = JSON.toJSONString(mapList);
return remark;
}
/**
* 板材信息转换 写表 Integer指板材的ItemID板id 加一个板材自定义编号
*/
@@ -462,6 +469,9 @@ public class ApiTypeRealize {
if (dataPlates != null && !dataPlates.isEmpty()) {
JSONArray plateLists = dataPlates.getJSONArray("List");
for (int i = 0; i < plateLists.size(); i++) {
long plateNo = idWorker.nextId();
long obtainingTime = idWorker.obtainingTime();
JSONObject plate = plateLists.getJSONObject(i);
Integer type = Integer.valueOf(dictDataApi.parseDictData("order_plate_type",
@@ -472,8 +482,10 @@ public class ApiTypeRealize {
.id(plateId)
.orderId(orderId)
.name(plate.getString("BoardName"))
.plateNo(plate.getString("CustBlockNo"))
// .plateNo(plate.getString("CustBlockNo"))
.plateNo((obtainingTime)+ Long.toString(plateNo).substring(2))
.type(type)
.goodsId(goodsDOMap.get(plate.getInteger("GoodsID")) != null
? goodsDOMap.get(plate.getInteger("GoodsID")).getId() : plate.getInteger("GoodsID"))
// .width(BigDecimal.valueOf(plate.getDouble("CutWidth")))
@@ -12,8 +12,9 @@ import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO;
import com.cf.imes.module.executor.dal.dataobject.rawgoods.RawGoodsDO;
import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper;
import com.cf.imes.module.executor.enums.OrderItemTypeEnum;
import com.cf.imes.module.executor.util.fileConversion.admin.SnowflakeIdWorker3rd;
import io.swagger.v3.oas.models.security.SecurityScheme;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -22,8 +23,6 @@ import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.FILE_UPLOAD_ERR;
/**
* 实现数据格式转换
@@ -37,7 +36,7 @@ public class ExcelTypeRealize {
private SnowFlakeGenerator snowFlakeGenerator;
@Resource
private PlateGoodMapper plateGoodMapper;
SnowflakeIdWorker3rd idWorker;
// 数据转换 + 错误验证
public Map<String, List<?>> changeDate(List<?> list, Long orderId) {
@@ -74,50 +73,45 @@ public class ExcelTypeRealize {
Map<List<Object>, List<OrderPlateImportExcelVO>> goodsMap = value.stream()
.collect(Collectors.groupingBy(
p -> Arrays.asList(p.getGoodsName(),
p.getGoodsName(),
p.getThickness(),
p.getMaterial(),
p.getColor(),
p.getSpec(),
p.getThickness()),
p.getTexture(),
p.getModel(),
p.getBrand()),
Collectors.toList()
));
goodsMap.forEach((goodKey, goodValue) -> {
Long plateGoodId = (Long) snowFlakeGenerator.nextId(null);
PlateGoodDO plateGoodDO = setPlateGoodDO(goodValue.get(0)).setId(plateGoodId).setOrganId(organId);
plateGoodDOS.add(plateGoodDO);
// 板材信息合集,添加生产单id,添加生产单板材设计端商品编码,板材信息写入order_raw_goods
Long rawGoodsId = (Long) snowFlakeGenerator.nextId(null);
RawGoodsDO rawGoodsDO = setRawGoodsDO(goodValue.get(0)).setId(rawGoodsId).setOrderId(orderId);
// 板材信息合集,添加生产单id,添加生产单板材设计端商品编码,板材信息写入order_raw_goods
// 规格分解
List<Double> specList = spec(goodValue.get(0).getSpec());
RawGoodsDO rawGoodsDO = setRawGoodsDO(goodValue.get(0)).setId((Long) snowFlakeGenerator.nextId(null)).setOrderId(orderId);
rawGoodsDOS.add(rawGoodsDO);
Long goodId = (Long) snowFlakeGenerator.nextId(null);
GoodsDO plateDO = setGoodsDO(goodValue.get(0)).setId(goodId).setOrderId(orderId)
.setRawGoodsId(rawGoodsId).setGoodsId(plateGoodId);
.setRawGoodsId(String.valueOf(rawGoodsDO.getId()))
.setHeight(BigDecimal.valueOf(specList.get(0))).setWidth(BigDecimal.valueOf(specList.get(1))); // 在good_id为空的时候,首先赋值为空值
goodsDOS.add(plateDO);
// 赋值给板件未对应前order_raw_goods的id
// 赋值给板件未对应前order_raw_goods的id
for (OrderPlateImportExcelVO reqVO : goodValue) {
reqVO.setGoodId(goodId);
}
});
} else { // 商品编码有的
// 判断商品是否存在板材库中
PlateGoodDO plateGoodDO = plateGoodMapper.selectOne(PlateGoodDO::getGoodsId, value.get(0).getGoodsId());
Long plateGoodId = null;
if (plateGoodDO != null) {//存在
plateGoodId = plateGoodDO.getId();
} else {
plateGoodId = (Long) snowFlakeGenerator.nextId(null);
PlateGoodDO plateGoodDONew = setPlateGoodDO(value.get(0)).setId(plateGoodId).setOrganId(organId);
plateGoodDOS.add(plateGoodDONew);
}
// 板材信息合集,添加生产单id,添加生产单板材设计端商品编码,板材信息写入order_raw_goods
Long rawGoodsId = (Long) snowFlakeGenerator.nextId(null);
RawGoodsDO rawGoodsDO = setRawGoodsDO(value.get(0)).setId(rawGoodsId).setOrderId(orderId);
List<Double> specList = spec(value.get(0).getSpec());
// 板材信息合集,添加生产单id,添加生产单板材设计端商品编码,板材信息写入order_raw_goods
RawGoodsDO rawGoodsDO = setRawGoodsDO(value.get(0)).setId((Long) snowFlakeGenerator.nextId(null)).setOrderId(orderId);
rawGoodsDOS.add(rawGoodsDO);
Long goodId = (Long) snowFlakeGenerator.nextId(null);
GoodsDO plateDO = setGoodsDO(value.get(0)).setId(goodId).setOrderId(orderId)
.setRawGoodsId(rawGoodsId).setGoodsId(plateGoodId);
.setRawGoodsId(String.valueOf(rawGoodsDO.getId())).setGoodsId(String.valueOf(rawGoodsDO.getRawGoodsId()))
.setHeight(BigDecimal.valueOf(specList.get(0))).setWidth(BigDecimal.valueOf(specList.get(1)));
goodsDOS.add(plateDO);
// 赋值给板件未对应前order_raw_goods的id
// 赋值给板件未对应前order_raw_goods的id
for (OrderPlateImportExcelVO reqVO : value) {
reqVO.setGoodId(goodId);
}
@@ -179,10 +173,14 @@ public class ExcelTypeRealize {
//板材
plateCountByCombination[0] = plateCountByCombination[0] + Double.parseDouble(combination.getGoodsNumber());
for (int i = 0; i < Integer.parseInt(combination.getGoodsNumber()); i++) {
long plateNo = idWorker.nextId();
long obtainingTime = idWorker.obtainingTime();
Long plateId = (Long) snowFlakeGenerator.nextId(null);
PlateDO plateDO = PlateDO.builder()
.id(plateId).orderId(orderId).name(combination.getName()).plateNo(combination.getPlateNo())
.goodsId(combination.getGoodId()).width(BigDecimal.valueOf(Double.parseDouble(combination.getWidth())))
.plateNo(((obtainingTime)+ Long.toString(plateNo).substring(2)))
.height(BigDecimal.valueOf(Double.parseDouble(combination.getHeight())))
.thickness(BigDecimal.valueOf(Double.parseDouble(combination.getThickness())))
.splitWidth(BigDecimal.valueOf(Double.parseDouble(combination.getSplitWidth())))
@@ -300,15 +298,22 @@ public class ExcelTypeRealize {
}
// spec分离数据
public List<String> spec(String spec) {
List<String> list = null;
public List<Double> spec(String spec) {
List<Double> list = new ArrayList<>();
String[] parts = spec.split("\\×");
if (parts.length <= 1) {
return null;
}
for (int i = 0; i < parts.length; i++) {
list.add(parts[i]);
for (int i = 0; i < 3; i++) {
Double num = 0.0;
try {
if (i < parts.length)
num = Double.parseDouble(parts[i]);
} catch (NumberFormatException e) {
// 转换失败,保持num为0
}
list.add(num);
}
return list;
}