Browse Source

销售出库

yzc 1 năm trước cách đây
mục cha
commit
0298e71f03

+ 8 - 1
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java

@@ -264,11 +264,18 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         }
         result.setProductCustomInfoList(productCustomInfoVos);
 
-        //赋值属性原材料名称
+        //赋值属性原材料名称
         this.attributeAssign(Arrays.asList(result), ProductInfo::getAttrRawMaterialId, (item, product) -> {
             item.setAttrRawMaterialName(product.getName());
         });
 
+        //赋值产品原材料信息
+        this.attributeAssign(Arrays.asList(result), ProductInfo::getRawMaterialId, (item, product) -> {
+            item.setRawMaterialCode(product.getCustomCode());
+            item.setRawMaterialName(product.getName());
+        });
+
+
         return result;
     }
 

+ 2 - 2
hx-sale/src/main/java/com/fjhx/sale/controller/contract/ContractController.java

@@ -350,8 +350,8 @@ public class ContractController {
      * 销售出库
      */
     @PostMapping("/saleOutbound")
-    public void saleOutbound(@RequestBody ContractSelectDto dto) {
-        contractService.saleOutbound(dto.getId());
+    public void saleOutbound(@RequestBody ContractDto dto) {
+        contractService.saleOutbound(dto);
     }
 
     /**

+ 5 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractDto.java

@@ -102,4 +102,9 @@ public class ContractDto extends Contract implements SetCustomizeAreaId {
      * 合同产品BOM
      */
     private List<ContractProductBom> contractProductBomList;
+
+    /**
+     * 特批出库
+     */
+    private Boolean specialOutbound;
 }

+ 5 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/vo/ContractVo.java

@@ -227,5 +227,10 @@ public class ContractVo extends Contract {
      */
     private Date prodDeliveryPeriod;
 
+    /**
+     * 出货金额
+     */
+    private BigDecimal shipmentAmount;
+
 }
 

+ 0 - 9
hx-sale/src/main/java/com/fjhx/sale/flow/ContractFlow.java

@@ -11,9 +11,6 @@ import com.fjhx.flow.enums.FlowStatusEnum;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
 import com.fjhx.sale.entity.contract.dto.ContractProductDto;
 import com.fjhx.sale.entity.contract.po.Contract;
-import com.fjhx.sale.service.contract.ContractProductBomService;
-import com.fjhx.sale.service.contract.ContractProductService;
-import com.fjhx.sale.service.contract.ContractProjectService;
 import com.fjhx.sale.service.contract.ContractService;
 import com.ruoyi.common.annotation.LogicIgnore;
 import com.ruoyi.common.core.domain.BasePo;
@@ -39,12 +36,6 @@ public class ContractFlow extends FlowDelegate {
     private CodingRuleService codingRuleService;
     @Autowired
     private ContractService contractService;
-    @Autowired
-    private ContractProductService contractProductService;
-    @Autowired
-    private ContractProjectService contractProjectService;
-    @Autowired
-    private ContractProductBomService contractProductBomService;
 
     @Override
     public String getFlowKey() {

+ 37 - 0
hx-sale/src/main/java/com/fjhx/sale/flow/SalesOutboundApprovedFlow.java

@@ -0,0 +1,37 @@
+package com.fjhx.sale.flow;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.flow.core.FlowDelegate;
+import com.fjhx.sale.entity.contract.dto.ContractDto;
+import com.fjhx.sale.entity.contract.po.Contract;
+import com.fjhx.sale.service.contract.ContractService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SalesOutboundApprovedFlow extends FlowDelegate {
+    @Autowired
+    private ContractService contractService;
+
+    @Override
+    public String getFlowKey() {
+        return "sales_outbound_approved_flow";
+    }
+
+    @Override
+    public Long start(Long flowId, JSONObject submitData) {
+        Long id = submitData.getLong("id");
+        Contract contract = contractService.getById(id);
+        //将code赋值给流程引擎
+        submitData.put("code", contract.getCode());
+        return id;
+    }
+
+    @Override
+    public void end(Long flowId, Long businessId, JSONObject submitData) {
+        ContractDto contractDto = submitData.toJavaObject(ContractDto.class);
+        //特批无需校验金额
+        contractDto.setSpecialOutbound(true);
+        contractService.saleOutbound(contractDto);
+    }
+}

+ 12 - 3
hx-sale/src/main/java/com/fjhx/sale/mapper/contract/ContractMapper.java

@@ -40,7 +40,7 @@ public interface ContractMapper extends BaseMapper<Contract> {
     /**
      * 外销合同表分页
      */
-    Map<String,Object> getHeadStatistic(@Param("ew") IWrapper<Contract> wrapper);
+    Map<String, Object> getHeadStatistic(@Param("ew") IWrapper<Contract> wrapper);
 
     /**
      * 利润预算表
@@ -49,6 +49,7 @@ public interface ContractMapper extends BaseMapper<Contract> {
 
     /**
      * 利润预算表头部统计
+     *
      * @param wrapper
      * @return
      */
@@ -61,25 +62,30 @@ public interface ContractMapper extends BaseMapper<Contract> {
 
     /**
      * 根据客户ID查询未包装的订单
+     *
      * @param customerId
      * @return
      */
-    List<ContractVo> getNoPackContractByCustomerId(@Param("customerId")String customerId);
+    List<ContractVo> getNoPackContractByCustomerId(@Param("customerId") String customerId);
 
     /**
      * 查询销售额(合同总金额)
+     *
      * @param id (买方公司ID)
      */
     ContractVo getSalesTotal(Long id);
 
     /**
      * 查询销售额明细
+     *
      * @param id
      * @return
      */
-    Page<ContractVo> getSalesTotalList(@Param("page") Page<Object> page,Long id);
+    Page<ContractVo> getSalesTotalList(@Param("page") Page<Object> page, Long id);
+
     /**
      * 查询指定客户的每月合同总额
+     *
      * @param dto
      */
     @TenantIgnore
@@ -87,6 +93,7 @@ public interface ContractMapper extends BaseMapper<Contract> {
 
     /**
      * 查询成交单统计(合同)
+     *
      * @param query
      * @return
      */
@@ -175,4 +182,6 @@ public interface ContractMapper extends BaseMapper<Contract> {
 
     void setProdTaskProdStatusByContractId(Long contractId, Integer produceStatus);
 
+    ContractVo detail(Long id);
+
 }

+ 1 - 1
hx-sale/src/main/java/com/fjhx/sale/service/contract/ContractService.java

@@ -252,7 +252,7 @@ public interface ContractService extends BaseService<Contract> {
     /**
      * 销售出库
      */
-    void saleOutbound(Long id);
+    void saleOutbound(ContractDto dto);
 
     /**
      * 生产终止

+ 40 - 13
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java

@@ -112,7 +112,6 @@ import org.springframework.web.bind.annotation.RequestBody;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -132,8 +131,6 @@ import java.util.stream.Collectors;
 public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
         implements ContractService, GetDocumentaryBusinessTemplate {
 
-    private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MMM/yyyy", Locale.ENGLISH);
-
     @Qualifier(ThreadPoolConfig.threadPoolTaskExecutor)
     @Autowired
     private ThreadPoolExecutor threadPoolExecutor;
@@ -2404,7 +2401,9 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
             @Override
             public Long getCityId() {
                 return contractDto.getBuyCityId();
-            }            @Override
+            }
+
+            @Override
             public void setProvinceId(Long provinceId) {
                 contractDto.setBuyProvinceId(provinceId);
             }
@@ -2415,7 +2414,6 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
             }
 
 
-
             @Override
             public void setCityId(Long cityId) {
                 contractDto.setBuyCityId(cityId);
@@ -2444,7 +2442,9 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
             @Override
             public Long getCityId() {
                 return contractDto.getSellCityId();
-            }            @Override
+            }
+
+            @Override
             public void setProvinceId(Long provinceId) {
                 contractDto.setSellProvinceId(provinceId);
             }
@@ -2455,7 +2455,6 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
             }
 
 
-
             @Override
             public void setCityId(Long cityId) {
                 contractDto.setSellCityId(cityId);
@@ -3062,7 +3061,16 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
 
     @DSTransactional
     @Override
-    public void saleOutbound(Long id) {
+    public void saleOutbound(ContractDto dto) {
+        Long id = dto.getId();
+        List<ContractProductDto> productDtoList = dto.getContractProductList();
+        //补充数据
+        for (ContractProductDto contractProductDto : productDtoList) {
+            ContractProduct byId = contractProductService.getById(contractProductDto.getId());
+            contractProductDto.setProductId(byId.getProductId());
+            contractProductDto.setPrice(byId.getPrice());
+        }
+
         //修改订单出库状态
         this.update(q -> q
                 .eq(Contract::getId, id)
@@ -3075,11 +3083,25 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
         //修改生产订单出库状态为出库中
         stockWaitDetailsMapper.updateOrderStatusByContractId(id, 5);
 
-        Contract contract = this.getById(id);
+        ContractVo contract = baseMapper.detail(id);
         Assert.notEmpty(contract, "查询不到销售订单信息!");
 
-        List<ContractProduct> productionOrderDetailList = contractProductService
-                .list(q -> q.eq(ContractProduct::getContractId, id));
+        //校验是否能出货(非特批校验,特批跳过)
+        if (ObjectUtil.isEmpty(dto.getSpecialOutbound()) || !dto.getSpecialOutbound()) {
+            //数量*(1-预付比例%)*单价<=(累计收款金额-预付款金额)-已出货金额
+            //预付比例-小数
+            BigDecimal multiply = new BigDecimal(contract.getAdvanceRatio()).multiply(BigDecimal.valueOf(0.01));
+            //剩下比例-小数
+            BigDecimal subtract = BigDecimal.ONE.subtract(multiply);
+            //(累计收款金额-预付款金额)-已出货金额
+            BigDecimal subtract2 = contract.getSumClaimMoney().subtract(contract.getAmount().multiply(multiply)).subtract(contract.getShipmentAmount());
+            for (ContractProduct productDto : productDtoList) {
+                BigDecimal multiply1 = productDto.getQuantity().multiply(subtract).multiply(productDto.getPrice());
+                if (multiply1.compareTo(subtract2) > 0) {
+                    throw new ServiceException(String.format("收款金额不满足出货条件,至少需再收款%s %s 才能出货!", contract.getCurrency(), multiply1.subtract(subtract2)));
+                }
+            }
+        }
 
         //生成待出库数据
         StockWait stockWait = new StockWait();
@@ -3093,11 +3115,16 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
         stockWaitService.save(stockWait);
 
         List<StockWaitDetails> stockWaitDetailsList = new ArrayList<>();
-        for (ContractProduct contractProduct : productionOrderDetailList) {
+        for (ContractProductDto contractProduct : productDtoList) {
+            BigDecimal quantity = contractProduct.getQuantity();
+            //跳过出库数量为空||出库数量为0
+            if (ObjectUtil.isEmpty(quantity) || quantity.compareTo(BigDecimal.ZERO) <= 0) {
+                continue;
+            }
             StockWaitDetails stockWaitDetails = new StockWaitDetails();
             stockWaitDetails.setStockWaitId(stockWait.getId());
             stockWaitDetails.setProductId(contractProduct.getProductId());
-            stockWaitDetails.setQuantity(contractProduct.getQuantity());
+            stockWaitDetails.setQuantity(quantity);
             stockWaitDetails.setReceiptQuantity(BigDecimal.ZERO);
             stockWaitDetails.setBusinessDetailsId(contractProduct.getId());
             stockWaitDetails.setContractDetailId(contractProduct.getId());

+ 12 - 0
hx-sale/src/main/resources/mapper/contract/ContractMapper.xml

@@ -614,4 +614,16 @@
         WHERE contract_id = #{contractId}
     </update>
 
+    <select id="detail" resultType="com.fjhx.sale.entity.contract.vo.ContractVo">
+        SELECT c.*,
+               sum(cc.contract_money)        as sumClaimMoney,
+               (SELECT IFNULL(sum(swd.receipt_quantity * cp.price), 0)
+                FROM contract_product cp
+                         LEFT JOIN stock_wait_details swd ON swd.contract_detail_id = cp.id
+                WHERE cp.contract_id = c.id) AS shipmentAmount
+        FROM contract c
+                 LEFT JOIN claim_contract cc ON cc.contract_id = c.id
+        WHERE c.id = #{id}
+    </select>
+
 </mapper>