1、webcad异步导入恢复nfs读写方式;2、orderImport路径全小写修正;

This commit is contained in:
gaoqr
2025-11-26 16:49:33 +08:00
parent c9be3478f4
commit 24e192a895
56 changed files with 401 additions and 395 deletions
@@ -36,7 +36,7 @@ public class RabbitMqConstants {
/**
* webcad拆单队列
*/
public static final String ORDER_IMPORT_WEBCAD_QUEUE = "order_import_webcad_queue_%s";
public static final String ORDER_IMPORT_WEBCAD_QUEUE = "order_import_webcad_queue";
/**
* 生产单导入死信交换机
@@ -7,7 +7,6 @@ import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -17,7 +16,6 @@ import java.util.Map;
import static com.cf.imes.framework.mq.rabbitmq.constant.RabbitMqConstants.ORDER_IMPORT_DEAD_LETTER_EXCHANGE;
import static com.cf.imes.framework.mq.rabbitmq.constant.RabbitMqConstants.ORDER_IMPORT_DEAD_LETTER_QUEUE;
import static com.cf.imes.framework.mq.rabbitmq.constant.RabbitMqConstants.ORDER_IMPORT_DEAD_LETTER_ROUTING_KEY;
import static com.cf.imes.framework.mq.rabbitmq.constant.RabbitMqConstants.ORDER_IMPORT_WEBCAD_QUEUE;
/**
* @author Gqr
@@ -25,8 +23,6 @@ import static com.cf.imes.framework.mq.rabbitmq.constant.RabbitMqConstants.ORDER
*/
@Configuration
public class ChenfengRabbitMQPlanConfiguration {
@Value("${chenfeng.plan.webcad.import.node:1}")
private String instanceId;
private static final String X_DEAD_LETTER_EXCHANGE_KEY = "x-dead-letter-exchange";
private static final String X_DEAD_LETTER_ROUTING_KEY = "x-dead-letter-routing-key";
@@ -37,13 +33,8 @@ public class ChenfengRabbitMQPlanConfiguration {
* @return
*/
@Bean
public DirectExchange orderImportWebCadFanoutExchange() {
return new DirectExchange(RabbitMqConstants.ORDER_IMPORT_WEBCAD_EXCHANGE);
}
@Bean("orderImportWebCadQueueName")
public String dynamicOrderImportWebCadQueueName() {
return String.format(ORDER_IMPORT_WEBCAD_QUEUE, instanceId);
public FanoutExchange orderImportWebCadFanoutExchange() {
return new FanoutExchange(RabbitMqConstants.ORDER_IMPORT_WEBCAD_EXCHANGE);
}
/**
@@ -58,7 +49,7 @@ public class ChenfengRabbitMQPlanConfiguration {
args.put(X_DEAD_LETTER_EXCHANGE_KEY, ORDER_IMPORT_DEAD_LETTER_EXCHANGE);
// 设置死信路由键
args.put(X_DEAD_LETTER_ROUTING_KEY, ORDER_IMPORT_DEAD_LETTER_ROUTING_KEY);
return QueueBuilder.durable(dynamicOrderImportWebCadQueueName()).withArguments(args).build();
return QueueBuilder.durable(RabbitMqConstants.ORDER_IMPORT_WEBCAD_QUEUE).withArguments(args).build();
}
/**
@@ -68,7 +59,7 @@ public class ChenfengRabbitMQPlanConfiguration {
*/
@Bean
public Binding orderImportWebCadBinding() {
return BindingBuilder.bind(orderImportWebCadQueue()).to(orderImportWebCadFanoutExchange()).with(instanceId);
return BindingBuilder.bind(orderImportWebCadQueue()).to(orderImportWebCadFanoutExchange());
}
/**
@@ -1,7 +1,10 @@
package com.cf.imes.module.plan.controller.admin.orderImport;
package com.cf.imes.module.plan.controller.admin.orderimport;
import cn.hutool.core.util.ObjectUtil;
import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.operatelog.core.annotations.OperateLog;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.plan.service.orderImport.WebCadOrderImportService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -14,6 +17,7 @@ import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.Resource;
import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.IMPORT;
import static com.cf.imes.module.plan.enums.ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORGANID_EMPTY_ERROR;
/**
* @author Gqr
@@ -30,6 +34,11 @@ public class OrderImportController {
@Operation(summary = "webcad拆单导入生产单")
@OperateLog(type = IMPORT)
public CommonResult<Boolean> webCadOrderImport(@RequestParam("file") MultipartFile file) {
Long organId = OrganContextHolder.getOrganId();
if (ObjectUtil.isNull(organId)) {
throw new ServiceException(WEBCAD_ORDER_IMPORT_ORGANID_EMPTY_ERROR);
}
webCadOrderImportService.webCadOrderImport(file);
return CommonResult.success(true);
}
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -7,7 +7,7 @@ import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.util.List;
/**
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.cf.imes.module.plan.controller.admin.orderImport.xml.vo;
package com.cf.imes.module.plan.controller.admin.orderimport.xml.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -70,9 +70,4 @@ public class OrderImportTaskDO extends BaseDO {
* 导入文件名称
*/
private String fileName;
/**
* 重试次数
*/
private int retryCount;
}
@@ -1,7 +1,7 @@
package com.cf.imes.module.plan.dal.mysql.orderImport;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.module.plan.controller.admin.orderImport.vo.OrderImportTempDataReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.vo.OrderImportTempDataReqVO;
import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTempDataDO;
import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTempDataGoodsGroupDO;
import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTempDataGoodsIdGroupDO;
@@ -15,4 +15,12 @@ public interface OrderImportTaskService {
* @return
*/
OrderImportTaskDO confirmOrderImport(Long taskId);
/**
* 更新导入任务为失败
*
* @param orderImportTaskDO
* @param ex
*/
void updateImportTaskFail(OrderImportTaskDO orderImportTaskDO, Exception ex);
}
@@ -2,6 +2,7 @@ package com.cf.imes.module.plan.service.orderImport;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.module.executor.enums.OrderImportStatusEnum;
import com.cf.imes.module.executor.enums.OrderImportTaskStatusEnum;
import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTaskDO;
@@ -13,6 +14,8 @@ import org.springframework.transaction.annotation.Transactional;
import jakarta.annotation.Resource;
import static com.cf.imes.module.plan.enums.ErrorCodeConstants.ORDER_IMPORT_FAIL;
/**
* @author Gqr
* @since 2025/5/13 16:41
@@ -39,10 +42,35 @@ public class OrderImportTaskServiceImpl implements OrderImportTaskService {
.set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CREATE_RECEIVE.getStatus())
.set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_FAIL.getStatus())
.set(OrderImportTaskDO::getResult, taskNotExistNotify)
.set(OrderImportTaskDO::getRetryCount, orderImportTaskDO.getRetryCount() + 1)
);
log.error(String.format("====================【%s】====================", taskNotExistNotify));
}
return orderImportTaskDO;
}
/**
* 更新导入任务为失败
*
* @param orderImportTaskDO
* @param ex
*/
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public void updateImportTaskFail(OrderImportTaskDO orderImportTaskDO, Exception ex) {
if (orderImportTaskDO == null) {
return;
}
String msg;
if (ex instanceof ServiceException) {
msg = ex.getMessage();
} else {
msg = ORDER_IMPORT_FAIL.getMsg();
}
orderImportTaskMapper.update(
new LambdaUpdateWrapper<OrderImportTaskDO>()
.eq(OrderImportTaskDO::getId, orderImportTaskDO.getId())
.set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CREATE_RECEIVE.getStatus())
.set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_FAIL.getStatus())
.set(OrderImportTaskDO::getResult, msg)
);
}
}
@@ -1,6 +1,5 @@
package com.cf.imes.module.plan.service.orderImport;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.nacos.common.utils.StringUtils;
@@ -20,7 +19,7 @@ import com.cf.imes.module.executor.enums.OrderImportStatusEnum;
import com.cf.imes.module.executor.enums.OrderImportTaskStatusEnum;
import com.cf.imes.module.executor.enums.OrderImportTypeEnum;
import com.cf.imes.module.executor.enums.OrderStatusEnum;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataReqVO;
import com.cf.imes.module.plan.dal.dataobject.order.OrderDO;
import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTaskDO;
import com.cf.imes.module.plan.dal.mysql.goods.GoodsMapper;
@@ -56,6 +55,10 @@ import jakarta.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.zip.GZIPInputStream;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_IMPORT_ORGAN_LOCK_ERROR;
@@ -128,10 +131,6 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
public boolean webCadOrderImport(MultipartFile file) {
Long organId = OrganContextHolder.getOrganId();
if (ObjectUtil.isNull(organId)) {
throw new ServiceException(WEBCAD_ORDER_IMPORT_ORGANID_EMPTY_ERROR);
}
// 是否同步处理
boolean sync = true;
@@ -264,11 +263,18 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
.organId(organId)
.build();
orderImportTaskMapper.insert(orderImportTaskDO);
// 缓存请求到本地磁盘
// 缓存到nfs目录
Path targetFile = Path.of(webCadImportProperties.getTempFilePath(), File.separator + taskId + ".json");
Path tmpFile = Path.of(webCadImportProperties.getTempFilePath(), File.separator + taskId + ".json.tmp");
ObjectMapper objectMapper = new ObjectMapper();
File file = new File(webCadImportProperties.getTempFilePath() + File.separator + taskId + ".json");
objectMapper.writeValue(file, node);
// 原子写入:先写临时文件,再 move
try (OutputStream out = Files.newOutputStream(tmpFile)) {
objectMapper.writeValue(out, node);
out.flush();
}
Files.move(tmpFile, targetFile, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE);
return taskId;
}
@@ -289,12 +295,12 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
@Override
public void afterCommit() {
// 数据库操作全部完成发送消息
rabbitTemplate.convertAndSend(RabbitMqConstants.ORDER_IMPORT_WEBCAD_EXCHANGE, webCadImportProperties.getNode(), message);
rabbitTemplate.convertAndSend(RabbitMqConstants.ORDER_IMPORT_WEBCAD_EXCHANGE, null, message);
}
});
} else {
// 数据库操作全部完成发送消息
rabbitTemplate.convertAndSend(RabbitMqConstants.ORDER_IMPORT_WEBCAD_EXCHANGE, webCadImportProperties.getNode(), message);
rabbitTemplate.convertAndSend(RabbitMqConstants.ORDER_IMPORT_WEBCAD_EXCHANGE, null, message);
}
}
@@ -328,7 +334,13 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
*/
private void removeCacheFileWhenException(boolean sync, Long taskId) {
if (!sync && ObjectUtil.isNotNull(taskId)) {
FileUtil.del(webCadImportProperties.getTempFilePath() + File.separator + taskId + ".json");
Path file = Path.of(webCadImportProperties.getTempFilePath(), taskId + ".json");
try {
Files.deleteIfExists(file); // 文件不存在也不会抛异常
} catch (IOException e) {
// 可以记录日志
log.warn("删除任务缓存文件失败: {}", file, e);
}
}
}
}
@@ -22,8 +22,6 @@ import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.framework.redis.constants.RedisKeyConstants;
import com.cf.imes.framework.redis.util.RedisLockUtil;
import com.cf.imes.module.executor.enums.OrderImportStatusEnum;
import com.cf.imes.module.executor.enums.OrderImportTaskStatusEnum;
import com.cf.imes.module.executor.enums.OrderImportTmpDataTypeEnum;
import com.cf.imes.module.plan.dal.dataobject.order.OrderDO;
import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTaskDO;
@@ -170,7 +168,7 @@ public class DefaultExcelOrderImportConsumer {
log.info("====================【生产单默认excel导入处理临时数据结束】====================");
} catch (Exception e) {
log.error(ORDER_IMPORT_FAIL.getMsg(), e);
updateImportTaskFail(orderImportTaskDO, e);
orderImportTaskService.updateImportTaskFail(orderImportTaskDO, e);
throw e;
} finally {
if (lockResult) {
@@ -180,32 +178,6 @@ public class DefaultExcelOrderImportConsumer {
}
}
/**
* 更新导入任务为失败
*
* @param orderImportTaskDO
* @param ex
*/
public void updateImportTaskFail(OrderImportTaskDO orderImportTaskDO, Exception ex) {
if (orderImportTaskDO == null) {
return;
}
String msg;
if (ex instanceof ServiceException) {
msg = ex.getMessage();
} else {
msg = ORDER_IMPORT_FAIL.getMsg();
}
orderImportTaskMapper.update(
new LambdaUpdateWrapper<OrderImportTaskDO>()
.eq(OrderImportTaskDO::getId, orderImportTaskDO.getId())
.set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CREATE_RECEIVE.getStatus())
.set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_FAIL.getStatus())
.set(OrderImportTaskDO::getResult, msg)
.set(OrderImportTaskDO::getRetryCount, orderImportTaskDO.getRetryCount() + 1)
);
}
/**
* 创建生产单
*
@@ -15,8 +15,6 @@ import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.framework.redis.config.ChenfengCacheProperties;
import com.cf.imes.framework.redis.constants.RedisKeyConstants;
import com.cf.imes.framework.redis.util.RedisLockUtil;
import com.cf.imes.module.executor.enums.OrderImportStatusEnum;
import com.cf.imes.module.executor.enums.OrderImportTaskStatusEnum;
import com.cf.imes.module.executor.enums.OrderImportTmpDataTypeEnum;
import com.cf.imes.module.executor.enums.OrderStatusEnum;
import com.cf.imes.module.plan.dal.dataobject.order.OrderDO;
@@ -167,7 +165,7 @@ public class DefaultXmlOrderImportConsumer {
log.info("====================【生产单默认xml导入处理临时数据结束】====================");
} catch (Exception e) {
log.error( ORDER_IMPORT_FAIL.getMsg(), e);
updateImportTaskFail(orderImportTaskDO, e);
orderImportTaskService.updateImportTaskFail(orderImportTaskDO, e);
throw e;
} finally {
if (lockResult) {
@@ -177,32 +175,6 @@ public class DefaultXmlOrderImportConsumer {
}
}
/**
* 更新导入任务为失败
*
* @param orderImportTaskDO
* @param ex
*/
public void updateImportTaskFail(OrderImportTaskDO orderImportTaskDO, Exception ex) {
if (orderImportTaskDO == null) {
return;
}
String msg;
if (ex instanceof ServiceException) {
msg = ex.getMessage();
} else {
msg = ORDER_IMPORT_FAIL.getMsg();
}
orderImportTaskMapper.update(
new LambdaUpdateWrapper<OrderImportTaskDO>()
.eq(OrderImportTaskDO::getId, orderImportTaskDO.getId())
.set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CREATE_RECEIVE.getStatus())
.set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_FAIL.getStatus())
.set(OrderImportTaskDO::getResult, msg)
.set(OrderImportTaskDO::getRetryCount, orderImportTaskDO.getRetryCount() + 1)
);
}
/**
* 创建生产单
*
@@ -1,17 +1,16 @@
package com.cf.imes.module.plan.service.orderImport.consumer;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd;
import com.cf.imes.framework.mq.rabbitmq.constant.RabbitMqConstants;
import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.framework.redis.config.ChenfengCacheProperties;
import com.cf.imes.framework.redis.constants.RedisKeyConstants;
import com.cf.imes.framework.redis.util.RedisLockUtil;
import com.cf.imes.module.executor.enums.OrderImportStatusEnum;
import com.cf.imes.module.executor.enums.OrderImportTaskStatusEnum;
import com.cf.imes.module.plan.dal.dataobject.orderImport.OrderImportTaskDO;
import com.cf.imes.module.plan.dal.mysql.goods.GoodsMapper;
import com.cf.imes.module.plan.dal.mysql.order.OrderMapper;
@@ -34,6 +33,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.thymeleaf.util.StringUtils;
import jakarta.annotation.Resource;
@@ -107,7 +107,9 @@ public class WebCadOrderImportConsumer {
@Resource
private ChenfengCacheProperties chenfengCacheProperties;
@RabbitListener(queues = "#{@orderImportWebCadQueueName}")
@RabbitListener(queues = RabbitMqConstants.ORDER_IMPORT_WEBCAD_QUEUE)
@DS("imes_prod")
@Transactional(rollbackFor = Exception.class)
public void orderImport(String message,
Channel channel,
@Header(value = "peek", required = false) String peek,
@@ -155,7 +157,7 @@ public class WebCadOrderImportConsumer {
} catch (Exception e) {
log.error(ORDER_IMPORT_FAIL.getMsg(), e);
updateImportTaskFail(orderImportTaskDO, e);
orderImportTaskService.updateImportTaskFail(orderImportTaskDO, e);
throw e;
} finally {
if (lockResult) {
@@ -165,30 +167,6 @@ public class WebCadOrderImportConsumer {
}
}
/**
* 更新导入任务为失败
*
* @param orderImportTaskDO
* @param ex
*/
public void updateImportTaskFail(OrderImportTaskDO orderImportTaskDO, Exception ex) {
if (orderImportTaskDO == null) {
return;
}
String msg;
if (ex instanceof ServiceException) {
msg = ex.getMessage();
} else {
msg = ORDER_IMPORT_FAIL.getMsg();
}
orderImportTaskMapper.update(
new LambdaUpdateWrapper<OrderImportTaskDO>()
.eq(OrderImportTaskDO::getId, orderImportTaskDO.getId())
.set(OrderImportTaskDO::getStatus, OrderImportTaskStatusEnum.CREATE_RECEIVE.getStatus())
.set(OrderImportTaskDO::getImportStatus, OrderImportStatusEnum.IMPORT_FAIL.getStatus())
.set(OrderImportTaskDO::getResult, msg)
.set(OrderImportTaskDO::getRetryCount, orderImportTaskDO.getRetryCount() + 1)
);
}
}
@@ -24,8 +24,8 @@ import com.cf.imes.module.executor.enums.OrderImportConstants;
import com.cf.imes.module.executor.enums.OrderImportStatusEnum;
import com.cf.imes.module.executor.enums.OrderImportTmpDataTypeEnum;
import com.cf.imes.module.executor.enums.OrderItemTypeEnum;
import com.cf.imes.module.plan.controller.admin.orderImport.vo.OrderImportTempDataReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.vo.OrderPlateImportExcelVO;
import com.cf.imes.module.plan.controller.admin.orderimport.vo.OrderImportTempDataReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.vo.OrderPlateImportExcelVO;
import com.cf.imes.module.plan.dal.dataobject.goods.GoodsDO;
import com.cf.imes.module.plan.dal.dataobject.order.OrderDO;
import com.cf.imes.module.plan.dal.dataobject.orderBody.OrderBodyDO;
@@ -64,7 +64,6 @@ import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@@ -22,32 +22,32 @@ import com.cf.imes.module.executor.enums.DictTypeConstants;
import com.cf.imes.module.executor.enums.OrderImportStatusEnum;
import com.cf.imes.module.executor.enums.OrderImportTmpDataTypeEnum;
import com.cf.imes.module.executor.enums.OrderItemTypeEnum;
import com.cf.imes.module.plan.controller.admin.orderImport.vo.OrderImportTempDataReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.AssemblyXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.BlockXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.CorrelationXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.CorrelationXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.CuttingOutlineXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.EdgingXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.ExtraVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.GrooveXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.GrooveXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.GroupXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.HardwareXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.HoleXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.HoleXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.IsletXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.IsletXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.OffsetLineXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.OffsetLineXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.OutlineXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.PlateXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.PointXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.PointXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.RawOutlineXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.RectSealVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.RemarkXmlVO;
import com.cf.imes.module.plan.controller.admin.orderImport.xml.vo.RoomBoxXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.vo.OrderImportTempDataReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.AssemblyXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.BlockXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.CorrelationXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.CorrelationXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.CuttingOutlineXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.EdgingXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.ExtraVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.GrooveXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.GrooveXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.GroupXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.HardwareXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.HoleXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.HoleXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.IsletXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.IsletXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.OffsetLineXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.OffsetLineXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.OutlineXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.PlateXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.PointXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.PointXmlVOS;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.RawOutlineXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.RectSealVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.RemarkXmlVO;
import com.cf.imes.module.plan.controller.admin.orderimport.xml.vo.RoomBoxXmlVO;
import com.cf.imes.module.plan.dal.dataobject.goods.GoodsDO;
import com.cf.imes.module.plan.dal.dataobject.order.OrderDO;
import com.cf.imes.module.plan.dal.dataobject.orderBody.OrderBodyDO;
@@ -1,7 +1,6 @@
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;
@@ -24,13 +23,13 @@ import com.cf.imes.module.executor.enums.DataTypeEnum;
import com.cf.imes.module.executor.enums.OrderImportStatusEnum;
import com.cf.imes.module.executor.enums.OrderItemTypeEnum;
import com.cf.imes.module.executor.enums.OrderStatusEnum;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataBlockRemarkVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataBlockReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataDoubleRoomTreeReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataGroupInfoReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataMaterialReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataPartsReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataProcessGroupReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataBlockRemarkVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataBlockReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataDoubleRoomTreeReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataGroupInfoReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataMaterialReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataPartsReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataProcessGroupReqVO;
import com.cf.imes.module.plan.dal.dataobject.goods.GoodsDO;
import com.cf.imes.module.plan.dal.dataobject.order.OrderDO;
import com.cf.imes.module.plan.dal.dataobject.orderBody.OrderBodyDO;
@@ -71,7 +70,10 @@ import org.springframework.jdbc.core.JdbcTemplate;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.Path;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
@@ -82,7 +84,6 @@ 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;
@@ -184,6 +185,7 @@ public class WebCadOrderImportAsyncFactory {
private static final String PART_CATEGORY_ONE = "封边条";
private static final String PART_CATEGORY_TWO = "五金";
private static final String PART_CATEGORY_THREE = "组件";
private static final String CHILDREN_FIELD = "children";
private static final String EMPTY_STRING = new String();
// 当前拆单导入的板件数量(初始包含前n次导入的板件总数)
@@ -241,76 +243,14 @@ public class WebCadOrderImportAsyncFactory {
try (JSONReader reader = new JSONReader(new FileReader(tempFilePath))) {
reader.startObject();
while (reader.hasNext()) {
String name = reader.readString();
if ("OrderNo".equals(name)) {
log.debug("====================【cad拆单解析生产单开始】====================");
analyzeOrder(reader.readString());
log.debug("====================【cad拆单解析生产单结束】====================");
}
if ("Materials".equals(name)) {
log.debug("====================【cad拆单解析板材开始】====================");
// 解析板材对应
analyzeMaterials(reader);
log.debug("====================【cad拆单解析板材结束】====================");
}
if ("ProcessGroup".equals(name)) {
log.debug("====================【cad拆单解析加工组开始】====================");
// 解析加工组类型
analyzeGroups(reader);
log.debug("====================【cad拆单解析加工组结束】====================");
}
if ("douleRoomTree".equals(name)) {
log.debug("====================【cad拆单解析成倍柜体开始】====================");
// 缓存柜体成倍信息
analyzeRoomBody(reader);
log.debug("====================【cad拆单解析成倍柜体结束】====================");
}
if ("Blocks".equals(name)) {
// 获取自定义板编号配置
plateNoGenerateConfigVO = customPlateNoGenerateService.getPlateNoGenerateConfig(orderId);
log.debug("====================【cad拆单解析板件开始】====================");
analyzeBlockRoomList(reader);
log.debug("====================【cad拆单解析板件结束】====================");
}
if ("Parts".equals(name)) {
log.debug("====================【cad拆单获取封边配置开始】====================");
// 获取系统配置-封边对应配置
getOrgSealEdgeConfig();
log.debug("====================【cad拆单获取封边配置结束】====================");
log.debug("====================【cad拆单解析配件开始】====================");
analyzePartsRoomList(reader);
log.debug("====================【cad拆单解析配件结束】====================");
}
String fieldName = reader.readString();
processFieldData(fieldName, reader);
}
reader.endObject();
orderItemBatchInsertWithinThreshold(orderItemDOS, true);
log.debug("====================【cad拆单全局保存开始】====================");
// 保存数据柜体、加工组
saveData();
log.debug("====================【cad拆单全局保存结束】====================");
// 新增/更新order_goods
insertOrUpdatePlateNumGoods();
// 更新生产单板件数量
updateOrderPlateNum();
// 更新导入任务为成功
updateTaskSuccess(taskId);
// 所有自定义板编号生成完成后更新配置到生产单
customPlateNoGenerateService.updateCustomPlateNoGenerateConfig(plateNoGenerateConfigVO, orderDO);
performPostProcessing(taskId);
} catch (Exception e) {
if (esInsert) {
CompletableFuture.runAsync(() -> {
// 数据库数据回滚,同步删除 ES 里当前批次的数据
orderInputProcessor.deleteByOrderIdBatch(orderId, batchId, ORDER_PLATE_MODEL);
});
}
handleProcessingException(e);
throw e;
} finally {
clearAll();
@@ -318,6 +258,93 @@ public class WebCadOrderImportAsyncFactory {
}
}
/**
* 处理JSON字段数据
*/
private void processFieldData(String fieldName, JSONReader reader) {
switch (fieldName) {
case "OrderNo":
log.debug("====================【cad拆单解析生产单开始】====================");
analyzeOrder(reader.readString());
log.debug("====================【cad拆单解析生产单结束】====================");
break;
case "Materials":
log.debug("====================【cad拆单解析板材开始】====================");
analyzeMaterials(reader);
log.debug("====================【cad拆单解析板材结束】====================");
break;
case "ProcessGroup":
log.debug("====================【cad拆单解析加工组开始】====================");
analyzeGroups(reader);
log.debug("====================【cad拆单解析加工组结束】====================");
break;
case "douleRoomTree":
log.debug("====================【cad拆单解析成倍柜体开始】====================");
analyzeRoomBody(reader);
log.debug("====================【cad拆单解析成倍柜体结束】====================");
break;
case "Blocks":
processBlocks(reader);
break;
case "Parts":
processParts(reader);
break;
default:
// 跳过未知字段
reader.readObject();
break;
}
}
/**
* 处理板件数据
*/
private void processBlocks(JSONReader reader) {
plateNoGenerateConfigVO = customPlateNoGenerateService.getPlateNoGenerateConfig(orderId);
log.debug("====================【cad拆单解析板件开始】====================");
analyzeBlockRoomList(reader);
log.debug("====================【cad拆单解析板件结束】====================");
}
/**
* 处理配件数据
*/
private void processParts(JSONReader reader) {
log.debug("====================【cad拆单获取封边配置开始】====================");
getOrgSealEdgeConfig();
log.debug("====================【cad拆单获取封边配置结束】====================");
log.debug("====================【cad拆单解析配件开始】====================");
analyzePartsRoomList(reader);
log.debug("====================【cad拆单解析配件结束】====================");
}
/**
* 执行后处理逻辑
*/
private void performPostProcessing(Long taskId) {
orderItemBatchInsertWithinThreshold(orderItemDOS, true);
log.debug("====================【cad拆单全局保存开始】====================");
saveData();
log.debug("====================【cad拆单全局保存结束】====================");
insertOrUpdatePlateNumGoods();
updateOrderPlateNum();
updateTaskSuccess(taskId);
customPlateNoGenerateService.updateCustomPlateNoGenerateConfig(plateNoGenerateConfigVO, orderDO);
}
/**
* 处理异常情况
*/
private void handleProcessingException(Exception e) {
if (esInsert) {
CompletableFuture.runAsync(() -> {
orderInputProcessor.deleteByOrderIdBatch(orderId, batchId, ORDER_PLATE_MODEL);
});
}
}
/**
* 获取组织封边条对应配置
*/
@@ -428,8 +455,7 @@ public class WebCadOrderImportAsyncFactory {
.eq(GoodsDO::getGoodsId, plateGoodsGoodsId)
.eq(GoodsDO::getOrderId, orderId)
.eq(GoodsDO::getOrganId, organId)
.eq(GoodsDO::getDeleted, false)
.select(GoodsDO::getId, GoodsDO::getVersion, GoodsDO::getPlateNum, GoodsDO::getPlannedPlateNum));
.eq(GoodsDO::getDeleted, false));
if (CollUtil.isNotEmpty(existOrderGoodIds)) {
// 缓存goodCode和orderGoodsId的对应关系
@@ -553,7 +579,7 @@ public class WebCadOrderImportAsyncFactory {
} else if ("count".equals(key)) {
// 无用count
reader.readObject();
} else if ("children".equals(key)) {
} else if (CHILDREN_FIELD.equals(key)) {
reader.startArray();
while (reader.hasNext()) {
WebCadDataDoubleRoomTreeReqVO.ChildrenDTO childrenDTO = reader.readObject(WebCadDataDoubleRoomTreeReqVO.ChildrenDTO.class);
@@ -574,55 +600,82 @@ public class WebCadOrderImportAsyncFactory {
* @param reader
*/
private void analyzeBlockRoomList(JSONReader reader) {
// 开始Blocks
reader.startArray();
while (reader.hasNext()) {
reader.startObject();
String roomName = null;
Long roomId = null;
while (reader.hasNext()) {
String key = reader.readString();
if ("name".equals(key)) {
roomName = reader.readString();
// 生产单下已有房间名直接使用roomId
Long existRoomId = existRoomIdMap.get(roomName);
if (ObjectUtil.isNotNull(existRoomId)) {
roomId = existRoomId;
} else {
// 查询生产单下是否已有同名房间
List<Long> existRoomIds = orderBodyMapper.selectList(new LambdaQueryWrapper<OrderBodyDO>()
.select(OrderBodyDO::getRoomId)
.eq(OrderBodyDO::getOrderId, orderId)
.eq(OrderBodyDO::getOrganId, organId)
.eq(OrderBodyDO::getDeleted, false)
.eq(OrderBodyDO::getRoomName, roomName)).stream().map(OrderBodyDO::getRoomId).toList();
if (CollUtil.isNotEmpty(existRoomIds)) {
roomId = existRoomIds.get(0);
existRoomIdMap.put(roomName, roomId);
} else {
roomId = (Long) snowFlakeGenerator.nextId(null);
existRoomIdMap.put(roomName, roomId);
}
}
} else if ("children".equals(key)) {
// 开始Blocks.children
reader.startArray();
while (reader.hasNext()) {
analyzeBlockBodyList(reader, roomName, roomId);
}
reader.endArray();
}
}
reader.endObject();
processBlockRoom(reader);
}
reader.endArray();
orderPlateBatchInsertWithinThreshold(plateDOS, true);
// 批量插入造型数据
orderModelsBatchInsertWithinThreshold(true);
}
/**
* 处理单个房间的板件数据
*/
private void processBlockRoom(JSONReader reader) {
reader.startObject();
String roomName = null;
Long roomId = null;
while (reader.hasNext()) {
String key = reader.readString();
if ("name".equals(key)) {
roomName = reader.readString();
roomId = getOrCreateRoomId(roomName);
} else if (CHILDREN_FIELD.equals(key)) {
processBlockChildren(reader, roomName, roomId);
} else {
reader.readObject();
}
}
reader.endObject();
}
/**
* 获取或创建房间ID
*/
private Long getOrCreateRoomId(String roomName) {
Long existRoomId = existRoomIdMap.get(roomName);
if (existRoomId != null) {
return existRoomId;
}
Long roomId = queryExistingRoomId(roomName);
if (roomId == null) {
roomId = (Long) snowFlakeGenerator.nextId(null);
}
existRoomIdMap.put(roomName, roomId);
return roomId;
}
/**
* 查询已存在的房间ID
*/
private Long queryExistingRoomId(String roomName) {
List<Long> existRoomIds = orderBodyMapper.selectList(new LambdaQueryWrapper<OrderBodyDO>()
.select(OrderBodyDO::getRoomId)
.eq(OrderBodyDO::getOrderId, orderId)
.eq(OrderBodyDO::getOrganId, organId)
.eq(OrderBodyDO::getDeleted, false)
.eq(OrderBodyDO::getRoomName, roomName))
.stream()
.map(OrderBodyDO::getRoomId)
.toList();
return CollUtil.isNotEmpty(existRoomIds) ? existRoomIds.get(0) : null;
}
/**
* 处理房间下的柜体列表
*/
private void processBlockChildren(JSONReader reader, String roomName, Long roomId) {
reader.startArray();
while (reader.hasNext()) {
analyzeBlockBodyList(reader, roomName, roomId);
}
reader.endArray();
}
/**
* 解析柜体下板件列表
*
@@ -1341,51 +1394,45 @@ public class WebCadOrderImportAsyncFactory {
private void analyzePartsRoomList(JSONReader reader) {
reader.startArray();
while (reader.hasNext()) {
reader.startObject();
String roomName = null;
Long roomId = null;
while (reader.hasNext()) {
String key = reader.readString();
if ("name".equals(key)) {
roomName = reader.readString();
// 生产单下已有房间名直接使用roomId
Long existRoomId = existRoomIdMap.get(roomName);
if (ObjectUtil.isNotNull(existRoomId)) {
roomId = existRoomId;
} else {
// 查询生产单下是否已有同名房间
List<Long> existRoomIds = orderBodyMapper.selectList(new LambdaQueryWrapper<OrderBodyDO>()
.select(OrderBodyDO::getRoomId)
.eq(OrderBodyDO::getOrderId, orderId)
.eq(OrderBodyDO::getOrganId, organId)
.eq(OrderBodyDO::getDeleted, false)
.eq(OrderBodyDO::getRoomName, roomName)).stream().map(OrderBodyDO::getRoomId).toList();
if (CollUtil.isNotEmpty(existRoomIds)) {
roomId = existRoomIds.get(0);
existRoomIdMap.put(roomName, roomId);
} else {
roomId = (Long) snowFlakeGenerator.nextId(null);
existRoomIdMap.put(roomName, roomId);
}
}
} else if ("children".equals(key)) {
// 开始Parts.children
reader.startArray();
while (reader.hasNext()) {
analyzePartsBodyList(reader, roomName, roomId);
}
reader.endArray();
}
}
reader.endObject();
processPartsRoom(reader);
}
reader.endArray();
orderPartBatchInsertWithinThreshold(orderPartsDOS, true);
}
/**
* 处理单个房间的配件数据
*/
private void processPartsRoom(JSONReader reader) {
reader.startObject();
String roomName = null;
Long roomId = null;
while (reader.hasNext()) {
String key = reader.readString();
if ("name".equals(key)) {
roomName = reader.readString();
roomId = getOrCreateRoomId(roomName);
} else if (CHILDREN_FIELD.equals(key)) {
processPartsChildren(reader, roomName, roomId);
} else {
reader.readObject();
}
}
reader.endObject();
}
/**
* 处理房间下的配件列表
*/
private void processPartsChildren(JSONReader reader, String roomName, Long roomId) {
reader.startArray();
while (reader.hasNext()) {
analyzePartsBodyList(reader, roomName, roomId);
}
reader.endArray();
}
private void analyzePartsBodyList(JSONReader reader, String roomName, Long roomId) {
reader.startObject();
@@ -2126,7 +2173,13 @@ public class WebCadOrderImportAsyncFactory {
* 移除缓存的临时文件
*/
private void deleteTempFile() {
FileUtil.del(tempFilePath);
Path file = Path.of(tempFilePath);
try {
Files.deleteIfExists(file); // 文件不存在也不会抛异常
} catch (IOException e) {
// 可以记录日志
log.warn("删除任务缓存文件失败: {}", file, e);
}
}
/**
@@ -20,14 +20,14 @@ import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator;
import com.cf.imes.framework.mybatis.core.injector.BaseBatchMapper;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.executor.enums.OrderItemTypeEnum;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataBlockRemarkVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataBlockReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataDoubleRoomTreeReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataGroupInfoReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataMaterialReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataPartsReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataProcessGroupReqVO;
import com.cf.imes.module.plan.controller.admin.orderImport.webcad.vo.WebCadDataReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataBlockRemarkVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataBlockReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataDoubleRoomTreeReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataGroupInfoReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataMaterialReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataPartsReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataProcessGroupReqVO;
import com.cf.imes.module.plan.controller.admin.orderimport.webcad.vo.WebCadDataReqVO;
import com.cf.imes.module.plan.dal.dataobject.goods.GoodsDO;
import com.cf.imes.module.plan.dal.dataobject.order.OrderDO;
import com.cf.imes.module.plan.dal.dataobject.orderBody.OrderBodyDO;
@@ -171,6 +171,10 @@ public class WebCadOrderImportFactory {
private static final String PART_CATEGORY_ONE = "封边条";
private static final String PART_CATEGORY_TWO = "五金";
private static final String PART_CATEGORY_THREE = "组件";
private static final String DELETED_FIELD = "deleted";
private static final String ORGAN_ID_FIELD = "organ_id";
private static final String ORDER_ID_FIELD = "order_id";
private static final String ROOM_NAME_FIELD = "room_name";
private static final String EMPTY_STRING = new String();
// 当前拆单导入的板件数量(初始包含前n次导入的板件总数)
@@ -340,9 +344,9 @@ public class WebCadOrderImportFactory {
// 统计当前板件总面积
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));
.eq(ORGAN_ID_FIELD, organId)
.eq(ORDER_ID_FIELD, orderId)
.eq(DELETED_FIELD, false));
if (CollUtil.isNotEmpty(orderPlateSumResult)) {
Map<String, Object> resultMap = orderPlateSumResult.get(0);
if(ObjectUtil.isNotNull(resultMap)) {
@@ -366,9 +370,9 @@ public class WebCadOrderImportFactory {
materialMap = goodsMapper.selectMaps(
new QueryWrapper<GoodsDO>()
.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)
.eq(ORDER_ID_FIELD, orderId)
.eq(ORGAN_ID_FIELD, organId)
.eq(DELETED_FIELD, false)
.in("goods_id", materialReqVOS.stream().map(WebCadDataMaterialReqVO::getGoodsId).collect(Collectors.toList()))
.groupBy("goods_id, plate_num, planned_plate_num, area, planned_plate_area, version")).stream()
.collect(Collectors.toMap(
@@ -517,13 +521,13 @@ public class WebCadOrderImportFactory {
existRoomIdMap = orderBodyMapper.selectMaps(
new QueryWrapper<OrderBodyDO>()
.select("room_name,MIN(room_id) as room_id")
.eq("order_id", orderId)
.eq("organ_id", organId)
.eq("deleted", false)
.in("room_name", roomNames)
.groupBy("room_name")).stream()
.eq(ORDER_ID_FIELD, orderId)
.eq(ORGAN_ID_FIELD, organId)
.eq(DELETED_FIELD, false)
.in(ROOM_NAME_FIELD, roomNames)
.groupBy(ROOM_NAME_FIELD)).stream()
.collect(Collectors.toMap(
m -> String.valueOf(m.get("room_name")),
m -> String.valueOf(m.get(ROOM_NAME_FIELD)),
m -> ((Number) m.get("room_id")).longValue()
));
@@ -1276,13 +1280,13 @@ public class WebCadOrderImportFactory {
Map<String, Long> existPartsRoomIdMap = orderBodyMapper.selectMaps(
new QueryWrapper<OrderBodyDO>()
.select("room_name,MIN(room_id) as room_id")
.eq("order_id", orderId)
.eq("organ_id", organId)
.eq("deleted", false)
.in("room_name", roomNames)
.groupBy("room_name")).stream()
.eq(ORDER_ID_FIELD, orderId)
.eq(ORGAN_ID_FIELD, organId)
.eq(DELETED_FIELD, false)
.in(ROOM_NAME_FIELD, roomNames)
.groupBy(ROOM_NAME_FIELD)).stream()
.collect(Collectors.toMap(
m -> String.valueOf(m.get("room_name")),
m -> String.valueOf(m.get(ROOM_NAME_FIELD)),
m -> ((Number) m.get("room_id")).longValue()
));
Long existPartRoomId = existPartsRoomIdMap.get(roomName);
@@ -23,11 +23,6 @@ public class WebCadImportProperties {
*/
private int asyncPlateThreshold;
/**
* 当前拆单的节点,异步用
*/
private String node;
/**
* 异步拆单请求json缓存地址
*/
@@ -41,14 +36,6 @@ public class WebCadImportProperties {
this.tempFilePath = tempFilePath;
}
public String getNode() {
return node;
}
public void setNode(String node) {
this.node = node;
}
public int getAsyncPlateThreshold() {
return asyncPlateThreshold;
}
@@ -96,7 +96,7 @@ spring:
xxl:
job:
admin:
addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址
addresses: http://192.168.1.205:28080/xxl-job-admin # 调度中心部署跟地址
--- #################### 服务保障相关配置 ####################
@@ -166,10 +166,9 @@ chenfeng:
plan:
webcad:
import:
node: 1
async-plate-threshold: 5000
cadImportPlateNumThreshold: 20000
temp-file-path: /data/imes-server/cf-prod-plan/local
temp-file-path: /data/imes-server/nfs
mybatis-plus:
configuration:
@@ -194,10 +194,9 @@ chenfeng:
plan:
webcad:
import:
node: 1
async-plate-threshold: 5000
async-plate-threshold: 1000
cadImportPlateNumThreshold: 20000
temp-file-path: /data/imes-server/cf-prod-plan/local
temp-file-path: Z:/
mybatis-plus:
configuration: