1、打包/删除包裹支持统计已打包板件/配件数到订单信息;2、创建排单 - 订单列表支持外部选择子单后弹窗订单列表展示下级;

This commit is contained in:
gaoqr
2026-05-08 14:45:34 +08:00
parent 8ad17c34c5
commit 189df72427
9 changed files with 235 additions and 42 deletions
@@ -77,19 +77,18 @@ public class PackRespVO {
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "板件数量")
private Integer plateNum;
@Schema(description = "已打包数-包裹数")
private Long packCount;
private Integer packCount;
@Schema(description = "已打包板件数")
private Integer packedPlatesCount;
@Schema(description = "已打包片数-已处理量")
private Long packPieceCount;
@Schema(description = "已打包配件数")
private Integer packedPartsCount;
@Schema(description = "总片数-板件总数")
private Long totalPieceCount;
private Integer totalPieceCount;
@Schema(description = "待处理量")
@@ -152,6 +152,16 @@ public class OrderDO extends BaseDO {
*/
private int version;
/**
* 已打包板件数
*/
private Integer packedPlatesCount;
/**
* 已打包配件数
*/
private Integer packedPartsCount;
/**
* 子单列表
*/
@@ -0,0 +1,33 @@
package com.cf.imes.module.executor.dal.dataobject.order;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 订单已打包数统计 DO
*
* @author Gqr
* @since 2026/5/8 10:55
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrderPackNumDO {
/**
* 订单id
*/
private Long orderId;
/**
* 已打包板件数量
*/
private Integer plateNum;
/**
* 已打包配件数量
*/
private Integer partsNum;
}
@@ -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.OrderPackNumDO;
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;
@@ -343,4 +344,20 @@ public interface OrderMapper extends BaseMapperX<OrderDO> {
* @return
*/
OrderPlateNumAndAreaDO selectPlateNumAndArea(@Param("orderId") Long orderId, @Param("delete") Boolean delete);
/**
* 查询订单列表对应的已打包数
*
* @param orderIds
* @return
*/
List<OrderPackNumDO> selectPackPlateNum(@Param("orderIds") Collection<Long> orderIds);
/**
* 查询订单列表对应的已打包数
*
* @param orderIds
* @return
*/
List<OrderPackNumDO> selectPackPartsNum(@Param("orderIds") Collection<Long> orderIds);
}
@@ -17,7 +17,6 @@ import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.Assert.AssertUtils;
import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.executor.api.plan.OrderPlanApi;
import com.cf.imes.module.executor.controller.admin.manage.pack.vo.*;
import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.OrderPackageVO;
@@ -34,6 +33,7 @@ import com.cf.imes.module.executor.dal.mysql.pack.OrderPackageMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.executor.enums.OrderPackageMethodEnum;
import com.cf.imes.module.executor.enums.pack.PackScanComponentCorrelationTypeEnum;
import com.cf.imes.module.executor.service.order.OrderInfoVersionControlService;
import com.cf.imes.module.executor.service.order.OrderService;
import com.cf.imes.module.executor.service.orderParts.OrderPartsService;
import com.cf.imes.module.executor.service.ordercomponent.OrderComponentService;
@@ -113,6 +113,9 @@ public class PackServiceImpl implements PackService {
@Resource
private OrderComponentService orderComponentService;
@Resource
private OrderInfoVersionControlService orderInfoVersionControlService;
// 打包分页查询
@Override
public PageResult<PackRespVO> getPackPage(PackPageReqVO pageReqVO) {
@@ -218,7 +221,7 @@ public class PackServiceImpl implements PackService {
@Override
@Transactional(rollbackFor = Exception.class)
public OrderPackRespVO updatePack(OrderPackReqVO packageVO) {
Long organId = SecurityFrameworkUtils.getUserOrganId();
Long organId = getUserOrganId();
String packNo = packageVO.getPackNo();
List<Long> orderIds = packageVO.getOrderIds();
List<Long> addPlateNos = packageVO.getAddPlateNoList();
@@ -269,14 +272,17 @@ public class PackServiceImpl implements PackService {
processParts(addPartsList, packMethod, orderIds, packageNo, true);
// 更新订单打包状态
for (Long orderId : orderIds) {
if (validateOrderPack(orderId)) {
List<OrderDO> orderDOS = ordersMapper.selectBatchIds(orderIds);
for (OrderDO orderDO : orderDOS) {
if (validateOrderPack(orderDO.getId())) {
// 修改订单的打包状态
PackServiceImpl p = (PackServiceImpl) AopContext.currentProxy();
p.updateOrderStatus(orderId);
p.updateOrderStatus(orderDO);
}
}
// 更新已打包数量到订单
orderInfoVersionControlService.updateOrderPackNum(orderDOS);
return typeConversion(orderPackageDOS.get(0), orderIds);
}
@@ -346,14 +352,17 @@ public class PackServiceImpl implements PackService {
// 更新订单打包状态
for (Long orderId : orderIds) {
if (validateOrderPack(orderId)) {
List<OrderDO> orderDOS = ordersMapper.selectBatchIds(orderIds);
for (OrderDO orderDO : orderDOS) {
if (validateOrderPack(orderDO.getId())) {
// 修改订单的打包状态
PackServiceImpl p = (PackServiceImpl) AopContext.currentProxy();
p.updateOrderStatus(orderId);
p.updateOrderStatus(orderDO);
}
}
// 更新已打包数量到订单
orderInfoVersionControlService.updateOrderPackNum(orderDOS);
return typeConversion(existPackageDO, orderIds);
@@ -617,7 +626,7 @@ public class PackServiceImpl implements PackService {
OrderItemDO newItem = new OrderItemDO();
// 基础字段复制(建议用BeanUtils)
org.springframework.beans.BeanUtils.copyProperties(source, newItem);
BeanUtils.copyProperties(source, newItem);
newItem.setId(null); // 新ID
newItem.setPackNum(packNum);
@@ -650,10 +659,8 @@ public class PackServiceImpl implements PackService {
// 修改当前订单的工序状态和订单的状态
@Transactional(rollbackFor = Exception.class)
public void updateOrderStatus(Long orderId) {
OrderDO orderDO = ordersMapper.selectById(orderId);
public OrderDO updateOrderStatus(OrderDO orderDO) {
Long orderId = orderDO.getId();
// 修改订单的打包状态为已打包
orderDO.setPackaged(OrderPackageStatusEnum.PACKAGED.getStatus());
@@ -667,8 +674,7 @@ public class PackServiceImpl implements PackService {
ordersMapper.updateById(orderDO);
return orderDO;
}
@@ -690,6 +696,8 @@ public class PackServiceImpl implements PackService {
Long packageNo = reqVO.getPackageNo();
List<Long> orderIds = reqVO.getOrderIds();
List<OrderDO> orderDOS = ordersMapper.selectBatchIds(orderIds);
List<OrderPackagDO> orderPackagDOS = orderPackageMapper.selectList(new LambdaQueryWrapper<OrderPackagDO>()
.eq(OrderPackagDO::getPackageNo, packageNo)
.in(OrderPackagDO::getOrderId, orderIds)
@@ -827,6 +835,9 @@ public class PackServiceImpl implements PackService {
.eq(OrderDO::getPackaged, OrderPackageStatusEnum.PACKAGED.getStatus())
.set(OrderDO::getPackaged, OrderPackageStatusEnum.UNPACKED.getStatus())
);
// 更新已打包数量到订单
orderInfoVersionControlService.updateOrderPackNum(orderDOS);
}
// 生成包裹编号
@@ -940,9 +951,12 @@ public class PackServiceImpl implements PackService {
.orderByDesc(OrderDO::getId)
);
if (CollUtil.isNotEmpty(childList)) {
List<PackRespVO> childOrdersPackList = BeanUtil.copyToList(childList, PackRespVO.class);
orderIds.addAll(childOrdersPackList.stream().map(PackRespVO::getId).toList());
packRespVOS.getRecords().addAll(childOrdersPackList);
for (OrderDO child : childList) {
PackRespVO childPackRespVO = BeanUtil.copyProperties(child, PackRespVO.class);
childPackRespVO.setTotalPieceCount(child.getPlateNum());
packRespVOS.getRecords().add(childPackRespVO);
orderIds.add(childPackRespVO.getId());
}
}
return buildPageResult(orderIds, packRespVOS);
@@ -966,20 +980,9 @@ public class PackServiceImpl implements PackService {
// 查询当前生产的包裹数量
List<PackRespVO> orderPackNumGroup = orderPackageMapper.selectPackPage(orderIds, getUserOrganId());
// 查询当前订单已经打包的板材数量
List<PackRespVO> orderPackedPlateNumGroup = orderPackageMapper.selectPackPieceCount(orderIds, getUserOrganId());
for (PackRespVO vosRecord : records) {
// 板材总数
vosRecord.setTotalPieceCount(vosRecord.getPlateNum().longValue());
// 已打包裹数
vosRecord.setPackCount(orderPackNumGroup.stream().filter(f -> Objects.equals(f.getId(), vosRecord.getId())).mapToLong(PackRespVO::getPackCount).sum());
// 已打包片数
vosRecord.setPackPieceCount(orderPackedPlateNumGroup.stream().filter(f -> Objects.equals(f.getId(), vosRecord.getId())).mapToLong(PackRespVO::getPackPieceCount).sum());
// 待处理量
vosRecord.setPendingNum(vosRecord.getTotalPieceCount() - vosRecord.getPackPieceCount());
vosRecord.setPackCount(orderPackNumGroup.stream().filter(f -> Objects.equals(f.getId(), vosRecord.getId())).mapToInt(PackRespVO::getPackCount).sum());
}
@@ -84,6 +84,7 @@ import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.DATA_DATA_ERROR;
@@ -796,14 +797,55 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
AssertUtils.notEmpty(plateDetailRespVOS,ORDER_PLATE_MODEL_DATE_ERROR);
return OrderSource.builder()
.orderList(orderDOS)
.orderList(buildTree(orderDOS))
.goodsList(goodsReqVOS)
.plateList(plateDetailRespVOS)
// .plateModels(orderModelDOS)
.plateModels(Collections.emptyList())
.build();
}
/**
* 将订单列表整理成父子结构
* 规则:
* 1. parentId = 0 的为父级
* 2. 子级通过 parentId 关联父级 id
* 3. 只有一层父子关系
*/
public List<OrderDO> buildTree(List<OrderDO> orderList) {
if (orderList == null || orderList.isEmpty()) {
return Collections.emptyList();
}
// 父级Map
Map<Long, OrderDO> parentMap = orderList.stream()
.filter(order -> order.getParentId() == 0)
.collect(Collectors.toMap(OrderDO::getId, Function.identity()));
// 初始化child
parentMap.values().forEach(order -> order.setChild(new ArrayList<>()));
List<OrderDO> result = new ArrayList<>();
for (OrderDO order : orderList) {
// 顶级
if (order.getParentId() == 0) {
result.add(order);
continue;
}
// 子级挂到父级
OrderDO parent = parentMap.get(order.getParentId());
if (parent != null) {
parent.getChild().add(order);
}
}
return result;
}
/**
* 分页获取订单ids下的es.orderModels数据
*
@@ -3,6 +3,7 @@ package com.cf.imes.module.executor.service.order;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import java.util.Collection;
import java.util.List;
/**
* 订单信息版本控制服务 Service
@@ -34,4 +35,11 @@ public interface OrderInfoVersionControlService {
* @param delete
*/
void updateOrderGoodsPlateNumAndArea(Collection<Long> orderGoodsIds, Boolean delete);
/**
* 更新订单的已打包板件数
*
* @param orderDOS
*/
void updateOrderPackNum(List<OrderDO> orderDOS);
}
@@ -1,11 +1,14 @@
package com.cf.imes.module.executor.service.order;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.mybatis.core.query.LambdaUpdateWrapperX;
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.order.OrderDO;
import com.cf.imes.module.executor.dal.dataobject.order.OrderPackNumDO;
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.OrderBodyPlateNumDO;
@@ -19,6 +22,8 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -137,4 +142,45 @@ public class OrderInfoVersionControlServiceImpl implements OrderInfoVersionContr
}
}
}
@Override
public void updateOrderPackNum(List<OrderDO> orderDOS) {
List<Long> orderIds = orderDOS.stream().map(OrderDO::getId).collect(Collectors.toList());
Map<Long, OrderDO> orderMap = orderDOS.stream()
.collect(Collectors.toMap(OrderDO::getId, Function.identity()));
List<OrderPackNumDO> orderPackPlateNumDOS = orderMapper.selectPackPlateNum(orderIds);
List<OrderPackNumDO> orderPackPartsNumDOS = orderMapper.selectPackPartsNum(orderIds);
Map<Long, Integer> orderPackPartsNumMap = new HashMap<>();
if (CollUtil.isNotEmpty(orderPackPartsNumDOS)) {
orderPackPartsNumMap = orderPackPartsNumDOS.stream()
.collect(Collectors.toMap(OrderPackNumDO::getOrderId, OrderPackNumDO::getPartsNum));
}
for (OrderPackNumDO orderPackPlateNumDO : orderPackPlateNumDOS) {
Long orderId = orderPackPlateNumDO.getOrderId();
// 当前订单下已打包板件
Integer plateNum = orderPackPlateNumDO.getPlateNum();
// 当前订单下已打包配件
Integer partsNum = orderPackPartsNumMap.getOrDefault(orderId, 0);
OrderDO orderDO = orderMap.get(orderId);
if (ObjectUtil.isNull(orderDO)) {
continue;
}
int version = orderDO.getVersion();
// 更新数量
LambdaUpdateWrapper<OrderDO> updateWrapper = new LambdaUpdateWrapperX<OrderDO>()
.eq(OrderDO::getId, orderId)
.eq(OrderDO::getVersion, version)
.set(OrderDO::getPackedPlatesCount, plateNum)
.set(OrderDO::getPackedPartsCount, partsNum)
.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);
}
}
}
}
@@ -502,8 +502,8 @@
<result property="packId" column="packId"/>
<result property="packCount" column="packCount"/>
<result property="totalPieceCount" column="totalPieceCount"/>
<result property="packPieceCount" column="packPieceCount"/>
<result property="plateNum" column="plateNum"/>
<result property="packedPlatesCount" column="packedPlatesCount"/>
<result property="packedPartsCount" column="packedPartsCount"/>
<result property="orderType" column="orderType"/>
</resultMap>
@@ -559,7 +559,9 @@
splitter as splitter,
packaged as packaged,
remark as remark,
plate_num as plateNum
plate_num as totalPieceCount,
packed_plates_count as packedPlatesCount,
packed_parts_count as packedPartsCount
from orders
<where>
@@ -650,4 +652,37 @@
and o.deleted = false
</select>
<select id="selectPackPlateNum" resultType="com.cf.imes.module.executor.dal.dataobject.order.OrderPackNumDO">
select oi.order_id as order_id,
IFNULL(sum(case
when oi.plate_id != 0
and oi.package_id != 0
then 1
else 0
end), 0) as plate_num
from order_item oi
where oi.order_id in
<foreach collection="orderIds" item="orderId" open="(" separator="," close=")">
#{orderId}
</foreach>
and oi.package_id != 0
and oi.plate_id != 0
group by oi.order_id
</select>
<select id="selectPackPartsNum" resultType="com.cf.imes.module.executor.dal.dataobject.order.OrderPackNumDO">
select order_id,
count(*) as parts_num
from (
select distinct order_id, parts_id, body_id
from order_item
where parts_id != 0
and package_id != 0
and order_id in
<foreach collection="orderIds" item="orderId" open="(" separator="," close=")">
#{orderId}
</foreach>
) t
group by order_id
</select>
</mapper>