api导入改善

This commit is contained in:
lym
2025-01-02 15:02:49 +08:00
parent 066fed2423
commit 87bd765361
9 changed files with 1055 additions and 875 deletions
@@ -47,6 +47,7 @@ public class ErrorCodeConstants {
public static final ErrorCode ORDER_BODY_NOT_EXISTS = new ErrorCode(1_002_029_004, "当前柜体不存在");
public static final ErrorCode RAW_GOODS_NOT_EXISTS = new ErrorCode(1_002_029_005, "生产单中未用到此板材");
public static final ErrorCode APP_TOKEN_ERROR = new ErrorCode(1_002_029_007, "token获取失败");
public static final ErrorCode ORDER_NOT_FOUND = new ErrorCode(1_002_029_006, "生产单不存在");
public static final ErrorCode PLATE_PLAN_DATA_ERROR = new ErrorCode(1_002_029_008, "板材生产数据获取错误或此单不存在");
public static final ErrorCode PLATE_PLAN_DATA_NULL = new ErrorCode(1_002_029_008, "板材生产源数据为空");
public static final ErrorCode PARTS_DATA_ERROR = new ErrorCode(1_002_029_009, "配件数据获取错误");
@@ -56,10 +57,13 @@ public class ErrorCodeConstants {
public static final ErrorCode ORDER_STATUS_CONFLICT = new ErrorCode(1_002_029_006, "生产单状态冲突,禁止投入生产");
public static final ErrorCode ORDER_READ_ERR = new ErrorCode(1_002_029_006, "订单列表获取失败,请刷新重试");
public static final ErrorCode ORDER_DATE_ERR = new ErrorCode(1_002_029_006, "获取订单列表,时间超出范围,请在30天范围内选择");
public static final ErrorCode ORDER_DETAIL_DATE_ERR = new ErrorCode(1_002_029_006, "板件造型数据对应有无,请重新上传");
public static final ErrorCode SOURCE_NOT_EXITS_ERROR = new ErrorCode(1_002_029_013, "源数据查询失败");
public static final ErrorCode ORDER_DELETED_ERR = new ErrorCode(1_002_029_006, "生产单删除失败");
public static final ErrorCode ORDER_RESTORE_ERR = new ErrorCode(1_002_029_006, "生产单还原失败");
public static final ErrorCode DATA_ERR = new ErrorCode(1_002_030_000, "当前正在导入,请稍后");
public static final ErrorCode LOCK_ERR = new ErrorCode(1_002_030_001, "当前存在导入情况,请稍后");
// ========== 自定义板编号生成 ==========
public static final ErrorCode CUSTOM_PLATENO_GENERATE_ORDERNO_RULE_NOT_SUPPORT_RESETMODE = new ErrorCode(1_002_030_001, "自定义版编号生产单序号规则中存在不支持的复位类型:{}");
@@ -217,48 +217,20 @@ public class OrderController {
try {
orderId = (Long) identifierGenerator.nextId(null);
Long organId = getUserOrganId();
JSONObject oauth = apiDataAchieve.getApiToken(organId).get();
String token = oauth.getJSONObject("info").getString("access_token");
String shopId = oauth.getJSONObject("info").getString("shop_id");
JSONObject order = apiDataAchieve.getApiOrder(token, shopId, orderNo).get();
if (!order.getString("err_code").equals("0")) {
throw exception(PLATE_PLAN_DATA_ERROR);
}
if (order.getJSONArray("data") == null) {
throw exception(PLATE_PLAN_DATA_NULL);
}
JSONObject dataPlates = apiDataAchieve.getApiPlateProData(token, orderNo).get();
JSONObject dataParts = apiDataAchieve.getApiPartsMessage(token, orderNo).get();
JSONObject dataBody = apiDataAchieve.getApiBodyMessage(token, orderNo).get();
JSONObject dataGoods = apiDataAchieve.getApiGoodsMessage(token, orderNo).get();
JSONObject plate = apiDataAchieve.getApiPlateDetailMessage(token, orderNo).get();
JSONObject dataModule = apiDataAchieve.getApiGroupMessage(token, orderNo).get();
JSONObject block = apiDataAchieve.getApiBlocksMessage(token, orderNo).get();
Map<String, Object> listMap = apiTypeRealize.apiPlateDataChange(
token,
order,
dataPlates,//板件生产信息
dataParts,// 配件信息
dataBody, // 柜体信息
dataGoods, // 商品信息
plate, // 板件明细
dataModule,// 加工组信息
block,// 板材数据
orderNo,// 原始生产单号
orderId,// 生成生产单号
organId);
Long id = orderService.importApiData(listMap);
Long id = orderService.importApiData(apiTypeRealize.apiDataChange(orderNo, orderId, organId));
return success(String.valueOf(id));
} catch (Exception e) {
log.error(errKey, e);
return success(e.getMessage());
} finally {
// 进行判断,为空,写入时出现了错误,数据库数据回滚,此时删除 ES 里的数据
OrderDO orderDO = orderMapper.selectById(orderId);
if (orderDO == null) {
orderInputProcessor.deleteByOrderId(orderId, ORDER_PLATE_MODEL);
orderInputProcessor.deleteByOrderId(orderId, ORDER_PLATE_MODEL_COMPRESS);
}
log.error(errKey, e);
return success(e.getMessage());
} finally {
redisLockUtil.unlock(lockKey);
}
@@ -8,6 +8,7 @@ import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderBodyRe
import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderRoomBodyRespVO;
import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiDataTypeVo;
import org.springframework.boot.system.ApplicationHome;
import javax.servlet.http.HttpServletResponse;
@@ -102,10 +103,10 @@ public interface OrderService {
void updateRestoreBody(Long orderId , Set<Long> roomId, Long bodyId, Integer status);
/**
* @param listMap:生产单号
* @param apiDataTypeVo:生产单号
* @return Boolean
*/
Long importApiData(Map<String, Object> listMap);
Long importApiData(ApiDataTypeVo apiDataTypeVo);
/**
* 文件数据导入
@@ -59,6 +59,7 @@ import com.cf.imes.module.executor.service.plan.PlanService;
import com.cf.imes.module.executor.util.deviseData.structure.FieldConstants;
import com.cf.imes.module.executor.util.deviseData.structure.PlateDetail;
import com.cf.imes.module.executor.util.fileConversion.admin.SnowflakeIdWorker3rd;
import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiDataTypeVo;
import org.springframework.aop.framework.AopContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -398,8 +399,8 @@ public class OrderServiceImpl implements OrderService {
@Override
@Transactional(rollbackFor = Exception.class)
public Long importApiData(Map<String, Object> listMap) {
OrderDO order = (OrderDO) listMap.get(FieldConstants.ORDER);
public Long importApiData(ApiDataTypeVo apiDataTypeVo) {
OrderDO order = apiDataTypeVo.getOrderDO();
if (order != null) {
//判断是否已经导入
// if (!validateOrderNoExists(order.getApiOrderId(), OrganContextHolder.getOrganId())) {
@@ -415,15 +416,15 @@ public class OrderServiceImpl implements OrderService {
order.setSplitter(nickName);
}
}
List<GoodsDO> goodsDO = (List<GoodsDO>) listMap.get(FieldConstants.GOODS);
List<RawGoodsDO> rawGoodsDO = (List<RawGoodsDO>) listMap.get(FieldConstants.RAW_GOODS);
List<OrderBodyDO> bodyDO = (List<OrderBodyDO>) listMap.get(FieldConstants.BODY);
List<OrderGroupDO> groupDO = (List<OrderGroupDO>) listMap.get(FieldConstants.GROUP);
List<OrderPartsDO> partsDO = (List<OrderPartsDO>) listMap.get(FieldConstants.PARTS);
List<PlateDO> plateDO = (List<PlateDO>) listMap.get(FieldConstants.PLATE);
List<PlateDetail> plateDetail = (List<PlateDetail>) listMap.get(FieldConstants.PLATE_DETAIL);
List<OrderItemDO> itemDO = (List<OrderItemDO>) listMap.get(FieldConstants.ITEM);
List<OrderPartsRemark> partsRemark = (List<OrderPartsRemark>) listMap.get(FieldConstants.PARTS_REMARK);
List<GoodsDO> goodsDO = new ArrayList<>(apiDataTypeVo.getMapGoodsDO().values());
List<RawGoodsDO> rawGoodsDO = new ArrayList<>(apiDataTypeVo.getMapRawGoodsDO().values());
List<OrderBodyDO> bodyDO = new ArrayList<>(apiDataTypeVo.getMapOrderBodyDO().values());
List<OrderGroupDO> groupDO = new ArrayList<>(apiDataTypeVo.getMapOrderGroupDO().values());
List<OrderPartsDO> partsDO = new ArrayList<>(apiDataTypeVo.getMapPartsInfos().values());
List<PlateDO> plateDO = new ArrayList<>(apiDataTypeVo.getMapPlatesInfos().values());
List<PlateDetail> plateDetail = new ArrayList<>(apiDataTypeVo.getMapPlateDetails().values());
List<OrderItemDO> itemDO = apiDataTypeVo.getMapItem();
List<OrderPartsRemark> partsRemark = new ArrayList<>(apiDataTypeVo.getMapPartRemarks().values());
Map<String, List<?>> map = getPlateGoods(goodsDO);// 检验商品板材信息是否存在
goodsDO = (List<GoodsDO>) map.get(FieldConstants.GOODS);
@@ -448,7 +449,7 @@ public class OrderServiceImpl implements OrderService {
// 保存压缩的数据
orderInputProcessor.batchSaveCompressModel(Collections.singletonList(orderModelCompressDO));
}
if (partsRemark != null && !partsRemark.isEmpty()) {
if (!partsRemark.isEmpty()) {
orderInputProcessor.batchSaveOrderPartsModel(partsRemark);
}
@@ -26,9 +26,9 @@ public class PlateDetail{
private String name;
// 板id
private Long plateId;
// 板编号
// 设计板编号
private String plateNo;
// 自定义板
// 设计板编
private String customPlateNo;
private Integer texture; //纹路 纹路(0正纹1可翻转2反纹)
@@ -2,7 +2,6 @@ package com.cf.imes.module.executor.util.fileConversion.admin.api.webcad;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cf.imes.module.system.api.application.ApplicationApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
@@ -10,15 +9,19 @@ import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.function.BiFunction;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
/**
@@ -39,9 +42,9 @@ public class ApiDataAchieve {
// 重复使用的常量
private static final String ORDER_NO_KEY = "order_no";
private static final String CURR_PAGE_KEY = "curr_page";
private static final String PAGE_COUNT_KEY = "page_count";
private static final String PAGE_COUNT_KEY = "page_count"; //请求
private static final String ERR_CODE_KEY = "err_code";
private static final String PAGECOUNT_KEY = "PageCount";
private static final String ALL_PAGE_COUNT_KEY = "PageCount"; // 页数
private static final String VALUE_KEY = "value";
private static final String GOODS_ID = "goods_id";
@@ -56,45 +59,35 @@ public class ApiDataAchieve {
if (!json.getString("err_msg").equals("success")) {
throw exception(APP_TOKEN_ERROR);
}
// String token = json.getJSONObject("info").getString("access_token");
return new AsyncResult<>(json);
}
// 获取板件生产数据信息
@Async
public Future<JSONObject> getApiPlateProData(String token, String orderNo) {
public JSONObject getApiPlateProData(String token, String orderNo) {
JSONObject jsonPlatesData = new JSONObject();
jsonPlatesData.put(ORDER_NO_KEY, "N" + orderNo);//生产单号需要传入赋值
jsonPlatesData.put("format", "json");
jsonPlatesData.put("version", "3");
JSONObject dataPlates = apiDataProduction.getApiOrderMessage(token, jsonPlatesData);
return new AsyncResult<>(dataPlates);
return dataPlates;
}
// 获取配件信息 分页获取
@Async
public Future<JSONObject> getApiPartsMessage(String token, String orderNo) {
JSONObject jsonParts = new JSONObject();
jsonParts.put(CURR_PAGE_KEY, 1);
jsonParts.put(PAGE_COUNT_KEY, PARTS_PAGE_MAX);
jsonParts.put(ORDER_NO_KEY, "N" + orderNo);
public JSONObject getApiPartsMessage(String token, String orderNo, JSONObject jsonParts) {
JSONObject parts = apiDataProduction.getApiOrderPartsMessage(token, jsonParts);
if (!parts.getString(ERR_CODE_KEY).equals("0")) {
log.error("配件数据获取错误" + "N" + orderNo);
throw exception(PARTS_DATA_ERROR);
}
JSONObject dataParts = new JSONObject();
for (int i = 1; i <= parts.getJSONObject(VALUE_KEY).getInteger(PAGECOUNT_KEY); i++) {
jsonParts.put(CURR_PAGE_KEY, i);
JSONObject value = apiDataProduction.getApiOrderPartsMessage(token, jsonParts);
dataParts = mergeJSONObjects(dataParts, value);
if (parts.getJSONObject(VALUE_KEY).getJSONArray("List") == null || parts.getJSONObject(VALUE_KEY).getJSONArray("List").isEmpty()) {
return null;
}
return new AsyncResult<>(dataParts);
return parts;
}
// 柜体信息转换
@Async
public Future<JSONObject> getApiBodyMessage(String token, String orderNo) {
public JSONObject getApiBodyMessage(String token, String orderNo) {
JSONObject jsonBody = new JSONObject();
jsonBody.put(CURR_PAGE_KEY, 1);
jsonBody.put(PAGE_COUNT_KEY, PARTS_PAGE_MAX);
@@ -105,17 +98,17 @@ public class ApiDataAchieve {
throw exception(BODY_DATA_ERROR);
}
JSONObject dataBody = new JSONObject();
for (int i = 1; i <= body.getJSONObject(VALUE_KEY).getInteger(PAGECOUNT_KEY); i++) {
for (int i = 1; i <= body.getJSONObject(VALUE_KEY).getInteger(ALL_PAGE_COUNT_KEY); i++) {
jsonBody.put(CURR_PAGE_KEY, i);
JSONObject value = apiDataProduction.getApiOrderBodyMessage(token, jsonBody);
dataBody = mergeJSONObjects(dataBody, value);
}
return new AsyncResult<>(dataBody);
return dataBody;
}
// 商品信息转换
@Async
public Future<JSONObject> getApiGoodsMessage(String token, String orderNo) {
public JSONObject getApiGoodsMessage(String token, String orderNo) {
JSONObject jsonGoods = new JSONObject();
jsonGoods.put(CURR_PAGE_KEY, 1);
jsonGoods.put(PAGE_COUNT_KEY, PARTS_PAGE_MAX);
@@ -126,47 +119,38 @@ public class ApiDataAchieve {
throw exception(GOODS_DATA_ERROR);
}
JSONObject dataGoods = new JSONObject();
for (int i = 1; i <= goods.getJSONObject(VALUE_KEY).getInteger(PAGECOUNT_KEY); i++) {
for (int i = 1; i <= goods.getJSONObject(VALUE_KEY).getInteger(ALL_PAGE_COUNT_KEY); i++) {
jsonGoods.put(CURR_PAGE_KEY, i);
JSONObject value = apiDataProduction.getApiOrderGoodsMessage(token, jsonGoods);
dataGoods = mergeJSONObjects(dataGoods, value);
}
return new AsyncResult<>(dataGoods);
return dataGoods;
}
// 板材明细信息转换
@Async
public Future<JSONObject> getApiPlateDetailMessage(String token, String orderNo) {
JSONObject jsonPlates = new JSONObject();
jsonPlates.put(CURR_PAGE_KEY, 1);
jsonPlates.put(PAGE_COUNT_KEY, PARTS_PAGE_MAX);
jsonPlates.put(ORDER_NO_KEY, "N" + orderNo);
public JSONObject getApiPlateDetailMessage(String token, String orderNo, JSONObject jsonPlates) {
JSONObject plates = apiDataProduction.getApiBlocksDataMessage(token, jsonPlates);
if (!plates.getString(ERR_CODE_KEY).equals("0")) {
log.error("板材明细获取错误" + "N" + orderNo);
throw exception(PLATE_DATA_ERROR);
}
JSONObject plate = new JSONObject();
for (int i = 1; i <= plates.getJSONObject(VALUE_KEY).getInteger(PAGECOUNT_KEY); i++) {
jsonPlates.put(CURR_PAGE_KEY, i);
JSONObject value = apiDataProduction.getApiBlocksDataMessage(token, jsonPlates);
plate = mergeJSONObjects(plate, value);
if (plates.getJSONObject(VALUE_KEY).getJSONArray("List") == null || plates.getJSONObject(VALUE_KEY).getJSONArray("List").isEmpty()) {
return null;
}
return new AsyncResult<>(plate);
return plates;
}
// 加工组信息转换
@Async
public Future<JSONObject> getApiGroupMessage(String token, String orderNo) {
public JSONObject getApiGroupMessage(String token, String orderNo) {
JSONObject jsonModule = new JSONObject();
jsonModule.put(ORDER_NO_KEY, "N" + orderNo);
JSONObject dataModule = apiDataProduction.getApiModuleTypeDataMessage(token, jsonModule);
return new AsyncResult<>(dataModule);
return dataModule;
}
// 板材数据信息转换
@Async
public Future<JSONObject> getApiBlocksMessage(String token, String orderNo) {
public JSONObject getApiBlocksMessage(String token, String orderNo) {
JSONObject jsonBlocks = new JSONObject();
jsonBlocks.put(CURR_PAGE_KEY, 1);
jsonBlocks.put(PAGE_COUNT_KEY, PARTS_PAGE_MAX);
@@ -176,12 +160,12 @@ public class ApiDataAchieve {
log.error("板材数据获取错误" + "N" + orderNo);
}
JSONObject block = new JSONObject();
for (int i = 1; i <= blocks.getJSONObject(VALUE_KEY).getInteger(PAGECOUNT_KEY); i++) {
for (int i = 1; i <= blocks.getJSONObject(VALUE_KEY).getInteger(ALL_PAGE_COUNT_KEY); i++) {
jsonBlocks.put(CURR_PAGE_KEY, i);
JSONObject value = apiDataProduction.getApiBlocksMessage(token, jsonBlocks);
block = mergeJSONObjects(block, value);
}
return new AsyncResult<>(block);
return block;
}
// 商品列表信息转换
@@ -197,14 +181,21 @@ public class ApiDataAchieve {
}
// 订单获取
public Future<JSONObject> getApiOrder(String token, String shopId, String orderNo) {
public JSONObject getApiOrder(String token, String orderNo) {
JSONObject jsonOrders = new JSONObject();
orderNo = "N" +orderNo;
JSONArray orderList = new JSONArray();
orderList.add(orderNo.replace(" ", ""));
jsonOrders.put(ORDER_NO_KEY, orderList);
JSONObject order = apiDataProduction.getApiOrderList(token, jsonOrders);
return new AsyncResult<>(order);
if (!order.getString(ProduceApiConstants.CODE).equals("0") ||
order.getJSONArray(ProduceApiConstants.DATA) == null ||
order.getJSONArray(ProduceApiConstants.DATA).isEmpty()) {
throw exception(ORDER_NOT_FOUND);
}
return order;
}
// 订单列表
@@ -281,7 +272,6 @@ public class ApiDataAchieve {
}
mergedObj.put("List", mergedList);
// System.out.println(mergedObj);
return mergedObj;
@@ -328,7 +318,6 @@ public class ApiDataAchieve {
}
mergedObj.put("data", mergedList);
// System.out.println(mergedObj);
return mergedObj;
@@ -0,0 +1,59 @@
package com.cf.imes.module.executor.util.fileConversion.admin.api.webcad;
import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRemark;
import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO;
import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
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.plate.PlateGoodDO;
import com.cf.imes.module.executor.dal.dataobject.rawgoods.RawGoodsDO;
import com.cf.imes.module.executor.util.deviseData.structure.PlateDetail;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
/**
* api数据转换中可能用到的数据结构
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ApiDataTypeVo {
public OrderDO orderDO;
public Map<String, RawGoodsDO> mapRawGoodsDO;
public Map<String, GoodsDO> mapGoodsDO;
public Map<String, OrderBodyDO> mapOrderBodyDO;
public Map<String, OrderGroupDO> mapOrderGroupDO; // 加工组id 和 加工组信息
public Map<String, List<String>> mapGroupLists;// 加工组id 和 小板配件itemId
public Map<String, List<OrderItemDO>> mapItemByGroup;
public List<OrderItemDO> mapItem;
public Map<String, OrderPartsDO> mapPartsInfos;
public Map<String, OrderPartsRemark> mapPartRemarks;
public Map<String, PlateDetail> mapPlateDetails; // 造型数据
public Map<String, PlateDO> mapPlatesInfos; // 小板数据
// 柜体板块片数,柜体异形板片数
public Map<String, Integer> totalPlateCountMapToBody;
public Map<String, Integer> irregularPlateCountMapToBody;
// 加工组板块片数,加工组异形板片数
public Map<String, Integer> totalPlateCountMapToGroup;
public Map<String, Integer> irregularPlateCountMapToGroup;
}
@@ -11,6 +11,12 @@ public class ProduceApiConstants {
public static final String CODE = "err_code";
public static final String ZERO = "0";
public static final String ONE = "1";
public static final String PAGE_COUNT = "PageCount";
// 请求发送
public static final String ORDER_NO_KEY = "order_no";
public static final String CURR_PAGE_KEY = "curr_page";
public static final String PAGE_COUNT_KEY = "page_count"; //请求
// ========== getApiOrderPartsMessage partsList 配件明细模块 ==========
public static final String GD_GOODS_SN = "goods_sn"; // 用户自定义配件编号
@@ -156,7 +162,7 @@ public class ProduceApiConstants {
public static final String BG_THICKNESS = "Thickness"; // 厚
public static final String BG_AREA = "Area"; // 面积
public static final String BG_WAVE = "Wave"; // 纹路(正纹 = 0, 可翻转 = 1, 反纹 = 2 )
public static final String BG_SEAL = "Seal"; // 封边信息(格式:左封边,右封边,上封边,下封边)
public static final String BG_SEAL = "Seal"; // 封边信息(格式:左封边,右封边,上封边,下封边) 信息不可以用,信息不全
public static final String BG_IS_UN_REGULAR = "IsUnRegular"; // 是否异形
public static final String BG_IS_MODEL = "IsModel"; // 是否造型
public static final String BG_IS_HOLE = "IsHole"; // 是否有孔