数据完善

This commit is contained in:
lym
2024-05-17 18:05:03 +08:00
parent e7fbf3b1c3
commit f936c39cad
26 changed files with 1018 additions and 541 deletions
@@ -0,0 +1,22 @@
package com.cf.imes.module.executor.api.orderProcess;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.module.executor.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name = ApiConstants.NAME) // TODO 晨丰:fallbackFactory =
@Tag(name = "RPC 服务 - 多组织")
public interface OrderProcessApi {
String PREFIX = ApiConstants.PREFIX + "/order-process";
@GetMapping(PREFIX +"/get")
@Operation(summary = "获得生产单中的加工组信息表")
@Parameter(name = "id", description = "加工组id", required = true, example = "1024")
CommonResult<Boolean> getOrderProcessByProcessGroupId(@RequestParam("id") Long id);
}
@@ -56,4 +56,6 @@ public interface ErrorCodeConstants {
ErrorCode BODY_DATA_ERROR = new ErrorCode(1_002_029_010, "柜体数据获取错误");
ErrorCode GOODS_DATA_ERROR = new ErrorCode(1_002_029_011, "商品信息获取错误");
ErrorCode PLATE_DATA_ERROR = new ErrorCode(1_002_029_012, "板材数据获取错误");
ErrorCode FILE_READ_SUCCESS = new ErrorCode(1_002_029_012, "文件读取成功");
ErrorCode FILE_READ_ERR = new ErrorCode(1_002_029_012, "文件读取错误");
}
@@ -0,0 +1,25 @@
package com.cf.imes.module.executor.api.orderProcess;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.module.executor.dal.dataobject.process.OrderProcessDO;
import com.cf.imes.module.executor.service.process.OrderProcessService;
import javax.annotation.Resource;
import static com.cf.imes.framework.common.pojo.CommonResult.success;
public class OrderProcessServiceImpl implements OrderProcessApi{
@Resource
private OrderProcessService orderProcessService;
@Override
public CommonResult<Boolean> getOrderProcessByProcessGroupId(Long id) {
OrderProcessDO plateDO = orderProcessService.getOrderProcessByProcessGroupId(id);
if (plateDO == null) {
return success(false);
}
return success(true);
}
}
@@ -28,11 +28,13 @@ import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.framework.common.pojo.CommonResult.success;
import com.cf.imes.framework.operatelog.core.annotations.OperateLog;
import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.*;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.service.order.OrderService;
@@ -58,7 +60,7 @@ public class OrderController {
private OrderService orderService;
@Resource
private ExcelReadUtil orderExcelUtil;
private ExcelReadUtil excelReadUtil;
private static final Logger log = LoggerFactory.getLogger(OrderController.class);
@@ -109,7 +111,7 @@ public class OrderController {
public void importTemplate(HttpServletResponse response, @RequestParam("type") Integer type) {
try {
// path是指想要下载的文件的路径
File file = new File(ResourceUtils.getURL("classpath:").getPath() + "\\files\\生产单上传样式.xlsx");
File file = new File(ResourceUtils.getURL("classpath:").getPath() + "\\files\\生产单新增Excel模板.xlsx");
log.info(file.getPath());
// 获取文件名
String filename = file.getName();
@@ -290,21 +292,31 @@ public class OrderController {
@RequestParam(value = "type", required = false, defaultValue = "true") Integer type,
HttpServletResponse response) throws IOException {
List<?> list = new ArrayList<>();
List<?> list = null;
OrderDO orderDO = new OrderDO();
if (type == 0) { //excel
// 读取文件
// OrderDO orderDO = orderExcelUtil.changeOrderDO(file).setOrderType(0);
excelReadUtil.setErr(0);
Map<String, Object> map = excelReadUtil.read(file);
System.err.println(excelReadUtil.isErr());
// 判断是否读取有误
if (excelReadUtil.isErr() > 1) {
// 返回文件
List<OrderPlateImportExcelVO> orderPlateImportExcelVOS = orderExcelUtil.read(file, OrderPlateImportExcelVO.class,7);
list = orderPlateImportExcelVOS;
System.out.println(list);
excelReadUtil.write(response, (Map<Object, Object>) map.get("order"), (List<OrderPlateImportExcelVO>) map.get("plate"));
throw exception(FILE_READ_ERR);
}else {
// 获取数据
list = (List<?>) map.get("plate");
orderDO = excelReadUtil.changeOrderDO((Map<Object, Object>) map.get("order")).setOrderType(0);
}
} else if (type == 1) { // json
}else if (type == 2) { // xml
}
orderService.importExcelData(orderDO,list);
throw exception(FILE_READ_SUCCESS);
}
@GetMapping("/get-goodsList")
@@ -76,7 +76,6 @@ public class OrderSaveReqVO {
private String splitter;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜")
@NotEmpty(message = "备注不能为空")
private String remark;
private Boolean deleted;
@@ -33,7 +33,7 @@ public class ProcessStepDO extends BaseDO {
/**
* 生产单号
*/
private Long orderNo;
private Long orderId;
/**
* 完成时间
*/
@@ -19,7 +19,7 @@ public interface ProcessStepMapper extends BaseMapperX<ProcessStepDO> {
default PageResult<ProcessStepDO> selectPage(ProcessStepPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ProcessStepDO>()
.eqIfPresent(ProcessStepDO::getOrderNo, reqVO.getOrderNo())
.eqIfPresent(ProcessStepDO::getOrderId, reqVO.getOrderNo())
.betweenIfPresent(ProcessStepDO::getFinishTime, reqVO.getFinishTime())
.eqIfPresent(ProcessStepDO::getStatus, reqVO.getStatus())
.eqIfPresent(ProcessStepDO::getType, reqVO.getType())
@@ -91,211 +91,6 @@ public class OrderInputProcessor {
public static final String ORDER_PLATE_MODEL = "imes_order_plate_model";
/* public void input(List<Detail> sourceList, Long orderId) {
Long organId = OrganContextHolder.getOrganId();
ArrayList<RawGoodsDO> rawGoodsDOS = new ArrayList<>();
ArrayList<OrderBodyDO> orderBodyDOS = new ArrayList<>();
ArrayList<OrderGroupDO> orderGroupDOS = new ArrayList<>();
ArrayList<PlateDO> plateDOS = new ArrayList<>();
ArrayList<OrderPartsDO> orderPartsDOS = new ArrayList<>();
ArrayList<OrderItemDO> orderItemDOS = new ArrayList<>();
ArrayList<OrderModuleExtraDO> orderModuleExtraDOS = new ArrayList<>();
ArrayList<OrderModelDO> orderModelDOS = new ArrayList<>();
Map<RawGoodsDO, Map<OrderBodyDO, Map<OrderGroupDO, List<Detail>>>> map = sourceList.stream().collect(Collectors.groupingBy(e ->
RawGoodsDO.builder()
.rawGoodsId(e.getIBoardProdInfo().getGoodsId())
.goodsName(e.getIBoardProdInfo().getGoodsName())
.material(e.getIBoardProdInfo().getMaterial())
.color(e.getIBoardProdInfo().getColor())
.brand(e.getIBoardProdInfo().getBrand())
.spec(e.getIBoardProdInfo().getSpec())
.price(0.0)
.orderId(orderId)
.build(),
Collectors.groupingBy(e ->
OrderBodyDO.builder()
.orderId(orderId)
.roomName(e.getIBoardProdInfo().getRoomsName())
.name(e.getIBoardProdInfo().getCabinetsName())
.width(e.getWidth())
.height(e.getHeight())
.depth(e.getDepth())
// .multiNum(e.getMultiNum().doubleValue())
.filename("")
.remark("")
.build(),
Collectors.groupingBy(e ->
OrderGroupDO.builder()
.groupTypeId((long) e.getIBoardProdInfo().getSynthesis())
.groupTypeName(e.getIBoardProdInfo().getCombinationName())
.name(e.getIBoardProdInfo().getSynthesisTypeName())
.build()
)
))
);
map.entrySet().forEach(i -> {
RawGoodsDO rawGoodsDO = i.getKey();
rawGoodsDOS.add(rawGoodsDO);
rawGoodsDO.setId(identifierGenerator.nextId(null).longValue());
i.getValue().entrySet().forEach(j -> {
OrderBodyDO orderBodyDO = j.getKey();
orderBodyDO.setId(identifierGenerator.nextId(null).longValue());
orderBodyDO.setRoomId(identifierGenerator.nextId(null).longValue());
Map<OrderGroupDO, List<Detail>> value = j.getValue();
Integer reduce = value.values().stream().map(List::size).reduce(0, Integer::sum);
int unregularNum = value.values().stream().flatMap(Collection::stream).filter(e -> !e.getIBoardProdInfo().getIsRect()).collect(Collectors.toList()).size();
orderBodyDO.setPlateNum(reduce);
orderBodyDO.setUnregularNum(unregularNum);
orderBodyDOS.add(orderBodyDO);
j.getValue().entrySet().forEach(k -> {
OrderGroupDO orderGroupDO = k.getKey();
orderGroupDO.setId(identifierGenerator.nextId(null).longValue());
orderGroupDO.setOrderId(orderId);
orderGroupDO.setBodyId(orderBodyDO.getId());
orderGroupDOS.add(orderGroupDO);
//moduleExtra
List<PlateModuleExtra> plateExtras = k.getValue().stream().filter(e -> e.getIBoardProdInfo().getGoodType() == 1)
.map(e -> PlateModuleExtra.builder()
.width(e.getIBoardProdInfo().getWidth())
.height(e.getIBoardProdInfo().getHeight())
.thickness(e.getIBoardProdInfo().getThickness())
.groupType(orderGroupDO.getGroupTypeName())
.build()
).toList();
List<PartsModuleExtra> partsModuleExtras = k.getValue().stream().filter(e -> e.getIBoardProdInfo().getGoodType() == 1)
.map(e -> PartsModuleExtra.builder()
.name(e.getIBoardProdInfo().getName())
.bodyName(e.getIBoardProdInfo().getCabinetsName())
.model(e.getIBoardProdInfo().getModel())
.spec(e.getIBoardProdInfo().getSpec())
.unit(e.getIBoardProdInfo().getUnit())
.build()
).toList();
if (CollectionUtil.isNotEmpty(plateExtras)) {
orderModuleExtraDOS.add(
OrderModuleExtraDO.builder()
.orderId(orderId)
.bodyId(orderBodyDO.getId())
.roomId(orderBodyDO.getRoomId())
.type(1)
.extraData(JsonUtils.toJsonString(plateExtras))
.build());
}
if (CollectionUtil.isNotEmpty(partsModuleExtras)) {
orderModuleExtraDOS.add(
OrderModuleExtraDO.builder()
.orderId(orderId)
.bodyId(orderBodyDO.getId())
.roomId(orderBodyDO.getRoomId())
.type(2)
.extraData(JsonUtils.toJsonString(partsModuleExtras))
.build());
}
k.getValue().forEach(e -> {
int goodType = e.getIBoardProdInfo().getGoodType();
OrderItemDO orderItemDO = new OrderItemDO();
orderItemDO.setOrderId(orderId);
orderItemDO.setPlanId(0L);
orderItemDO.setPackageId(0L);
orderItemDO.setGroupId(orderGroupDO.getId());
orderItemDO.setRoomId(orderBodyDO.getRoomId());
orderItemDO.setBodyId(orderBodyDO.getId());
orderItemDO.setNum(e.getIBoardProdInfo().getGoodsNumber());
if (goodType == 1) {
PlateDO plateDO = PlateDO.builder()
.id(identifierGenerator.nextId(null).longValue())
// .goodsId(rawGoodsDO.getRawGoodsId())
.orderId(orderId)
.name(e.getIBoardProdInfo().getName())
.plateNo(e.getIBoardProdInfo().getPlateNo())
//.type(e.getIBoardProdInfo().)
// .goodsId(rawGoodsDO.getRawGoodsId())
// .height(new BigDecimal(e.getIBoardProdInfo().getHeight()))
// .width(new BigDecimal(e.getIBoardProdInfo().getWidth()))
// .thickness(new BigDecimal(e.getIBoardProdInfo().getThickness().toString()))
// .splitHeight(new BigDecimal(e.getIBoardProdInfo().getSplitHeight()))
// .splitWidth(new BigDecimal(e.getIBoardProdInfo().getSplitWidth()))
// .splitThickness(new BigDecimal(e.getIBoardProdInfo().getThickness().toString()))
// .sealLeft(new BigDecimal(e.getIBoardProdInfo().getSealLeft()))
// .sealRight(new BigDecimal(e.getIBoardProdInfo().getSealRight()))
// .sealUp(new BigDecimal(e.getIBoardProdInfo().getSealUp()))
// .sealDown(new BigDecimal(e.getIBoardProdInfo().getSealDown()))
// .area(new BigDecimal( String.valueOf(e.getIBoardProdInfo().getWidth())).multiply( new BigDecimal(e.getIBoardProdInfo().getHeight())))
.texture(e.getIBoardProdInfo().getTexture())
.type(0)
.holeFace(0)
.holeArrange(0)
.unregularPointCount(0)
.frontHoleCount(0)
.frontModelCount(0)
.backHoleCount(0)
.sideHoleCount(0)
.backModelCount(0)
.isDoor(false)
.openDoorType(e.getIBoardProdInfo().getOpenDoorType())
.offsetX(0.0)
.offsetY(0.0)
.isArcAcross(false)
.moduleTypeId(orderBodyDO.getId())
.filterType(0)
.remark(e.getIBoardProdInfo().getRemark())
.isCancel(false)
.build();
orderItemDO.setPlateId(plateDO.getId());
orderItemDO.setPartsId(0L);
orderItemDO.setType(1);
plateDOS.add(plateDO);
orderModelDOS.add(
OrderModelDO.builder()
.orderId(orderId)
.plateId(plateDO.getId())
.contourDetail(e.getContourDetail())
.pointDetail(e.getPointDetail())
.holeDetail(e.getHoleDetail())
.rawPointDetail(e.getRawPointDetail())
.sideHoleDetail(e.getSideHoleDetail())
.sideModelDetail(e.getSideModelDetail())
.build());
} else {
OrderPartsDO orderPartsDO = OrderPartsDO.builder()
.id(identifierGenerator.nextId(null).longValue())
.orderId(orderId)
.goodsId(rawGoodsDO.getRawGoodsId())
.name(e.getIBoardProdInfo().getName())
.material(e.getIBoardProdInfo().getMaterial())
.model(e.getIBoardProdInfo().getModel())
.spec(e.getIBoardProdInfo().getSpec())
.brand(e.getIBoardProdInfo().getBrand())
.factory(e.getIBoardProdInfo().getFactory())
.unit(e.getIBoardProdInfo().getUnit())
.price(0.0)
.isComposite(false)
.remark(e.getIBoardProdInfo().getRemark())
// .type(0)
.build();
orderItemDO.setType(2);
orderItemDO.setPartsId(orderPartsDO.getId());
orderItemDO.setPlateId(0L);
orderPartsDOS.add(orderPartsDO);
orderItemDOS.add(orderItemDO);
}
});
});
});
});
batchSaveModel(orderModelDOS);
batchInsert(rawGoodsDOS, orderBodyDOS, orderGroupDOS, orderPartsDOS, plateDOS, orderModuleExtraDOS, orderItemDOS);
}*/
/**
* 批量保存生产单小板五金数据
*
@@ -133,4 +133,6 @@ public interface OrderService {
* @return List<GoodsDO>
*/
List<GoodsDO> getGoodsList(Long orderId);
void importExcelData(OrderDO orderDO, List<?> list);
}
@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import cn.smallbun.screw.core.util.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.executor.controller.admin.order.vo.order.*;
import com.cf.imes.framework.datapermission.core.util.DataPermissionUtils;
@@ -33,6 +34,7 @@ import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.executor.dal.mysql.rawgoods.RawGoodsMapper;
import com.cf.imes.module.executor.util.deviseData.dataTwo.PlateDetail;
import com.cf.imes.module.executor.util.fileConversion.admin.api.webcad.ApiTypeRealize;
import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.ExcelTypeRealize;
import com.cf.imes.module.system.api.application.ApplicationApi;
import com.cf.imes.module.system.api.user.AdminUserApi;
import org.springframework.stereotype.Service;
@@ -119,6 +121,12 @@ public class OrderServiceImpl implements OrderService {
@Resource
private IdentifierGenerator identifierGenerator;
@Resource
private SnowFlakeGenerator snowFlakeGenerator;
@Resource
private ExcelTypeRealize excelTypeRealize;
private static final int DEFAULT_DAYS_TO_ADD = 30;
private static final int PARTS_PAGE_MAX = 10;
@@ -378,7 +386,7 @@ public class OrderServiceImpl implements OrderService {
List<PlateDetail> plateDetail = (List<PlateDetail>) listMap.get("plateDetail");
List<OrderItemDO> itemDO = (List<OrderItemDO>) listMap.get("itemDO");
Map<String, List<?>> map = getPlateGoods(goodsDO);
Map<String, List<?>> map = getPlateGoods(goodsDO);// 检验商品板材信息是否存在
goodsDO = (List<GoodsDO>) map.get("goodsDO");
List<PlateGoodDO> plateGoodDOS = (List<PlateGoodDO>) map.get("plateGoodDOLists");
validateCustomOrderNoExists(order.get(0).getCustomOrderNo());
@@ -397,7 +405,6 @@ public class OrderServiceImpl implements OrderService {
.eq(GoodsDO::getOrderId, orderId)
.eq(GoodsDO::getDeleted, false));
}
private Map<String, List<?>> getPlateGoods(List<GoodsDO> goodsLists) {
Map<String, List<?>> map = new HashMap<>();
List<PlateGoodDO> plateGoodLists = new ArrayList<>();
@@ -422,20 +429,6 @@ public class OrderServiceImpl implements OrderService {
return map;
}
// 合并两个 JSON 对象的方法
// public JSONObject mergeJSONObjects(JSONObject object1, JSONObject object2) {
// if (object1 == null) {
// object1.putAll( object2.getJSONObject("value"));
// } else {
//// System.out.println("object2 " + object2);
//// System.out.println(" object2.getJSONObject(value) " + object2.getJSONObject("value"));
// if (object2 != null)
// object1.putAll( object2.getJSONObject("value"));
// }
// System.out.println(" object1 " + object1);
// return object1;
// }
public JSONObject mergeJSONObjects(JSONObject object1, JSONObject object2) {
// 创建新对象
@@ -552,4 +545,26 @@ public class OrderServiceImpl implements OrderService {
});
}
@Override
public void importExcelData(OrderDO orderDO, List<?> list) {
orderDO.setId((Long) snowFlakeGenerator.nextId(null));
System.out.println(excelTypeRealize.changeDate(list,orderDO.getId()));
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<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");
validateCustomOrderNoExists(orderDO.getCustomOrderNo());
orderInputProcessor.batchInsert(rawGoodsDO, bodyDO, groupDO, partsDO, plateDO, null, itemDO, orderDO,goodsDO,plateGoodDOS);
orderInputProcessor.batchSaveModel(orderModelDOS);
// System.out.println("plateDO = " + plateDO+ " BeanUtils.toBean(plateDetail, OrderModelDO.class) = " + orderModelDOs);
}
}
@@ -41,4 +41,12 @@ public interface OrderProcessService {
*/
OrderProcessDO getOrderProcess(Long orderId);
/**
* 获得生产单中工序
*
* @param processGroupId 工序组Id
* @return 生产单工序
*/
OrderProcessDO getOrderProcessByProcessGroupId(Long processGroupId);
}
@@ -1,7 +1,14 @@
package com.cf.imes.module.executor.service.process;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.cf.imes.module.executor.dal.dataobject.processStep.ProcessStepDO;
import com.cf.imes.module.executor.dal.dataobject.processStepItem.OrderProcessStepItemDO;
import com.cf.imes.module.executor.dal.mysql.order.OrderMapper;
import com.cf.imes.module.executor.dal.mysql.processStep.ProcessStepMapper;
import com.cf.imes.module.executor.dal.mysql.processStepItem.ProcessStepItemMapper;
import com.cf.imes.module.system.api.process.ProcessGroupApi;
import com.cf.imes.module.system.api.process.dto.ProcessListReqDTO;
import com.cf.imes.module.system.api.process.dto.ProcessRespDTO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@@ -13,6 +20,9 @@ import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.module.executor.dal.mysql.process.OrderProcessMapper;
import java.util.ArrayList;
import java.util.List;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*;
@@ -34,6 +44,15 @@ public class OrderProcessServiceImpl implements OrderProcessService {
@Resource
private OrderMapper orderMapper;
@Resource
private IdentifierGenerator identifierGenerator;
@Resource
private ProcessStepMapper processStepMapper;
@Resource
private ProcessStepItemMapper processStepItemMapper;
@Override
public Long createOrderProcess(OrderProcessSaveReqVO createReqVO) {
// 校验生产单存在
@@ -49,8 +68,32 @@ public class OrderProcessServiceImpl implements OrderProcessService {
throw exception(ORDER_PROCESS_EXISTS);
}
// 插入
OrderProcessDO orderProcess = BeanUtils.toBean(createReqVO, OrderProcessDO.class);
OrderProcessDO orderProcess = BeanUtils.toBean(createReqVO, OrderProcessDO.class).setId((Long) identifierGenerator.nextId(null));
//
// List<ProcessStepDO> processStepDOS = new ArrayList<>();
// List<OrderProcessStepItemDO> orderProcessStepItemDOS = new ArrayList<>();
// // 需要获取工序组的具体信息,以及工序组中工序的信息,然后将工序组中工序的信息插入到生产单工序步骤表中
// ProcessListReqDTO processListReqDTO = processGroupApi.getProcessGroupDetail(createReqVO.getGroupId());
// System.err.println(processListReqDTO);
// processListReqDTO.getLists().forEach(processRespDTO -> {
// ProcessStepDO processStepDO = BeanUtils.toBean(processRespDTO, ProcessStepDO.class).setOrderId(createReqVO.getOrderId())
// .setStatus(false).setProcessinfoId(processRespDTO.getId()).setOrderProcessId(orderProcess.getId())
// .setId((Long) identifierGenerator.nextId(null));// 计划日期没有填写
// processStepDOS.add(processStepDO);
// OrderProcessStepItemDO orderProcessStepItemDO = OrderProcessStepItemDO.builder()
// .name(processRespDTO.getName())
// .processStepId(processRespDTO.getId())
// .orderProcessId(orderProcess.getId())
// .status(false)
// .groupName(processListReqDTO.getName())
// .build();// 查模块id,柜体id,加工组id
// orderProcessStepItemDOS.add(orderProcessStepItemDO);
// });
// 批量插入
orderProcessMapper.insert(orderProcess);
// processStepMapper.insertBatch(processStepDOS);
// processStepItemMapper.insertBatch(orderProcessStepItemDOS);
// 返回
return orderProcess.getId();
}
@@ -88,4 +131,9 @@ public class OrderProcessServiceImpl implements OrderProcessService {
return orderProcessMapper.selectOne("order_id", orderId);
}
@Override
public OrderProcessDO getOrderProcessByProcessGroupId(Long processGroupId) {
return orderProcessMapper.selectOne("group_id", processGroupId);
}
}
@@ -27,6 +27,9 @@ public class PartsInfo {
// 柜体成倍拆单的倍数
private Integer multiNum;
// 单个配件的数量
private Double partNum;
// 商品信息
private String goodsNo; // 商品编码
private Long goodId; // 商品对应标识
@@ -3,108 +3,43 @@ package com.cf.imes.module.executor.util.fileConversion.admin.files.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.*;
@Slf4j
public final class ExcelListener<T> extends AnalysisEventListener<OrderPlateImportExcelVO> {
public final class ExcelListener extends AnalysisEventListener<Map<Integer, String>> {
/**
* 自定义用于暂时存储data
* 可以通过实例获取该值
* 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
*/
private List<OrderPlateImportExcelVO> datas = new ArrayList<>();
// private static final int BATCH_COUNT = 100;
// private List<Map<Integer, String>> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
private List<Map<Integer, String>> cachedDataList = new ArrayList<Map<Integer, String>>();
private boolean stopParsing = false; // 添加一个标志位用于控制是否停止解析数据
private boolean flag = true;
private Map<Integer, String> valueMap = new HashMap<>();
/**
* 每解析一行都会回调invoke()方法
*
* @param data 读取后的数据对象
* @param context 内容
*/
@Override
public void invoke(OrderPlateImportExcelVO data, AnalysisContext context) {
// 根据列来确定是那一条数据,然后将错误的数据插入其中
// 这里要判断数据的合法性,不合法的数据直接插入到错误数据中
System.err.println(data);
if (data.getGoodType() == 0) {
data.setResult("商品类型未选择");
flag = false;
} else {
if (!data.isValidGoods()){
data.setResult("商品信息填写有误");
flag = false;
}
if (data.getGoodType() == 1) { //板材
// if (!data.isValidRawGoods()) {
// data.setResult("板材信息填写有误");
// flag = false;
// }
}
public void invoke(Map<Integer, String> data, AnalysisContext context) {
log.info("解析到一条数据: {}", JSON.toJSONString(data));
if (data.get(0) != null && data.get(0).equals("***")) {
log.info("遇到指定数据 ***, 停止写入!");
stopParsing = true;
}
if (!stopParsing) {
data.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
cachedDataList.add(data);
}
datas.add(data);
}
/**
* 读取完后操作
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
if (this.flag)
log.info("所有数据读取完成");
log.info("所有数据解析完成!");
}
/**
* 异常方法 (类型转换异常也会执行此方法) (读取一行抛出异常也会执行此方法)
*
* @param exception
* @param context
* @throws Exception
*/
// @Override
// public void onException(Exception exception, AnalysisContext context) {
// this.flag = false;
// if (exception instanceof ExcelDataConvertException) {
// ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
// log.error("第{}行,第{}列解析异常,数据为:{}", excelDataConvertException.getRowIndex() + 1,
// excelDataConvertException.getColumnIndex() + 1, excelDataConvertException.getCellData());
// valueMap.put(excelDataConvertException.getRowIndex() + 1 , String.valueOf(new RuntimeException("第" + (excelDataConvertException.getRowIndex() + 1) + "行" +
// ",第" + (excelDataConvertException.getColumnIndex() + 1) + "列数据格式有误,读取失败")));
// }
// }
/**
* 返回数据
*
* @return 返回读取的数据集合
**/
public List<OrderPlateImportExcelVO> getDatas() {
return datas;
public List<Map<Integer, String>> getDataLists() {
return cachedDataList;
}
/**
* 返回读取结果
*
* @return 是否读取成功
**/
public boolean getFlag() {
return flag;
}
/**
* 返回错误信息
*
* @return String
**/
public Map<Integer, String> getValueMap() {
return valueMap;
}
}
@@ -2,8 +2,17 @@ package com.cf.imes.module.executor.util.fileConversion.admin.files.excel;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.nacos.common.utils.DateFormatUtils;
import com.alibaba.nacos.common.utils.StringUtils;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.system.api.dict.DictDataApi;
import com.cf.imes.module.system.api.dict.dto.DictDataRespDTO;
import com.cf.imes.module.system.enums.DictTypeConstants;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Cell;
@@ -11,11 +20,17 @@ import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
@@ -27,10 +42,17 @@ public class ExcelReadUtil { // 文件读取
private String value;
private ExcelListener<OrderPlateImportExcelVO> excelListener = new ExcelListener();
private Boolean index = true;
public List<OrderPlateImportExcelVO> read(MultipartFile file, Class<OrderPlateImportExcelVO> head, Integer index) throws IOException {
private int isErr;
@Resource
private DictDataApi dictDataApi;
// 读excel
public Map<String, Object> read(MultipartFile file) throws IOException {
Map<String, Object> map = new HashMap<>();
ExcelListener excelListener = new ExcelListener();
if (file.isEmpty()) {
value = "文件为空";
throw new IOException("文件为空");
@@ -44,169 +66,436 @@ public class ExcelReadUtil { // 文件读取
value = "文件大小为 0";
throw new IOException("文件大小为 0");
} else {
// 读文件
EasyExcel.read(file.getInputStream(), excelListener).headRowNumber(-1).sheet().doRead();
List<OrderPlateImportExcelVO> list = new ArrayList<>();
Map<Object, Object> orderMap = new HashMap<>();// order
List<Map<Integer, String>> dataLists = excelListener.getDataLists();// 读取的内容
List<OrderPlateImportExcelVO> list = new ArrayList<>();// plate
EasyExcel.read(file.getInputStream(), excelListener).sheet().doRead();
dataLists.forEach(
item -> {
if (item.get(0).equals("###")) {
index = false;
}
if (index) {
System.out.println(item);
orderMap.put(item.get(0), item.get(1));
orderMap.put(item.get(12), item.get(13));
} else {
if (!(item.get(0).equals("序号") || item.get(0).equals("###"))) {
list.add(changeValue(item));
}
return list;
}
}
);
index = true;
map.put("order", orderMap);
System.err.println(map.get("order"));
map.put("plate", list);
return map;
}
}
// order 数据转换
public OrderDO changeOrderDO(Map<Object, Object> orderMap){
String s = (String) orderMap.get("出货日期");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate orderDate = LocalDate.parse(s, formatter);
// // 获取单元格数据
// public Map<Object, Object> changeValue(InputStream file) throws IOException {
// Map<Object, Object> map = new HashMap<>();
//
// //获取工作簿
// XSSFWorkbook book = new XSSFWorkbook(file);
// //获取工作表
// XSSFSheet sheet = book.getSheetAt(0);
// int lastRowNum = sheet.getLastRowNum();
//
// List<Object> objects = new ArrayList<>();
// Map<Object, Object> objectMap = new HashMap<>();
// List<List<Object>> objList = new ArrayList<>();
// boolean index = true;
//int a = 0;
// for (int i = 0; i < lastRowNum; i++) {
// //获取单元格
// XSSFRow row = sheet.getRow(i);
// if (row != null) {
// for (Cell cell : row) {
// if (cell != null && !"".equals(cell)) {
//
// Object result = getValue(cell);
//
// if (!result.equals("")) {
// objects.add(result);
// }
// }
// }
// if (objects.get(0).equals("###"))
// index = false;
// if (objects.get(0).equals("***"))
// break;
//
//// System.out.println(objects);
// if (index){
// for (int j = 0; j < objects.size() - 1; j++) {
// if (isEven(j)) {//偶数
// objectMap.put(objects.get(j), objects.get(j + 1));
// }
// }
// }else {
// System.out.println(objects.get(0) + ":" +objects);
// a++;
//// System.out.println(objects);
// objList.add(objects);
// System.err.println(objList);
// }
//
//
// objects.clear();
// }
// }
//// System.out.println(a);
//// System.out.println(objectMap);
//// System.err.println(objList);
//
// return map;
// }
public OrderDO changeOrderDO(MultipartFile file) throws IOException {
OrderDO orderDO = new OrderDO();
//获取工作簿
XSSFWorkbook book = new XSSFWorkbook(file.getInputStream());
//获取工作表
XSSFSheet sheet = book.getSheetAt(0);
int lastRowNum = sheet.getLastRowNum();
List<Object> objects = new ArrayList<>();
Map<Object, Object> objectMap = new HashMap<>();
for (int i = 0; i < lastRowNum; i++) {
//获取单元格
XSSFRow row = sheet.getRow(i);
if (row != null) {
for (Cell cell : row) {
if (cell != null && !"".equals(cell)) {
Object result = getValue(cell);
if (!result.equals(""))
objects.add(result);
}
}
for (int j = 0; j < objects.size() - 1; j++) {
if (isEven(j)) {//偶数
objectMap.put(objects.get(j), objects.get(j + 1));
}
}
if (objects.get(0).equals("###"))
break;
}
}
String s = (String) objectMap.get("出货日期");
orderDO.setCustomOrderNo((String) objectMap.get("自定义单号"))
.setCustomer((String) objectMap.get("客户"))
.setDealer((String) objectMap.get("经销商"))
.setDealerPhoneNumber((String) objectMap.get("经销商电话"))
.setAddress((String) objectMap.get("客户地址"))
.setPhoneNumber((String) objectMap.get("客户电话"))
.setSalesman((String) objectMap.get("业务员"))
.setDeliveryDate(changeTime(s))
.setSplitter((String) objectMap.get("拆单员"))
.setRemark((String) objectMap.get("备注"));
System.out.println(orderDO);
OrderDO orderDO = OrderDO.builder()
.customer((String) orderMap.get("客户"))
.customOrderNo((String) orderMap.get("自定义单号"))
.dealer((String) orderMap.get("经销商"))
.dealerPhoneNumber((String) orderMap.get("经销商电话"))
.address((String) orderMap.get("客户地址"))
.phoneNumber((String) orderMap.get("客户电话"))
.salesman((String) orderMap.get("业务员"))
.deliveryDate(orderDate.atStartOfDay())
.splitter((String) orderMap.get("拆单员"))
.remark((String) orderMap.get("备注"))
.build();
return orderDO;
}
// 数据判断
private Object getValue(Cell cell) {
Object result = null;
switch (cell.getCellType()) {
case NUMERIC: //数字
result = cell.getNumericCellValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
result = DateFormatUtils.format(date, "yyyy-MM-dd'T'HH:mm:ss");
} else {
result = cell.getNumericCellValue();
DecimalFormat df = new DecimalFormat("0");
result = df.format(result);
}
break;
case BOOLEAN: //Boolean
result = cell.getBooleanCellValue();
break;
case ERROR: //故障
result = cell.getErrorCellValue();
break;
case FORMULA: //公式
result = cell.getCellFormula();
break;
case BLANK: //空值
result = "";
break;
default: //字符串
result = cell.getStringCellValue();
}
return result;
}
private LocalDateTime changeTime(String dateString) {
// 使用 DateTimeFormatter 解析字符串为 LocalDateTime 对象
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDateTime dateTime = LocalDateTime.parse(dateString, formatter);
// 打印解析后的 LocalDateTime 对象
System.out.println("Parsed LocalDateTime: " + dateTime);
return dateTime;
}
// 写excel
public void write(HttpServletResponse response,
Map<Object, Object> orderMap,
List<OrderPlateImportExcelVO> list) throws IOException {
private boolean isEven(int num) {
return num % 2 == 0;
// 加载模板
String filePathErr = ResourceUtils.getURL("classpath:").getPath() + "\\files\\生产单新增Excel模板.xlsx";
//输入流
// InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("templates/生产单新增Excel模板.xlsx");
InputStream inputStream = ResourceUtils.getURL(filePathErr).openStream();
ServletOutputStream outputStream = response.getOutputStream();
//设置输出流和模板信息
ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
//开启自动换行,自动换行表示每次写入一条list数据是都会重新生成一行空行,此选项默认是关闭的,需要提前设置为true
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
//列表
excelWriter.fill(list, fillConfig, writeSheet);
//准备单组和数据
Map<String, String> map = new HashMap<>();
map.put("customOrderNo", (String) orderMap.get("customOrderNo"));
map.put("customer", (String) orderMap.get("customer"));
map.put("address", (String) orderMap.get("address"));
map.put("phoneNumber", (String) orderMap.get("phoneNumber"));
map.put("remark", (String) orderMap.get("remark"));
map.put("splitter", (String) orderMap.get("splitter"));
map.put("salesman", (String) orderMap.get("salesman"));
map.put("dealerPhoneNumber", (String) orderMap.get("dealerPhoneNumber"));
map.put("dealer", (String) orderMap.get("dealer"));
excelWriter.fill(map, writeSheet);
// response.addHeader("Baeldung-Example-Header", "Value-HttpServletResponse");
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
//关流
excelWriter.finish();
inputStream.close();
outputStream.close();
}
// 赋值单元格数据
private OrderPlateImportExcelVO changeValue(Map<Integer, String> dataMap) {
OrderPlateImportExcelVO vo = new OrderPlateImportExcelVO();
for (Map.Entry<Integer, String> entry : dataMap.entrySet()) {
Integer key = entry.getKey();
String value = entry.getValue();
switch (key) {
case 0:
vo.setOrdinal(value);
break;
case 1:// 类型
vo.setGoodType(value);
break;
case 2:// 物料编码
vo.setGoodsId(value);
break;
case 3:// 商品名称
vo.setGoodsName(value);
break;
case 4:// 材质
vo.setMaterial(value);
break;
case 5:// 颜色
vo.setColor(value);
break;
case 6:// 厂家
vo.setFactory(value);
break;
case 7:// 品牌
vo.setBrand(value);
break;
case 8:// 型号
vo.setModel(value);
break;
case 9:// 规格
vo.setSpec(value);
break;
case 10:// 单位
vo.setUnit(value);
break;
case 11:// 数量
vo.setGoodsNumber(value);
break;
case 12:// 房间
vo.setRoomsName(value);
break;
case 13:// 柜体
vo.setCabinetsName(value);
break;
case 14:// 加工组类型
vo.setSynthesisTypeName(value);
break;
case 15:// 加工组名称
vo.setCombinationName(value);
break;
case 16://板名称
vo.setName(value);
break;
case 17:// 自定义板编号
vo.setPlateNo(value);
break;
case 18:// 成品长
vo.setHeight(value);
break;
case 19:// 成品宽
vo.setWidth(value);
break;
case 20:// 拆单长
vo.setSplitHeight(value);
break;
case 21:// 拆单宽
vo.setSplitWidth(value);
break;
case 22:// 厚
vo.setThickness(value);
break;
case 23:// 左封边
vo.setSealLeft(value);
break;
case 24:// 右封边
vo.setSealRight(value);
break;
case 25:// 上封边
vo.setSealUp(value);
break;
case 26:// 下封边
vo.setSealDown(value);
break;
case 27:// 排版面
vo.setTypographicFace(value);
break;
case 28:// 纹路
vo.setTexture(value);
break;
case 29:// 开门方向
vo.setOpenDoorType(value);
break;
case 30://备注1
vo.setRemark1(value);
break;
case 31://备注2
vo.setRemark2(value);
break;
case 32://备注3
vo.setRemark3(value);
break;
case 33://备注4
vo.setRemark4(value);
break;
case 34://备注5
vo.setRemark5(value);
break;
case 35://备注6
vo.setRemark6(value);
break;
case 36://备注7
vo.setRemark7(value);
break;
case 37://备注8
vo.setRemark8(value);
break;
case 38://备注9
vo.setRemark9(value);
break;
case 39://备注10
vo.setRemark10(value);
break;
default:
// 处理默认情况,可以选择忽略或者做其他处理
break;
}
}
checkVO(vo);
return vo;
}
// OrderPlateImportExcelVO 数据验证
private Boolean checkVO(OrderPlateImportExcelVO vo) {
List<String> errList = new ArrayList<>();
Boolean flag = true;
// 检查非空 类型、数量
if (StringUtils.isEmpty(vo.getGoodType()) || StringUtils.isEmpty(vo.getGoodsNumber())) {
errList.add("类型、数量不能为空");
flag = false;
}
// 检查商品物料编码或是商品名称、规格、材质、颜色不可全为空
if (StringUtils.isEmpty(vo.getGoodsId()) && (StringUtils.isEmpty(vo.getGoodsName()) || StringUtils.isEmpty(vo.getSpec())
|| StringUtils.isEmpty(vo.getMaterial()) || StringUtils.isEmpty(vo.getColor()) || StringUtils.isEmpty(vo.getUnit()))) {
errList.add("商品物料编码或是商品名称、规格、材质、颜色、单位不可全为空");
flag = false;
}
// 若商品类型为板材,需检查房间、柜体、板名称、成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边、排版面、纹路、开门方向不能为空
if (StringUtils.equals(vo.getGoodType(), "板材")) {
if (StringUtils.isEmpty(vo.getRoomsName()) && StringUtils.isEmpty(vo.getCabinetsName()) && StringUtils.isEmpty(vo.getName())) {
flag = false;
errList.add("房间、柜体、板名称不能为空");
}
//成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边 不能为空
if (StringUtils.isEmpty(vo.getHeight()) && StringUtils.isEmpty(vo.getWidth()) && StringUtils.isEmpty(vo.getSplitHeight())
&& StringUtils.isEmpty(vo.getSplitWidth()) && StringUtils.isEmpty(vo.getThickness()) && StringUtils.isEmpty(vo.getSealLeft())
&& StringUtils.isEmpty(vo.getSealRight()) && StringUtils.isEmpty(vo.getSealUp()) && StringUtils.isEmpty(vo.getSealDown())) {
flag = false;
errList.add("小板轮廓数据不能为空");
} else { // 成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边 数据类型以及长度验证
if (!convertToDouble(vo.getHeight())) {
flag = false;
errList.add("成品长数据类型错误");
} else {
if (!checkPrecision(vo.getHeight())) {
flag = false;
errList.add("成品长数据长度错误");
}
}
if (!convertToDouble(vo.getWidth())) {
flag = false;
errList.add("成品宽数据类型错误");
} else {
if (!checkPrecision(vo.getWidth())) {
flag = false;
errList.add("成品宽数据长度错误");
}
}
if (!convertToDouble(vo.getSplitHeight())) {
flag = false;
errList.add("拆单长数据类型错误");
} else {
if (!checkPrecision(vo.getSplitHeight())) {
flag = false;
errList.add("拆单长数据长度错误");
}
}
if (!convertToDouble(vo.getSplitWidth())) {
flag = false;
errList.add("拆单宽数据类型错误");
} else {
if (!checkPrecision(vo.getSplitWidth())) {
flag = false;
errList.add("拆单宽数据长度错误");
}
}
if (!convertToDouble(vo.getThickness())) {
flag = false;
errList.add("厚数据类型错误");
} else {
if (!checkPrecision(vo.getThickness())) {
flag = false;
errList.add("厚数据长度错误");
}
}
if (!convertToDouble(vo.getSealLeft())) {
flag = false;
errList.add("左封边数据类型错误");
} else {
if (!checkPrecision(vo.getSealLeft())) {
flag = false;
errList.add("左封边数据长度错误");
}
}
if (!convertToDouble(vo.getSealRight())) {
flag = false;
errList.add("右封边数据类型错误");
} else {
if (!checkPrecision(vo.getSealRight())) {
flag = false;
errList.add("右封边数据长度错误");
}
}
if (!convertToDouble(vo.getSealUp())) {
flag = false;
errList.add("上封边数据类型错误");
} else {
if (!checkPrecision(vo.getSealUp())) {
flag = false;
errList.add("上封边数据长度错误");
}
}
if (!convertToDouble(vo.getSealDown())) {
flag = false;
errList.add("下封边数据类型错误");
} else {
if (!checkPrecision(vo.getSealDown())) {
flag = false;
errList.add("下封边数据长度错误");
}
}
}
// 排版面、纹路、开门方向
if (StringUtils.isEmpty(vo.getTypographicFace()) && StringUtils.isEmpty(vo.getTexture()) && StringUtils.isEmpty(vo.getOpenDoorType())) {
flag = false;
errList.add("排版面、纹路、开门方向不能为空");
} else {
DictDataRespDTO typographyDTO = dictDataApi.parseDictData(DictTypeConstants.TYPOGRAPHY_TYPE, vo.getTypographicFace()).getData();// 排版面
if (typographyDTO == null) {
flag = false;
errList.add("排版面数据不存在");
} else {
vo.setTypographicFace(typographyDTO.getValue());
}
DictDataRespDTO grainDTO = dictDataApi.parseDictData(DictTypeConstants.GRAIN_TYPE, vo.getTexture()).getData();// 纹路
if (grainDTO == null) {
flag = false;
errList.add("纹路数据不存在");
} else {
vo.setTexture(grainDTO.getValue());
}
DictDataRespDTO doorDTO = dictDataApi.parseDictData(DictTypeConstants.DOOR_OPENING_DIRECTIONS, vo.getOpenDoorType()).getData();
if (doorDTO == null) {
flag = false;
errList.add("开门方向数据不存在");
} else {
vo.setOpenDoorType(doorDTO.getValue());
}
}
}
if (!flag) {
isErr++;
}
JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(errList));// 错误列表
vo.setResult(String.valueOf(jsonArray));
return flag;
}
// 数据类型可否转换判断
public Boolean convertToDouble(String str) {
try {
Double.parseDouble(str);
} catch (NumberFormatException e) {
return false;
}
return true;
}
// 数据长度判断
public boolean checkPrecision(String numberStr) {
if (numberStr == null) {
return false;
}
// 分割整数部分和小数部分
String[] parts = numberStr.split("\\.");
String integerPart = parts[0];
String decimalPart = parts.length > 1 ? parts[1] : "";
// 检查整数部分位数
if (integerPart.length() > 5) {
return false;
}
// 检查小数部分位数
if (decimalPart.length() > 3) {
return false;
}
return true;
}
public int isErr() {
return isErr;
}
public void setErr(int isErr) {
this.isErr = isErr;
}
}
@@ -0,0 +1,322 @@
package com.cf.imes.module.executor.util.fileConversion.admin.files.excel;
import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO;
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.orderModuleExtra.OrderModuleExtraDO;
import com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 实现数据格式转换
* 使用自带id
*/
@Slf4j
@Component
public class ExcelTypeRealize {
@Resource
private SnowFlakeGenerator snowFlakeGenerator;
@Resource
private PlateGoodMapper plateGoodMapper;
// 数据转换 + 错误验证
public Map<String, List<?>> changeDate(List<?> list, Long orderId) {
List<OrderPlateImportExcelVO> excelVOS = (List<OrderPlateImportExcelVO>) list;
Map<String, List<?>> map = new HashMap<>();
Long organId = OrganContextHolder.getOrganId();
ArrayList<RawGoodsDO> rawGoodsDOS = new ArrayList<>();
ArrayList<GoodsDO> goodsDOS = new ArrayList<>();
ArrayList<PlateGoodDO> plateGoodDOS = new ArrayList<>();
ArrayList<OrderBodyDO> orderBodyDOS = new ArrayList<>();
ArrayList<OrderGroupDO> orderGroupDOS = new ArrayList<>();
ArrayList<PlateDO> plateDOS = new ArrayList<>();
ArrayList<OrderPartsDO> orderPartsDOS = new ArrayList<>();
ArrayList<OrderItemDO> orderItemDOS = new ArrayList<>();
ArrayList<OrderModuleExtraDO> orderModuleExtraDOS = new ArrayList<>();
ArrayList<OrderModelDO> orderModelDOS = new ArrayList<>();
HashMap<String, List<OrderPlateImportExcelVO>> checkMap = classifyGoods(excelVOS);
Map<String, List<OrderPlateImportExcelVO>> goodsIdMap = checkMap.get("plate").stream().collect(
Collectors.groupingBy(
excelVO -> excelVO.getGoodsId() != null ? excelVO.getGoodsId() : " ",
Collectors.toList()
));
goodsIdMap.forEach((key, value) -> {
if (value.get(0).getGoodsId() == null) { // 没有商品编号的
// 将相同条件的元素归为一个集合
Map<List<Object>, List<OrderPlateImportExcelVO>> goodsMap = value.stream()
.collect(Collectors.groupingBy(
p -> Arrays.asList(p.getGoodsName(),
p.getMaterial(),
p.getColor(),
p.getSpec(),
p.getThickness()),
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);
rawGoodsDOS.add(rawGoodsDO);
Long goodId = (Long) snowFlakeGenerator.nextId(null);
GoodsDO plateDO = setGoodsDO(goodValue.get(0)).setId(goodId).setOrderId(orderId)
.setRawGoodsId(rawGoodsId).setGoodsId(plateGoodId);
goodsDOS.add(plateDO);
// 赋值给板件未对应前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);
rawGoodsDOS.add(rawGoodsDO);
Long goodId = (Long) snowFlakeGenerator.nextId(null);
GoodsDO plateDO = setGoodsDO(value.get(0)).setId(goodId).setOrderId(orderId)
.setRawGoodsId(rawGoodsId).setGoodsId(plateGoodId);
goodsDOS.add(plateDO);
// 赋值给板件未对应前order_raw_goods的id
for (OrderPlateImportExcelVO reqVO : value) {
reqVO.setGoodId(goodId);
}
}
});
// 房间名称为条件进行分组
Map<String, List<OrderPlateImportExcelVO>> roomCollect = excelVOS.stream().collect(
Collectors.groupingBy(
excelVO -> excelVO.getRoomsName() != null ? excelVO.getRoomsName() : " ",
Collectors.toList()
));
System.out.println("roomCollect " + roomCollect);
roomCollect.forEach((roomName, listRoom) -> {
Long roomId = (Long) snowFlakeGenerator.nextId(null);
// 柜体名称为条件进行分组
Map<String, List<OrderPlateImportExcelVO>> bodyCollect = listRoom.stream()
.collect(Collectors.groupingBy(
excelVO -> excelVO.getCabinetsName() != null ? excelVO.getCabinetsName() : " ",
Collectors.toList()
));
bodyCollect.forEach((bodyName, listBody) -> {
Long bodyId = (Long) snowFlakeGenerator.nextId(null);
final Double[] plateCountByCabinetName = {0.0};
OrderBodyDO orderBodyDO = OrderBodyDO.builder().id(bodyId).orderId(orderId).orderId(organId)
.roomId(roomId).roomName(roomName).name(bodyName).width(0.0).height(0.0)
.depth(0.0).multiNum(0).plateNum(0).unregularNum(0).filename("").remark("").build(); //没有获取柜体的长宽高
// 加工组类型为条件进行分组
Map<String, List<OrderPlateImportExcelVO>> synthesisCollect = listBody.stream()
.collect(Collectors.groupingBy(
excelVO -> excelVO.getSynthesis() != null ? excelVO.getSynthesis() : " ",
Collectors.toList()
));
Long groupTypeId = (Long) snowFlakeGenerator.nextId(null);
synthesisCollect.forEach((synthesis, listSynthesis) -> {
// 加工组名称为条件进行分组
Map<String, List<OrderPlateImportExcelVO>> combinationNameCollect = listSynthesis.stream()
.collect(Collectors.groupingBy(
excelVO -> excelVO.getCombinationName() != null ? excelVO.getCombinationName() : " ",
Collectors.toList()
));
combinationNameCollect.forEach((combinationName, listCombinationName) -> {
Long groupId = (Long) snowFlakeGenerator.nextId(null);
// 板数量
final Double[] plateCountByCombination = {0.0};
OrderGroupDO orderGroupDO = OrderGroupDO.builder().id(groupId).orderId(orderId).orderId(organId).bodyId(bodyId)
.groupTypeId(groupTypeId).groupTypeName(synthesis).name(combinationName).width(0.0).height(0.0)
.depth(0.0).multiNum(0).plateNum(0).unregularNum(0).filename("").remark("").build();
listCombinationName.forEach(combination -> {
if (combination.getGoodType().equals("板材")) {
//板材
plateCountByCombination[0] = plateCountByCombination[0] + Double.parseDouble(combination.getGoodsNumber());
for (int i = 0; i < Integer.parseInt(combination.getGoodsNumber()); i++) {
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())))
.height(BigDecimal.valueOf(Double.parseDouble(combination.getHeight()))).thickness(BigDecimal.valueOf(Double.parseDouble(combination.getThickness())))
.splitWidth(BigDecimal.valueOf(Double.parseDouble(combination.getSplitWidth())))
.splitHeight(BigDecimal.valueOf(Double.parseDouble(combination.getSplitHeight())))
.splitThickness(BigDecimal.valueOf(Double.parseDouble(combination.getThickness())))
.sealLeft(BigDecimal.valueOf(Double.parseDouble(combination.getSealLeft())))
.sealRight(BigDecimal.valueOf(Double.parseDouble(combination.getSealRight())))
.sealUp(BigDecimal.valueOf(Double.parseDouble(combination.getSealUp())))
.sealDown(BigDecimal.valueOf(Double.parseDouble(combination.getSealDown())))
.holeFace(Integer.valueOf(combination.getTypographicFace()))
.texture(Integer.valueOf(combination.getTexture()))
.openDoorType(Integer.valueOf(combination.getOpenDoorType()))
.isSpecialShaped(false)
.isSculpt(false)
.remark(combination.remarkJSON())
.build();
plateDOS.add(plateDO);
OrderItemDO orderItemDO = OrderItemDO.builder().orderId(orderId).type(1)
.roomId(roomId).bodyId(bodyId).plateId(plateId)
.num(1.0).groupId(groupId).build();
orderItemDOS.add(orderItemDO);
orderModelDOS.add(OrderModelDO.builder().orderId(orderId).plateId(plateId).build());
}
plateCountByCabinetName[0] = plateCountByCabinetName[0] + plateCountByCombination[0];
} else {
//配件
Long partsId = (Long) snowFlakeGenerator.nextId(null);
OrderPartsDO orderPartsDO = OrderPartsDO.builder().id(partsId).orderId(orderId).goodsId(combination.getGoodsId())
.name(combination.getName()).material(combination.getMaterial()).type(combination.getGoodType())
.model(combination.getModel()).spec(combination.getSpec()).brand(combination.getBrand()).factory(combination.getFactory())
.unit(combination.getUnit()).price(0.0).isComposite(false).remark(combination.remarkJSON()).isComposite(false).build();
orderPartsDOS.add(orderPartsDO);
OrderItemDO orderItemDO = OrderItemDO.builder().orderId(orderId).type(2)
.roomId(roomId).bodyId(bodyId).partsId(partsId).groupId(groupId)
.num(Double.valueOf(combination.getGoodsNumber())).build();
orderItemDOS.add(orderItemDO);
}
});
orderGroupDO.setPlateNum(plateCountByCombination[0].intValue());
orderGroupDOS.add(orderGroupDO);
});
});
orderBodyDO.setPlateNum(Integer.valueOf(plateCountByCabinetName[0].intValue()));
orderBodyDOS.add(orderBodyDO);
});
});
map.put("rawGoodsDOS", rawGoodsDOS);
map.put("goodsDOS", goodsDOS);
map.put("plateGoodDOS", plateGoodDOS);
map.put("orderBodyDOS", orderBodyDOS);
map.put("orderGroupDOS", orderGroupDOS);
map.put("plateDOS", plateDOS);
map.put("orderPartsDOS", orderPartsDOS);
map.put("orderItemDOS", orderItemDOS);
map.put("orderModuleExtraDOS", orderModuleExtraDOS);
map.put("orderModelDOS", orderModelDOS);
return map;
}
// 板材库数据
private PlateGoodDO setPlateGoodDO(OrderPlateImportExcelVO excelVO) {
return PlateGoodDO.builder()
// .id(plateGoodId)
.goodsId("")
.goodsName(excelVO.getGoodsName())
.material(excelVO.getMaterial())
.color(excelVO.getColor())
.texture("")
.width(Double.valueOf(excelVO.getWidth()))
.height(Double.valueOf(excelVO.getHeight()))
.thickness(Double.valueOf(excelVO.getThickness()))
.spec(excelVO.getSpec())
.brand(excelVO.getBrand())
// .organId(organId)
.build();
}
// RawGoodsDO数据
private RawGoodsDO setRawGoodsDO(OrderPlateImportExcelVO excelVO) {
return RawGoodsDO.builder()
// .id(rawGoodsId)
// .orderId(orderId)
.rawGoodsId(excelVO.getGoodsId())
.goodsName(excelVO.getGoodsName())
.material(excelVO.getMaterial())
.color(excelVO.getColor())
.thickness(Double.valueOf(excelVO.getThickness()))
.spec(excelVO.getSpec())
.brand(excelVO.getBrand())
.build();
}
// GoodsDO数据
private GoodsDO setGoodsDO(OrderPlateImportExcelVO excelVO) {
return GoodsDO.builder()
// .id(goodId)
// .orderId(orderId)
// .rawGoodsId(rawGoodsId)
// .goodsId(plateGoodId)
.goodsName(excelVO.getGoodsName())
.material(excelVO.getMaterial())
.color(excelVO.getColor())
.width(BigDecimal.valueOf(Double.valueOf(excelVO.getWidth())))
.height(BigDecimal.valueOf(Double.valueOf(excelVO.getHeight())))
.thickness(BigDecimal.valueOf(Double.valueOf(excelVO.getThickness())))
.spec(excelVO.getSpec())
.brand(excelVO.getBrand())
.build();
}
// spec分离数据
public List<String> spec(String spec) {
List<String> list = null;
String[] parts = spec.split("\\×");
if (parts.length <= 1) {
return null;
}
for (int i = 0; i < parts.length; i++) {
list.add(parts[i]);
}
return list;
}
// 对数据进行分类
private HashMap<String, List<OrderPlateImportExcelVO>> classifyGoods(List<OrderPlateImportExcelVO> list) {
HashMap<String, List<OrderPlateImportExcelVO>> map = new HashMap<>();
List<OrderPlateImportExcelVO> plateLists = new ArrayList<>();
List<OrderPlateImportExcelVO> partsLists = new ArrayList<>();
for (OrderPlateImportExcelVO detail : list) {
//判断是板材还是配件
if (detail.getGoodType().equals("板材")) {
plateLists.add(detail);
} else {
partsLists.add(detail);
}
}
map.put("plate", plateLists);
map.put("parts", partsLists);
return map;
}
}
@@ -28,17 +28,19 @@ public class OrderPlateImportExcelVO {
@ExcelProperty(value = "序号")
@JsonIgnore
private int ordinal;
private String ordinal;
@ExcelProperty(value = "类型", converter = DictConvert.class)
@JsonIgnore
@DictFormat(DictTypeConstants.PRODUCT_TYPE)
private int goodType;
private String goodType;
@ExcelProperty(value = "物料编码")
@JsonIgnore
private String goodsId;
private Long goodId;//商品id
@ExcelProperty(value = "商品名称")
@JsonIgnore
private String goodsName;
@@ -74,7 +76,7 @@ public class OrderPlateImportExcelVO {
@ExcelProperty(value = "数量")
@JsonIgnore
@NotNull
private float goodsNumber;
private String goodsNumber;
@ExcelProperty(value = "房间")
@JsonIgnore
@@ -87,7 +89,7 @@ public class OrderPlateImportExcelVO {
@ExcelProperty(value = "加工组类型", converter = DictConvert.class)
@JsonIgnore
@DictFormat(DictTypeConstants.SYNTHESIS_TYPE)
private int synthesis;
private String synthesis;
@JsonIgnore
@ExcelIgnore
@@ -107,54 +109,54 @@ public class OrderPlateImportExcelVO {
@ExcelProperty(value = "成品长")
@JsonIgnore
private BigDecimal height;
private String height;
@ExcelProperty(value = "成品宽")
@JsonIgnore
private BigDecimal width;
private String width;
@ExcelProperty(value = "拆单长")
@JsonIgnore
private BigDecimal splitHeight;
private String splitHeight;
@ExcelProperty(value = "拆单宽")
@JsonIgnore
private BigDecimal splitWidth;
private String splitWidth;
@ExcelProperty(value = "")
@JsonIgnore
private BigDecimal splitThickness;
private String thickness;
@ExcelProperty(value = "左封边")
@JsonIgnore
private BigDecimal sealLeft;
private String sealLeft;
@ExcelProperty(value = "右封边")
@JsonIgnore
private BigDecimal sealRight;
private String sealRight;
@ExcelProperty(value = "上封边")
@JsonIgnore
private BigDecimal sealUp;
private String sealUp;
@ExcelProperty(value = "下封边")
@JsonIgnore
private BigDecimal sealDown;
private String sealDown;
@ExcelProperty(value = "排版面", converter = DictConvert.class)
@JsonIgnore
@DictFormat(DictTypeConstants.YPOGRAPHY_TYPE)
private int typographicFace;
@DictFormat(DictTypeConstants.TYPOGRAPHY_TYPE)
private String typographicFace;
@ExcelProperty(value = "纹路", converter = DictConvert.class)
@JsonIgnore
@DictFormat(DictTypeConstants.GRAIN_TYPE)
private int texture;
private String texture;
@ExcelProperty(value = "开门方向", converter = DictConvert.class)
@JsonIgnore
@DictFormat(DictTypeConstants.DOOR_OPENING_DIRECTIONS)
private int openDoorType;
private String openDoorType;
@ExcelProperty(value = "上传结果")
@JsonIgnore
@@ -194,18 +196,6 @@ public class OrderPlateImportExcelVO {
@ExcelIgnore
private String remark;
@JsonIgnore
public boolean isValidGoods() {
return (isNonEmpty(goodsId) ||
((isNonEmpty(goodsName)) && (isNonEmpty(model) || isNonEmpty(spec)) && isNonEmpty(material) && isNonEmpty(color) && isNonEmpty(unit)))
&& goodsNumber > 0;
}
private boolean isNonEmpty(String value) {
return value != null && !value.trim().isEmpty();
}
//备注转json数据
public String remarkJSON() {
ObjectMapper objectMapper = new ObjectMapper();
@@ -1,40 +0,0 @@
package com.cf.imes.module.executor.util.fileConversion.admin.files.excel;
import com.alibaba.excel.EasyExcel;
import com.cf.imes.framework.excel.core.util.ExcelUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @projectName: cf_imes_server
* @author: 晨丰科技
* @date: 2024/5/14 9:23
*/
public class Test {
public static void main(String[] args) throws IOException {
String filePath = "C:/Users/Administrator/Desktop/生产单新增Excel模板.xlsx";
InputStream inputStream = new FileInputStream(filePath);
ExcelListener<OrderPlateImportExcelVO> excelListener = new ExcelListener();
// ExcelListenerTwo excelListener = new ExcelListenerTwo();
// List<OrderTest> list = read(inputStream, OrderTest.class,excelListener);
// System.out.println(list);
// EasyExcel.read(inputStream, new ExcelListener()).sheet().doRead();
ExcelReadUtil excelReadUtil = new ExcelReadUtil();
EasyExcel.read(inputStream, excelListener).sheet().doRead();
// excelReadUtil.changeValue(inputStream);
}
}