diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java index 13f6807a9..9fdf20c8b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java @@ -24,6 +24,7 @@ public class ErrorCodeConstants { public static final ErrorCode CREATE_PLAN_GOODS_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_003_107_011, "创建排单失败:材质【{}】板件数量已发生改变,请刷新后重新创建单排"); public static final ErrorCode ORDER_PLATE_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_003_107_012, "更新生产单状态失败:生产单号【{}】板件数量已发生改变,请刷新后重新操作"); public static final ErrorCode GOODS_PLATE_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_003_107_013, "更新材质状态失败:材质【{}】板件数量已发生改变,请刷新后重新操作"); + public static final ErrorCode BODY_PLATE_UPDATE_CONCURRENCY_ERROR = new ErrorCode(1_003_107_014, "更新柜体状态失败:柜体【{}】板件数量已发生改变,请刷新后重新操作"); // ========== 生产单商品 TODO 补充编号 ========== @@ -186,4 +187,7 @@ public class ErrorCodeConstants { //=========== 部件管理 1-003-010-000 ============ public static final ErrorCode ORDER_COMPONENT_NOT_EXIST = new ErrorCode(1_003_010_000, "order.component.not.exist"); + public static final ErrorCode ORDER_COMPONENT_DELETE_PLATE_IN_PLAN = new ErrorCode(1_003_010_001, "order.component.delete.plate.in.plan"); + public static final ErrorCode ORDER_COMPONENT_RESTORE_PARENT_IS_DELETED = new ErrorCode(1_003_010_002, "order.component.restore.parent.is.deleted"); + public static final ErrorCode ORDER_COMPONENT_NO_NEED_TO_RESTORE = new ErrorCode(1_003_010_003, "order.component.no.need.to.restore"); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderModuleDetailRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderModuleDetailRespVO.java index 892e1ba0c..191af47ec 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderModuleDetailRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderModuleDetailRespVO.java @@ -1,5 +1,6 @@ package com.cf.imes.module.executor.controller.admin.order.vo.order; +import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderComponentRespVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -25,4 +26,7 @@ public class OrderModuleDetailRespVO { @Schema(description = "组件列表") private List component; + + @Schema(description = "部件列表") + private List section; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/OrderComponentController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/OrderComponentController.java index 5ec44a14c..911fcf070 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/OrderComponentController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/OrderComponentController.java @@ -12,7 +12,10 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; import org.springframework.validation.annotation.Validated; +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.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -58,4 +61,18 @@ public class OrderComponentController { public CommonResult> getComponentViewPlates(@Valid @RequestBody OrderDetailComponentPageReqVO pageReqVO) { return success(orderComponentService.getViewComponentPlatesCadInfo(pageReqVO)); } + + @DeleteMapping("/{orderId}/{id}") + @Operation(summary = "删除订单部件") + public CommonResult deleteOrderComponent(@PathVariable("orderId") Long orderId, @PathVariable("id") Long id) { + orderComponentService.deleteOrderComponent(orderId, id); + return success(true); + } + + @PutMapping("/{orderId}/{id}") + @Operation(summary = "恢复订单部件") + public CommonResult restoreOrderComponent(@PathVariable("orderId") Long orderId, @PathVariable("id") Long id) { + orderComponentService.restoreOrderComponent(orderId, id); + return success(true); + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/OrderDetailComponentListReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/OrderDetailComponentListReqVO.java index 15a542b2e..4fb669075 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/OrderDetailComponentListReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/ordercomponent/vo/OrderDetailComponentListReqVO.java @@ -40,9 +40,6 @@ public class OrderDetailComponentListReqVO { @Size(max = 200, message = "{order.detail.component.list.query.componentIds.max}") private Set componentIds; - @Schema(description = "部件编号", example = "1") - private Long componentId; - @Schema(description = "部件名称", example = "部件") private String name; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/OrderGoodsPlateNumAndAreaDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/OrderGoodsPlateNumAndAreaDO.java new file mode 100644 index 000000000..dfeafeaaf --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/goods/OrderGoodsPlateNumAndAreaDO.java @@ -0,0 +1,33 @@ +package com.cf.imes.module.executor.dal.dataobject.goods; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Gqr + * @since 2025/6/26 16:30 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class OrderGoodsPlateNumAndAreaDO { + /** + * 订单商品id + */ + private Long orderGoodsId; + + /** + * 板件数量 + */ + private Integer num; + + /** + * 板件面积 + */ + private BigDecimal area; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderPlateNumAndAreaDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderPlateNumAndAreaDO.java new file mode 100644 index 000000000..3d8fb8457 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/order/OrderPlateNumAndAreaDO.java @@ -0,0 +1,28 @@ +package com.cf.imes.module.executor.dal.dataobject.order; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Gqr + * @since 2025/6/26 16:30 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class OrderPlateNumAndAreaDO { + /** + * 板件数量 + */ + private Integer num; + + /** + * 板件面积 + */ + private BigDecimal area; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderBody/OrderBodyDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderBody/OrderBodyDO.java index 8f3df732b..78c27cc37 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderBody/OrderBodyDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderBody/OrderBodyDO.java @@ -86,4 +86,9 @@ public class OrderBodyDO extends BaseDO { * cad图纸数据文件id */ private Long cadViewFileId; + + /** + * 版本号:乐观锁用 + */ + private int version; } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderBody/OrderBodyPlateNumAndAreaDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderBody/OrderBodyPlateNumAndAreaDO.java new file mode 100644 index 000000000..baa4935cb --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderBody/OrderBodyPlateNumAndAreaDO.java @@ -0,0 +1,33 @@ +package com.cf.imes.module.executor.dal.dataobject.orderBody; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Gqr + * @since 2025/6/26 16:30 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class OrderBodyPlateNumAndAreaDO { + /** + * 柜体id + */ + private Long orderBodyId; + + /** + * 板件数量 + */ + private Integer num; + + /** + * 板件面积 + */ + private BigDecimal area; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/ordecomponent/OrderComponentDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/ordercomponent/OrderComponentDO.java similarity index 96% rename from cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/ordecomponent/OrderComponentDO.java rename to cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/ordercomponent/OrderComponentDO.java index 55c0fdac5..dd3b1d124 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/ordecomponent/OrderComponentDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/ordercomponent/OrderComponentDO.java @@ -1,4 +1,4 @@ -package com.cf.imes.module.executor.dal.dataobject.ordecomponent; +package com.cf.imes.module.executor.dal.dataobject.ordercomponent; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java index 271515574..16bbfff9c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java @@ -16,11 +16,13 @@ import com.cf.imes.module.executor.controller.admin.plan.vo.GoodsReqVO; import com.cf.imes.module.executor.controller.admin.plan.vo.PlateInfoVO; import com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList; import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; +import com.cf.imes.module.executor.dal.dataobject.goods.OrderGoodsPlateNumAndAreaDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.Collection; import java.util.List; +import java.util.Set; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; @@ -200,4 +202,12 @@ public interface GoodsMapper extends BaseMapperX { * @return */ OrderPlanPlateNumAndAreaRespVO selectPlannedPlateNumAndArea(@Param("orderGoodsId") Long orderGoodsId); + + /** + * 查询订单材质下的板件数量和面积 + * + * @param orderGoodsIds + * @return + */ + List selectPlateNumAndArea(@Param("orderGoodsIds") Set orderGoodsIds); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java index 76757537a..f51465632 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java @@ -23,6 +23,7 @@ import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlanPlat import com.cf.imes.module.executor.controller.admin.plan.bo.OrderIds; import com.cf.imes.module.executor.controller.admin.plan.vo.*; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; +import com.cf.imes.module.executor.dal.dataobject.order.OrderPlateNumAndAreaDO; import com.cf.imes.module.executor.enums.OrderDeletedEnum; import com.cf.imes.module.executor.enums.OrderStatusEnum; import org.apache.ibatis.annotations.Mapper; @@ -100,7 +101,7 @@ public interface OrderMapper extends BaseMapperX { } - IPage selectOrderPage(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + IPage selectOrderPage(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); Map selectDynamicSqlString(@Param("sqlStr") String sqlStr); @@ -224,7 +225,7 @@ public interface OrderMapper extends BaseMapperX { default List selectOrderListByUpdateTime() { return selectList(new LambdaQueryWrapper() .eq(OrderDO::getDeleted, OrderDeletedEnum.DELETED.getStatus()) - .lt(OrderDO::getUpdateTime, LocalDateTime.now().minusDays(30))).stream().map(OrderDO::getId).collect(Collectors.toList()); + .lt(OrderDO::getUpdateTime, LocalDateTime.now().minusDays(30))).stream().map(OrderDO::getId).toList(); } default int updateOrderListStatus(List orderIds, Integer status,Long organId) { @@ -256,13 +257,13 @@ public interface OrderMapper extends BaseMapperX { List selectPlanOrderList(@Param("planIds") List planIds, @Param("organId") Long organId); - IPage selectFilterOrderPagePlate(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + IPage selectFilterOrderPagePlate(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); List selectFilterOrderPlateList(@Param(Constants.WRAPPER) QueryWrapperX queryWrapperX); List selectFilterGoodsPlateList(@Param(Constants.WRAPPER) QueryWrapperX queryWrapperX); - IPage selectFilterGoodsPlatePage(@Param("page") IPage page,@Param(Constants.WRAPPER) QueryWrapperX queryWrapperX); + IPage selectFilterGoodsPlatePage(@Param("page") IPage page,@Param(Constants.WRAPPER) QueryWrapperX queryWrapperX); List selectNoPlanOrderPlateCount(@Param(Constants.WRAPPER) Wrapper wrapper,@Param("organId") Long organId); @@ -299,7 +300,7 @@ public interface OrderMapper extends BaseMapperX { - IPage selectOrderIdList(@Param("page") IPage page, @Param("pageReqVO") PackPageReqVO pageReqVO, @Param("organId") Long organId); + IPage selectOrderIdList(@Param("page") IPage page, @Param("pageReqVO") PackPageReqVO pageReqVO, @Param("organId") Long organId); List selectLabelOrderData(@Param("orderIds") List orderIds,@Param("organId") Long organId); @@ -311,4 +312,12 @@ public interface OrderMapper extends BaseMapperX { * @return */ OrderPlanPlateNumAndAreaRespVO selectPlannedPlateNumAndArea(@Param("orderId") Long orderId); + + /** + * 查询订单下板件数量和面积 + * + * @param orderId + * @return + */ + OrderPlateNumAndAreaDO selectPlateNumAndArea(@Param("orderId") Long orderId); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java index 242ed7ae0..9d7084ae8 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java @@ -7,6 +7,7 @@ import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderModuleRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderRoomBodyRespVO; import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO; +import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyPlateNumAndAreaDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -196,5 +197,11 @@ public interface OrderBodyMapper extends BaseMapperX { .select(OrderBodyDO::getId,OrderBodyDO::getName,OrderBodyDO::getRoomName)); } - + /** + * 查询柜体下的板件数量和面积 + * + * @param orderBodyIds + * @return + */ + List selectPlateNumAndArea(@Param("orderBodyIds") Set orderBodyIds); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/ordercomponent/OrderComponentMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/ordercomponent/OrderComponentMapper.java index 21832c730..0f7fb3584 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/ordercomponent/OrderComponentMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/ordercomponent/OrderComponentMapper.java @@ -2,7 +2,7 @@ package com.cf.imes.module.executor.dal.mysql.ordercomponent; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentListReqVO; -import com.cf.imes.module.executor.dal.dataobject.ordecomponent.OrderComponentDO; +import com.cf.imes.module.executor.dal.dataobject.ordercomponent.OrderComponentDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -28,8 +28,44 @@ public interface OrderComponentMapper extends BaseMapperX { /** * 查询id列表中每个节点上同一棵树的所有父级 + * * @param ids * @return */ List getTopComponentListIn(@Param("ids") List ids); + + /** + * 查询订单topid下的所有大于level层级的部件列表 + * @param orderId + * @param topId + * @param level + * @return + */ + List getComponentListOnTopLevel(@Param("orderId") Long orderId, + @Param("topId") Long topId, + @Param("level") int level, + @Param("deleted") boolean deleted); + + /** + * 查询是否有部件板件在排单中 + * + * @param componentIds + * @return + */ + boolean selectOrderComponentPlateInPlan(@Param("componentIds") List componentIds); + + /** + * 根据id查询,忽略逻辑删除 + * + * @param id + * @return + */ + OrderComponentDO selectByIdIgnoreDeleted(@Param("id") Long id); + + /** + * 恢复部件 + * + * @param componentIds + */ + void restoreOrderComponents(@Param("orderId") Long orderId, @Param("componentIds") List componentIds); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java index eb8adc978..9a546d4db 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java @@ -1,9 +1,7 @@ package com.cf.imes.module.executor.dal.mysql.plate; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Constants; import com.cf.imes.framework.common.enums.OrderPlateCutStatusEnum; import com.cf.imes.framework.common.enums.OrderPlateTypeEnum; import com.cf.imes.framework.common.pojo.PageResult; @@ -15,9 +13,7 @@ import com.cf.imes.module.executor.controller.admin.manage.process.vo.PlateDetai import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.PackageDetailsRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.LabelOrderPlateData; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.NotPlanOrderPlateRespVO; import com.cf.imes.module.executor.controller.admin.plan.vo.PlateDetailRespVO; -import com.cf.imes.module.executor.controller.admin.plan.vo.PlatePage; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateGoodsIdVO; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateGoodsRespVO; import com.cf.imes.module.executor.controller.admin.plate.vo.PlatePageReqVO; @@ -156,10 +152,6 @@ public interface PlateMapper extends BaseMapperX { -// List selectPlateArea(@Param("orderIdsList") List orderIdsList,@Param("organId") Long organId); - - - default List selectPlateByPlateNo(List orderIdList,List plateNo, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(PlateDO::getOrganId,organId) @@ -304,8 +296,34 @@ public interface PlateMapper extends BaseMapperX { List selectOrderPackPlateList(@Param("orderIds") List orderIds, @Param("organId") Long organId); - IPage selectPackPlateList(@Param("page") IPage page, @Param("packageId") Long packageId, @Param("organId") Long organId); + IPage selectPackPlateList(@Param("page") IPage page, @Param("packageId") Long packageId, @Param("organId") Long organId); List selectLabelOrderPlateDataByOrderId(@Param("orderId") Long orderId,@Param("organId") Long organId); + /** + * 更新订单部件板件 + * + * @param orderId + * @param componentIds + * @param deleted true:删除,false恢复 + * @return + */ + int updateOrderComponentPlate(@Param("orderId") Long orderId, @Param("componentIds") List componentIds, @Param("deleted") boolean deleted); + + /** + * 查询部件下板件用到的order_goods id + * + * @param componentIds + * @return + */ + List selectOrderComponentGoodsIds(@Param("orderId") Long orderId, @Param("componentIds") List componentIds, @Param("deleted") boolean deleted); + + /** + * 查询部件下板件用到的柜体id + * + * @param orderId + * @param componentIds + * @return + */ + List selectOrderComponentBodyIds(@Param("orderId") Long orderId, @Param("componentIds") List componentIds, @Param("deleted") boolean deleted); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java index d978a1cdc..005d69e48 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java @@ -30,6 +30,8 @@ import com.cf.imes.module.executor.controller.admin.order.vo.type.PlateByRoomBod import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsPrintRespVO; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRemark; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO; +import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderComponentRespVO; +import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentListReqVO; import com.cf.imes.module.executor.controller.admin.plan.vo.OrderRespVOCopy; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateGoodsRespVO; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateRespVO; @@ -289,8 +291,11 @@ public class OrderServiceImpl implements OrderService { types.add(CategoryEnum.EDGING.getValue()); List orderItemDOS = orderItemMapper.selectPartsByOrderId(orderId, getUserOrganId(), deleted, types); - // 板材 - List orderGoodsRespVOS = orderItemMapper.selectGoodsByOrderId(orderId, getUserOrganId(), deleted); + // 部件 + OrderDetailComponentListReqVO componentListReqVO = new OrderDetailComponentListReqVO(); + componentListReqVO.setOrderId(orderId); + componentListReqVO.setDeleted(deleted == 1 ? true : false); + List orderComponentList = orderComponentService.getOrderComponentList(componentListReqVO); // 组件 types.clear(); @@ -300,8 +305,8 @@ public class OrderServiceImpl implements OrderService { OrderModuleDetailRespVO orderModuleDetailRespVO = new OrderModuleDetailRespVO(); orderModuleDetailRespVO.setModule(orderModuleRespVOList); orderModuleDetailRespVO.setParts(orderItemDOS); - orderModuleDetailRespVO.setGoods(orderGoodsRespVOS); orderModuleDetailRespVO.setComponent(orderComponentRespVOS); + orderModuleDetailRespVO.setSection(orderComponentList); return orderModuleDetailRespVO; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/ordercomponent/OrderComponentService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/ordercomponent/OrderComponentService.java index d4dc6dfcb..72da7285d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/ordercomponent/OrderComponentService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/ordercomponent/OrderComponentService.java @@ -44,4 +44,19 @@ public interface OrderComponentService { * @return */ List getViewComponentPlatesCadInfo(OrderDetailComponentPageReqVO reqVO); + + /** + * 删除部件 + * + * @param id + */ + void deleteOrderComponent(Long orderId, Long id); + + /** + * 恢复部件 + * + * @param orderId + * @param id + */ + void restoreOrderComponent(Long orderId, Long id); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/ordercomponent/OrderComponentServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/ordercomponent/OrderComponentServiceImpl.java index ec8bfdce4..f22daaf29 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/ordercomponent/OrderComponentServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/ordercomponent/OrderComponentServiceImpl.java @@ -3,27 +3,45 @@ package com.cf.imes.module.executor.service.ordercomponent; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; 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.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderComponentRespVO; import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentListReqVO; import com.cf.imes.module.executor.controller.admin.ordercomponent.vo.OrderDetailComponentPageReqVO; import com.cf.imes.module.executor.controller.admin.plate.vo.OrderViewPlatePageRespVO; -import com.cf.imes.module.executor.dal.dataobject.ordecomponent.OrderComponentDO; +import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; +import com.cf.imes.module.executor.dal.dataobject.goods.OrderGoodsPlateNumAndAreaDO; +import com.cf.imes.module.executor.dal.dataobject.ordercomponent.OrderComponentDO; +import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; +import com.cf.imes.module.executor.dal.dataobject.order.OrderPlateNumAndAreaDO; +import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO; +import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyPlateNumAndAreaDO; import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderBodyViewPlatesPageDO; +import com.cf.imes.module.executor.dal.mysql.goods.GoodsMapper; +import com.cf.imes.module.executor.dal.mysql.order.OrderMapper; +import com.cf.imes.module.executor.dal.mysql.orderBody.OrderBodyMapper; import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper; import com.cf.imes.module.executor.dal.mysql.ordercomponent.OrderComponentMapper; +import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; +import com.cf.imes.module.executor.enums.ErrorCodeConstants; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.Deque; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -32,7 +50,11 @@ import java.util.function.Function; import java.util.stream.Collectors; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_COMPONENT_DELETE_PLATE_IN_PLAN; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_COMPONENT_NOT_EXIST; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_COMPONENT_NO_NEED_TO_RESTORE; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_COMPONENT_RESTORE_PARENT_IS_DELETED; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_NOT_EXISTS; /** * 订单部件服务实现类 ServiceImpl @@ -49,6 +71,18 @@ public class OrderComponentServiceImpl implements OrderComponentService { @Resource private OrderItemMapper orderItemMapper; + @Resource + private OrderMapper orderMapper; + + @Resource + private PlateMapper plateMapper; + + @Resource + private GoodsMapper goodsMapper; + + @Resource + private OrderBodyMapper orderBodyMapper; + @Override public List getOrderComponentList(OrderDetailComponentListReqVO reqVO) { List resultList = new ArrayList<>(); @@ -87,19 +121,21 @@ public class OrderComponentServiceImpl implements OrderComponentService { @Override public List getComponentListOnTopId(OrderDetailComponentListReqVO reqVO) { - Long componentId = reqVO.getComponentId(); + Set componentIds = reqVO.getComponentIds(); Long orderId = reqVO.getOrderId(); // 1、查询部件 - OrderComponentDO componentDO = orderComponentMapper.selectById(componentId); - if (ObjectUtil.isNull(componentDO)) { + List componentDOS = orderComponentMapper.selectByIds(componentIds); + if (CollUtil.isEmpty(componentDOS) || componentDOS.size() != componentIds.size()) { throw new ServiceException(ORDER_COMPONENT_NOT_EXIST); } + List topIds = componentDOS.stream() + .map(OrderComponentDO::getTopId) + .toList(); // 2、根据部件的topid查询树上所有节点 List topComponentList = orderComponentMapper.selectList(new LambdaQueryWrapperX() - .eq(OrderComponentDO::getTopId, componentDO.getTopId()) - .eq(OrderComponentDO::getOrganId, componentDO.getOrganId()) + .in(OrderComponentDO::getTopId, topIds) .eq(OrderComponentDO::getOrderId, orderId) .eqIfPresent(OrderComponentDO::getDeleted, reqVO.isDeleted()) .likeIfPresent(OrderComponentDO::getName, reqVO.getName()) @@ -120,7 +156,7 @@ public class OrderComponentServiceImpl implements OrderComponentService { throw new ServiceException(ORDER_COMPONENT_NOT_EXIST); } - if(CollUtil.isEmpty(componentIds)) { + if (CollUtil.isEmpty(componentIds)) { // 2、把下级部件id作为查询条件 List orderComponentDOS = orderComponentMapper.selectList(new LambdaQueryWrapperX() .eq(OrderComponentDO::getTopId, componentDO.getTopId()) @@ -128,7 +164,7 @@ public class OrderComponentServiceImpl implements OrderComponentService { .eq(OrderComponentDO::getOrderId, orderId) .eqIfPresent(OrderComponentDO::getDeleted, pageReqVO.isDeleted()) .select(OrderComponentDO::getId)); - if(CollUtil.isNotEmpty(orderComponentDOS)) { + if (CollUtil.isNotEmpty(orderComponentDOS)) { componentIds = orderComponentDOS.stream().map(OrderComponentDO::getId).collect(Collectors.toSet()); } else { return new PageResult<>(); @@ -141,7 +177,7 @@ public class OrderComponentServiceImpl implements OrderComponentService { // 分页查询板件 PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); IPage pageRes = orderItemMapper.selectBodyViewPlatesPage(page, orderId, null, - null, null, getUserOrganId(), componentIds, false); + null, null, getUserOrganId(), componentIds, false); return new PageResult<>(BeanUtil.copyToList(pageRes.getRecords(), OrderViewPlatePageRespVO.class), pageRes.getTotal()); } @@ -158,7 +194,7 @@ public class OrderComponentServiceImpl implements OrderComponentService { } Long cadViewFileId = componentDO.getCadViewFileId(); - if(CollUtil.isEmpty(componentIds)) { + if (CollUtil.isEmpty(componentIds)) { // 2、把下级部件id作为查询条件 List orderComponentDOS = orderComponentMapper.selectList(new LambdaQueryWrapperX() .eq(OrderComponentDO::getTopId, componentDO.getTopId()) @@ -166,7 +202,7 @@ public class OrderComponentServiceImpl implements OrderComponentService { .eq(OrderComponentDO::getOrderId, orderId) .eqIfPresent(OrderComponentDO::getDeleted, pageReqVO.isDeleted()) .select(OrderComponentDO::getId)); - if(CollUtil.isNotEmpty(orderComponentDOS)) { + if (CollUtil.isNotEmpty(orderComponentDOS)) { componentIds = orderComponentDOS.stream().map(OrderComponentDO::getId).collect(Collectors.toSet()); } else { return Collections.emptyList(); @@ -194,4 +230,293 @@ public class OrderComponentServiceImpl implements OrderComponentService { } return resultList; } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteOrderComponent(Long orderId, Long id) { + // 校验自身 + OrderDO orderDO = orderMapper.selectById(orderId); + AssertUtils.notEmpty(orderDO, ORDER_NOT_EXISTS); + + OrderComponentDO componentDO = orderComponentMapper.selectById(id); + AssertUtils.notEmpty(componentDO, ORDER_COMPONENT_NOT_EXIST); + + // 查询top树下层级以下的所有部件 + List componentOnTop = orderComponentMapper.getComponentListOnTopLevel(orderId, componentDO.getTopId(), componentDO.getLevel(), false); + + // 整理出所属的下级,整理成id集合 + Set deleteIds = getChildrenIds(componentDO, componentOnTop); + + // 需要重新累计数量的order_goods id + Set deleteGoodsIds = new HashSet<>(); + // 需要重新累计数量的柜体 id + Set deleteBodyIds = new HashSet<>(); + // 删除的板件总数量 + int deleteRowsTotal = 0; + + // 分批处理:删除对应的板件 + List> split = CollUtil.split(deleteIds, 10); + for (List ids : split) { + // 5、部件下是否有在排单中的板件,有则终止删除 + boolean plateInPlan = orderComponentMapper.selectOrderComponentPlateInPlan(ids); + if (plateInPlan) { + throw new ServiceException(ORDER_COMPONENT_DELETE_PLATE_IN_PLAN); + } + + // 删除前累计goods_id + List batchDeleteGoodsIds = plateMapper.selectOrderComponentGoodsIds(orderId, ids, false); + deleteGoodsIds.addAll(batchDeleteGoodsIds); + + // 删除前累计body_id + List batchDeleteBodyIds = plateMapper.selectOrderComponentBodyIds(orderId, ids, false); + deleteBodyIds.addAll(batchDeleteBodyIds); + + // 删除部件下的板件 + int deletedRows; + do { + // 调用 Mapper 批量删除 + deletedRows = plateMapper.updateOrderComponentPlate(orderId, ids, true); + // 循环直到没有删除 + deleteRowsTotal += deletedRows; + } while (deletedRows > 0); + + // 删除部件 + orderComponentMapper.deleteByIds(ids); + + // TODO 打包解包 + } + + if (deleteRowsTotal == 0) { + return; + } + + // 更新影响的柜体 + updateOrderBodyPlateNum(deleteBodyIds); + // 更新影响的订单商品 + updateOrderGoodsPlateNumAndArea(deleteGoodsIds); + // 更新订单 + updateOrderPlateNumAndArea(orderDO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void restoreOrderComponent(Long orderId, Long id) { + // 校验自身 + OrderDO orderDO = orderMapper.selectById(orderId); + AssertUtils.notEmpty(orderDO, ORDER_NOT_EXISTS); + + OrderComponentDO componentDO = orderComponentMapper.selectByIdIgnoreDeleted(id); + AssertUtils.notEmpty(componentDO, ORDER_COMPONENT_NOT_EXIST); + AssertUtils.equals(componentDO.getDeleted(), false, ORDER_COMPONENT_NO_NEED_TO_RESTORE); + + // 非顶级需要校验上级是否恢复 + if (OrderComponentDO.PARENT_ID_ROOT.equals(componentDO.getPid())) { + OrderComponentDO parent = orderComponentMapper.selectByIdIgnoreDeleted(componentDO.getPid()); + if(parent != null && parent.getDeleted()) { + throw new ServiceException(ORDER_COMPONENT_RESTORE_PARENT_IS_DELETED); + } + } + + // 查询top树下层级以下的所有部件 + List componentOnTop = orderComponentMapper.getComponentListOnTopLevel(orderId, componentDO.getTopId(), componentDO.getLevel(), true); + + // 整理出所属的下级,整理成id集合 + Set restoreIds = getChildrenIds(componentDO, componentOnTop); + + // 需要重新累计数量的order_goods id + Set restoreGoodsIds = new HashSet<>(); + // 需要重新累计数量的柜体 id + Set restoreBodyIds = new HashSet<>(); + // 删除的板件总数量 + int restoreRowsTotal = 0; + + // 分批处理:删除对应的板件 + List> split = CollUtil.split(restoreIds, 10); + for (List ids : split) { + // 5、部件下是否有在排单中的板件,有则终止恢复 + boolean plateInPlan = orderComponentMapper.selectOrderComponentPlateInPlan(ids); + if (plateInPlan) { + throw new ServiceException(ORDER_COMPONENT_DELETE_PLATE_IN_PLAN); + } + + // 恢复前累计goods_id + List batchDeleteGoodsIds = plateMapper.selectOrderComponentGoodsIds(orderId, ids, true); + restoreGoodsIds.addAll(batchDeleteGoodsIds); + + // 恢复前累计body_id + List batchDeleteBodyIds = plateMapper.selectOrderComponentBodyIds(orderId, ids, true); + restoreBodyIds.addAll(batchDeleteBodyIds); + + // 恢复部件下的板件 + int restoreRows; + do { + // 批量恢复 + restoreRows = plateMapper.updateOrderComponentPlate(orderId, ids, false); + // 循环直到没有影响 + restoreRowsTotal += restoreRows; + } while (restoreRows > 0); + + // 恢复部件 + orderComponentMapper.restoreOrderComponents(orderId, ids); + + // TODO 打包解包 + } + + if (restoreRowsTotal == 0) { + return; + } + + // 更新影响的柜体 + updateOrderBodyPlateNum(restoreBodyIds); + // 更新影响的订单商品 + updateOrderGoodsPlateNumAndArea(restoreGoodsIds); + // 更新订单 + updateOrderPlateNumAndArea(orderDO); + } + + /** + * 更新影响的柜体的 板件数量 + * + * @param orderBodyIds + */ + private void updateOrderBodyPlateNum(Set orderBodyIds) { + // 查询删除涉及的柜体 + Map bodyMap = orderBodyMapper.selectByIds(orderBodyIds) + .stream() + .collect(Collectors.toMap(OrderBodyDO::getId, Function.identity())); + + // 统计删除涉及的柜体下的数量和面积、更新到order_body + Map bodyStatMap = orderBodyMapper.selectPlateNumAndArea(orderBodyIds) + .stream() + .collect(Collectors.toMap( + OrderBodyPlateNumAndAreaDO::getOrderBodyId, + Function.identity() + )); + for (Long orderBodyId : orderBodyIds) { + + OrderBodyDO orderBodyDO = bodyMap.get(orderBodyId); + int version = orderBodyDO.getVersion(); + OrderBodyPlateNumAndAreaDO stat = + bodyStatMap.getOrDefault(orderBodyId, + new OrderBodyPlateNumAndAreaDO(orderBodyId, 0, BigDecimal.ZERO)); + + int update = orderBodyMapper.update(new LambdaUpdateWrapper() + .eq(OrderBodyDO::getId, orderBodyId) + .eq(OrderBodyDO::getVersion, version) + .set(OrderBodyDO::getPlateNum, stat.getNum()) + .set(OrderBodyDO::getVersion, version + 1)); + + if (update == 0) { + throw new ServiceException(ErrorCodeConstants.BODY_PLATE_UPDATE_CONCURRENCY_ERROR, orderBodyId); + } + } + } + + /** + * 更新影响的订单商品的 板件数量和面积 + * + * @param orderGoodsIds + */ + private void updateOrderGoodsPlateNumAndArea(Set orderGoodsIds) { + // 查询删除涉及的order_goods + Map goodsMap = + goodsMapper.selectByIds(orderGoodsIds) + .stream() + .collect(Collectors.toMap(GoodsDO::getId, Function.identity())); + + // 统计删除涉及的order_goods下的数量和面积、更新到order_goods + Map goodStatMap = + goodsMapper.selectPlateNumAndArea(orderGoodsIds) + .stream() + .collect(Collectors.toMap( + OrderGoodsPlateNumAndAreaDO::getOrderGoodsId, + Function.identity() + )); + + for (Long orderGoodsId : orderGoodsIds) { + + GoodsDO goodsDO = goodsMap.get(orderGoodsId); + + OrderGoodsPlateNumAndAreaDO stat = + goodStatMap.getOrDefault(orderGoodsId, + new OrderGoodsPlateNumAndAreaDO(orderGoodsId, 0, BigDecimal.ZERO)); + + int version = goodsDO.getVersion(); + int update = goodsMapper.update(new LambdaUpdateWrapper() + .eq(GoodsDO::getId, orderGoodsId) + .eq(GoodsDO::getVersion, version) + .set(GoodsDO::getArea, stat.getArea()) + .set(GoodsDO::getPlateNum, stat.getNum()) + .set(GoodsDO::getVersion, version + 1)); + + if (update == 0) { + throw new ServiceException(ErrorCodeConstants.GOODS_PLATE_UPDATE_CONCURRENCY_ERROR, orderGoodsId); + } + } + } + + private void updateOrderPlateNumAndArea(OrderDO orderDO) { + Long orderId = orderDO.getId(); + // 重新计算订单数量 + // 统计每个orders下的未排单面积,更新到orders中 + OrderPlateNumAndAreaDO orderPlateNumAndAreaDO = orderMapper.selectPlateNumAndArea(orderId); + + // 当前生产单下排单的板件数量 + Integer num = orderPlateNumAndAreaDO.getNum(); + + int version = orderDO.getVersion(); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(OrderDO::getId, orderId) + .eq(OrderDO::getVersion, version) + .set(OrderDO::getPlannedPlateArea, orderPlateNumAndAreaDO.getArea()) + .set(OrderDO::getPlannedPlateNum, num) + .set(OrderDO::getVersion, version + 1); + int update = orderMapper.update(updateWrapper); + if (update == 0) { + throw new ServiceException(com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PLATE_UPDATE_CONCURRENCY_ERROR, orderId); + } + } + + /** + * 整理出需要删除的部件id列表 + * + * @param componentDO + * @param componentOnTop + * @return + */ + private Set getChildrenIds(OrderComponentDO componentDO, List componentOnTop) { + // 3、整理出真正的下级(通过 pid 逐级确认) + Set needDeleteIds = new HashSet<>(); + needDeleteIds.add(componentDO.getId()); + + if (CollUtil.isNotEmpty(componentOnTop)) { + + // 先构建 pid -> children 映射 + Map> childrenMap = componentOnTop.stream() + .collect(Collectors.groupingBy(OrderComponentDO::getPid)); + + // 用队列逐级往下找 + Deque queue = new ArrayDeque<>(); + queue.add(componentDO.getId()); + + while (!queue.isEmpty()) { + Long parentId = queue.poll(); + + List children = childrenMap.get(parentId); + if (CollUtil.isEmpty(children)) { + continue; + } + + for (OrderComponentDO child : children) { + Long childId = child.getId(); + if (needDeleteIds.add(childId)) { // 防重复 + queue.add(childId); // 继续往下找 + } + } + } + } + return needDeleteIds; + } + + } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml index badf05baf..fc72f965a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml @@ -575,4 +575,18 @@ and og.deleted = false + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml index a0385d8a6..b7e2011cd 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml @@ -16,9 +16,6 @@ - - - @@ -636,4 +633,14 @@ and op.deleted = false and o.deleted = false + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderBody/OrderBodyMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderBody/OrderBodyMapper.xml index b37c13c5e..a354a4533 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderBody/OrderBodyMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderBody/OrderBodyMapper.xml @@ -71,4 +71,23 @@ + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/ordercomponent/OrderComponentMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/ordercomponent/OrderComponentMapper.xml index 1955b4d69..19987c70b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/ordercomponent/OrderComponentMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/ordercomponent/OrderComponentMapper.xml @@ -21,7 +21,7 @@ - + select * from order_component oc + where oc.order_id = #{orderId} + and oc.top_id = #{topId} + and oc.deleted = #{deleted} + and oc.level > #{level} + + + + + + + update order_component + set deleted = false + where + order_id = #{orderId} + and id in + + #{componentId} + + and deleted = true + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml index fdb03dfd9..db909d171 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml @@ -967,6 +967,66 @@ + + UPDATE order_plate op + SET op.deleted = #{deleted} + WHERE op.deleted != #{deleted} + AND op.order_id = #{orderId} + AND EXISTS ( + SELECT 1 + FROM order_item oi + WHERE oi.plate_id = op.id + AND oi.organ_id = op.organ_id + AND oi.order_id = op.order_id + AND oi.comp_id IN ( + + #{componentId} + + ) + ) + ORDER BY op.id + LIMIT 1000; + + + + + diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode.properties index 9fe4fbfb6..17596e47c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode.properties @@ -26,4 +26,7 @@ veneer.org.classification.name.empty=组织下分类名称不存在,请前往 veneer.import.template.download.error=导入模版下载失败 veneer.import.org.classification.name.not.exist=第{0}行分类名称{1}不存在,请前往 [新增] 窗口维护分类名称 -order.component.not.exist=订单部件不存在 \ No newline at end of file +order.component.not.exist=订单部件不存在 +order.component.delete.plate.in.plan=部件下存在已排单的板件,请移除部件后再次进行删除 +order.component.restore.parent.is.deleted=该部件上级已被删除,请先恢复上级部件 +order.component.no.need.to.restore=该部件未删除,无需恢复 \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_cht.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_cht.properties index 96a3a6d37..7a11656f1 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_cht.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_cht.properties @@ -26,4 +26,7 @@ veneer.org.classification.name.empty=組織下分類名稱不存在,請前往 veneer.import.template.download.error=導入模版下載失敗 veneer.import.org.classification.name.not.exist=第{0}行分類名稱{1}不存在,請前往[新增]視窗維護分類名稱 -order.component.not.exist=訂單部件不存在 \ No newline at end of file +order.component.not.exist=訂單部件不存在 +order.component.delete.plate.in.plan=部件下存在已排單的板件,請移除部件後再次進行删除 +order.component.restore.parent.is.deleted=該部件上級已被删除,請先恢復上級部件 +order.component.no.need.to.restore=該部件未删除,無需恢復 \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_en.properties b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_en.properties index 81f256bc1..4664cf11e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_en.properties +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/message_errorcode_en.properties @@ -26,4 +26,7 @@ veneer.org.classification.name.empty=The classification name does not exist unde veneer.import.template.download.error=Import template download failed veneer.import.org.classification.name.not.exist=The classification name {1} does not exist in line {0}, please go to the [Add] window to maintain the classification name -order.component.not.exist=The order component does not exist \ No newline at end of file +order.component.not.exist=The order component does not exist +order.component.delete.plate.in.plan=There are already listed boards under the component. Please remove the component and delete it again +order.component.restore.parent.is.deleted=The upper level of this component has been deleted. Please restore the upper level component first +order.component.no.need.to.restore=This component has not been deleted and does not need to be restored \ No newline at end of file