新增cad三维看图能力相关

This commit is contained in:
gaoqr
2025-12-24 17:24:10 +08:00
parent a78ddf464c
commit dd431650ba
27 changed files with 529 additions and 149 deletions
@@ -50,6 +50,21 @@ public class ServletUtils {
IoUtil.write(response.getOutputStream(), false, content);
}
/**
* 返回附件文本
*
* @param response 响应
* @param filename 文件名
* @param content 附件内容
*/
public static void writeAttachmentText(HttpServletResponse response, String filename, byte[] content) throws IOException {
// 设置 header 和 contentType
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
response.setContentType(MediaType.TEXT_PLAIN_VALUE);
// 输出附件
IoUtil.write(response.getOutputStream(), false, content);
}
/**
* @param request 请求
* @return ua
@@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
@@ -75,6 +76,11 @@ public interface FileApi {
@Parameter(name = "path", description = "文件地址", example = "url", required = true)
CommonResult<Boolean> deleteFileByPath(String path);
@DeleteMapping(PREFIX + "/{id}")
@Operation(summary = "根据文件id删除文件")
@Parameter(name = "id", description = "文件id", example = "123L", required = true)
CommonResult<Boolean> deleteFileById(@PathVariable Long id);
@PostMapping(PREFIX + "/create/id")
@Operation(summary = "保存文件,并返回文件id")
CommonResult<Long> createFileAndReturnId(@Valid @RequestBody FileCreateReqDTO createReqDTO);
@@ -28,6 +28,12 @@ public class FileApiImpl implements FileApi {
return success(fileService.deleteFileByPath(path));
}
@Override
public CommonResult<Boolean> deleteFileById(Long id) {
fileService.deleteFile(id);
return success(true);
}
@Override
public CommonResult<Long> createFileAndReturnId(FileCreateReqDTO createReqDTO) {
return success(fileService.createFileDO(createReqDTO.getName(), createReqDTO.getPath(),
@@ -50,6 +50,14 @@ public class FileController {
return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream())));
}
@PostMapping("/cadview")
@Operation(summary = "上传CAD图纸数据")
@OperateLog(logArgs = false) // 上传文件,没有记录操作日志的必要
public CommonResult<Long> uploadCadViewFile(@RequestPart("file") MultipartFile file) throws Exception {
return success(fileService.createFileDO("cadViewFile", null, file.getBytes()));
}
@DeleteMapping("/delete")
@Operation(summary = "删除文件")
@Parameter(name = "id", description = "编号", required = true)
@@ -101,6 +109,22 @@ public class FileController {
ServletUtils.writeAttachment(response, String.valueOf(id), content);
}
@GetMapping("/txt/{id}")
@Operation(summary = "根据文件编号下载文本文件")
@Parameter(name = "id", description = "文件编号", required = true)
@OperateLog(enable = false)
@PermitAll
public void getTxtFileContentById(HttpServletResponse response,
@PathVariable("id") Long id) throws Exception {
byte[] content = fileService.getFileById(id);
if (content == null) {
log.warn("[getFileContent][id({}) 文件不存在]", id);
response.setStatus(HttpStatus.NOT_FOUND.value());
return;
}
ServletUtils.writeAttachmentText(response, String.valueOf(id), content);
}
@GetMapping("/page")
@Operation(summary = "获得文件分页")
@PreAuthorize("@ss.hasPermission('infra:file:query')")
@@ -44,7 +44,7 @@ public interface FileService {
*
* @param id 编号
*/
void deleteFile(Long id) throws Exception;
void deleteFile(Long id);
/**
* 获得文件内容
@@ -105,14 +105,18 @@ public class FileServiceImpl implements FileService {
}
@Override
public void deleteFile(Long id) throws Exception {
public void deleteFile(Long id) {
// 校验存在
FileDO file = validateFileExists(id);
// 从文件存储器中删除
FileClient client = fileConfigService.getFileClient(file.getConfigId());
Assert.notNull(client, CLIENT_ERR_NOTIFICATION, file.getConfigId());
client.delete(file.getPath());
try {
client.delete(file.getPath());
} catch (Exception e) {
throw new ServiceException(FILE_REMOVE_FAIL);
}
// 删除记录
fileMapper.deleteById(id);
@@ -0,0 +1,27 @@
package com.cf.imes.module.executor.controller.admin.order.vo.order;
import com.cf.imes.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Schema(description = "管理后台 - 柜体视图板材分组条件")
@Data
@ToString(callSuper = true)
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrderBodyViewPlatePageReqVO extends PageParam {
@Schema(description = "生产单号", example = "1024")
private Long orderId;
@Schema(description = "房间编号", example = "1024")
private Long roomId;
@Schema(description = "柜体编号", example = "1024")
private Long bodyId;
}
@@ -88,7 +88,4 @@ public class OrderRespVO {
private LocalDateTime createTime;
private Boolean deleted;
@Schema(description = "cad图纸路径")
private String cadViewPath;
}
@@ -1,10 +1,8 @@
package com.cf.imes.module.executor.controller.admin.order.vo.product;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
import java.util.List;
import com.alibaba.excel.annotation.*;
@@ -6,6 +6,7 @@ import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.excel.core.util.ExcelUtils;
import com.cf.imes.framework.operatelog.core.annotations.OperateLog;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderBodyViewPlatePageReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList;
import com.cf.imes.module.executor.controller.admin.plate.vo.*;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
@@ -138,5 +139,16 @@ public class PlateController {
return success(plateService.createNewPlate(reqVO));
}
@GetMapping("/body/view/page")
@Operation(summary = "获取柜体下的板件视图分页列表数据")
public CommonResult<PageResult<OrderBodyViewPlatePageRespVO>> getBodyViewPlatesPage(@Valid OrderBodyViewPlatePageReqVO orderBodyPageRespVO) {
return success(plateService.getBodyViewPlatesPage(orderBodyPageRespVO));
}
@GetMapping("/body/view/cadinfo")
@Operation(summary = "获取板件对应柜体下的所有板件视图列表数据")
@Parameter(name = "plateNo", description = "板件id", required = true)
public CommonResult<List<OrderBodyViewPlatePageRespVO>> getBodyViewPlatesCadInfo(@RequestParam(value = "plateNo") Long plateNo) {
return success(plateService.getBodyViewPlatesCadInfo(plateNo));
}
}
@@ -0,0 +1,66 @@
package com.cf.imes.module.executor.controller.admin.plate.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
*
*
* @author Gqr
* @since 2025/12/23 13:40
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Schema(description = "管理后台 - 柜体对应的板件视图信息")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderBodyViewPlatePageRespVO {
@Schema(description = "板件编号")
private Long id;
@Schema(description = "板件名称")
private String name;
@Schema(description = "板件宽度")
private BigDecimal width;
@Schema(description = "板件高度")
private BigDecimal height;
@Schema(description = "板件厚度")
private BigDecimal thickness;
@Schema(description = "板件CAD图纸ID")
private Integer cadViewId;
@Schema(description = "左封边厚度")
private BigDecimal sealLeft;
@Schema(description = "右封边厚度")
private BigDecimal sealRight;
@Schema(description = "上封边厚度")
private BigDecimal sealUp;
@Schema(description = "下封边厚度")
private BigDecimal sealDown;
@Schema(description = "材质")
private String material;
@Schema(description = "颜色")
private String color;
@Schema(description = "CAD图纸文件ID")
private Long cadViewFileId;
@Schema(description = "CAD设计板编号")
private String customNumber;
}
@@ -146,9 +146,4 @@ public class OrderDO extends BaseDO {
private Double plannedPlateArea;
private int version;
/**
* cad图纸路径
*/
private String cadViewPath;
}
@@ -1,6 +1,5 @@
package com.cf.imes.module.executor.dal.dataobject.orderBody;
import com.cf.imes.framework.organ.core.db.OrganBaseDO;
import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import com.cf.imes.framework.mybatis.core.dataobject.BaseDO;
@@ -82,4 +81,9 @@ public class OrderBodyDO extends BaseDO {
* 是否删除
*/
private Boolean deleted;
/**
* cad图纸数据文件id
*/
private Long cadViewFileId;
}
@@ -0,0 +1,79 @@
package com.cf.imes.module.executor.dal.dataobject.orderItem;
import lombok.Data;
import java.math.BigDecimal;
/**
* 柜体板件视图数据DO
*
* @author Gqr
* @since 2025/12/23 11:54
*/
@Data
public class OrderBodyViewPlatesPageDO {
/**
* 主键
*/
private Long id;
/**
* 板件名称
*/
private String name;
/**
* 板件宽度
*/
private BigDecimal width;
/**
* 板件高度
*/
private BigDecimal height;
/**
* 板件厚度
*/
private BigDecimal thickness;
/**
* 板件CAD图纸ID
*/
private Integer cadViewId;
/**
* 左封边厚度
*/
private BigDecimal sealLeft;
/**
* 右封边厚度
*/
private BigDecimal sealRight;
/**
* 上封边厚度
*/
private BigDecimal sealUp;
/**
* 下封边厚度
*/
private BigDecimal sealDown;
/**
* 材质
*/
private String material;
/**
* 颜色
*/
private String color;
/**
* cad设计板编号
*/
private String customNumber;
}
@@ -222,4 +222,9 @@ public class PlateDO extends BaseDO {
* cad图纸数据
*/
private String cadData;
/**
* cad自定义板编号
*/
private String cadPlateNo;
}
@@ -10,6 +10,7 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsRes
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlatesDetailRespVO;
import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlateRespVO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderBodyViewPlatesPageDO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -186,4 +187,19 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
List<PlateAndPartIdList> selectOrderPackPlateIds(@Param("orderId") Long orderId,@Param("organId") Long organId);
/**
* 分页查询柜体板件视图数据
*
* @param page
* @param orderId
* @param roomId
* @param bodyId
* @return
*/
IPage<OrderBodyViewPlatesPageDO> selectBodyViewPlatesPage(@Param("page") IPage page,
@Param("orderId") Long orderId,
@Param("roomId") Long roomId,
@Param("bodyId") Long bodyId,
@Param("organId") Long organId,
@Param("cadView") boolean cadView);
}
@@ -2,6 +2,7 @@ package com.cf.imes.module.executor.service.plate;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsSaveReqVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderBodyViewPlatePageReqVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList;
import com.cf.imes.module.executor.controller.admin.plate.vo.*;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
@@ -94,4 +95,19 @@ public interface PlateService {
List<InsertPlateRespVO> createNewPlate(List<OptimizationSavePlateReqVO> reqVO);
/**
* 获取柜体板件视图分页列表
*
* @param orderBodyPageRespVO
* @return
*/
PageResult<OrderBodyViewPlatePageRespVO> getBodyViewPlatesPage(OrderBodyViewPlatePageReqVO orderBodyPageRespVO);
/**
* 根据板件id获取柜体下的所有板件cad视图所需信息
*
* @param plateId
* @return
*/
List<OrderBodyViewPlatePageRespVO> getBodyViewPlatesCadInfo(Long plateId);
}
@@ -1,5 +1,6 @@
package com.cf.imes.module.executor.service.plate;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
@@ -14,6 +15,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.enums.*;
import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.pojo.PageParam;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.Assert.AssertUtils;
import com.cf.imes.framework.common.util.object.BeanUtils;
@@ -21,6 +23,7 @@ import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd;
import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.cf.imes.framework.mybatis.core.query.QueryWrapperX;
import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsSaveReqVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderBodyViewPlatePageReqVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlanPlateNumAndAreaRespVO;
import com.cf.imes.module.executor.controller.admin.plan.vo.OrderGoodsResp;
import com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList;
@@ -28,6 +31,7 @@ import com.cf.imes.module.executor.controller.admin.plate.vo.*;
import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderBodyViewPlatesPageDO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
@@ -136,28 +140,28 @@ public class PlateServiceImpl implements PlateService {
@Transactional(rollbackFor = Exception.class)
public void deletePlate(List<Long> plateIds, Long planId) {
if(CollUtil.isEmpty(plateIds)){
if (CollUtil.isEmpty(plateIds)) {
return;
}
PlanDO planDO = planMapper.selectById(planId);
AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR);
AssertUtils.notEmpty(planDO, ORDER_PLAN_DATE_ERROR);
List<PlateDO> plateDOS = plateMapper.selectBatchIds(plateIds);
AssertUtils.notEmpty(plateDOS,REMAIN_PLATE_NOT_EXISTS);
AssertUtils.notEmpty(plateDOS, REMAIN_PLATE_NOT_EXISTS);
for (PlateDO plateDO : plateDOS) {
if(!plateDO.getType().equals(OrderPlateTypeEnum.SELFINCREASINGBOARD.getType())){
throw new ServiceException(PLATE_IS_SOURCE,plateDO.getPlateNo());
if (!plateDO.getType().equals(OrderPlateTypeEnum.SELFINCREASINGBOARD.getType())) {
throw new ServiceException(PLATE_IS_SOURCE, plateDO.getPlateNo());
}
if(!plateDO.getIsCutted().equals(OrderPlateCutStatusEnum.NOCUTTING.getStatus())){
if (!plateDO.getIsCutted().equals(OrderPlateCutStatusEnum.NOCUTTING.getStatus())) {
throw new ServiceException(THIS_PLATE_IS_OPTIMIZE,plateDO.getPlateNo());
throw new ServiceException(THIS_PLATE_IS_OPTIMIZE, plateDO.getPlateNo());
}
}
@@ -175,7 +179,7 @@ public class PlateServiceImpl implements PlateService {
List<OrderBodyDO> orderBodyDOS = orderBodyMapper.selectBatchIds(bodyIds);
orderBodyDOS.forEach(f->{
orderBodyDOS.forEach(f -> {
int plateNum = orderItemDOS.stream().filter(o -> f.getId().equals(o.getBodyId())).toList().size();
f.setPlateNum(f.getPlateNum() - plateNum);
@@ -191,7 +195,7 @@ public class PlateServiceImpl implements PlateService {
// 删除添加自增板时新增的大板ID
List<Long> orderGoodsIdList = goodsMapper.selectInsertGoodsIds(orderIds, goodsIds, getUserOrganId());
if(CollUtil.isNotEmpty(orderGoodsIdList)){
if (CollUtil.isNotEmpty(orderGoodsIdList)) {
goodsMapper.deleteBatchIds(orderGoodsIdList);
}
@@ -301,8 +305,6 @@ public class PlateServiceImpl implements PlateService {
}
@Override
public PageResult<PlateDO> getPlatePage(PlatePageReqVO pageReqVO) {
return plateMapper.selectPage(pageReqVO);
@@ -317,8 +319,6 @@ public class PlateServiceImpl implements PlateService {
}
@Override
public PageResult<PlateResList> getOrderPlatePage(NoPlanPlatePageReqVO pageReqVO) {
@@ -331,14 +331,14 @@ public class PlateServiceImpl implements PlateService {
QueryWrapperX<OrderDO> queryWrapperX = new QueryWrapperX<>();
queryWrapperX
.eq("o.organ_id",organId)
.eq("o.deleted",false)
.in("o.status",statusList)
.eq("o.organ_id", organId)
.eq("o.deleted", false)
.in("o.status", statusList)
.isNotNull("op.id")
.eq("op.deleted",false);
.eq("op.deleted", false);
if(pageReqVO.getPlanId() != null){
if (pageReqVO.getPlanId() != null) {
Long planId = pageReqVO.getPlanId();
@@ -348,7 +348,7 @@ public class PlateServiceImpl implements PlateService {
List<OrderGoodsResp> goodsRespVOS = planMapper.selectPlanGoodsList(planId, organId);
AssertUtils.notEmpty(goodsRespVOS,PLAN_NOT_EXISTS);
AssertUtils.notEmpty(goodsRespVOS, PLAN_NOT_EXISTS);
List<String> material = goodsRespVOS.stream().map(OrderGoodsResp::getMaterial).distinct().toList();
@@ -362,7 +362,7 @@ public class PlateServiceImpl implements PlateService {
// 混单
if(planDO.getType().equals(PlanTypeEnum.MIXEDORDERPLAN.getType())){
if (planDO.getType().equals(PlanTypeEnum.MIXEDORDERPLAN.getType())) {
// 混单添加查询条件
mixedInsertQuery(pageReqVO, planDO, material, thickness, queryWrapperX);
@@ -381,37 +381,37 @@ public class PlateServiceImpl implements PlateService {
else {
queryWrapperX
.likeIfPresent(FIELD_OG_MATERIAL,pageReqVO.getMaterial())
.likeIfPresent(FIELD_OG_BRAND,pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR,pageReqVO.getColor())
.eqIfPresent(FIELD_OP_THICKNESS,pageReqVO.getThickness());
.likeIfPresent(FIELD_OG_MATERIAL, pageReqVO.getMaterial())
.likeIfPresent(FIELD_OG_BRAND, pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR, pageReqVO.getColor())
.eqIfPresent(FIELD_OP_THICKNESS, pageReqVO.getThickness());
}
queryWrapperX
.inIfPresent("op.goods_id",pageReqVO.getGoodsIdList())
.inIfPresent("op.goods_id", pageReqVO.getGoodsIdList())
.likeIfPresent("o.id", pageReqVO.getOrderId() != null ? pageReqVO.getOrderId() : null)
.likeIfPresent("op.id",pageReqVO.getPlateId())
.likeIfPresent("op.name",pageReqVO.getPlateName())
.likeIfPresent("op.plate_no",pageReqVO.getPlateNo())
.likeIfPresent("op.custom_plate_no",pageReqVO.getCustomPlateNo())
.likeIfPresent("op.id", pageReqVO.getPlateId())
.likeIfPresent("op.name", pageReqVO.getPlateName())
.likeIfPresent("op.plate_no", pageReqVO.getPlateNo())
.likeIfPresent("op.custom_plate_no", pageReqVO.getCustomPlateNo())
.betweenIfPresent("op.height", new BigDecimal[]{pageReqVO.getLongMinRang(), pageReqVO.getLongMaxRang()})
.betweenIfPresent("op.width", new BigDecimal[]{pageReqVO.getWidthMinRang(), pageReqVO.getWidthMaxRang()})
.betweenIfPresent(FIELD_OP_THICKNESS, new BigDecimal[]{pageReqVO.getThicknessMinRang(), pageReqVO.getThicknessMaxRang()})
.eqIfPresent("op.texture",pageReqVO.getTexture())
.eqIfPresent("op.is_special_shaped",pageReqVO.getIsSpecialShaped())
.eqIfPresent("op.is_sculpt",pageReqVO.getIsSculpt())
.eqIfPresent("op.is_row_hole",pageReqVO.getIsRowHole())
.likeIfPresent("op.remark",pageReqVO.getRemark())
.eqIfPresent("op.texture", pageReqVO.getTexture())
.eqIfPresent("op.is_special_shaped", pageReqVO.getIsSpecialShaped())
.eqIfPresent("op.is_sculpt", pageReqVO.getIsSculpt())
.eqIfPresent("op.is_row_hole", pageReqVO.getIsRowHole())
.likeIfPresent("op.remark", pageReqVO.getRemark())
.orderByDesc("o.id, op.id");
Integer pageNo = (pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize();
List<PlateResList> plateResLists = orderMapper.selectNoPlanOrderPlateList(queryWrapperX,pageNo,pageReqVO.getPageSize(),organId);
List<PlateResList> plateResLists = orderMapper.selectNoPlanOrderPlateList(queryWrapperX, pageNo, pageReqVO.getPageSize(), organId);
if(CollUtil.isEmpty(plateResLists)){
if (CollUtil.isEmpty(plateResLists)) {
return new PageResult<>();
@@ -420,7 +420,7 @@ public class PlateServiceImpl implements PlateService {
queryWrapperX
.groupBy("o.id");
List<Long> plateCount = orderMapper.selectNoPlanOrderPlateCount(queryWrapperX,organId);
List<Long> plateCount = orderMapper.selectNoPlanOrderPlateCount(queryWrapperX, organId);
long sum = plateCount.stream().mapToLong(Long::longValue).sum();
@@ -465,7 +465,7 @@ public class PlateServiceImpl implements PlateService {
@Override
public PageResult<PlateRespVO> getPlatePageByTerms(PlateTermsPageReqVO pageReqVO) {
PageDTO<PlateRespVO> page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
IPage<PlateRespVO> pageRes = plateMapper.selectProductList(page, pageReqVO.getOrderId(), pageReqVO.getRoomId(), pageReqVO.getBodyId(),getUserOrganId());
IPage<PlateRespVO> pageRes = plateMapper.selectProductList(page, pageReqVO.getOrderId(), pageReqVO.getRoomId(), pageReqVO.getBodyId(), getUserOrganId());
return new PageResult<PlateRespVO>(pageRes.getRecords(), pageRes.getTotal());
}
@@ -487,11 +487,11 @@ public class PlateServiceImpl implements PlateService {
@SneakyThrows
@Override
public List<BodyPlateDetailVO> getPlateModelByPlateId(List<Long> bodyIds) {
public List<BodyPlateDetailVO> getPlateModelByPlateId(List<Long> bodyIds) {
List<BodyPlateIdDTO> list = plateMapper.selectJoinList(BodyPlateIdDTO.class, new MPJLambdaWrapperX<PlateDO>()
.selectAs(PlateDO::getId, FIELD_PLATE_ID)
.leftJoin(OrderItemDO.class, OrderItemDO::getPlateId, PlateDO::getId)
.eq(OrderItemDO::getOrganId,getUserOrganId())
.eq(OrderItemDO::getOrganId, getUserOrganId())
.in(OrderItemDO::getBodyId, bodyIds)
.select(OrderItemDO::getBodyId)
);
@@ -503,18 +503,17 @@ public class PlateServiceImpl implements PlateService {
List<BodyPlateDetailVO> bodyPlateDetailVOS = new ArrayList<>();
List<List<List<Object>>> data = new ArrayList<>();
map.entrySet().forEach(e->{
bodyPlateDetailVOS.add(BodyPlateDetailVO.builder()
.orderModelList(e.getValue())
.bodyId(e.getKey())
.build()
);
map.entrySet().forEach(e -> {
bodyPlateDetailVOS.add(BodyPlateDetailVO.builder()
.orderModelList(e.getValue())
.bodyId(e.getKey())
.build()
);
});
return bodyPlateDetailVOS;
}
@Override
@Transactional(rollbackFor = Exception.class)
public List<InsertPlateRespVO> createNewPlate(List<OptimizationSavePlateReqVO> reqVO) {
@@ -529,15 +528,15 @@ public class PlateServiceImpl implements PlateService {
List<OrderModelDO> orderPlateModelDOS = new ArrayList<>();
Long planId = Optional.ofNullable(reqVO.get(0).getPlanId()).orElseThrow(()-> new ServiceException(ORDER_PLAN_PLATE_ERROR));
Long planId = Optional.ofNullable(reqVO.get(0).getPlanId()).orElseThrow(() -> new ServiceException(ORDER_PLAN_PLATE_ERROR));
PlanDO planDO = planMapper.selectById(planId);
AssertUtils.notEmpty(planDO,ORDER_PLAN_DATE_ERROR);
AssertUtils.notEmpty(planDO, ORDER_PLAN_DATE_ERROR);
List<Long> orderIds = reqVO.stream().map(OptimizationSavePlateReqVO::getOrderId).distinct().toList();
// 查询排单下的orderGoodsId列表
List<Long> goodsId = planMapper.selectPlanOrderGoodsId(planId,orderIds, getUserOrganId());
List<Long> goodsId = planMapper.selectPlanOrderGoodsId(planId, orderIds, getUserOrganId());
List<GoodsDO> goodsDOS = goodsMapper.selectBatchIds(goodsId);
@@ -546,9 +545,9 @@ public class PlateServiceImpl implements PlateService {
Map<Long, OrderPlanPlateNumAndAreaRespVO> orderGoodsPlanPlateNumAndAreaRespVOMap = new HashMap<>();
// 组装新增数据
reqVO.forEach(f->{
reqVO.forEach(f -> {
Map<String,String> plateIdAndNo = new HashMap<>();
Map<String, String> plateIdAndNo = new HashMap<>();
Long orderId = f.getOrderId();
@@ -571,7 +570,7 @@ public class PlateServiceImpl implements PlateService {
// 小板ID
Long plateId = (Long) identifierGenerator.nextId(null);
plateIdAndNo.put(plateId.toString(),plateNo);
plateIdAndNo.put(plateId.toString(), plateNo);
// 计算面积
BigDecimal area = f.getWidth().multiply(f.getHeight()).movePointLeft(6).stripTrailingZeros();
@@ -644,7 +643,7 @@ public class PlateServiceImpl implements PlateService {
List<OrderBodyDO> orderBodyDOS = orderBodyMapper.selectBatchIds(bodyIds);
orderBodyDOS.forEach(f->{
orderBodyDOS.forEach(f -> {
Integer plateNum = numVOS.stream()
.filter(n -> n.getBodyId().equals(f.getId()))
@@ -724,7 +723,6 @@ public class PlateServiceImpl implements PlateService {
}
public static List<OrderBodyNumVO> mergeOrderBody(List<OrderBodyNumVO> dataList) {
if (dataList == null || dataList.isEmpty()) {
return Collections.emptyList();
@@ -744,16 +742,12 @@ public class PlateServiceImpl implements PlateService {
}
private List<OrderModelDO> buildRespByPlateIds(Collection<Long> plateIds, String index) {
List<FieldValue> fieldValues = plateIds.stream().map(FieldValue::of).toList();
SearchRequest.Builder builder = new SearchRequest.Builder();
builder.index(index);
builder.query(q -> q.terms(b -> b.field(FIELD_PLATE_ID).terms(e->e.value(fieldValues))));
builder.query(q -> q.terms(b -> b.field(FIELD_PLATE_ID).terms(e -> e.value(fieldValues))));
builder.size(plateIds.size());
try {
SearchResponse<OrderModelDO> search = elasticsearchClient.search(builder.build(), OrderModelDO.class);
@@ -776,29 +770,28 @@ public class PlateServiceImpl implements PlateService {
QueryWrapperX<OrderDO> queryWrapperX) {
if(Boolean.TRUE.equals(pageReqVO.getIsMixed())){
if (Boolean.TRUE.equals(pageReqVO.getIsMixed())) {
throw new ServiceException(PLAN_IS_MIXED_ERROR);
}
// 相同材质和厚度
if(planDO.getFilter().equals(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType())){
if (planDO.getFilter().equals(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType())) {
queryWrapperX
.inIfPresent(FIELD_OG_MATERIAL,material)
.likeIfPresent(FIELD_OG_BRAND,pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR,pageReqVO.getColor())
.inIfPresent(FIELD_OP_THICKNESS,thickness);
.inIfPresent(FIELD_OG_MATERIAL, material)
.likeIfPresent(FIELD_OG_BRAND, pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR, pageReqVO.getColor())
.inIfPresent(FIELD_OP_THICKNESS, thickness);
}
// 相同厚度
else {
queryWrapperX
.likeIfPresent(FIELD_OG_MATERIAL,pageReqVO.getMaterial())
.likeIfPresent(FIELD_OG_BRAND,pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR,pageReqVO.getColor())
.inIfPresent(FIELD_OP_THICKNESS,thickness);
.likeIfPresent(FIELD_OG_MATERIAL, pageReqVO.getMaterial())
.likeIfPresent(FIELD_OG_BRAND, pageReqVO.getBrand())
.likeIfPresent(FIELD_OG_COLOR, pageReqVO.getColor())
.inIfPresent(FIELD_OP_THICKNESS, thickness);
}
@@ -816,14 +809,14 @@ public class PlateServiceImpl implements PlateService {
QueryWrapperX<OrderDO> queryWrapperX) {
// 是否开启混单
if(Boolean.TRUE.equals(pageReqVO.getIsMixed())){
if (Boolean.TRUE.equals(pageReqVO.getIsMixed())) {
if(!planDO.getStatus().equals(PlanStatusEnum.NOCUTTING.getStatus())){
if (!planDO.getStatus().equals(PlanStatusEnum.NOCUTTING.getStatus())) {
throw new ServiceException(PLAN_PLATE_IS_CUTTING);
}
// 相同材质和厚度 混单
if(pageReqVO.getMixedType().equals(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType())){
if (pageReqVO.getMixedType().equals(MixConfigTypeEnum.SAMEMATERIALANDTHICKNESS.getType())) {
queryWrapperX
.inIfPresent(FIELD_OG_MATERIAL, material)
.likeIfPresent(FIELD_OG_BRAND, pageReqVO.getBrand())
@@ -832,7 +825,7 @@ public class PlateServiceImpl implements PlateService {
}
// 相同厚度 混单
else{
else {
queryWrapperX
.likeIfPresent(FIELD_OG_MATERIAL, pageReqVO.getMaterial())
.likeIfPresent(FIELD_OG_BRAND, pageReqVO.getBrand())
@@ -840,7 +833,7 @@ public class PlateServiceImpl implements PlateService {
.inIfPresent(FIELD_OP_THICKNESS, thickness);
}
}else {
} else {
queryWrapperX
.inIfPresent(FIELD_OG_MATERIAL, material)
.inIfPresent(FIELD_OG_BRAND, brand)
@@ -852,5 +845,53 @@ public class PlateServiceImpl implements PlateService {
}
@Override
public PageResult<OrderBodyViewPlatePageRespVO> getBodyViewPlatesPage(OrderBodyViewPlatePageReqVO pageReqVO) {
PageDTO<PlateRespVO> page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
IPage<OrderBodyViewPlatesPageDO> pageRes = orderItemMapper.selectBodyViewPlatesPage(page, pageReqVO.getOrderId(), pageReqVO.getRoomId(), pageReqVO.getBodyId(), getUserOrganId(), false);
return new PageResult(BeanUtil.copyToList(pageRes.getRecords(), OrderBodyViewPlatePageRespVO.class), pageRes.getTotal());
}
@Override
public List<OrderBodyViewPlatePageRespVO> getBodyViewPlatesCadInfo(Long plateId) {
// 匹配板材
PlateDO plateDO = plateMapper.selectById(plateId);
if (ObjectUtil.isNull(plateDO)) {
throw new ServiceException(PLATE_NOT_EXISTS);
}
// 匹配orderItem
OrderItemDO orderItemDO = orderItemMapper.selectOne(new LambdaUpdateWrapper<OrderItemDO>()
.eq(OrderItemDO::getPlateId, plateId)
.eq(OrderItemDO::getOrderId, plateDO.getOrderId())
.eq(OrderItemDO::getOrganId, plateDO.getOrganId()));
if (ObjectUtil.isNull(orderItemDO)) {
throw new ServiceException(PLATE_NOT_EXISTS);
}
// 匹配柜体
OrderBodyDO orderBodyDO = orderBodyMapper.selectById(orderItemDO.getBodyId());
if (ObjectUtil.isNull(orderBodyDO)) {
throw new ServiceException(ORDER_BODY_NOT_EXISTS);
}
Long cadViewFileId = orderBodyDO.getCadViewFileId();
// 查询所有板件的视图所需信息
PageDTO<PlateRespVO> page = new PageDTO<>(1, PageParam.PAGE_SIZE_NONE);
IPage<OrderBodyViewPlatesPageDO> viewPlatesPage = orderItemMapper.selectBodyViewPlatesPage(page, orderItemDO.getOrderId(), orderItemDO.getRoomId(), orderItemDO.getBodyId(), orderItemDO.getOrganId(), true);
List<OrderBodyViewPlatesPageDO> records = viewPlatesPage.getRecords();
List<OrderBodyViewPlatePageRespVO> resultList = new ArrayList<>();
if (CollUtil.isNotEmpty(records)) {
resultList = records.stream().map(item -> {
OrderBodyViewPlatePageRespVO vo = new OrderBodyViewPlatePageRespVO();
BeanUtil.copyProperties(item, vo);
vo.setCadViewFileId(cadViewFileId);
return vo;
}).collect(Collectors.toList());
}
return resultList;
}
}
@@ -533,4 +533,21 @@
and plate_id !=0
</select>
<select id="selectBodyViewPlatesPage" resultType="com.cf.imes.module.executor.dal.dataobject.orderItem.OrderBodyViewPlatesPageDO">
SELECT p.id, p.name, p.width, p.height, p.thickness, p.cad_view_id, g.material, g.color
<if test="cadView">
, p.cad_plate_no as customNumber, p.seal_left, p.seal_down, p.seal_right, p.seal_up
</if>
FROM order_item i
LEFT JOIN `order_plate` p ON i.plate_id = p.id
LEFT JOIN `order_goods` g ON g.id = p.goods_id
WHERE i.order_id = #{orderId} AND i.organ_id = #{organId} AND p.deleted = false and i.plate_id != 0
<if test="roomId != null">
AND i.room_id = #{roomId}
</if>
<if test="bodyId != null">
AND i.body_id = #{bodyId}
</if>
</select>
</mapper>
@@ -18,6 +18,9 @@ public class WebCadDataReqVO {
@JsonProperty(value = "OrderNo")
private String orderNo;
@JsonProperty(value = "CadViewFileId")
private Long cadViewFileId;
@JsonProperty(value = "Materials")
private List<WebCadDataMaterialReqVO> Materials;
@@ -33,6 +36,4 @@ public class WebCadDataReqVO {
@JsonProperty(value = "Blocks")
private List<WebCadDataDoubleRoomTreeReqVO> blocks;
private String cadViewPath;
}
@@ -157,9 +157,4 @@ public class OrderDO extends BaseDO {
* 版本号:乐观锁用
*/
private int version;
/**
* cad图纸路径
*/
private String cadViewPath;
}
@@ -301,4 +301,9 @@ public class PlateDO extends BaseDO {
* cad图纸数据
*/
private String cadData;
/**
* cad自定义板编号
*/
private String cadPlateNo;
}
@@ -1,5 +1,6 @@
package com.cf.imes.module.plan.framework.rpc.config;
import com.cf.imes.module.infra.api.file.FileApi;
import com.cf.imes.module.system.api.customplateno.CustomPlateNoSeqApi;
import com.cf.imes.module.system.api.dict.DictDataApi;
import com.cf.imes.module.system.api.systemconfig.SystemConfigApi;
@@ -11,6 +12,6 @@ import org.springframework.context.annotation.Configuration;
* @author there
*/
@Configuration(proxyBeanMethods = false)
@EnableFeignClients(clients = {AdminUserApi.class, DictDataApi.class, SystemConfigApi.class, CustomPlateNoSeqApi.class,})
@EnableFeignClients(clients = {AdminUserApi.class, DictDataApi.class, SystemConfigApi.class, CustomPlateNoSeqApi.class, FileApi.class})
public class RpcConfiguration {
}
@@ -21,6 +21,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.infra.api.file.FileApi;
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;
@@ -118,6 +119,9 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
@Resource
private RabbitTemplate rabbitTemplate;
@Resource
private FileApi fileApi;
private static final String REDIS_UNIQUEKEY = "webcad";
@Resource
@@ -134,6 +138,8 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
Long taskId = null;
OrderDO orderDO = null;
JsonFactory factory = new JsonFactory();
Long cadViewFileId = null;
try (GZIPInputStream gzipInputStream = new GZIPInputStream(file.getInputStream());
JsonParser parser = factory.createParser(gzipInputStream)) {
factory.disable(JsonParser.Feature.AUTO_CLOSE_SOURCE);
@@ -165,6 +171,9 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
WebCadDataReqVO webCadDataReqVO = mapper.readValue(parser, WebCadDataReqVO.class);
WebCadOrderImportFactory webCadOrderImportFactory = new WebCadOrderImportFactory(organId, orderDO, snowFlakeGenerator, orderMapper, orderBodyMapper, plateMapper,
idWorker, orderInputProcessor, goodsMapper, rawGoodsMapper, customPlateNoGenerateService, systemConfigApi, webCadImportProperties.getCadImportPlateNumThreshold(), jdbcTemplate);
// cad图纸文件id
cadViewFileId = webCadDataReqVO.getCadViewFileId();
webCadOrderImportFactory.analyzeTempData(webCadDataReqVO);
} else {
sync = false;
@@ -190,11 +199,15 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
}
}
} catch (ServiceException se) {
// 删除cad图纸数据
removeCadFileWhenException(cadViewFileId);
// 移除临时文件
removeCacheFileWhenException(sync, taskId);
throw se;
} catch (Exception e) {
// 删除cad图纸数据
removeCadFileWhenException(cadViewFileId);
// 移除临时文件
removeCacheFileWhenException(sync, taskId);
@@ -333,4 +346,19 @@ public class WebCadOrderImportServiceImpl implements WebCadOrderImportService {
}
}
}
/**
* 删除cad图纸文件数据
*
* @param cadViewFileId
*/
private void removeCadFileWhenException(Long cadViewFileId) {
try {
if (ObjectUtil.isNotNull(cadViewFileId)) {
fileApi.deleteFileById(cadViewFileId);
}
} catch (IORuntimeException e) {
log.error("删除cad图纸数据文件失败: {}", cadViewFileId, e);
}
}
}
@@ -5,17 +5,16 @@ import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
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.infra.api.file.FileApi;
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;
import com.cf.imes.module.plan.dal.mysql.orderBody.OrderBodyMapper;
import com.cf.imes.module.plan.dal.mysql.orderGroup.OrderGroupMapper;
import com.cf.imes.module.plan.dal.mysql.orderImport.OrderImportTaskMapper;
import com.cf.imes.module.plan.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.plan.dal.mysql.rawgoods.RawGoodsMapper;
@@ -65,9 +64,6 @@ public class WebCadOrderImportConsumer {
@Resource
private PlateMapper plateMapper;
@Resource
private OrderGroupMapper orderGroupMapper;
@Resource
private SnowflakeIdWorker3rd idWorker;
@@ -107,6 +103,9 @@ public class WebCadOrderImportConsumer {
@Resource
private ChenfengCacheProperties chenfengCacheProperties;
@Resource
private FileApi fileApi;
@RabbitListener(queues = "#{@orderImportWebCadQueueName}")
@DS("imes_prod")
@Transactional(rollbackFor = Exception.class)
@@ -150,8 +149,9 @@ public class WebCadOrderImportConsumer {
log.info("====================【webcad异步拆单处理临时数据开始】====================");
WebCadOrderImportAsyncFactory webCadOrderImportAsyncFactory =
new WebCadOrderImportAsyncFactory(organId, orderMapper, snowFlakeGenerator, orderBodyMapper, plateMapper, orderGroupMapper, idWorker,
orderImportTaskMapper, orderInputProcessor, goodsMapper, rawGoodsMapper, customPlateNoGenerateService, systemConfigApi, orderImportTaskDO.getCreator(), cadImportPlateNumThreshold, jdbcTemplate);
new WebCadOrderImportAsyncFactory(organId, orderMapper, snowFlakeGenerator, orderBodyMapper, plateMapper, idWorker,
orderImportTaskMapper, orderInputProcessor, goodsMapper, rawGoodsMapper, customPlateNoGenerateService, systemConfigApi, orderImportTaskDO.getCreator(),
cadImportPlateNumThreshold, jdbcTemplate, fileApi);
webCadOrderImportAsyncFactory.analyzeTempData(taskId, webCadImportProperties.getTempFilePath());
log.info("====================【webcad异步拆单处理临时数据结束】====================");
@@ -1,6 +1,7 @@
package com.cf.imes.module.plan.service.orderImport.factory;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.NumberUtil;
@@ -23,6 +24,7 @@ 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.infra.api.file.FileApi;
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;
@@ -51,7 +53,6 @@ import com.cf.imes.module.plan.dal.elasticsearch.PointList;
import com.cf.imes.module.plan.dal.mysql.goods.GoodsMapper;
import com.cf.imes.module.plan.dal.mysql.order.OrderMapper;
import com.cf.imes.module.plan.dal.mysql.orderBody.OrderBodyMapper;
import com.cf.imes.module.plan.dal.mysql.orderGroup.OrderGroupMapper;
import com.cf.imes.module.plan.dal.mysql.orderImport.OrderImportTaskMapper;
import com.cf.imes.module.plan.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.plan.dal.mysql.rawgoods.RawGoodsMapper;
@@ -113,8 +114,6 @@ public class WebCadOrderImportAsyncFactory {
private PlateMapper plateMapper;
private OrderGroupMapper orderGroupMapper;
private SnowflakeIdWorker3rd idWorker;
private OrderImportTaskMapper orderImportTaskMapper;
@@ -131,6 +130,8 @@ public class WebCadOrderImportAsyncFactory {
private JdbcTemplate jdbcTemplate;
private FileApi fileApi;
private Long organId;
// 批次id
@@ -202,15 +203,14 @@ public class WebCadOrderImportAsyncFactory {
private String tempFilePath;
// cad图纸路径
private String cadViewPath;
// cad图纸文件id
private Long cadViewFileId;
public WebCadOrderImportAsyncFactory(Long organId,
OrderMapper orderMapper,
SnowFlakeGenerator snowFlakeGenerator,
OrderBodyMapper orderBodyMapper,
PlateMapper plateMapper,
OrderGroupMapper orderGroupMapper,
SnowflakeIdWorker3rd idWorker,
OrderImportTaskMapper orderImportTaskMapper,
OrderInputProcessor orderInputProcessor,
@@ -220,13 +220,13 @@ public class WebCadOrderImportAsyncFactory {
SystemConfigApi systemConfigApi,
String operatorName,
int cadImportPlateNumThreshold,
JdbcTemplate jdbcTemplate) {
JdbcTemplate jdbcTemplate,
FileApi fileApi) {
this.organId = organId;
this.orderMapper = orderMapper;
this.snowFlakeGenerator = snowFlakeGenerator;
this.orderBodyMapper = orderBodyMapper;
this.plateMapper = plateMapper;
this.orderGroupMapper = orderGroupMapper;
this.idWorker = idWorker;
this.orderImportTaskMapper = orderImportTaskMapper;
this.orderInputProcessor = orderInputProcessor;
@@ -240,6 +240,7 @@ public class WebCadOrderImportAsyncFactory {
sealEdgeConfigList = new ArrayList<>();
this.cadImportPlateNumThreshold = cadImportPlateNumThreshold;
this.jdbcTemplate = jdbcTemplate;
this.fileApi = fileApi;
}
public void analyzeTempData(Long taskId, String webcadJsonCachePath) throws FileNotFoundException {
@@ -254,6 +255,9 @@ public class WebCadOrderImportAsyncFactory {
performPostProcessing(taskId);
} catch (Exception e) {
// 删除cad图纸数据
removeCadFileWhenException(cadViewFileId);
handleProcessingException(e);
throw e;
} finally {
@@ -272,9 +276,6 @@ public class WebCadOrderImportAsyncFactory {
analyzeOrder(reader.readString());
log.debug("====================【cad拆单解析生产单结束】====================");
break;
case "cadViewPath":
cadViewPath = reader.readString();
break;
case "Materials":
log.debug("====================【cad拆单解析板材开始】====================");
analyzeMaterials(reader);
@@ -296,6 +297,9 @@ public class WebCadOrderImportAsyncFactory {
case "Parts":
processParts(reader);
break;
case "CadViewFileId":
cadViewFileId = reader.readLong();
break;
default:
// 跳过未知字段
reader.readObject();
@@ -434,7 +438,7 @@ public class WebCadOrderImportAsyncFactory {
.eq("deleted", false));
if (CollUtil.isNotEmpty(orderPlateSumResult)) {
Map<String, Object> resultMap = orderPlateSumResult.get(0);
if(ObjectUtil.isNotNull(resultMap)) {
if (ObjectUtil.isNotNull(resultMap)) {
currentPlateArea = (BigDecimal) resultMap.get("area");
}
}
@@ -623,7 +627,7 @@ public class WebCadOrderImportAsyncFactory {
reader.startObject();
String roomName = null;
Long roomId = null;
while (reader.hasNext()) {
String key = reader.readString();
if ("name".equals(key)) {
@@ -646,7 +650,7 @@ public class WebCadOrderImportAsyncFactory {
if (existRoomId != null) {
return existRoomId;
}
Long roomId = queryExistingRoomId(roomName);
if (roomId == null) {
roomId = (Long) snowFlakeGenerator.nextId(null);
@@ -660,15 +664,15 @@ public class WebCadOrderImportAsyncFactory {
*/
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))
.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;
}
@@ -1390,11 +1394,10 @@ public class WebCadOrderImportAsyncFactory {
// 配置不为空时,生成自定义板编号
if (ObjectUtil.isNotNull(plateNoGenerateConfigVO)) {
customPlateNoGenerateService.generateCustomPlateNo(orderId, plateDO, plateNoGenerateConfigVO, isFirstPlate);
} else {
// 配置为空的时候,使用cad的板编号
if (ObjectUtil.isNotNull(cadCustBlockNo)) {
plateDO.setCustomPlateNo(String.valueOf(cadCustBlockNo));
}
}
// cad的板编号
if (ObjectUtil.isNotNull(cadCustBlockNo)) {
plateDO.setCadPlateNo(String.valueOf(cadCustBlockNo));
}
}
@@ -1419,7 +1422,7 @@ public class WebCadOrderImportAsyncFactory {
reader.startObject();
String roomName = null;
Long roomId = null;
while (reader.hasNext()) {
String key = reader.readString();
if ("name".equals(key)) {
@@ -1849,7 +1852,7 @@ public class WebCadOrderImportAsyncFactory {
private void orderPlateBatchInsertWithinThreshold(List<PlateDO> list, boolean isLast) {
// 达到批量的阈值就做一次插入
if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) {
String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater, cad_view_id, cad_data) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater, cad_view_id, cad_data, cad_plate_no) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int index) throws SQLException {
@@ -1922,8 +1925,8 @@ public class WebCadOrderImportAsyncFactory {
}
}
private void clearPlate(){
plateDOS = ListUtils.newArrayListWithExpectedSize(BATCH_THRESHOLD_NUMBER);
private void clearPlate() {
plateDOS = ListUtils.newArrayListWithExpectedSize(BATCH_THRESHOLD_NUMBER);
}
private void orderItemBatchInsertWithinThreshold(List<OrderItemDO> list, boolean isLast) {
@@ -1966,8 +1969,8 @@ public class WebCadOrderImportAsyncFactory {
}
}
private void clearItem(){
orderItemDOS = ListUtils.newArrayListWithExpectedSize(BATCH_THRESHOLD_NUMBER);
private void clearItem() {
orderItemDOS = ListUtils.newArrayListWithExpectedSize(BATCH_THRESHOLD_NUMBER);
}
private void orderPartBatchInsertWithinThreshold(List<OrderPartsDO> list, boolean isLast) {
@@ -2021,8 +2024,8 @@ public class WebCadOrderImportAsyncFactory {
}
}
private void clearPart(){
orderPartsDOS = ListUtils.newArrayListWithExpectedSize(BATCH_THRESHOLD_NUMBER);
private void clearPart() {
orderPartsDOS = ListUtils.newArrayListWithExpectedSize(BATCH_THRESHOLD_NUMBER);
}
/**
@@ -2215,7 +2218,6 @@ public class WebCadOrderImportAsyncFactory {
.eq(OrderDO::getVersion, version)
.set(OrderDO::getPlateNum, currentPlateNum)
.set(OrderDO::getArea, currentPlateArea)
.set(OrderDO::getCadViewPath, cadViewPath)
.set(OrderDO::getVersion, version + 1));
if (updated == 0) {
throw new ServiceException(ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORDER_UPDATE_CONCURRENCY_ERROR, orderId);
@@ -2255,4 +2257,19 @@ public class WebCadOrderImportAsyncFactory {
}
}
}
/**
* 删除cad图纸文件数据
*
* @param cadViewFileId
*/
private void removeCadFileWhenException(Long cadViewFileId) {
try {
if (ObjectUtil.isNotNull(cadViewFileId)) {
fileApi.deleteFileById(cadViewFileId);
}
} catch (IORuntimeException e) {
log.error("删除cad图纸数据文件失败: {}", cadViewFileId, e);
}
}
}
@@ -189,6 +189,9 @@ public class WebCadOrderImportFactory {
// 板件数量是否已达到阈值
private boolean plateNumReachThreshold = false;
// cad图纸文件id
private Long cadViewFileId;
public WebCadOrderImportFactory(Long organId,
OrderDO orderDO,
SnowFlakeGenerator snowFlakeGenerator,
@@ -258,7 +261,9 @@ public class WebCadOrderImportFactory {
orderItemBatchInsertWithinThreshold(orderItemDOS, true);
log.debug("====================【cad拆单全局保存开始】====================");
// 保存数据柜体、加工组
cadViewFileId = webCadDataReqVO.getCadViewFileId();
saveData();
log.debug("====================【cad拆单全局保存结束】====================");
@@ -266,7 +271,7 @@ public class WebCadOrderImportFactory {
insertOrUpdatePlateNumGoods();
// 更新生产单板件数量
updateOrderPlateNum(webCadDataReqVO.getCadViewPath());
updateOrderPlateNum();
// 所有自定义板编号生成完成后更新配置到生产单
customPlateNoGenerateService.updateCustomPlateNoGenerateConfig(plateNoGenerateConfigVO, orderDO);
@@ -1158,11 +1163,10 @@ public class WebCadOrderImportFactory {
// 配置不为空时,生成自定义板编号
if (ObjectUtil.isNotNull(plateNoGenerateConfigVO)) {
customPlateNoGenerateService.generateCustomPlateNo(orderId, plateDO, plateNoGenerateConfigVO, isFirstPlate);
} else {
// 配置为空的时候,使用cad的板编号
if (ObjectUtil.isNotNull(cadCustBlockNo)) {
plateDO.setCustomPlateNo(String.valueOf(cadCustBlockNo));
}
}
// cad的板编号
if (ObjectUtil.isNotNull(cadCustBlockNo)) {
plateDO.setCadPlateNo(String.valueOf(cadCustBlockNo));
}
}
@@ -1700,7 +1704,7 @@ public class WebCadOrderImportFactory {
private void orderPlateBatchInsertWithinThreshold(List<PlateDO> list, boolean isLast) {
// 达到批量的阈值就做一次插入
if (CollUtil.isNotEmpty(list) && (list.size() >= BATCH_THRESHOLD_NUMBER || isLast)) {
String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater, cad_view_id, cad_data) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
String sql = "INSERT INTO order_plate (id,organ_id,order_id,name,plate_no,type,goods_id,width,height,thickness,split_width,split_height,split_thickness,seal_left,seal_right,seal_up,seal_down,area,texture,hole_face,hole_arrange,unregular_point_count,front_hole_count,back_hole_count,side_hole_count,front_model_count,back_model_count,is_door,open_door_type,offset_x,offset_y,is_arc_across,module_type_id,is_special_shaped,is_sculpt,is_side_sculpt,is_2v,is_side_2v,is_row_hole,is_optimized,is_cutted,filter_type,remark,is_cancel,deleted,custom_plate_no,create_time,update_time,creator,updater, cad_view_id, cad_data, cad_plate_no) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int index) throws SQLException {
@@ -1757,6 +1761,7 @@ public class WebCadOrderImportFactory {
ps.setString(50, item.getUpdater());
ps.setInt(51, item.getCadViewId());
ps.setString(52, item.getCadData());
ps.setString(53, item.getCadPlateNo());
}
@Override
@@ -1914,7 +1919,7 @@ public class WebCadOrderImportFactory {
*/
private void saveBody(List<List<OrderBodyDO>> bodyList) {
for (List<OrderBodyDO> bodys : bodyList) {
String sql = "INSERT INTO order_body (id, organ_id, order_id, room_id, room_name, name, width, height, depth, multi_num, plate_num, unregular_num, filename, remark, deleted,create_time,update_time,creator,updater) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
String sql = "INSERT INTO order_body (id, organ_id, order_id, room_id, room_name, name, width, height, depth, multi_num, plate_num, unregular_num, filename, remark, deleted,create_time,update_time,creator,updater, cad_view_file_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int index) throws SQLException {
@@ -1938,6 +1943,7 @@ public class WebCadOrderImportFactory {
ps.setTimestamp(17, Timestamp.valueOf(orderBodyDO.getUpdateTime()));
ps.setString(18, orderBodyDO.getCreator());
ps.setString(19, orderBodyDO.getUpdater());
ps.setLong(20, cadViewFileId);
}
@Override
@@ -2016,7 +2022,7 @@ public class WebCadOrderImportFactory {
/**
* 更新生产单的板件总数
*/
private void updateOrderPlateNum(String cadViewPath) {
private void updateOrderPlateNum() {
int version = orderDO.getVersion();
Long orderId = orderDO.getId();
int updated = orderMapper.update(new LambdaUpdateWrapper<OrderDO>()
@@ -2025,7 +2031,6 @@ public class WebCadOrderImportFactory {
.eq(OrderDO::getVersion, version)
.set(OrderDO::getPlateNum, currentPlateNum)
.set(OrderDO::getArea, currentPlateArea)
.set(OrderDO::getCadViewPath, cadViewPath)
.set(OrderDO::getVersion, version + 1));
if (updated == 0) {
throw new ServiceException(ErrorCodeConstants.WEBCAD_ORDER_IMPORT_ORDER_UPDATE_CONCURRENCY_ERROR, orderId);