新增 未排贴皮列表获取接口

This commit is contained in:
gaoqr
2026-08-10 17:40:23 +08:00
parent 35f814bbe6
commit a9170fdbd0
10 changed files with 300 additions and 0 deletions
@@ -7,6 +7,8 @@ import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanCreateRe
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPageReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPageRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPlateRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanNoPlanPlateDataRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanNoPlanPlateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanProduceReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanRemovePlateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanSortReqVO;
@@ -183,6 +185,20 @@ public class VeneerPlanController {
return success(veneerPlanService.getPlanPlateList(planId));
}
/**
* 查询指定订单中当前贴皮排单可继续加入的未排贴皮板件。
*
* @param req 订单ID列表和目标贴皮排单ID
* @return 未排贴皮板件及原板件造型数据
*/
@PostMapping("/orders/noplan")
@Operation(summary = "获取贴皮排单未排贴皮板件")
@PreAuthorize("@ss.hasPermission('placeorder:query')")
public CommonResult<VeneerPlanNoPlanPlateDataRespVO> getVeneerPlanNoPlanPlateData(
@Valid @RequestBody VeneerPlanNoPlanPlateReqVO req) {
return success(veneerPlanService.getNoPlanPlateData(req));
}
/**
* 查询未完成开料的贴皮排单优先级列表。
*
@@ -0,0 +1,27 @@
package com.cf.imes.module.executor.controller.admin.veneer.vo;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 贴皮排单待选未排板件及造型数据响应。
*/
@Schema(description = "管理后台 - 贴皮排单待选未排板件数据 Response VO")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VeneerPlanNoPlanPlateDataRespVO {
@Schema(description = "未排贴皮及原板件信息")
private List<UnplannedVeneerPlateRespVO> plateList;
@Schema(description = "原板件造型信息,按 plateId 与 plateList 关联")
private List<OrderModelDO> plateModels;
}
@@ -0,0 +1,26 @@
package com.cf.imes.module.executor.controller.admin.veneer.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.util.List;
/**
* 贴皮排单待选未排板件查询参数。
*/
@Schema(description = "管理后台 - 贴皮排单待选未排板件查询 Request VO")
@Data
public class VeneerPlanNoPlanPlateReqVO {
@Schema(description = "订单ID列表", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "{veneer.plan.noplan.order.ids.required}")
@Size(max = 200, message = "{veneer.plan.noplan.order.ids.max}")
private List<Long> orderIds;
@Schema(description = "目标贴皮排单ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "{veneer.plan.id.required}")
private Long planId;
}
@@ -5,6 +5,7 @@ import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPageReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPageRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPlateRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.UnplannedVeneerPlateRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanSortReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanSortRespVO;
import com.cf.imes.module.executor.dal.dataobject.veneer.OrderPlateVeneerDO;
@@ -41,6 +42,19 @@ public interface VeneerPlanMapper extends BaseMapperX<OrderVeneerPlanDO> {
*/
List<VeneerPlanPlateRespVO> selectPlanPlateList(@Param("planId") Long planId);
/**
* 查询指定订单中与目标贴皮排单商品匹配的未排贴皮板件。
*
* @param orderIds 订单ID列表
* @param planId 目标贴皮排单ID
* @param organId 组织ID
* @return 未排贴皮板件原始数据
*/
List<UnplannedVeneerPlateRespVO> selectNoPlanVeneerPlateList(
@Param("orderIds") List<Long> orderIds,
@Param("planId") Long planId,
@Param("organId") Long organId);
/**
* 查询尚未完成开料的贴皮排单优先级列表。
*
@@ -6,6 +6,8 @@ import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanCreateRe
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPageReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPageRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPlateRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanNoPlanPlateDataRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanNoPlanPlateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanProduceReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanRemovePlateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanSortReqVO;
@@ -85,6 +87,14 @@ public interface VeneerPlanService {
*/
List<VeneerPlanPlateRespVO> getPlanPlateList(Long planId);
/**
* 查询指定订单中与目标贴皮排单商品匹配的未排贴皮板件。
*
* @param req 订单ID列表和目标贴皮排单ID
* @return 未排贴皮板件及原板件造型数据
*/
VeneerPlanNoPlanPlateDataRespVO getNoPlanPlateData(VeneerPlanNoPlanPlateReqVO req);
/**
* 查询未完成开料的贴皮排单优先级列表。
*
@@ -10,6 +10,7 @@ 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.PageResult;
import com.cf.imes.framework.common.util.json.JsonUtils;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.security.core.LoginUser;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
@@ -17,6 +18,8 @@ import com.cf.imes.module.executor.controller.admin.plan.vo.PlanOrderRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanAddPlateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanCreateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanGroupReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanNoPlanPlateDataRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanNoPlanPlateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPageReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPageRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPlateRespVO;
@@ -26,7 +29,9 @@ import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanSortReqV
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanSortRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanUpdateReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanWithdrawProduceReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.UnplannedVeneerPlateRespVO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.executor.dal.dataobject.veneer.OrderPlateVeneerDO;
import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerGoodsDO;
import com.cf.imes.module.executor.dal.dataobject.veneer.OrderVeneerPlanDO;
@@ -432,6 +437,71 @@ public class VeneerPlanServiceImpl implements VeneerPlanService {
return veneerPlanMapper.selectPlanPlateList(planId);
}
@Override
public VeneerPlanNoPlanPlateDataRespVO getNoPlanPlateData(
VeneerPlanNoPlanPlateReqVO req) {
OrderVeneerPlanDO plan = validatePlanExists(req.getPlanId());
LoginUser loginUser = Objects.requireNonNull(SecurityFrameworkUtils.getLoginUser());
// 只查询当前排单贴皮商品对应的未排记录,A/B 面保留为独立记录。
List<UnplannedVeneerPlateRespVO> rawPlates =
veneerPlanMapper.selectNoPlanVeneerPlateList(
req.getOrderIds(), plan.getId(), loginUser.getOrganId());
List<UnplannedVeneerPlateRespVO> plates = mergeNoPlanVeneerPlateDetails(rawPlates);
// 同一原板的 A/B 面共用一份造型数据,通过 plateId 关联,避免重复返回。
Map<Long, OrderModelDO> modelMap = new LinkedHashMap<>();
for (UnplannedVeneerPlateRespVO plate : plates) {
if (plate.getPlateId() == null || StrUtil.isBlank(plate.getModelData())
|| modelMap.containsKey(plate.getPlateId())) {
continue;
}
OrderModelDO model = JsonUtils.parseObject(plate.getModelData(), OrderModelDO.class);
if (model != null) {
model.setPlateId(plate.getPlateId());
modelMap.put(plate.getPlateId(), model);
}
}
return VeneerPlanNoPlanPlateDataRespVO.builder()
.plateList(plates)
.plateModels(new ArrayList<>(modelMap.values()))
.build();
}
/**
* 合并同一贴皮面因多个加工组产生的重复行。
*
* @param rawPlates SQL 原始查询结果
* @return 按贴皮分解记录 ID 去重后的结果
*/
private List<UnplannedVeneerPlateRespVO> mergeNoPlanVeneerPlateDetails(
List<UnplannedVeneerPlateRespVO> rawPlates) {
if (CollUtil.isEmpty(rawPlates)) {
return List.of();
}
Map<Long, UnplannedVeneerPlateRespVO> plateMap = new LinkedHashMap<>();
Map<Long, Set<String>> groupNameMap = new HashMap<>();
for (UnplannedVeneerPlateRespVO plate : rawPlates) {
if (plate.getId() == null) {
continue;
}
plateMap.putIfAbsent(plate.getId(), plate);
if (StrUtil.isNotBlank(plate.getProcessGroupName())) {
groupNameMap.computeIfAbsent(plate.getId(), key -> new LinkedHashSet<>())
.add(plate.getProcessGroupName());
}
}
plateMap.forEach((id, plate) -> {
Set<String> groupNames = groupNameMap.get(id);
plate.setProcessGroupName(CollUtil.isEmpty(groupNames)
? null : String.join(",", groupNames));
});
return new ArrayList<>(plateMap.values());
}
@Override
public List<VeneerPlanSortRespVO> getPlanSortPage() {
return veneerPlanMapper.selectPlanSortList(
@@ -2,6 +2,15 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cf.imes.module.executor.dal.mysql.veneer.VeneerPlanMapper">
<resultMap id="NoPlanVeneerPlateMap"
type="com.cf.imes.module.executor.controller.admin.veneer.vo.UnplannedVeneerPlateRespVO"
autoMapping="true">
<id property="id" column="id"/>
<id property="plateId" column="plateId"/>
<result property="modelData" column="modelData"
typeHandler="com.cf.imes.framework.mybatis.core.type.CompressStringTypeHandler"/>
</resultMap>
<select id="selectPlanPage"
resultType="com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerPlanPageRespVO">
SELECT ovp.id,
@@ -156,6 +165,128 @@
ORDER BY opv.order_plate_id DESC, opv.veneer_side
</select>
<select id="selectNoPlanVeneerPlateList"
resultMap="NoPlanVeneerPlateMap">
SELECT opv.id,
opv.order_id AS orderId,
opv.order_goods_id AS orderGoodsId,
opv.order_veneer_goods_id AS orderVeneerGoodsId,
opv.order_plate_id AS plateId,
opv.plate_no AS plateNo,
opv.plate_name AS plateName,
opv.plate_length AS height,
opv.plate_length AS length,
opv.plate_width AS width,
opv.plate_thickness AS thickness,
opv.veneer_area AS area,
opv.hole_arrange AS holeArrange,
opv.veneer_side AS veneerSide,
opv.plate_surface AS plateSurface,
opv.veneer_no AS veneerNo,
opv.outer_margin AS outerMargin,
ovg.source_veneer_id AS sourceVeneerId,
ovg.goods_id AS sourceVeneerNo,
ovg.goods_name AS veneerName,
ovg.product_level AS productLevel,
ovg.color AS veneerColor,
ovg.material AS veneerMaterial,
op.goods_id AS goodsId,
op.custom_plate_no AS customPlateNo,
op.name AS name,
op.split_width AS splitWidth,
op.split_height AS splitHeight,
op.split_thickness AS splitThickness,
op.seal_left AS sealLeft,
op.seal_right AS sealRight,
op.seal_up AS sealUp,
op.seal_down AS sealDown,
op.reserved_edge_left AS reservedEdgeLeft,
op.reserved_edge_right AS reservedEdgeRight,
op.reserved_edge_up AS reservedEdgeUp,
op.reserved_edge_down AS reservedEdgeDown,
op.texture,
op.hole_face AS holeFace,
op.unregular_point_count AS unregularPointCount,
op.front_hole_count AS frontHoleCount,
op.back_hole_count AS backHoleCount,
op.side_hole_count AS sideHoleCount,
op.front_model_count AS frontModelCount,
op.back_model_count AS backModelCount,
op.is_door AS isDoor,
op.is_arc_across AS isArcAcross,
op.module_type_id AS moduleTypeId,
op.offset_x AS offsetX,
op.offset_y AS offsetY,
op.remark,
op.type,
op.is_row_hole AS isRowHole,
op.is_sculpt AS isSculpt,
op.is_side_sculpt AS isSideSculpt,
op.is_2v AS is2v,
op.is_side_2v AS isSide2v,
CASE WHEN op.front_model_count > 0 AND op.back_model_count > 0
THEN 1 ELSE 0 END AS doubleSideModel,
CASE WHEN op.front_hole_count > 0 AND op.back_hole_count > 0
THEN 1 ELSE 0 END AS doubleSideHole,
CASE WHEN op.front_model_count > 0 THEN 1 ELSE 0 END AS frontModel,
CASE WHEN op.back_model_count > 0 THEN 1 ELSE 0 END AS backModel,
CASE WHEN op.front_hole_count > 0 THEN 1 ELSE 0 END AS frontHole,
CASE WHEN op.back_hole_count > 0 THEN 1 ELSE 0 END AS backHole,
CASE WHEN op.side_hole_count > 0 THEN 1 ELSE 0 END AS sideHole,
ogs.goods_name AS goodsName,
ogs.color,
ogs.brand,
ogs.material,
ogp.name AS processGroupName,
ob.room_name AS roomName,
ob.name AS bodyName,
op.model_data AS modelData
FROM order_plate_veneer opv
JOIN order_veneer_plan ovp
ON ovp.id = #{planId}
AND ovp.organ_id = #{organId}
AND ovp.deleted = false
JOIN order_veneer_goods ovg
ON ovg.organ_id = opv.organ_id
AND ovg.order_id = opv.order_id
AND ovg.id = opv.order_veneer_goods_id
AND ovg.source_veneer_id = ovp.source_veneer_id
AND ovg.deleted = false
JOIN order_plate op
ON op.organ_id = opv.organ_id
AND op.order_id = opv.order_id
AND op.id = opv.order_plate_id
AND op.deleted = false
JOIN order_goods ogs
ON ogs.organ_id = op.organ_id
AND ogs.order_id = op.order_id
AND ogs.id = op.goods_id
AND ogs.deleted = false
LEFT JOIN order_item oi
ON oi.organ_id = opv.organ_id
AND oi.order_id = opv.order_id
AND oi.plate_id = opv.order_plate_id
AND oi.plate_id != 0
LEFT JOIN order_body ob
ON ob.organ_id = oi.organ_id
AND ob.order_id = oi.order_id
AND ob.id = oi.body_id
AND ob.deleted = false
LEFT JOIN order_group ogp
ON ogp.organ_id = oi.organ_id
AND ogp.order_id = oi.order_id
AND ogp.id = oi.group_id
AND ogp.deleted = false
WHERE opv.organ_id = #{organId}
AND opv.order_id IN
<foreach collection="orderIds" item="orderId" open="(" close=")" separator=",">
#{orderId}
</foreach>
AND opv.deleted = false
AND opv.plan_id = 0
ORDER BY opv.order_id ASC, opv.order_plate_id ASC, opv.veneer_no ASC, oi.group_id ASC
</select>
<select id="selectPendingVeneerList"
resultType="com.cf.imes.module.executor.dal.dataobject.veneer.OrderPlateVeneerDO">
SELECT opv.id,
@@ -115,6 +115,8 @@ veneer.plan.sort.record.duplicate=貼皮排單{0}被重複提交,請檢查後
veneer.plan.sort.status.changed=貼皮排單不存在或狀態發生變化,請重新整理後再試
veneer.plan.not.exist=貼皮排單{0}不存在或已刪除,請重新整理後再試
veneer.plan.id.required=貼皮排單ID不能為空
veneer.plan.noplan.order.ids.required=訂單ID列表不能為空
veneer.plan.noplan.order.ids.max=訂單ID列表不能超過200個
veneer.plan.process.required=請選擇貼皮排單的加工方案
veneer.plan.process.id.required=貼皮排單加工方案組ID不能為空
veneer.plan.process.name.required=貼皮排單加工方案組名稱不能為空
@@ -115,6 +115,8 @@ veneer.plan.sort.record.duplicate=Veneer plan {0} was submitted more than once.
veneer.plan.sort.status.changed=The veneer plan does not exist or its status has changed. Please refresh and retry
veneer.plan.not.exist=Veneer plan {0} does not exist or has been deleted. Please refresh and retry
veneer.plan.id.required=Veneer plan ID is required
veneer.plan.noplan.order.ids.required=The order ID list is required
veneer.plan.noplan.order.ids.max=The order ID list cannot contain more than 200 orders
veneer.plan.process.required=Please select a process scheme for the veneer plan
veneer.plan.process.id.required=The process scheme ID of the veneer plan is required
veneer.plan.process.name.required=The process scheme name of the veneer plan is required
@@ -115,6 +115,8 @@ veneer.plan.sort.record.duplicate=贴皮排单{0}被重复提交,请检查后
veneer.plan.sort.status.changed=贴皮排单不存在或状态发生变化,请刷新后重试
veneer.plan.not.exist=贴皮排单{0}不存在或已删除,请刷新后重试
veneer.plan.id.required=贴皮排单ID不能为空
veneer.plan.noplan.order.ids.required=订单ID列表不能为空
veneer.plan.noplan.order.ids.max=订单ID列表不能超过200个
veneer.plan.process.required=请选择贴皮排单的加工方案
veneer.plan.process.id.required=贴皮排单加工方案组ID不能为空
veneer.plan.process.name.required=贴皮排单加工方案组名称不能为空