Explorar o código

销售合同添加出库

yzc hai 1 ano
pai
achega
e72df09f93

+ 26 - 0
hx-common/src/main/java/com/fjhx/common/enums/TaskDetailsStockStatus.java

@@ -0,0 +1,26 @@
+package com.fjhx.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum TaskDetailsStockStatus {
+
+    NO_IN_STOCK(0, "未入库"),
+    IN_STOCK_ING(5, "入库中"),
+    IN_STOCK(10, "已入库"),
+    OUT_STOCK_ING(15, "出库中"),
+    OUT_STOCK(20, "已出库");
+
+    /**
+     * 详细类型
+     */
+    private final Integer detailType;
+
+    /**
+     * 信息类型说明
+     */
+    private final String detailTypeRemark;
+
+}

+ 21 - 0
hx-jxst/src/main/java/com/fjhx/jxst/controller/sales/SalesContractController.java

@@ -3,6 +3,7 @@ package com.fjhx.jxst.controller.sales;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.jxst.entity.sales.dto.SalesContractDto;
 import com.fjhx.jxst.entity.sales.dto.SalesContractSelectDto;
+import com.fjhx.jxst.entity.sales.vo.SalesContractDetailsVo;
 import com.fjhx.jxst.entity.sales.vo.SalesContractVo;
 import com.fjhx.jxst.service.sales.SalesContractService;
 import com.ruoyi.common.core.domain.BaseSelectDto;
@@ -12,6 +13,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -60,4 +63,22 @@ public class SalesContractController {
         salesContractService.settle(dto);
     }
 
+    /**
+     * 销售出库分页
+     *
+     * @return
+     */
+    @PostMapping("/salesDeliveryList")
+    List<SalesContractDetailsVo> salesDeliveryList(@RequestBody SalesContractDto dto){
+        return salesContractService.salesDeliveryList(dto);
+    }
+
+    /**
+     * 销售出库
+     */
+    @PostMapping("/salesDelivery")
+    void salesDelivery(@RequestBody SalesContractDto dto){
+        salesContractService.salesDelivery(dto);
+    }
+
 }

+ 6 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/dto/SalesContractDto.java

@@ -2,6 +2,7 @@ package com.fjhx.jxst.entity.sales.dto;
 
 import com.fjhx.jxst.entity.sales.po.SalesContract;
 import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
+import com.fjhx.mes.entity.production.po.ProductionTaskDetail;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -22,4 +23,9 @@ public class SalesContractDto extends SalesContract {
      */
     List<SalesContractDetails> salesContractDetailsList;
 
+    /**
+     * 生产任务明细列表
+     */
+    List<ProductionTaskDetail> productionTaskDetailList;
+
 }

+ 7 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/vo/SalesContractDetailsVo.java

@@ -1,10 +1,12 @@
 package com.fjhx.jxst.entity.sales.vo;
 
 import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
+import com.fjhx.mes.entity.production.vo.ProductionTaskDetailVo;
 import lombok.Getter;
 import lombok.Setter;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 销售合同明细列表查询返回值实体
@@ -46,4 +48,9 @@ public class SalesContractDetailsVo extends SalesContractDetails {
      */
     private BigDecimal completionRate;
 
+    /**
+     * 生产任务明细列表
+     */
+    private List<ProductionTaskDetailVo> productionTaskDetailList;
+
 }

+ 13 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/sales/SalesContractService.java

@@ -1,6 +1,7 @@
 package com.fjhx.jxst.service.sales;
 
 import com.fjhx.jxst.entity.sales.po.SalesContract;
+import com.fjhx.jxst.entity.sales.vo.SalesContractDetailsVo;
 import com.fjhx.jxst.entity.statement.bo.SettlementBo;
 import com.ruoyi.common.core.service.BaseService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -8,6 +9,8 @@ import com.fjhx.jxst.entity.sales.vo.SalesContractVo;
 import com.fjhx.jxst.entity.sales.dto.SalesContractSelectDto;
 import com.fjhx.jxst.entity.sales.dto.SalesContractDto;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -53,4 +56,14 @@ public interface SalesContractService extends BaseService<SalesContract> {
      * 预算
      */
     void budget(SalesContractDto dto);
+
+    /**
+     * 销售出库分页
+     */
+    List<SalesContractDetailsVo> salesDeliveryList(SalesContractDto dto);
+
+    /**
+     * 销售出库
+     */
+    void salesDelivery(SalesContractDto dto);
 }

+ 102 - 3
hx-jxst/src/main/java/com/fjhx/jxst/service/sales/impl/SalesContractServiceImpl.java

@@ -12,6 +12,7 @@ import com.fjhx.area.utils.CustomizeAreaUtil;
 import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.common.entity.corporation.po.Corporation;
 import com.fjhx.common.enums.CodingRuleEnum;
+import com.fjhx.common.enums.TaskDetailsStockStatus;
 import com.fjhx.common.service.coding.CodingRuleService;
 import com.fjhx.common.service.corporation.CorporationService;
 import com.fjhx.common.utils.Assert;
@@ -30,7 +31,16 @@ import com.fjhx.jxst.entity.statement.bo.SettlementBo;
 import com.fjhx.jxst.mapper.sales.SalesContractMapper;
 import com.fjhx.jxst.service.sales.SalesContractDetailsService;
 import com.fjhx.jxst.service.sales.SalesContractService;
+import com.fjhx.mes.entity.production.po.ProductionTaskDetail;
+import com.fjhx.mes.entity.production.vo.ProductionTaskDetailVo;
+import com.fjhx.mes.service.production.ProductionTaskDetailService;
+import com.fjhx.wms.entity.stock.emums.StockWaitType;
+import com.fjhx.wms.entity.stock.po.StockWait;
+import com.fjhx.wms.entity.stock.po.StockWaitDetails;
+import com.fjhx.wms.service.stock.StockWaitDetailsService;
+import com.fjhx.wms.service.stock.StockWaitService;
 import com.ruoyi.common.core.domain.BasePo;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
@@ -72,6 +82,12 @@ public class SalesContractServiceImpl extends ServiceImpl<SalesContractMapper, S
     private CodingRuleService codingRuleService;
     @Autowired
     private ISysRoleService sysRoleService;
+    @Autowired
+    private StockWaitService stockWaitService;
+    @Autowired
+    private StockWaitDetailsService stockWaitDetailsService;
+    @Autowired
+    private ProductionTaskDetailService productionTaskDetailService;
 
     @Override
     public Page<SalesContractVo> getPage(SalesContractSelectDto dto) {
@@ -98,9 +114,9 @@ public class SalesContractServiceImpl extends ServiceImpl<SalesContractMapper, S
         DynamicDataSourceContextHolder.poll();
 
         //分页权限过滤(财务/管理员看所有,负责人看当前部门,部门总监看部门及子部门数据,其他人只能看自己)
-        if(!permissionList.contains("admin") && !permissionList.contains("finance")){
+        if (!permissionList.contains("admin") && !permissionList.contains("finance")) {
             List<Long> authUserIdList = UserUtil.getAuthUserIdList();
-            wrapper.in("sc",SalesContract::getCreateUser,authUserIdList);
+            wrapper.in("sc", SalesContract::getCreateUser, authUserIdList);
         }
 
         wrapper.orderByDesc("sc", SalesContract::getId);
@@ -202,7 +218,10 @@ public class SalesContractServiceImpl extends ServiceImpl<SalesContractMapper, S
     @DSTransactional
     @Override
     public void add(SalesContractDto salesContractDto) {
-        salesContractDto.setCode(codingRuleService.createCode(CodingRuleEnum.JXST_SALES_CONTRACT.getKey(), salesContractDto.getCustomerId()));
+        //只有在创建合同的时候 生成code
+        if(ObjectUtil.isEmpty(salesContractDto.getId())) {
+            salesContractDto.setCode(codingRuleService.createCode(CodingRuleEnum.JXST_SALES_CONTRACT.getKey(), salesContractDto.getCustomerId()));
+        }
         this.saveOrUpdate(salesContractDto);
 
         List<SalesContractDetails> salesContractDetailsList = salesContractDto.getSalesContractDetailsList();
@@ -329,4 +348,84 @@ public class SalesContractServiceImpl extends ServiceImpl<SalesContractMapper, S
         Assert.notEmpty(salesContract, "查询不到合同信息!");
         this.updateById(dto);
     }
+
+    /**
+     * 销售出库列表
+     */
+    @Override
+    public List<SalesContractDetailsVo> salesDeliveryList(SalesContractDto dto) {
+        List<SalesContractDetails> salesContractDetailsList = salesContractDetailsService.list(q -> q
+                .eq(SalesContractDetails::getSalesContractId, dto.getId())
+        );
+        List<SalesContractDetailsVo> salesContractDetailsVos = BeanUtil.copyToList(salesContractDetailsList, SalesContractDetailsVo.class);
+        //赋值产品信息
+        productInfoService.attributeAssign(salesContractDetailsVos, SalesContractDetailsVo::getProductId, (item, productInfo) -> {
+            item.setProductName(productInfo.getName());
+            item.setProductSpec(productInfo.getSpec());
+        });
+
+        //获取任务明细
+        List<Long> scdIds = salesContractDetailsVos.stream().map(SalesContractDetails::getId).collect(Collectors.toList());
+        List<ProductionTaskDetail> productionTaskDetailList = productionTaskDetailService.list(q -> q.in(ProductionTaskDetail::getContractDetailsId, scdIds));
+        List<ProductionTaskDetailVo> productionTaskDetailVos = BeanUtil.copyToList(productionTaskDetailList, ProductionTaskDetailVo.class);
+        Map<Long, List<ProductionTaskDetailVo>> salesDeliveryMap = productionTaskDetailVos.stream().collect(Collectors.groupingBy(ProductionTaskDetailVo::getProductId));
+
+        for (SalesContractDetailsVo salesContractDetailsVo : salesContractDetailsVos) {
+            List<ProductionTaskDetailVo> list = salesDeliveryMap.get(salesContractDetailsVo.getProductId());
+            salesContractDetailsVo.setProductionTaskDetailList(list);
+        }
+
+        return salesContractDetailsVos;
+    }
+
+    /**
+     * 销售出库
+     */
+    @Override
+    @DSTransactional
+    public synchronized void salesDelivery(SalesContractDto dto) {
+        List<ProductionTaskDetail> productionTaskDetailList = dto.getProductionTaskDetailList();
+        if(ObjectUtil.isEmpty(productionTaskDetailList)){
+            return;
+        }
+
+        StockWait stockWait = new StockWait();
+        stockWait.setType(2);
+        stockWait.setStatus(0);
+        stockWait.setBusinessId(dto.getId());
+        //销售出库
+        stockWait.setBusinessType(StockWaitType.CONTRACT_SALE_OUT.getDetailType());
+        stockWaitService.save(stockWait);
+
+        //更新状态
+        List<Long> ptdIds = productionTaskDetailList.stream().map(ProductionTaskDetail::getId).collect(Collectors.toList());
+
+        //检查并发
+        List<ProductionTaskDetail> neList = productionTaskDetailService.list(q -> q
+                .in(ProductionTaskDetail::getId, ptdIds)
+                .ne(ProductionTaskDetail::getStockStatus, TaskDetailsStockStatus.IN_STOCK.getDetailType())
+        );
+        String neSnList = neList.stream().map(ProductionTaskDetail::getProductSn).collect(Collectors.joining(","));
+        if(neList.size()>0){
+            throw new ServiceException(String.format("列表中以下产品已经被操作:%s,请刷新后重试!!!",neSnList));
+        }
+
+        //更新状态
+        productionTaskDetailService.update(q->q
+                .in(ProductionTaskDetail::getId, ptdIds)
+                .set(ProductionTaskDetail::getStockStatus,TaskDetailsStockStatus.OUT_STOCK_ING.getDetailType())
+        );
+
+        List<StockWaitDetails> stockWaitDetailsList = new ArrayList<>();
+        for (ProductionTaskDetail productionTaskDetail : productionTaskDetailList) {
+            StockWaitDetails stockWaitDetails = new StockWaitDetails();
+            stockWaitDetails.setStockWaitId(stockWait.getId());
+            stockWaitDetails.setProductId(productionTaskDetail.getProductId());
+            stockWaitDetails.setQuantity(BigDecimal.ONE);
+            stockWaitDetails.setBusinessDetailsId(productionTaskDetail.getId());
+            stockWaitDetailsList.add(stockWaitDetails);
+        }
+
+        stockWaitDetailsService.saveBatch(stockWaitDetailsList);
+    }
 }

+ 6 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/production/po/ProductionTaskDetail.java

@@ -97,4 +97,10 @@ public class ProductionTaskDetail extends BasePo {
      */
     private Long contractDetailsId;
 
+    /**
+     * 库存状态 0未入库 5入库中 10已入库 15出库中 20已出库
+     * TaskDetailsStockStatus
+     */
+    private Integer stockStatus;
+
 }

+ 6 - 0
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionTaskDetailServiceImpl.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.common.enums.PushBusinessTypeEnum;
+import com.fjhx.common.enums.TaskDetailsStockStatus;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.customer.entity.customer.po.Customer;
 import com.fjhx.customer.service.customer.CustomerService;
@@ -291,6 +292,10 @@ public class ProductionTaskDetailServiceImpl extends ServiceImpl<ProductionTaskD
 
         //设置当前工序状态完成
         productionTaskDetail.setProcessesStatus(3);
+
+        //修改状态未入库中
+        productionTaskDetail.setStockStatus(TaskDetailsStockStatus.IN_STOCK_ING.getDetailType());
+
         this.updateById(productionTaskDetail);
 
         //保存附件
@@ -313,6 +318,7 @@ public class ProductionTaskDetailServiceImpl extends ServiceImpl<ProductionTaskD
         stockWaitDetails.setStockWaitId(stockWait.getId());
         stockWaitDetails.setProductId(productionTaskDetail.getProductId());
         stockWaitDetails.setQuantity(BigDecimal.ONE);//生产任务明细入库 数量默认只有1
+        stockWaitDetails.setProductionTaskDetailId(productionTaskDetail.getId());
         stockWaitDetailsService.save(stockWaitDetails);
     }
 

+ 1 - 1
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionTaskServiceImpl.java

@@ -254,7 +254,7 @@ public class ProductionTaskServiceImpl extends ServiceImpl<ProductionTaskMapper,
                 Long stockFrozenId = stockFrozen.getId();
                 stockFrozenService.update(q -> q
                         .eq(StockFrozen::getId, stockFrozenId)
-                        .setSql("frozen_quantity = frozen_quantity" + multiply)
+                        .setSql("frozen_quantity = frozen_quantity + " + multiply)
                 );
             }
         }

+ 2 - 1
hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/JournalType.java

@@ -30,7 +30,8 @@ public enum JournalType {
     PRODUCTION_TASK_OUT(InOutType.OUT, 20, "生产任务待出库出库", "production_task"),
     WORD_ORDER_OUT(InOutType.OUT, 21, "工单出库待出库出库", "work_order"),
     STOCK_CHECK_IN(InOutType.IN, 22, "库存盘点修正入库", "stock_check"),
-    STOCK_CHECK_OUT(InOutType.OUT, 23, "库存盘点修正出库", "stock_check")
+    STOCK_CHECK_OUT(InOutType.OUT, 23, "库存盘点修正出库", "stock_check"),
+    CONTRACT_SALE_OUT(InOutType.OUT, 24, "合同销售出库", "")
     ;
 
 

+ 2 - 1
hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/StockWaitType.java

@@ -17,7 +17,8 @@ public enum StockWaitType {
     SALES_RETURN_IN(InOutType.IN, 8, "售后退货入库", "after_sales"),
     SALES_REPLACE_IN(InOutType.IN, 9, "售后换货入库", "after_sales"),
     SALES_REPLACE_OUT(InOutType.OUT, 10, "售后换货出库", "after_sales"),
-    WORD_ORDER_OUT(InOutType.OUT, 11, "工单直接出库出库", "work_order");
+    WORD_ORDER_OUT(InOutType.OUT, 11, "工单直接出库出库", "work_order"),
+    CONTRACT_SALE_OUT(InOutType.OUT, 12, "合同销售出库", "");
 
 
     /**

+ 5 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/StockWaitDetails.java

@@ -64,4 +64,9 @@ public class StockWaitDetails extends BasePo {
      * 采购明细id
      */
     private Long purchaseDetailId;
+
+    /**
+     * 生产任务明细id
+     */
+    private Long productionTaskDetailId;
 }

+ 5 - 0
hx-wms/src/main/java/com/fjhx/wms/mapper/stock/StockWaitMapper.java

@@ -31,4 +31,9 @@ public interface StockWaitMapper extends BaseMapper<StockWait> {
 
     PurchaseDetailPo getPurchaseDetail(@Param("ew") IWrapper<Object> wrapper);
 
+    /**
+     * 修改生产任务明细状态
+     */
+    void updateProductionTaskDetailStatus(@Param("productionTaskDetailId")Long productionTaskDetailId,@Param("stockStatus")Integer stockStatus);
+
 }

+ 20 - 1
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitServiceImpl.java

@@ -4,9 +4,11 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.enums.TaskDetailsStockStatus;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
@@ -225,7 +227,7 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
             );
 
             //生产任务待出库(物料出库解冻冻结库存)
-            if (StockWaitType.PRODUCTION_TASK_OUT.getDetailType().equals(stockWait.getType())) {
+            if (StockWaitType.PRODUCTION_TASK_OUT.getDetailType().equals(stockWait.getBusinessType())) {
                 //减少冻结库存
                 StockFrozen stockFrozen = stockFrozenService.getOne(q -> q.eq(StockFrozen::getProductId, productId));
                 stockFrozenService.update(q -> q
@@ -235,6 +237,20 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
                         .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
                 );
             }
+            //完工入库
+            if (StockWaitType.COMPLETION_IN.getDetailType().equals(stockWait.getBusinessType())) {
+                //修改生产任务明细的状态为已入库
+                DynamicDataSourceContextHolder.push(SourceConstant.MES);
+                baseMapper.updateProductionTaskDetailStatus(stockWaitDetails1.getProductionTaskDetailId(), TaskDetailsStockStatus.IN_STOCK.getDetailType());
+                DynamicDataSourceContextHolder.poll();
+            }
+            //合同销售出库
+            if (StockWaitType.CONTRACT_SALE_OUT.getDetailType().equals(stockWait.getBusinessType())) {
+                //修改生产任务明细的状态为已出库
+                DynamicDataSourceContextHolder.push(SourceConstant.MES);
+                baseMapper.updateProductionTaskDetailStatus(stockWaitDetails1.getProductionTaskDetailId(), TaskDetailsStockStatus.OUT_STOCK.getDetailType());
+                DynamicDataSourceContextHolder.poll();
+            }
         }
     }
 
@@ -385,6 +401,9 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
         } else if (StockWaitType.WORD_ORDER_OUT.getDetailType().equals(businessType)) {
             //工单待出库出库
             return JournalType.WORD_ORDER_OUT;
+        } else if (StockWaitType.CONTRACT_SALE_OUT.getDetailType().equals(businessType)) {
+            //合同销售出库待出库出库
+            return JournalType.CONTRACT_SALE_OUT;
         } else {
             throw new ServiceException("未知待出入库业务类型");
         }

+ 4 - 0
hx-wms/src/main/resources/mapper/stock/StockWaitMapper.xml

@@ -54,4 +54,8 @@
             ${ew.customSqlSegment}
     </select>
 
+    <update id="updateProductionTaskDetailStatus">
+        update production_task_detail ptd set stock_status = #{stockStatus} where ptd.id = #{productionTaskDetailId}
+    </update>
+
 </mapper>