Browse Source

一键包装

24282 1 year ago
parent
commit
ecffe54356

+ 20 - 0
sd-business/src/main/java/com/sd/business/controller/order/OrderPackageBomController.java

@@ -0,0 +1,20 @@
+package com.sd.business.controller.order;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * 订单sku bom 关联 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-07-24
+ */
+@RestController
+@RequestMapping("/orderPackageBom")
+public class OrderPackageBomController {
+
+
+}

+ 19 - 0
sd-business/src/main/java/com/sd/business/controller/production/ProductionOrderController.java

@@ -1,8 +1,11 @@
 package com.sd.business.controller.production;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.sd.business.entity.production.dto.ProductionOrderDto;
+import com.sd.business.entity.production.dto.RapidPackagingDto;
 import com.sd.business.entity.production.dto.SetTagDto;
+import com.sd.business.entity.production.vo.ProductionOrderDetailVo;
 import com.sd.business.entity.production.vo.ProductionOrderVo;
 import com.sd.business.service.production.ProductionOrderService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -38,4 +41,20 @@ public class ProductionOrderController {
         productionOrderService.setTag(dto);
     }
 
+    /**
+     * 一键包装明细
+     */
+    @PostMapping("/detail")
+    public ProductionOrderDetailVo detail(@RequestBody BaseSelectDto dto) {
+        return productionOrderService.detail(dto);
+    }
+
+    /**
+     * 一键包装
+     */
+    @PostMapping("/rapidPackaging")
+    public void rapidPackaging(@Validated @RequestBody RapidPackagingDto dto) {
+        productionOrderService.rapidPackaging(dto);
+    }
+
 }

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/order/dto/OrderPackageBomDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.order.dto;
+
+import com.sd.business.entity.order.po.OrderPackageBom;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 订单sku bom 关联新增编辑入参实体
+ *
+ * @author
+ * @since 2023-07-24
+ */
+@Getter
+@Setter
+public class OrderPackageBomDto extends OrderPackageBom {
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/order/dto/OrderPackageBomSelectDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.order.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 订单sku bom 关联列表查询入参实体
+ *
+ * @author
+ * @since 2023-07-24
+ */
+@Getter
+@Setter
+public class OrderPackageBomSelectDto extends BaseSelectDto {
+
+}

+ 41 - 0
sd-business/src/main/java/com/sd/business/entity/order/po/OrderPackageBom.java

@@ -0,0 +1,41 @@
+package com.sd.business.entity.order.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 订单sku bom 关联
+ * </p>
+ *
+ * @author
+ * @since 2023-07-24
+ */
+@Getter
+@Setter
+@TableName("order_package_bom")
+public class OrderPackageBom extends BasePo {
+
+    /**
+     * 订单id
+     */
+    private Long orderId;
+
+    /**
+     * bom规格id
+     */
+    @NotNull(message = "包装bom规格id不能为空")
+    private Long bomSpecId;
+
+    /**
+     * 数量
+     */
+    @NotNull(message = "包装数量不能为空")
+    private BigDecimal quantity;
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/order/vo/OrderPackageBomVo.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.order.vo;
+
+import com.sd.business.entity.order.po.OrderPackageBom;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 订单sku bom 关联列表查询返回值实体
+ *
+ * @author
+ * @since 2023-07-24
+ */
+@Getter
+@Setter
+public class OrderPackageBomVo extends OrderPackageBom {
+
+}

+ 29 - 0
sd-business/src/main/java/com/sd/business/entity/production/dto/RapidPackagingDto.java

@@ -0,0 +1,29 @@
+package com.sd.business.entity.production.dto;
+
+import com.sd.business.entity.order.po.OrderPackageBom;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Getter
+@Setter
+public class RapidPackagingDto {
+
+    /**
+     * 订单id
+     */
+    @NotNull(message = "订单id不能为空")
+    private Long orderId;
+
+    /**
+     * 包装明细
+     */
+    @Valid
+    @NotEmpty(message = "包装明细列表不能为空")
+    private List<OrderPackageBom> packageList;
+
+}

+ 50 - 0
sd-business/src/main/java/com/sd/business/entity/production/vo/ProductionOrderDetailVo.java

@@ -0,0 +1,50 @@
+package com.sd.business.entity.production.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Getter
+@Setter
+public class ProductionOrderDetailVo {
+
+    private List<SkuSpec> skuSpecList;
+
+    private List<OrderPackage> packageList;
+
+
+    @Getter
+    @Setter
+    public static class SkuSpec {
+
+        private Long skuSpecId;
+
+        private String skuSpecCode;
+
+        private String skuSpecName;
+
+        private BigDecimal quantity;
+
+    }
+
+    @Getter
+    @Setter
+    public static class OrderPackage {
+
+        private Long bomSpecId;
+
+        private String bomSpecCode;
+
+        private String bomSpecName;
+
+        private BigDecimal quantity;
+
+        private BigDecimal costPrice;
+
+        private BigDecimal internalSellingPrice;
+
+    }
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/mapper/order/OrderPackageBomMapper.java

@@ -0,0 +1,17 @@
+package com.sd.business.mapper.order;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sd.business.entity.order.po.OrderPackageBom;
+
+
+/**
+ * <p>
+ * 订单sku bom 关联 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-07-24
+ */
+public interface OrderPackageBomMapper extends BaseMapper<OrderPackageBom> {
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/service/order/OrderPackageBomService.java

@@ -0,0 +1,17 @@
+package com.sd.business.service.order;
+
+import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.order.po.OrderPackageBom;
+
+
+/**
+ * <p>
+ * 订单sku bom 关联 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-07-24
+ */
+public interface OrderPackageBomService extends BaseService<OrderPackageBom> {
+
+}

+ 21 - 0
sd-business/src/main/java/com/sd/business/service/order/impl/OrderPackageBomServiceImpl.java

@@ -0,0 +1,21 @@
+package com.sd.business.service.order.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sd.business.entity.order.po.OrderPackageBom;
+import com.sd.business.mapper.order.OrderPackageBomMapper;
+import com.sd.business.service.order.OrderPackageBomService;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 订单sku bom 关联 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-07-24
+ */
+@Service
+public class OrderPackageBomServiceImpl extends ServiceImpl<OrderPackageBomMapper, OrderPackageBom> implements OrderPackageBomService {
+
+}

+ 13 - 0
sd-business/src/main/java/com/sd/business/service/production/ProductionOrderService.java

@@ -1,8 +1,11 @@
 package com.sd.business.service.production;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.sd.business.entity.production.dto.ProductionOrderDto;
+import com.sd.business.entity.production.dto.RapidPackagingDto;
 import com.sd.business.entity.production.dto.SetTagDto;
+import com.sd.business.entity.production.vo.ProductionOrderDetailVo;
 import com.sd.business.entity.production.vo.ProductionOrderVo;
 
 public interface ProductionOrderService {
@@ -17,4 +20,14 @@ public interface ProductionOrderService {
      */
     void setTag(SetTagDto dto);
 
+    /**
+     * 一件包装明细
+     */
+    ProductionOrderDetailVo detail(BaseSelectDto dto);
+
+    /**
+     * 一键包装
+     */
+    void rapidPackaging(RapidPackagingDto dto);
+
 }

+ 143 - 1
sd-business/src/main/java/com/sd/business/service/production/impl/ProductionOrderServiceImpl.java

@@ -2,25 +2,41 @@ package com.sd.business.service.production.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.BaseIdPo;
+import com.ruoyi.common.core.domain.BasePo;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.sd.business.entity.order.enums.OrderStatusEnum;
 import com.sd.business.entity.order.po.OrderInfo;
+import com.sd.business.entity.order.po.OrderPackageBom;
+import com.sd.business.entity.order.po.OrderSku;
 import com.sd.business.entity.production.dto.ProductionOrderDto;
+import com.sd.business.entity.production.dto.RapidPackagingDto;
 import com.sd.business.entity.production.dto.SetTagDto;
 import com.sd.business.entity.production.po.ProductionTask;
+import com.sd.business.entity.production.vo.ProductionOrderDetailVo;
 import com.sd.business.entity.production.vo.ProductionOrderScheduleVo;
 import com.sd.business.entity.production.vo.ProductionOrderVo;
+import com.sd.business.entity.sku.po.SkuSpecLink;
 import com.sd.business.mapper.production.ProductionOrderMapper;
+import com.sd.business.service.bom.BomSpecService;
+import com.sd.business.service.order.OrderPackageBomService;
 import com.sd.business.service.order.OrderService;
+import com.sd.business.service.order.OrderSkuService;
 import com.sd.business.service.production.ProductionOrderService;
 import com.sd.business.service.production.ProductionTaskService;
 import com.sd.business.service.sku.SkuService;
+import com.sd.business.service.sku.SkuSpecLinkService;
 import com.sd.business.service.sku.SkuSpecService;
+import com.sd.framework.util.Assert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -41,6 +57,18 @@ public class ProductionOrderServiceImpl implements ProductionOrderService {
     @Autowired
     private OrderService orderService;
 
+    @Autowired
+    private OrderSkuService orderSkuService;
+
+    @Autowired
+    private SkuSpecLinkService skuSpecLinkService;
+
+    @Autowired
+    private BomSpecService bomSpecService;
+
+    @Autowired
+    private OrderPackageBomService orderPackageBomService;
+
     @Override
     public Page<ProductionOrderVo> getPage(ProductionOrderDto dto) {
 
@@ -91,4 +119,118 @@ public class ProductionOrderServiceImpl implements ProductionOrderService {
         orderService.update(q -> q.in(BaseIdPo::getId, dto.getOrderIdList()).set(OrderInfo::getTag, dto.getTag()));
     }
 
+    @Override
+    public ProductionOrderDetailVo detail(BaseSelectDto dto) {
+        Long id = dto.getId();
+        Assert.notNull(id, "订单id不能为空");
+
+        List<ProductionOrderDetailVo.SkuSpec> skuSpecList = getSkuSpecList(id);
+        List<ProductionOrderDetailVo.OrderPackage> packageList = getPackageList(skuSpecList);
+
+        ProductionOrderDetailVo vo = new ProductionOrderDetailVo();
+        vo.setSkuSpecList(skuSpecList);
+        vo.setPackageList(packageList);
+        return vo;
+    }
+
+    @Override
+    public synchronized void rapidPackaging(RapidPackagingDto dto) {
+        Long orderId = dto.getOrderId();
+        OrderInfo orderInfo = orderService.getById(orderId);
+        if (!orderInfo.getStatus().equals(OrderStatusEnum.IN_PRODUCTION.getKey())) {
+            throw new ServiceException("订单已被处理");
+        }
+
+        List<OrderPackageBom> orderPackageBomList = dto.getPackageList();
+        orderPackageBomList.forEach(item -> item.setOrderId(orderId));
+        orderPackageBomService.saveBatch(orderPackageBomList);
+
+        orderService.update(q -> q
+                .eq(BaseIdPo::getId, orderId)
+                .set(OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                .set(BasePo::getUpdateTime, new Date())
+        );
+        
+    }
+
+    private List<ProductionOrderDetailVo.SkuSpec> getSkuSpecList(Long orderId) {
+
+        // 获取订单sku规格
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.eq(OrderSku::getOrderId, orderId));
+
+        // 相同订单sku规格合并,数量相加
+        List<ProductionOrderDetailVo.SkuSpec> skuSpecList = new ArrayList<>(
+                orderSkuList.stream()
+                        .map(item -> {
+                            ProductionOrderDetailVo.SkuSpec skuSpec = new ProductionOrderDetailVo.SkuSpec();
+                            skuSpec.setSkuSpecId(item.getSkuSpecId());
+                            skuSpec.setQuantity(item.getQuantity());
+                            return skuSpec;
+                        })
+                        .collect(Collectors.toMap(
+                                ProductionOrderDetailVo.SkuSpec::getSkuSpecId,
+                                Function.identity(),
+                                (v1, v2) -> {
+                                    v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                                    return v1;
+                                })
+                        ).values());
+
+        // 赋值订单sku规格品号以及品名
+        skuSpecService.attributeAssign(skuSpecList, ProductionOrderDetailVo.SkuSpec::getSkuSpecId, (item, skuSpec) -> {
+            item.setSkuSpecName(skuSpec.getName());
+            item.setSkuSpecCode(skuSpec.getCode());
+        });
+
+        return skuSpecList;
+    }
+
+    private List<ProductionOrderDetailVo.OrderPackage> getPackageList(List<ProductionOrderDetailVo.SkuSpec> skuSpecList) {
+        // 订单sku规格id 数量map
+        Map<Long, BigDecimal> map = skuSpecList.stream().collect(Collectors.toMap(
+                ProductionOrderDetailVo.SkuSpec::getSkuSpecId,
+                ProductionOrderDetailVo.SkuSpec::getQuantity
+        ));
+
+        // 获取订单sku规格包装列表
+        List<SkuSpecLink> list = skuSpecLinkService.list(q -> q
+                .eq(SkuSpecLink::getType, 2)
+                .eq(SkuSpecLink::getDepartmentId, SecurityUtils.getDeptId())
+                .in(SkuSpecLink::getSkuSpecId, map.keySet())
+        );
+
+        if (list.size() == 0) {
+            return Collections.emptyList();
+        }
+
+        // 同一包装合并数量
+        List<ProductionOrderDetailVo.OrderPackage> orderPackageList = new ArrayList<>(list.stream()
+                .map(item -> {
+                    ProductionOrderDetailVo.OrderPackage orderPackage = new ProductionOrderDetailVo.OrderPackage();
+                    BigDecimal quantity = map.get(item.getSkuSpecId());
+                    orderPackage.setBomSpecId(item.getBomSpecId());
+                    orderPackage.setQuantity(item.getQuantity().multiply(quantity));
+                    return orderPackage;
+                })
+                .collect(Collectors.toMap(
+                        ProductionOrderDetailVo.OrderPackage::getBomSpecId,
+                        Function.identity(),
+                        (v1, v2) -> {
+                            v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                            return v1;
+                        }
+                )).values());
+
+        // 赋值品名 品号 销售单价 成本价
+        bomSpecService.attributeAssign(orderPackageList, ProductionOrderDetailVo.OrderPackage::getBomSpecId, (item, bomSpec) -> {
+            item.setBomSpecCode(bomSpec.getCode());
+            item.setBomSpecName(bomSpec.getName());
+            item.setCostPrice(bomSpec.getCostPrice());
+            item.setInternalSellingPrice(bomSpec.getInternalSellingPrice());
+        });
+
+        return orderPackageList;
+    }
+
 }

+ 4 - 0
sd-business/src/main/resources/mapper/order/OrderPackageBomMapper.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sd.business.mapper.order.OrderPackageBomMapper">
+</mapper>