Преглед на файлове

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	hx-customer/src/main/java/com/fjhx/customer/service/customer/impl/CustomerServiceImpl.java
#	hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractDto.java
#	hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java
24282 преди 2 години
родител
ревизия
e54a5b2533
променени са 78 файла, в които са добавени 1725 реда и са изтрити 213 реда
  1. 17 0
      code/src/test/java/JxstDataSource.java
  2. 168 0
      hx-account/src/main/java/com/fjhx/account/entity/account/dto/FundAccount.java
  3. 5 0
      hx-admin/pom.xml
  4. 4 0
      hx-admin/src/main/resources/application-dev.yml
  5. 4 0
      hx-admin/src/main/resources/application-test.yml
  6. 2 0
      hx-common/src/main/java/com/fjhx/common/constant/SourceConstant.java
  7. 13 2
      hx-customer/src/main/java/com/fjhx/customer/controller/customer/CustomerController.java
  8. 10 0
      hx-customer/src/main/java/com/fjhx/customer/entity/customer/dto/CustomerSelectDto.java
  9. 15 2
      hx-customer/src/main/java/com/fjhx/customer/entity/customer/po/Customer.java
  10. 6 0
      hx-customer/src/main/java/com/fjhx/customer/mapper/customer/CustomerMapper.java
  11. 10 0
      hx-customer/src/main/java/com/fjhx/customer/service/customer/CustomerService.java
  12. 71 1
      hx-customer/src/main/java/com/fjhx/customer/service/customer/impl/CustomerServiceImpl.java
  13. 3 0
      hx-customer/src/main/resources/mapper/customer/CustomerMapper.xml
  14. 35 0
      hx-jxst/pom.xml
  15. 52 0
      hx-jxst/src/main/java/com/fjhx/jxst/controller/sales/SalesContractController.java
  16. 19 0
      hx-jxst/src/main/java/com/fjhx/jxst/controller/sales/SalesContractDetailsController.java
  17. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/dto/SalesContractDetailsDto.java
  18. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/dto/SalesContractDetailsSelectDto.java
  19. 25 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/dto/SalesContractDto.java
  20. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/dto/SalesContractSelectDto.java
  21. 57 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/po/SalesContract.java
  22. 48 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/po/SalesContractDetails.java
  23. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/vo/SalesContractDetailsVo.java
  24. 29 0
      hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/vo/SalesContractVo.java
  25. 54 0
      hx-jxst/src/main/java/com/fjhx/jxst/flow/SalesContractFlow.java
  26. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/mapper/sales/SalesContractDetailsMapper.java
  27. 26 0
      hx-jxst/src/main/java/com/fjhx/jxst/mapper/sales/SalesContractMapper.java
  28. 17 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/sales/SalesContractDetailsService.java
  29. 36 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/sales/SalesContractService.java
  30. 21 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/sales/impl/SalesContractDetailsServiceImpl.java
  31. 70 0
      hx-jxst/src/main/java/com/fjhx/jxst/service/sales/impl/SalesContractServiceImpl.java
  32. 4 0
      hx-jxst/src/main/resources/mapper/sales/SalesContractDetailsMapper.xml
  33. 22 0
      hx-jxst/src/main/resources/mapper/sales/SalesContractMapper.xml
  34. 16 0
      hx-mes/src/main/java/com/fjhx/mes/controller/bom/BomInfoController.java
  35. 8 5
      hx-mes/src/main/java/com/fjhx/mes/controller/technology/TechnologyController.java
  36. 6 0
      hx-mes/src/main/java/com/fjhx/mes/entity/bom/dto/BomInfoDto.java
  37. 8 4
      hx-mes/src/main/java/com/fjhx/mes/entity/technology/dto/TechnologyDto.java
  38. 1 1
      hx-mes/src/main/java/com/fjhx/mes/entity/work/po/WorkOrder.java
  39. 10 0
      hx-mes/src/main/java/com/fjhx/mes/service/bom/BomInfoService.java
  40. 16 0
      hx-mes/src/main/java/com/fjhx/mes/service/bom/impl/BomInfoServiceImpl.java
  41. 3 0
      hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionPlanServiceImpl.java
  42. 78 18
      hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionTaskServiceImpl.java
  43. 5 6
      hx-mes/src/main/java/com/fjhx/mes/service/technology/TechnologyService.java
  44. 37 36
      hx-mes/src/main/java/com/fjhx/mes/service/technology/impl/TechnologyServiceImpl.java
  45. 70 8
      hx-mes/src/main/java/com/fjhx/mes/service/work/impl/WorkOrderServiceImpl.java
  46. 18 1
      hx-sale/src/main/java/com/fjhx/sale/controller/contract/ContractController.java
  47. 9 1
      hx-sale/src/main/java/com/fjhx/sale/controller/sample/SampleController.java
  48. 7 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractDto.java
  49. 7 1
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/Contract.java
  50. 13 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/vo/ContractVo.java
  51. 9 2
      hx-sale/src/main/java/com/fjhx/sale/entity/sample/po/Sample.java
  52. 16 1
      hx-sale/src/main/java/com/fjhx/sale/entity/sample/vo/SampleVo.java
  53. 4 1
      hx-sale/src/main/java/com/fjhx/sale/flow/ContractFlow.java
  54. 5 1
      hx-sale/src/main/java/com/fjhx/sale/flow/SampleFlow.java
  55. 2 0
      hx-sale/src/main/java/com/fjhx/sale/mapper/contract/ContractMapper.java
  56. 2 2
      hx-sale/src/main/java/com/fjhx/sale/service/commission/impl/CommissionServiceImpl.java
  57. 9 0
      hx-sale/src/main/java/com/fjhx/sale/service/contract/ContractService.java
  58. 102 48
      hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java
  59. 5 1
      hx-sale/src/main/java/com/fjhx/sale/service/sample/SampleService.java
  60. 50 13
      hx-sale/src/main/java/com/fjhx/sale/service/sample/impl/SampleServiceImpl.java
  61. 10 0
      hx-sale/src/main/resources/mapper/contract/ContractMapper.xml
  62. 19 0
      hx-wms/src/main/java/com/fjhx/wms/controller/stock/StockFrozenController.java
  63. 17 0
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/dto/StockFrozenDto.java
  64. 17 0
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/dto/StockFrozenSelectDto.java
  65. 2 1
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/JournalType.java
  66. 2 2
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/StockWaitType.java
  67. 16 5
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/Stock.java
  68. 33 0
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/StockFrozen.java
  69. 17 0
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/vo/StockFrozenVo.java
  70. 17 0
      hx-wms/src/main/java/com/fjhx/wms/mapper/stock/StockFrozenMapper.java
  71. 17 0
      hx-wms/src/main/java/com/fjhx/wms/service/stock/StockFrozenService.java
  72. 21 0
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockFrozenServiceImpl.java
  73. 10 0
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java
  74. 19 7
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitDetailsServiceImpl.java
  75. 50 42
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitServiceImpl.java
  76. 4 0
      hx-wms/src/main/resources/mapper/stock/StockFrozenMapper.xml
  77. 3 1
      hx-wms/src/main/resources/mapper/stock/StockMapper.xml
  78. 7 0
      pom.xml

+ 17 - 0
code/src/test/java/JxstDataSource.java

@@ -0,0 +1,17 @@
+import fly.generator.GeneratorApplication;
+
+public class JxstDataSource {
+
+    public static void main(String[] args) {
+        GeneratorApplication.builder()
+                .url("jdbc:mysql://36.134.91.96:17330/bytesailing_jxst?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true")
+                .username("fjhx2012mysql")
+                .password("3PN-Mzn#vnP&q6d")
+                .port(9989)
+                .module("hx-jxst")
+                .parent("com.fjhx.jxst")
+                .superServiceClass("com.ruoyi.common.core.service.BaseService")
+                .build();
+    }
+
+}

+ 168 - 0
hx-account/src/main/java/com/fjhx/account/entity/account/dto/FundAccount.java

@@ -0,0 +1,168 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.account.entity.account.dto;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 资金账户管理表实体类
+ *
+ * @author BladeX
+ * @since 2022-07-05
+ */
+@Data
+@TableName("t_erp_fund_account")
+
+public class FundAccount{
+
+    private static final long serialVersionUID = 1L;
+
+    private String id;
+    /**
+     * 公司ID
+     */
+    private String companyId;
+
+    /**
+     * 账号名
+     */
+    private String name;
+
+    /**
+     * 账号
+     */
+    private String accountNumber;
+
+    /**
+     * 人民币余额
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal rmbAmount;
+
+    /**
+     * 美元余额
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal dollarAmount;
+
+    /**
+     * 欧元余额
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal euroAmount;
+
+    /**
+     * 英镑余额
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal sterlingAmount;
+
+    /**
+     * 美元汇率
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal dollarExchange;
+
+    /**
+     * 欧元汇率
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal euroExchange;
+
+    /**
+     * 英镑汇率
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal sterlingExchange;
+
+    /**
+     * 备注
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String remark;
+
+    /**
+     * 是否删除。 0:否。  1 是
+     */
+    private Integer delFleg;
+
+    /**
+     * 租户ID
+     */
+    private String tenantId;
+
+    /**
+     * 人民币初始化
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal rmb;
+
+    /**
+     * 欧元初始化
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal euro;
+
+    /**
+     * 美元初始化
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal dollar;
+
+    /**
+     * 英镑初始化
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal sterling;
+
+    /**
+     * 公司名称
+     */
+    @TableField(exist = false)
+    private String companyName;
+
+
+    /**
+     * 公司ID
+     */
+    private String createUser;
+
+    /**
+     * 账号名
+     */
+    private Date createTime;
+
+    /**
+     * 账号
+     */
+    private String updateUser;
+
+    /**
+     * 账号
+     */
+    private Date updateTime;
+
+
+
+}

+ 5 - 0
hx-admin/pom.xml

@@ -90,6 +90,11 @@
         </dependency>
 
         <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>hx-jxst</artifactId>
+        </dependency>
+
+        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>

+ 4 - 0
hx-admin/src/main/resources/application-dev.yml

@@ -77,6 +77,10 @@ spring:
                     url: jdbc:mysql://36.134.91.96:17330/yf_new?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
                     username: fjhx2012mysql
                     password: 3PN-Mzn#vnP&q6d
+                jxst:
+                    url: jdbc:mysql://36.134.91.96:17330/bytesailing_jxst?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
+                    username: fjhx2012mysql
+                    password: 3PN-Mzn#vnP&q6d
 
     # redis 配置
     redis:

+ 4 - 0
hx-admin/src/main/resources/application-test.yml

@@ -73,6 +73,10 @@ spring:
                     url: jdbc:mysql://127.0.0.1:17330/bytesailing_ehsd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
                     username: fjhx2012mysql
                     password: 3PN-Mzn#vnP&q6d
+                jxst:
+                    url: jdbc:mysql://127.0.0.1:17330/bytesailing_jxst?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
+                    username: fjhx2012mysql
+                    password: 3PN-Mzn#vnP&q6d
 
     # redis 配置
     redis:

+ 2 - 0
hx-common/src/main/java/com/fjhx/common/constant/SourceConstant.java

@@ -44,4 +44,6 @@ public interface SourceConstant {
      */
     String DATA = "data";
 
+    String JXST = "jxsr";
+
 }

+ 13 - 2
hx-customer/src/main/java/com/fjhx/customer/controller/customer/CustomerController.java

@@ -14,6 +14,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.Map;
+
 /**
  * <p>
  * 客户表 前端控制器
@@ -84,8 +86,8 @@ public class CustomerController {
      * 客户分配
      */
     @PostMapping("/CustomerAllocation")
-    public void CustomerAllocation(@RequestBody CustomerDto dto) {
-        customerService.updateById(dto);
+    public void customerAllocation(@RequestBody CustomerDto dto) {
+        customerService.customerAllocation(dto);
     }
 
     /**
@@ -95,4 +97,13 @@ public class CustomerController {
     public void editTag(@RequestBody CustomerDto customerDto) {
         customerService.editTag(customerDto);
     }
+
+
+    /**
+     * 客户来源统计
+     */
+    @PostMapping("/sourceStatistics")
+    public Map<String,Object> sourceStatistics(@RequestBody  CustomerSelectDto  customerDto){
+        return customerService.sourceStatistics(customerDto);
+    }
 }

+ 10 - 0
hx-customer/src/main/java/com/fjhx/customer/entity/customer/dto/CustomerSelectDto.java

@@ -24,6 +24,11 @@ public class CustomerSelectDto extends BaseSelectDto {
     private String source;
 
     /**
+     *用户ID
+     */
+    private Long userId;
+
+    /**
      * 客户状态(0:公海客户  1:私海客户)
      */
     private String type;
@@ -33,5 +38,10 @@ public class CustomerSelectDto extends BaseSelectDto {
      */
     private String keyword;
 
+    /**
+     *统计类型(1:来源统计  2,类型统计  3:业务员统计)
+     */
+    private Integer statisticsType;
+
 
 }

+ 15 - 2
hx-customer/src/main/java/com/fjhx/customer/entity/customer/po/Customer.java

@@ -1,5 +1,6 @@
 package com.fjhx.customer.entity.customer.po;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.common.core.domain.BasePo;
 import lombok.Getter;
@@ -59,7 +60,7 @@ public class Customer extends BasePo {
     private String name;
 
     /**
-     * 客户状态(字典表key)
+     * 客户类型(字典表key)
      */
     private String status;
 
@@ -71,11 +72,23 @@ public class Customer extends BasePo {
     /**
      * 业务员id
      */
-    private String userId;
+    private Long userId;
 
     /**
      * 客户标签
      */
     private String tag;
 
+    /**
+     * 用户名称
+     */
+    @TableField(exist = false)
+    private String userName;
+
+    /**
+     * 个数
+     */
+    @TableField(exist = false)
+    private Integer count;
+
 }

+ 6 - 0
hx-customer/src/main/java/com/fjhx/customer/mapper/customer/CustomerMapper.java

@@ -46,4 +46,10 @@ public interface CustomerMapper extends BaseMapper<Customer> {
      * @return
      */
     List<CustomerVo> sourceIncrement(@Param("ew") QueryWrapper<Object> query);
+
+
+    /**
+     * 客户分配
+     */
+    void customerAllocation(CustomerDto dto);
 }

+ 10 - 0
hx-customer/src/main/java/com/fjhx/customer/service/customer/CustomerService.java

@@ -68,4 +68,14 @@ public interface CustomerService extends BaseService<Customer> {
     List<CustomerVo> sourceIncrement(QueryWrapper<Object> query);
 
     void editTag(CustomerDto customerDto);
+
+    /**
+     * 客户来源统计
+     */
+    Map<String,Object> sourceStatistics(CustomerSelectDto customerDto);
+
+    /**
+     * 客户分配
+     */
+    void customerAllocation(CustomerDto dto);
 }

+ 71 - 1
hx-customer/src/main/java/com/fjhx/customer/service/customer/impl/CustomerServiceImpl.java

@@ -2,11 +2,14 @@ package com.fjhx.customer.service.customer.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.area.utils.AreaUtil;
+import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.area.utils.CustomizeAreaUtil;
 import com.fjhx.customer.entity.customer.dto.CustomerDto;
 import com.fjhx.customer.entity.customer.dto.CustomerSelectDto;
@@ -21,15 +24,22 @@ import com.fjhx.customer.service.customer.CustomerService;
 import com.fjhx.customer.service.customer.CustomerTopService;
 import com.fjhx.customer.service.customer.CustomerUserService;
 import com.fjhx.customer.utils.code.CodeEnum;
+import com.fjhx.tenant.entity.dict.dto.DictTenantDataSelectDto;
+import com.fjhx.tenant.entity.dict.vo.DictTenantDataVo;
+import com.fjhx.tenant.service.dict.DictTenantDataService;
 import com.obs.services.internal.ServiceException;
+import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.ruoyi.system.utils.UserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -48,6 +58,9 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
     @Autowired
     private CustomerTopService customerTopService;
 
+    @Autowired
+    private DictTenantDataService dictTenantDataService;
+
 
     /**
      * 查询客户的列表
@@ -141,7 +154,7 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
 
         customerDto.setCode(CodeEnum.CUSTOMER.getCode());
         this.save(customerDto);
-        // 添加库户-联系人表的信息
+        //添加库户-联系人表的信息
         saveCustomerUse(customerDto);
     }
 
@@ -262,5 +275,62 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
         this.updateById(customerDto);
     }
 
+    /**
+     * 客户来源统计
+     */
+    @Override
+    public Map<String,Object> sourceStatistics(CustomerSelectDto customerDto) {
+        if (ObjectUtil.isEmpty(customerDto) && ObjectUtil.isEmpty(customerDto.getStatisticsType())){
+            throw new ServiceException("参数异常:统计类型不能为null");
+        }
+        //存放统计数据
+        Map<String,Object> map = new HashMap<>();
+        QueryWrapper<Customer> query = Wrappers.query();
+        if (ObjectUtil.isNotEmpty(customerDto.getType())){
+            //私海客户查询
+            if (customerDto.getType().equals("1")) {
+                query.isNotNull("user_id");
+                //私海客户需要添加权限(自己查自己)
+                query.eq("user_id", SecurityUtils.getUserId());
+            } else if (customerDto.getType().equals("0")) {//公海客户
+                query.and(wrapper1 -> wrapper1.isNull("user_id").or().eq("user_id", ""));
+            }
+        }
+        if (customerDto.getStatisticsType() == 1){//来源统计
+            query.groupBy("source");
+            query.select("count(*) count,source");
+        }else if (customerDto.getStatisticsType() == 2){//数据类型统计
+            query.groupBy("status");
+            query.select("count(*) count,status");
+        }else if (customerDto.getStatisticsType() == 3){//业务员统计
+            query.groupBy("user_id");
+            query.select("count(*) count,user_id");
+        }
+        List<Customer> customerList = baseMapper.selectList(query);
+
+
+        UserUtil.assignmentNickName(customerList, Customer::getUserId,Customer::setUserName);
+
+        Integer countAmount = customerList.stream().map(customer -> customer.getCount()).reduce(Integer::sum).orElse(0);
+        map.put("countAmount",countAmount);
+        map.put("customerList",customerList);
+        return map;
+    }
+
+    /**
+     * 客户分配
+     */
+    @Override
+    public void customerAllocation(CustomerDto dto) {
+        baseMapper.customerAllocation(dto);
+    }
+
+    //根据字典编码获取字典的数据
+    private List<DictTenantDataVo> getDict(String code){
+        DictTenantDataSelectDto dto = new DictTenantDataSelectDto();
+        dto.setDictCode(code);
+        List<DictTenantDataVo> dictTenantDataServiceList = dictTenantDataService.getList(dto);
+        return dictTenantDataServiceList;
+    }
 
 }

+ 3 - 0
hx-customer/src/main/resources/mapper/customer/CustomerMapper.xml

@@ -1,6 +1,9 @@
 <?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.fjhx.customer.mapper.customer.CustomerMapper">
+    <update id="customerAllocation">
+        update customer set user_id = #{userId} where id = #{id}
+    </update>
     <select id="getList" resultType="com.fjhx.customer.entity.customer.vo.CustomerVo">
         select
             c.id,

+ 35 - 0
hx-jxst/pom.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.fjhx</groupId>
+        <artifactId>bytesailing</artifactId>
+        <version>1.0</version>
+    </parent>
+
+    <artifactId>hx-jxst</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>hx-base</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>hx-customer</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>hx-mes</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

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

@@ -0,0 +1,52 @@
+package com.fjhx.jxst.controller.sales;
+
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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 com.ruoyi.common.core.domain.BaseSelectDto;
+import com.fjhx.jxst.service.sales.SalesContractService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * <p>
+ * 销售合同 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@RestController
+@RequestMapping("/salesContract")
+public class SalesContractController {
+
+    @Autowired
+    private SalesContractService salesContractService;
+
+    /**
+     * 销售合同分页
+     */
+    @PostMapping("/page")
+    public Page<SalesContractVo> page(@RequestBody SalesContractSelectDto dto) {
+        return salesContractService.getPage(dto);
+    }
+
+    /**
+     * 销售合同明细
+     */
+    @PostMapping("/detail")
+    public SalesContractVo detail(@RequestBody BaseSelectDto dto) {
+        return salesContractService.detail(dto.getId());
+    }
+
+    /**
+     * 销售合同新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody SalesContractDto salesContractDto) {
+        salesContractService.add(salesContractDto);
+    }
+
+}

+ 19 - 0
hx-jxst/src/main/java/com/fjhx/jxst/controller/sales/SalesContractDetailsController.java

@@ -0,0 +1,19 @@
+package com.fjhx.jxst.controller.sales;
+
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * <p>
+ * 销售合同明细 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@RestController
+@RequestMapping("/salesContractDetails")
+public class SalesContractDetailsController {
+
+
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/dto/SalesContractDetailsDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.entity.sales.dto;
+
+import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 销售合同明细新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class SalesContractDetailsDto extends SalesContractDetails {
+
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/dto/SalesContractDetailsSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.entity.sales.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 销售合同明细列表查询入参实体
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class SalesContractDetailsSelectDto extends BaseSelectDto {
+
+}

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

@@ -0,0 +1,25 @@
+package com.fjhx.jxst.entity.sales.dto;
+
+import com.fjhx.jxst.entity.sales.po.SalesContract;
+import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 销售合同新增编辑入参实体
+ *
+ * @author
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class SalesContractDto extends SalesContract {
+
+    /**
+     * 明细列表
+     */
+    List<SalesContractDetails> salesContractDetailsList;
+
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/dto/SalesContractSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.entity.sales.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 销售合同列表查询入参实体
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class SalesContractSelectDto extends BaseSelectDto {
+
+}

+ 57 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/po/SalesContract.java

@@ -0,0 +1,57 @@
+package com.fjhx.jxst.entity.sales.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 销售合同
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+@TableName("sales_contract")
+public class SalesContract extends BasePo {
+
+    /**
+     * 客户id
+     */
+    private Long customerId;
+
+    /**
+     * 交货日期
+     */
+    private Date deliveryDate;
+
+    /**
+     * 付款方式 租户字典
+     */
+    private String payMethod;
+
+    /**
+     * 运费支付方 甲方/乙方
+     */
+    private String freightPayer;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 流程id
+     */
+    private Long flowId;
+
+    /**
+     * 流程key
+     */
+    private String flowKey;
+
+}

+ 48 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/po/SalesContractDetails.java

@@ -0,0 +1,48 @@
+package com.fjhx.jxst.entity.sales.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 销售合同明细
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+@TableName("sales_contract_details")
+public class SalesContractDetails extends BasePo {
+
+    /**
+     * 销售合同id
+     */
+    private Long salesContractId;
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 单价
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 数量
+     */
+    private BigDecimal quantity;
+
+    /**
+     * 是否定制
+     */
+    private String isCustomized;
+
+}

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

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.entity.sales.vo;
+
+import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 销售合同明细列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class SalesContractDetailsVo extends SalesContractDetails {
+
+}

+ 29 - 0
hx-jxst/src/main/java/com/fjhx/jxst/entity/sales/vo/SalesContractVo.java

@@ -0,0 +1,29 @@
+package com.fjhx.jxst.entity.sales.vo;
+
+import com.fjhx.jxst.entity.sales.po.SalesContract;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 销售合同列表查询返回值实体
+ *
+ * @author
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class SalesContractVo extends SalesContract {
+
+    /**
+     * 客户名称
+     */
+    private String customerName;
+
+    /**
+     * 合同金额
+     */
+    private BigDecimal contractAmount;
+
+}

+ 54 - 0
hx-jxst/src/main/java/com/fjhx/jxst/flow/SalesContractFlow.java

@@ -0,0 +1,54 @@
+package com.fjhx.jxst.flow;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.flow.core.FlowDelegate;
+import com.fjhx.jxst.entity.sales.dto.SalesContractDto;
+import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
+import com.fjhx.jxst.service.sales.SalesContractDetailsService;
+import com.fjhx.jxst.service.sales.SalesContractService;
+import com.fjhx.mes.entity.work.dto.WorkOrderDto;
+import com.fjhx.mes.entity.work.po.WorkOrder;
+import com.fjhx.mes.service.work.WorkOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class SalesContractFlow extends FlowDelegate {
+
+    @Autowired
+    private SalesContractService salesContractService;
+    @Autowired
+    private SalesContractDetailsService salesContractDetailsService;
+    @Autowired
+    private WorkOrderService workOrderService;
+
+    @Override
+    public String getFlowKey() {
+        return "jxst_sales_contract_flow";
+    }
+
+    @Override
+    public Long start(Long flowId, JSONObject submitData) {
+        SalesContractDto salesContractDto = submitData.toJavaObject(SalesContractDto.class);
+        salesContractDto.setFlowId(flowId);
+        salesContractService.add(salesContractDto);
+        return salesContractDto.getId();
+    }
+
+    @Override
+    public void end(Long flowId, Long businessId, JSONObject submitData) {
+        //按产品往“工单管理”中插入对应的工单数据
+        List<SalesContractDetails> salesContractDetailsList = salesContractDetailsService.list(q -> q.eq(SalesContractDetails::getSalesContractId, businessId));
+        for (SalesContractDetails salesContractDetails : salesContractDetailsList) {
+            WorkOrderDto workOrder = new WorkOrderDto();
+            workOrder.setSourceId(businessId);
+            workOrder.setSource("sales_contract");//销售合同
+            workOrder.setProductId(salesContractDetails.getProductId());
+            workOrder.setQuantity(salesContractDetails.getQuantity());
+            //添加工单
+            workOrderService.add(workOrder);
+        }
+    }
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/mapper/sales/SalesContractDetailsMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.mapper.sales;
+
+import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * <p>
+ * 销售合同明细 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+public interface SalesContractDetailsMapper extends BaseMapper<SalesContractDetails> {
+
+}

+ 26 - 0
hx-jxst/src/main/java/com/fjhx/jxst/mapper/sales/SalesContractMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.jxst.mapper.sales;
+
+import com.fjhx.jxst.entity.sales.po.SalesContract;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.jxst.entity.sales.vo.SalesContractVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * 销售合同 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+public interface SalesContractMapper extends BaseMapper<SalesContract> {
+
+    /**
+     * 销售合同分页
+     */
+    Page<SalesContractVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<SalesContract> wrapper);
+
+}

+ 17 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/sales/SalesContractDetailsService.java

@@ -0,0 +1,17 @@
+package com.fjhx.jxst.service.sales;
+
+import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 销售合同明细 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+public interface SalesContractDetailsService extends BaseService<SalesContractDetails> {
+
+}

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

@@ -0,0 +1,36 @@
+package com.fjhx.jxst.service.sales;
+
+import com.fjhx.jxst.entity.sales.po.SalesContract;
+import com.ruoyi.common.core.service.BaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.jxst.entity.sales.vo.SalesContractVo;
+import com.fjhx.jxst.entity.sales.dto.SalesContractSelectDto;
+import com.fjhx.jxst.entity.sales.dto.SalesContractDto;
+
+
+/**
+ * <p>
+ * 销售合同 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+public interface SalesContractService extends BaseService<SalesContract> {
+
+    /**
+     * 销售合同分页
+     */
+    Page<SalesContractVo> getPage(SalesContractSelectDto dto);
+
+    /**
+     * 销售合同明细
+     */
+    SalesContractVo detail(Long id);
+
+    /**
+     * 销售合同新增
+     */
+    void add(SalesContractDto salesContractDto);
+
+}

+ 21 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/sales/impl/SalesContractDetailsServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.jxst.service.sales.impl;
+
+import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
+import com.fjhx.jxst.mapper.sales.SalesContractDetailsMapper;
+import com.fjhx.jxst.service.sales.SalesContractDetailsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 销售合同明细 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Service
+public class SalesContractDetailsServiceImpl extends ServiceImpl<SalesContractDetailsMapper, SalesContractDetails> implements SalesContractDetailsService {
+
+}

+ 70 - 0
hx-jxst/src/main/java/com/fjhx/jxst/service/sales/impl/SalesContractServiceImpl.java

@@ -0,0 +1,70 @@
+package com.fjhx.jxst.service.sales.impl;
+
+import com.fjhx.customer.service.customer.CustomerService;
+import com.fjhx.jxst.entity.sales.po.SalesContract;
+import com.fjhx.jxst.entity.sales.po.SalesContractDetails;
+import com.fjhx.jxst.mapper.sales.SalesContractMapper;
+import com.fjhx.jxst.service.sales.SalesContractDetailsService;
+import com.fjhx.jxst.service.sales.SalesContractService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.jxst.entity.sales.vo.SalesContractVo;
+import com.fjhx.jxst.entity.sales.dto.SalesContractSelectDto;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.fjhx.jxst.entity.sales.dto.SalesContractDto;
+import cn.hutool.core.bean.BeanUtil;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 销售合同 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Service
+public class SalesContractServiceImpl extends ServiceImpl<SalesContractMapper, SalesContract> implements SalesContractService {
+
+    @Autowired
+    private SalesContractDetailsService salesContractDetailsService;
+    @Autowired
+    private CustomerService customerService;
+
+    @Override
+    public Page<SalesContractVo> getPage(SalesContractSelectDto dto) {
+        IWrapper<SalesContract> wrapper = getWrapper();
+        wrapper.orderByDesc("sc", SalesContract::getId);
+        Page<SalesContractVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        List<SalesContractVo> records = page.getRecords();
+        //赋值客户名称
+        customerService.attributeAssign(records, SalesContractVo::getCustomerId, (item, customer) -> {
+            item.setCustomerName(customer.getName());
+        });
+        return page;
+    }
+
+    @Override
+    public SalesContractVo detail(Long id) {
+        SalesContract SalesContract = this.getById(id);
+        SalesContractVo result = BeanUtil.toBean(SalesContract, SalesContractVo.class);
+        return result;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(SalesContractDto salesContractDto) {
+        this.save(salesContractDto);
+        List<SalesContractDetails> salesContractDetailsList = salesContractDto.getSalesContractDetailsList();
+        for (SalesContractDetails salesContractDetails : salesContractDetailsList) {
+            salesContractDetails.setSalesContractId(salesContractDto.getId());
+        }
+        salesContractDetailsService.saveBatch(salesContractDetailsList);
+    }
+
+}

+ 4 - 0
hx-jxst/src/main/resources/mapper/sales/SalesContractDetailsMapper.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.fjhx.jxst.mapper.sales.SalesContractDetailsMapper">
+</mapper>

+ 22 - 0
hx-jxst/src/main/resources/mapper/sales/SalesContractMapper.xml

@@ -0,0 +1,22 @@
+<?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.fjhx.jxst.mapper.sales.SalesContractMapper">
+    <select id="getPage" resultType="com.fjhx.jxst.entity.sales.vo.SalesContractVo">
+        select
+            sc.id,
+            sc.customer_id,
+            sc.delivery_date,
+            sc.pay_method,
+            sc.freight_payer,
+            sc.remark,
+            sc.create_user,
+            sc.create_time,
+            sc.update_user,
+            sc.update_time,
+            (SELECT sum(unit_price * quantity) FROM sales_contract_details WHERE sales_contract_id = sc.id) contractAmount,
+            sc.flow_id
+        from sales_contract sc
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>

+ 16 - 0
hx-mes/src/main/java/com/fjhx/mes/controller/bom/BomInfoController.java

@@ -80,4 +80,20 @@ public class BomInfoController {
         bomInfoService.editVersion(bomInfo);
     }
 
+    /**
+     * bom新增 嘉兴双拓
+     */
+    @PostMapping("/addByJxst")
+    public void addByJxst(@Validated @RequestBody BomInfoDto bomInfoDto) {
+        bomInfoService.addByJxst(bomInfoDto);
+    }
+
+    /**
+     * bom编辑 嘉兴双拓
+     */
+    @PostMapping("/editByJxst")
+    public void editByJxst(@RequestBody BomInfoDto bomInfoDto) {
+        bomInfoService.editByJxst(bomInfoDto);
+    }
+
 }

+ 8 - 5
hx-mes/src/main/java/com/fjhx/mes/controller/technology/TechnologyController.java

@@ -1,13 +1,16 @@
 package com.fjhx.mes.controller.technology;
 
-import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.mes.entity.technology.vo.TechnologyVo;
-import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
 import com.fjhx.mes.entity.technology.dto.TechnologyDto;
-import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
+import com.fjhx.mes.entity.technology.vo.TechnologyVo;
 import com.fjhx.mes.service.technology.TechnologyService;
+import com.ruoyi.common.core.domain.BaseSelectDto;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 
 /**
@@ -15,7 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  * 工艺 前端控制器
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-28
  */
 @RestController

+ 6 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/bom/dto/BomInfoDto.java

@@ -1,5 +1,6 @@
 package com.fjhx.mes.entity.bom.dto;
 
+import com.fjhx.file.entity.ObsFile;
 import com.fjhx.mes.entity.bom.po.BomDetail;
 import com.fjhx.mes.entity.bom.po.BomInfo;
 import lombok.Getter;
@@ -33,4 +34,9 @@ public class BomInfoDto extends BomInfo {
     @NotNull(message = "新增类型不能为空")
     private Integer addType;
 
+    /**
+     * 程序文件列表
+     */
+    private List<ObsFile> fileList;
+
 }

+ 8 - 4
hx-mes/src/main/java/com/fjhx/mes/entity/technology/dto/TechnologyDto.java

@@ -1,6 +1,6 @@
 package com.fjhx.mes.entity.technology.dto;
 
-import com.fjhx.item.entity.product.po.ProductInfo;
+import com.fjhx.file.entity.ObsFile;
 import com.fjhx.mes.entity.applicable.po.ApplicableProducts;
 import com.fjhx.mes.entity.technology.po.Technology;
 import lombok.Getter;
@@ -11,17 +11,21 @@ import java.util.List;
 /**
  * 工艺新增编辑入参实体
  *
- * @author 
+ * @author
  * @since 2023-03-28
  */
 @Getter
 @Setter
 public class TechnologyDto extends Technology {
 
-    /**适用产品列表*/
+    /**
+     * 适用产品列表
+     */
     private List<ApplicableProducts> productList;
 
-    /**工序列表*/
+    /**
+     * 工序列表
+     */
     private List<String> processRouteList;
 
 }

+ 1 - 1
hx-mes/src/main/java/com/fjhx/mes/entity/work/po/WorkOrder.java

@@ -35,7 +35,7 @@ public class WorkOrder extends BasePo {
     /**
      * 工单来源
      */
-    private Integer source;
+    private String source;
 
     /**
      * 产品id

+ 10 - 0
hx-mes/src/main/java/com/fjhx/mes/service/bom/BomInfoService.java

@@ -1,5 +1,6 @@
 package com.fjhx.mes.service.bom;
 
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.mes.entity.bom.dto.BomInfoDto;
 import com.fjhx.mes.entity.bom.dto.BomInfoSelectDto;
@@ -50,4 +51,13 @@ public interface BomInfoService extends BaseService<BomInfo> {
      */
     void editVersion(BomInfo bomInfo);
 
+    /**
+     * BOM添加 嘉兴双拓
+     */
+    void addByJxst(BomInfoDto bomInfoDto);
+
+    /**
+     * BOM修改 嘉兴双拓
+     */
+    void editByJxst(BomInfoDto bomInfoDto);
 }

+ 16 - 0
hx-mes/src/main/java/com/fjhx/mes/service/bom/impl/BomInfoServiceImpl.java

@@ -3,8 +3,10 @@ package com.fjhx.mes.service.bom.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.bom.dto.BomInfoDto;
@@ -217,4 +219,18 @@ public class BomInfoServiceImpl extends ServiceImpl<BomInfoMapper, BomInfo> impl
 
     }
 
+    @DSTransactional
+    @Override
+    public void addByJxst(BomInfoDto bomInfoDto) {
+        add(bomInfoDto);
+        ObsFileUtil.saveFile(bomInfoDto.getFileList(), bomInfoDto.getId());
+    }
+
+    @DSTransactional
+    @Override
+    public void editByJxst(BomInfoDto bomInfoDto) {
+        edit(bomInfoDto);
+        ObsFileUtil.editFile(bomInfoDto.getFileList(), bomInfoDto.getId());
+    }
+
 }

+ 3 - 0
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionPlanServiceImpl.java

@@ -84,6 +84,9 @@ public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper,
             }
         }
         //赋值待排程数量
+        for (ProductionPlanVo productionPlanVo : records) {
+            productionPlanVo.setRemainingQuantity(productionPlanVo.getQuantity());
+        }
         List<Long> productionPlanIds = records.stream().map(ProductionPlan::getId).collect(Collectors.toList());
         if (ObjectUtil.isNotEmpty(productionPlanIds)) {
             List<ProductionTask> productionTaskList = productionTaskService.list(q -> q.in(ProductionTask::getProductionPlanId, productionPlanIds));

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

@@ -1,26 +1,40 @@
 package com.fjhx.mes.service.production.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.mes.entity.bom.po.BomDetail;
+import com.fjhx.mes.entity.bom.po.BomInfo;
 import com.fjhx.mes.entity.production.dto.ProductionTaskDto;
 import com.fjhx.mes.entity.production.dto.ProductionTaskSelectDto;
 import com.fjhx.mes.entity.production.po.ProductionPlan;
 import com.fjhx.mes.entity.production.po.ProductionTask;
 import com.fjhx.mes.entity.production.vo.ProductionTaskVo;
+import com.fjhx.mes.entity.work.po.WorkOrder;
 import com.fjhx.mes.mapper.production.ProductionTaskMapper;
+import com.fjhx.mes.service.bom.BomDetailService;
+import com.fjhx.mes.service.bom.BomInfoService;
 import com.fjhx.mes.service.production.ProductionPlanService;
 import com.fjhx.mes.service.production.ProductionTaskService;
+import com.fjhx.mes.service.work.WorkOrderService;
 import com.fjhx.mes.utils.code.CodeEnum;
+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.obs.services.internal.ServiceException;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.system.utils.UserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -32,30 +46,40 @@ import java.util.stream.Collectors;
  * 生产任务 服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-30
  */
 @Service
 public class ProductionTaskServiceImpl extends ServiceImpl<ProductionTaskMapper, ProductionTask> implements ProductionTaskService {
     @Autowired
-    ProductInfoService productInfoService;
+    private ProductInfoService productInfoService;
     @Autowired
-    ProductionPlanService productionPlanService;
+    private ProductionPlanService productionPlanService;
+    @Autowired
+    private WorkOrderService workOrderService;
+    @Autowired
+    private BomInfoService bomInfoService;
+    @Autowired
+    private BomDetailService bomDetailService;
+    @Autowired
+    private StockWaitService stockWaitService;
+    @Autowired
+    private StockWaitDetailsService stockWaitDetailsService;
 
     @Override
     public Page<ProductionTaskVo> getPage(ProductionTaskSelectDto dto) {
         IWrapper<ProductionTask> wrapper = getWrapper();
         wrapper.orderByDesc("pt", ProductionTask::getId);
-        if(ObjectUtil.isNotEmpty(dto.getKeyword())) {
-            wrapper.and(q->q.like("pt",ProductionTaskVo::getCode, dto.getKeyword())
-                    .or().like("pt",ProductionTaskVo::getQuantity, dto.getKeyword())
-                    .or().like("pt",ProductionTaskVo::getDueDate, dto.getKeyword()));
+        if (ObjectUtil.isNotEmpty(dto.getKeyword())) {
+            wrapper.and(q -> q.like("pt", ProductionTaskVo::getCode, dto.getKeyword())
+                    .or().like("pt", ProductionTaskVo::getQuantity, dto.getKeyword())
+                    .or().like("pt", ProductionTaskVo::getDueDate, dto.getKeyword()));
         }
         Page<ProductionTaskVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         List<ProductionTaskVo> records = page.getRecords();
         //赋值产品名称
         List<Long> productIds = records.stream().map(ProductionTaskVo::getProductId).collect(Collectors.toList());
-        if(ObjectUtil.isNotEmpty(productIds)) {
+        if (ObjectUtil.isNotEmpty(productIds)) {
             List<ProductInfo> productInfos = productInfoService.listByIds(productIds);
             Map<Long, ProductInfo> productInfoMap = productInfos.stream().collect(Collectors.groupingBy(ProductInfo::getId,
                     Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
@@ -71,7 +95,7 @@ public class ProductionTaskServiceImpl extends ServiceImpl<ProductionTaskMapper,
         }
 
         //赋值负责人名字
-        UserUtil.assignmentNickName(records,ProductionTask::getPersonLiableId,ProductionTaskVo::setPersonLiableName);
+        UserUtil.assignmentNickName(records, ProductionTask::getPersonLiableId, ProductionTaskVo::setPersonLiableName);
         return page;
     }
 
@@ -79,26 +103,62 @@ public class ProductionTaskServiceImpl extends ServiceImpl<ProductionTaskMapper,
     public ProductionTaskVo detail(Long id) {
         ProductionTaskVo productionTaskVo = baseMapper.detail(id);
         ProductInfo productInfo = productInfoService.getById(productionTaskVo.getProductId());
-        if(ObjectUtil.isNotEmpty(productInfo)) {
+        if (ObjectUtil.isNotEmpty(productInfo)) {
             productionTaskVo.setProductName(productInfo.getName());
         }
         Map<Long, String> nickNameMapByIds = UserUtil.getNickNameMapByIds(Arrays.asList(productionTaskVo.getPersonLiableId()));
-        if(ObjectUtil.isNotEmpty(nickNameMapByIds)) {
+        if (ObjectUtil.isNotEmpty(nickNameMapByIds)) {
             productionTaskVo.setPersonLiableName(nickNameMapByIds.get(productionTaskVo.getPersonLiableId()));
         }
         return productionTaskVo;
     }
 
-    @Transactional(rollbackFor = Exception.class)
+    @DSTransactional
     @Override
     public void add(ProductionTaskDto productionTaskDto) {
         productionTaskDto.setCode(CodeEnum.PRODUCTION_TASK.getCode());
         this.save(productionTaskDto);
         Long productionPlanId = productionTaskDto.getProductionPlanId();
         //更新生产计划状态为进行中
-        ProductionPlan byId = productionPlanService.getById(productionPlanId);
-        byId.setStatus(1);
-        productionPlanService.updateById(byId);
+        ProductionPlan productionPlan = productionPlanService.getById(productionPlanId);
+        productionPlan.setStatus(1);
+        productionPlanService.updateById(productionPlan);
+        //添加待出库数据
+        //查询工单中的产品信息
+        WorkOrder workOrder = workOrderService.getById(productionPlan.getWorkOrderId());
+        if (ObjectUtil.isEmpty(workOrder)) {
+            throw new ServiceException("查询不到该任务的工单信息");
+        }
+        //查询BOM信息
+        BomInfo bomInfo = bomInfoService.getOne(q -> q.eq(BomInfo::getProductId, workOrder.getProductId()));
+        if (ObjectUtil.isEmpty(bomInfo)) {
+            throw new ServiceException("查询不到产品的BOM信息");
+        }
+        List<BomDetail> bomDetailList = bomDetailService.list(q -> q.eq(BomDetail::getBomInfoId, bomInfo.getId()));
+        if (ObjectUtil.isEmpty(bomDetailList)) {
+            throw new ServiceException("查询不到BOM明细");
+        }
+        //创建待出库信息
+        StockWait stockWait = new StockWait();
+        stockWait.setBusinessId(productionTaskDto.getId());
+        stockWait.setType(2);//出库
+        stockWait.setStatus(0);//待出库
+        stockWait.setBusinessType(StockWaitType.PRODUCTION_TASK_OUT.getDetailType());//生产任务出库
+        stockWaitService.save(stockWait);
+        //创建待出库明细
+        List<StockWaitDetails> stockWaitDetailsList = new ArrayList<>();
+        for (BomDetail bomDetail : bomDetailList) {
+            //计算数量
+            BigDecimal multiply = bomDetail.getQuantity().multiply(productionTaskDto.getQuantity());
+            //创建待出库明细
+            StockWaitDetails stockWaitDetails = new StockWaitDetails();
+            stockWaitDetails.setStockWaitId(stockWait.getId());
+            stockWaitDetails.setProductId(bomDetail.getProductId());
+            stockWaitDetails.setQuantity(multiply);
+            stockWaitDetails.setReceiptQuantity(BigDecimal.ZERO);
+            stockWaitDetailsList.add(stockWaitDetails);
+        }
+        stockWaitDetailsService.saveBatch(stockWaitDetailsList);
     }
 
     @Override
@@ -112,9 +172,9 @@ public class ProductionTaskServiceImpl extends ServiceImpl<ProductionTaskMapper,
     }
 
     @Override
-    public List<ProductionTaskVo> myListByIds(List<Long> ids){
+    public List<ProductionTaskVo> myListByIds(List<Long> ids) {
         QueryWrapper queryWrapper = new QueryWrapper();
-        queryWrapper.in("pt.id",ids);
+        queryWrapper.in("pt.id", ids);
         return baseMapper.myListByIds(queryWrapper);
     }
 

+ 5 - 6
hx-mes/src/main/java/com/fjhx/mes/service/technology/TechnologyService.java

@@ -1,11 +1,11 @@
 package com.fjhx.mes.service.technology;
 
-import com.fjhx.mes.entity.technology.po.Technology;
-import com.ruoyi.common.core.service.BaseService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.mes.entity.technology.vo.TechnologyVo;
-import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
 import com.fjhx.mes.entity.technology.dto.TechnologyDto;
+import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
+import com.fjhx.mes.entity.technology.po.Technology;
+import com.fjhx.mes.entity.technology.vo.TechnologyVo;
+import com.ruoyi.common.core.service.BaseService;
 
 
 /**
@@ -13,7 +13,7 @@ import com.fjhx.mes.entity.technology.dto.TechnologyDto;
  * 工艺 服务类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-28
  */
 public interface TechnologyService extends BaseService<Technology> {
@@ -42,5 +42,4 @@ public interface TechnologyService extends BaseService<Technology> {
      * 工艺删除
      */
     void delete(Long id);
-
 }

+ 37 - 36
hx-mes/src/main/java/com/fjhx/mes/service/technology/impl/TechnologyServiceImpl.java

@@ -1,26 +1,26 @@
 package com.fjhx.mes.service.technology.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
+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.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.applicable.po.ApplicableProducts;
 import com.fjhx.mes.entity.production.po.ProductionProcesses;
+import com.fjhx.mes.entity.technology.dto.TechnologyDto;
+import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
 import com.fjhx.mes.entity.technology.po.Technology;
+import com.fjhx.mes.entity.technology.vo.TechnologyVo;
 import com.fjhx.mes.mapper.technology.TechnologyMapper;
 import com.fjhx.mes.service.applicable.ApplicableProductsService;
 import com.fjhx.mes.service.production.ProductionProcessesService;
 import com.fjhx.mes.service.technology.TechnologyService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.mes.entity.technology.vo.TechnologyVo;
-import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
-import com.ruoyi.common.utils.wrapper.IWrapper;
-import com.fjhx.mes.entity.technology.dto.TechnologyDto;
-import cn.hutool.core.bean.BeanUtil;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
@@ -28,7 +28,6 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 
 /**
@@ -60,52 +59,54 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
         List<TechnologyVo> records = page.getRecords();
         //获取所有适用商品列表
         List<Long> technologyIds = records.stream().map(TechnologyVo::getId).collect(Collectors.toList());
-        if(ObjectUtil.isNotEmpty(technologyIds)) {
+        if (ObjectUtil.isNotEmpty(technologyIds)) {
             List<ApplicableProducts> applicableProductsList = applicableProductsService.list(q -> q.in(ApplicableProducts::getTechnologyId, technologyIds));
             List<Long> productsIds = applicableProductsList.stream().map(ApplicableProducts::getProductId).collect(Collectors.toList());
-            List<ProductInfo> productInfos = productInfoService.listByIds(productsIds);
-            Map<Long, ProductInfo> productInfoMap = productInfos.stream().collect(Collectors.groupingBy(ProductInfo::getId, Collectors.collectingAndThen(Collectors.toList(), item -> item.get(0))));
-            Map<Long, List<ApplicableProducts>> applicableProductsMap = applicableProductsList.stream().collect(Collectors.groupingBy(ApplicableProducts::getTechnologyId));
-            for (TechnologyVo technologyVo : records) {
-                //处理适用产品列表
-                List<String> productNameList = new ArrayList<>();
-                List<ApplicableProducts> applicableProductsList1 = applicableProductsMap.get(technologyVo.getId());
-                for (ApplicableProducts applicableProducts : applicableProductsList1) {
-                    ProductInfo productInfo = productInfoMap.get(applicableProducts.getProductId());
-                    if(ObjectUtil.isNotEmpty(productInfo)) {
-                        productNameList.add(productInfo.getName());
-                    }else{
-                        productNameList.add("未知商品:"+applicableProducts.getProductId());
+            if (ObjectUtil.isNotEmpty(productsIds)) {
+                List<ProductInfo> productInfos = productInfoService.listByIds(productsIds);
+                Map<Long, ProductInfo> productInfoMap = productInfos.stream().collect(Collectors.groupingBy(ProductInfo::getId, Collectors.collectingAndThen(Collectors.toList(), item -> item.get(0))));
+                Map<Long, List<ApplicableProducts>> applicableProductsMap = applicableProductsList.stream().collect(Collectors.groupingBy(ApplicableProducts::getTechnologyId));
+                for (TechnologyVo technologyVo : records) {
+                    //处理适用产品列表
+                    List<String> productNameList = new ArrayList<>();
+                    List<ApplicableProducts> applicableProductsList1 = applicableProductsMap.get(technologyVo.getId());
+                    for (ApplicableProducts applicableProducts : applicableProductsList1) {
+                        ProductInfo productInfo = productInfoMap.get(applicableProducts.getProductId());
+                        if (ObjectUtil.isNotEmpty(productInfo)) {
+                            productNameList.add(productInfo.getName());
+                        } else {
+                            productNameList.add("未知商品:" + applicableProducts.getProductId());
+                        }
                     }
+                    technologyVo.setApplicableProductsNameList(productNameList);
                 }
-                technologyVo.setApplicableProductsNameList(productNameList);
             }
         }
 
         //获取所有的工艺线路
         List<String> processRouteIdList = new ArrayList<>();
         List<String> processRoutes = records.stream().map(TechnologyVo::getProcessRoute).collect(Collectors.toList());
-        for (String processRoute : processRoutes){
-            if(ObjectUtil.isNotEmpty(processRoute)) {
+        for (String processRoute : processRoutes) {
+            if (ObjectUtil.isNotEmpty(processRoute)) {
                 List<String> processRouteIds = Arrays.asList(processRoute.split(","));
                 processRouteIdList.addAll(processRouteIds);
             }
         }
-        if(ObjectUtil.isNotEmpty(processRouteIdList)) {
+        if (ObjectUtil.isNotEmpty(processRouteIdList)) {
             //查出所有工序信息
             List<ProductionProcesses> productionProcessesList = productionProcessesService.listByIds(processRouteIdList);
             //根据工序id分组
             Map<Long, ProductionProcesses> productionProcessesMap = productionProcessesList.stream().distinct().collect(Collectors.groupingBy(ProductionProcesses::getId, Collectors.collectingAndThen(Collectors.toList(), item -> item.get(0))));
             for (TechnologyVo technologyVo : records) {
-                if(ObjectUtil.isNotEmpty(technologyVo.getProcessRoute())) {
+                if (ObjectUtil.isNotEmpty(technologyVo.getProcessRoute())) {
                     List<String> arr = new ArrayList<>();
                     List<String> processRouteIds = Arrays.asList(technologyVo.getProcessRoute().split(","));
                     for (String processRouteId : processRouteIds) {
                         ProductionProcesses productionProcesses = productionProcessesMap.get(Long.parseLong(processRouteId));
-                        if(ObjectUtil.isNotEmpty(productionProcesses)) {
+                        if (ObjectUtil.isNotEmpty(productionProcesses)) {
                             arr.add(productionProcesses.getName());
-                        }else{
-                            arr.add("未知工序:"+processRouteId);
+                        } else {
+                            arr.add("未知工序:" + processRouteId);
                         }
                     }
                     technologyVo.setProcessRouteNameList(arr);
@@ -129,10 +130,10 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
         List<ProductionProcesses> productionProcessesList = productionProcessesService.listByIds(processRouteIds);
         Map<Long, ProductionProcesses> productionProcessesMap = productionProcessesList.stream()
                 .collect(Collectors.groupingBy(ProductionProcesses::getId,
-                Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
+                        Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
         //对工艺线路排序必须按照前端提交的顺序排序
         List<ProductionProcesses> newProductionProcessesList = new ArrayList<>();
-        for (String processRouteId : processRouteIds){
+        for (String processRouteId : processRouteIds) {
             newProductionProcessesList.add(productionProcessesMap.get(Long.parseLong(processRouteId)));
         }
         result.setProcessRouteList(newProductionProcessesList);
@@ -146,7 +147,7 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
         technologyDto.setProcessRoute(join);
         this.save(technologyDto);
         List<ApplicableProducts> productList = technologyDto.getProductList();
-        for (ApplicableProducts applicableProducts : productList){
+        for (ApplicableProducts applicableProducts : productList) {
             applicableProducts.setTechnologyId(technologyDto.getId());
         }
         applicableProductsService.saveBatch(productList);
@@ -159,8 +160,8 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
         technologyDto.setProcessRoute(join);
         this.updateById(technologyDto);
         List<ApplicableProducts> productList = technologyDto.getProductList();
-        applicableProductsService.remove(q->q.eq(ApplicableProducts::getTechnologyId,technologyDto.getId()));
-        for (ApplicableProducts applicableProducts : productList){
+        applicableProductsService.remove(q -> q.eq(ApplicableProducts::getTechnologyId, technologyDto.getId()));
+        for (ApplicableProducts applicableProducts : productList) {
             applicableProducts.setTechnologyId(technologyDto.getId());
         }
         applicableProductsService.saveBatch(productList);
@@ -170,7 +171,7 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
     @Override
     public void delete(Long id) {
         this.removeById(id);
-        applicableProductsService.remove(q->q.eq(ApplicableProducts::getTechnologyId,id));
+        applicableProductsService.remove(q -> q.eq(ApplicableProducts::getTechnologyId, id));
     }
 
 }

+ 70 - 8
hx-mes/src/main/java/com/fjhx/mes/service/work/impl/WorkOrderServiceImpl.java

@@ -8,17 +8,25 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.mes.entity.bom.po.BomDetail;
+import com.fjhx.mes.entity.bom.po.BomInfo;
 import com.fjhx.mes.entity.production.po.ProductionPlan;
 import com.fjhx.mes.entity.work.dto.WorkOrderDto;
 import com.fjhx.mes.entity.work.dto.WorkOrderSelectDto;
 import com.fjhx.mes.entity.work.po.WorkOrder;
 import com.fjhx.mes.entity.work.vo.WorkOrderVo;
 import com.fjhx.mes.mapper.work.WorkOrderMapper;
+import com.fjhx.mes.service.bom.BomDetailService;
+import com.fjhx.mes.service.bom.BomInfoService;
 import com.fjhx.mes.service.production.ProductionPlanService;
 import com.fjhx.mes.service.work.WorkOrderService;
 import com.fjhx.mes.utils.code.CodeEnum;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
 import com.fjhx.sale.service.contract.ContractProductService;
+import com.fjhx.wms.entity.stock.po.Stock;
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import com.fjhx.wms.service.stock.StockFrozenService;
+import com.fjhx.wms.service.stock.StockService;
 import com.obs.services.internal.ServiceException;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,12 +51,20 @@ import java.util.stream.Collectors;
 public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder> implements WorkOrderService {
 
     @Autowired
-    ProductInfoService productInfoService;
+    private ProductInfoService productInfoService;
     @Autowired
-    ProductionPlanService productionPlanService;
+    private ProductionPlanService productionPlanService;
 
     @Autowired
     private ContractProductService contractProductService;
+    @Autowired
+    private BomInfoService bomInfoService;
+    @Autowired
+    private BomDetailService bomDetailService;
+    @Autowired
+    private StockService stockService;
+    @Autowired
+    private StockFrozenService stockFrozenService;
 
     @Override
     public Page<WorkOrderVo> getPage(WorkOrderSelectDto dto) {
@@ -68,6 +84,9 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
             });
         }
         //赋值待排程数量
+        for (WorkOrderVo workOrder : records) {
+            workOrder.setRemainingQuantity(workOrder.getQuantity());
+        }
         List<Long> workOrderIds = records.stream().map(WorkOrder::getId).collect(Collectors.toList());
         if (ObjectUtil.isNotEmpty(workOrderIds)) {
             List<ProductionPlan> productionPlanList = productionPlanService.list(q -> q.in(ProductionPlan::getWorkOrderId, workOrderIds));
@@ -101,36 +120,79 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
         return result;
     }
 
+    @DSTransactional
     @Override
     public void add(WorkOrderDto workOrderDto) {
         //生成工单编号,以及设置默认状态
         workOrderDto.setCode(CodeEnum.WORK_ORDER.getCode());
         workOrderDto.setStatus(0);
         this.save(workOrderDto);
+        //搜索BOM明细并到冻结库存
+        BomInfo bomInfo = bomInfoService.getOne(q -> q.eq(BomInfo::getProductId, workOrderDto.getProductId()));
+        if (ObjectUtil.isEmpty(bomInfo)) {
+            throw new ServiceException("查询不到产品的BOM信息");
+        }
+        List<BomDetail> bomDetailList = bomDetailService.list(q -> q.eq(BomDetail::getBomInfoId, bomInfo.getId()));
+        if (ObjectUtil.isEmpty(bomDetailList)) {
+            throw new ServiceException("查询不到BOM明细");
+        }
+        List<Long> productIds = bomDetailList.stream().map(BomDetail::getProductId).collect(Collectors.toList());
+        Map<Long, List<Stock>> productMap = stockService.mapKGroup(Stock::getProductId, q -> q.in(Stock::getProductId, productIds));
+        List<StockFrozen> stockFrozenList = new ArrayList<>();
+        for (BomDetail bomDetail : bomDetailList) {
+            Long productId = bomDetail.getProductId();
+            //计算总数量 需要的物料数量*工单数量
+            BigDecimal multiply = bomDetail.getQuantity().multiply(workOrderDto.getQuantity());
+            //添加冻结库存
+            List<Stock> stocks = productMap.get(productId);
+            if (ObjectUtil.isEmpty(stocks)) {
+                throw new ServiceException("物料库存不存在");
+            }
+            //计算库存是否充足(可用库存 - 冻结库存 - 所需的数量)是否大等于0
+            BigDecimal quantity = stocks.stream().map(Stock::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+            Map<Long, StockFrozen> stockFrozenMap = stockFrozenService.mapKEntity(StockFrozen::getProductId, q -> q.in(StockFrozen::getProductId, productIds));
+            StockFrozen stockFrozen = stockFrozenMap.get(bomDetail.getProductId());
+            if(ObjectUtil.isEmpty(stockFrozen)){
+                stockFrozen = new StockFrozen();
+                stockFrozen.setProductId(bomDetail.getProductId());
+                stockFrozen.setFrozenQuantity(BigDecimal.ZERO);
+            }
+            BigDecimal subtract = quantity.subtract(stockFrozen.getFrozenQuantity()).subtract(multiply);
+            if (subtract.compareTo(BigDecimal.ZERO) < 0) {
+                throw new ServiceException("物料库存不足");
+            }
+            //存在库存
+            BigDecimal add = stockFrozen.getFrozenQuantity().add(multiply);
+            stockFrozen.setFrozenQuantity(add);
+
+            stockFrozenList.add(stockFrozen);
+        }
+        stockFrozenService.saveOrUpdateBatch(stockFrozenList);
     }
 
     /**
      * 批量新增
+     *
      * @param workOrder
      */
     @Override
     @DSTransactional
     public void addBatch(List<WorkOrder> workOrder) {
-        if(CollectionUtils.isEmpty(workOrder)){
+        if (CollectionUtils.isEmpty(workOrder)) {
             throw new ServiceException("提交不能为空");
         }
         List<ContractProduct> upContractProduct = new ArrayList<>();
-        for(WorkOrder w:workOrder){
+        for (WorkOrder w : workOrder) {
             //生成工单编号,以及设置默认状态
             w.setCode(CodeEnum.WORK_ORDER.getCode());
             w.setStatus(0);
-            if(ObjectUtil.isNotEmpty(w.getSourceId())&&w.getSource()==1){//外销合同生产数据
+            if (ObjectUtil.isNotEmpty(w.getSourceId()) && w.getSource() == "1") {//外销合同生产数据
                 ContractProduct contractProduct = contractProductService.getById(w.getSourceId());
-                if(ObjectUtil.isNotEmpty(contractProduct)){
+                if (ObjectUtil.isNotEmpty(contractProduct)) {
                     throw new ServiceException("该合同产品不存在,请检查");
                 }
                 BigDecimal expendQuantity = contractProduct.getExpendQuantity().subtract(w.getQuantity());
-                if(expendQuantity.compareTo(BigDecimal.ZERO)< 1){//小于0不让继续执行
+                if (expendQuantity.compareTo(BigDecimal.ZERO) < 1) {//小于0不让继续执行
                     throw new ServiceException("生产数量不得大于销售合同数量");
                 }
                 contractProduct.setExpendQuantity(expendQuantity);
@@ -138,7 +200,7 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
             }
         }
         this.saveBatch(workOrder);
-        if(CollectionUtils.isNotEmpty(upContractProduct)){//扣减销售合同数量
+        if (CollectionUtils.isNotEmpty(upContractProduct)) {//扣减销售合同数量
             contractProductService.updateBatchById(upContractProduct);
         }
     }

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

@@ -8,6 +8,7 @@ import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
 import com.fjhx.sale.entity.contract.po.Contract;
 import com.fjhx.sale.entity.contract.vo.ContractPdfInfoVo;
 import com.fjhx.sale.entity.contract.vo.ContractVo;
+import com.fjhx.sale.entity.sample.dto.SampleDto;
 import com.fjhx.sale.service.contract.ContractService;
 import com.ruoyi.common.core.domain.BaseSelectDto;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -139,10 +140,26 @@ public class ContractController {
     }
 
     /**
-     * 产品销售统计(数据看板-销售分析页面开发)
+     * 产品销售统计(数据看板-销售分析页面开发)
      */
     @PostMapping("/productSalesStatistics")
     public  List<ContractDto>  productSalesStatistics(@RequestBody ContractDto dto) {
         return contractService.productSalesStatistics(dto);
     }
+
+    /**
+     * 产品销售量统计(数据看板-销售分析页面开发)
+     */
+    @PostMapping("/salesVolumeStatistics")
+    public  List<ContractDto>  salesVolumeStatistics(@RequestBody ContractDto dto) {
+        return contractService.salesVolumeStatistics(dto);
+    }
+
+    /**
+     * 合同交接单
+     */
+    @PostMapping("/contractHandover")
+    public void contractHandover(@RequestBody ContractDto dto) {
+        contractService.contractHandover(dto);
+    }
 }

+ 9 - 1
hx-sale/src/main/java/com/fjhx/sale/controller/sample/SampleController.java

@@ -17,7 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  * 样品单表 前端控制器
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-05-05
  */
 @RestController
@@ -67,4 +67,12 @@ public class SampleController {
         sampleService.delete(dto.getId());
     }
 
+    /**
+     * 样品交接单
+     */
+    @PostMapping("/sampleHandover")
+    public void sampleHandover(@RequestBody SampleDto dto) {
+        sampleService.sampleHandover(dto);
+    }
+
 }

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

@@ -4,6 +4,8 @@ import com.fjhx.sale.entity.contract.po.Contract;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /**
  * 外销合同表新增编辑入参实体
  *
@@ -51,4 +53,9 @@ public class ContractDto extends Contract {
 
     private String sellCityName;
 
+
+    /**
+     * 外销数量
+     */
+    private BigDecimal quantity;
 }

+ 7 - 1
hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/Contract.java

@@ -260,12 +260,18 @@ public class Contract extends BasePo {
     private Integer version;
 
     /**
-     * 附件列表
+     * 交接单附件列表
      */
     @TableField(exist = false)
     private List<ObsFile> fileList;
 
     /**
+     * 包装附件列表
+     */
+    @TableField(exist = false)
+    private List<ObsFile> packageFileList;
+
+    /**
      * 合同产品列表
      */
     @TableField(exist = false)

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

@@ -1,10 +1,12 @@
 package com.fjhx.sale.entity.contract.vo;
 
+import com.fjhx.file.entity.FileInfoVo;
 import com.fjhx.sale.entity.contract.po.Contract;
 import lombok.Getter;
 import lombok.Setter;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 外销合同表列表查询返回值实体
@@ -85,4 +87,15 @@ public class ContractVo extends Contract {
      * 总到账认领金额
      */
     private BigDecimal sumClaimMoney;
+
+
+    /**
+     * 交接单附件信息
+     */
+    List<FileInfoVo> fileInfoVos;
+
+    /**
+     * 交接单附件信息
+     */
+    List<FileInfoVo> packageFileInfoVOList;
 }

+ 9 - 2
hx-sale/src/main/java/com/fjhx/sale/entity/sample/po/Sample.java

@@ -17,7 +17,7 @@ import lombok.Setter;
  * 样品单表
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-05-05
  */
 @Getter
@@ -227,10 +227,17 @@ public class Sample extends BasePo {
 
 
     /**
-     * 附件列表
+     * 交接单附件列表
      */
     @TableField(exist = false)
     private List<ObsFile> fileList;
+
+    /**
+     * 包装附件列表
+     */
+    @TableField(exist = false)
+    private List<ObsFile> packageFileList;
+
     /**
      * 样品单产品列表
      */

+ 16 - 1
hx-sale/src/main/java/com/fjhx/sale/entity/sample/vo/SampleVo.java

@@ -1,13 +1,16 @@
 package com.fjhx.sale.entity.sample.vo;
 
+import com.fjhx.file.entity.FileInfoVo;
 import com.fjhx.sale.entity.sample.po.Sample;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.List;
+
 /**
  * 样品单表列表查询返回值实体
  *
- * @author 
+ * @author
  * @since 2023-05-05
  */
 @Getter
@@ -18,4 +21,16 @@ public class SampleVo extends Sample {
      * 买方名称
      */
     private String buyCorporationName;
+
+    /**
+     * 交接单附件信息
+     */
+    List<FileInfoVo> fileInfoVos;
+
+    /**
+     * 交接单附件信息
+     */
+    List<FileInfoVo> packageFileInfoVOList;
+
+
 }

+ 4 - 1
hx-sale/src/main/java/com/fjhx/sale/flow/ContractFlow.java

@@ -86,7 +86,10 @@ public class ContractFlow extends FlowDelegate {
             }
             contractShipmentService.saveBatch(contractShipmentList);
         }
-        ObsFileUtil.saveFile(contract.getFileList(),contract.getId());
+        //交接单附件列表
+        ObsFileUtil.saveFile(contract.getFileList(),contract.getId(),1);
+        //包装指示附件列表
+        ObsFileUtil.saveFile(contract.getPackageFileList(),contract.getId(),2);
         return contract.getId();
     }
 

+ 5 - 1
hx-sale/src/main/java/com/fjhx/sale/flow/SampleFlow.java

@@ -21,6 +21,7 @@ import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.flow.core.FlowDelegate;
 import com.fjhx.sale.util.code.CodeEnum;
 import com.obs.services.internal.ServiceException;
+import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.SecurityUtils;
 import org.springframework.stereotype.Component;
 
@@ -86,7 +87,10 @@ public class SampleFlow extends FlowDelegate {
             }
             sampleShipmentService.saveBatch(sampleShipmentList);
         }
-        ObsFileUtil.saveFile(sample.getFileList(),sample.getId());
+        //交接单附件
+        ObsFileUtil.saveFile(sample.getFileList(),sample.getId(),1);
+        //包装附件
+        ObsFileUtil.saveFile(sample.getPackageFileList(),sample.getId(),2);
         return sample.getId();
 
     }

+ 2 - 0
hx-sale/src/main/java/com/fjhx/sale/mapper/contract/ContractMapper.java

@@ -76,4 +76,6 @@ public interface ContractMapper extends BaseMapper<Contract> {
      * 产品销售统计(数据看板-销售分析页面开发)
      */
     List<ContractDto> productSalesStatistics(@Param("ew") QueryWrapper<Object> query);
+
+    List<ContractDto> salesVolumeStatistics(@Param("ew") QueryWrapper<Object> query);
 }

+ 2 - 2
hx-sale/src/main/java/com/fjhx/sale/service/commission/impl/CommissionServiceImpl.java

@@ -114,13 +114,13 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
                 .setScale(2,BigDecimal.ROUND_HALF_UP));
 
         //计算公共金额:到账金额 * 公共占比
-        commissionDto.setPublicAmount(commissionDto.getPublicAmount()
+        commissionDto.setPublicAmount(commissionDto.getContractArrival()
                 .multiply(commissionRule.getPublicRatio())
                 .divide(new BigDecimal(100))
                 .setScale(2,BigDecimal.ROUND_HALF_UP));
 
         //计算总办金额:到账金额 * 总办占比
-        commissionDto.setHaveOverallAmount(commissionDto.getPublicAmount()
+        commissionDto.setHaveOverallAmount(commissionDto.getContractArrival()
                 .multiply(commissionRule.getHaveOverallRatio())
                 .divide(new BigDecimal(100))
                 .setScale(2,BigDecimal.ROUND_HALF_UP));

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

@@ -121,4 +121,13 @@ public interface ContractService extends BaseService<Contract> {
     List<ContractDto> productSalesStatistics(ContractDto dto);
 
 
+    /**
+     * 产品销售量统计(数据看板-销售分析页面开发)
+     */
+    List<ContractDto> salesVolumeStatistics(ContractDto dto);
+
+    /**
+     * 合同交接单
+     */
+    void contractHandover(ContractDto dto);
 }

+ 102 - 48
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java

@@ -23,6 +23,8 @@ import com.fjhx.common.service.documentary.GetDocumentaryBusinessTemplate;
 import com.fjhx.customer.entity.customer.dto.CustomerDto;
 import com.fjhx.customer.entity.customer.po.Customer;
 import com.fjhx.customer.service.customer.CustomerService;
+import com.fjhx.file.entity.FileInfoVo;
+import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.sale.entity.contract.bo.ContractDocumentaryBo;
@@ -101,28 +103,48 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
     @Override
     public Page<ContractVo> getPage(ContractSelectDto dto) {
         IWrapper<Contract> wrapper = getWrapper();
-        wrapper.orderByDesc("t1",Contract::getCreateTime);
-        wrapper.between("t1",Contract::getStatus, FlowStatusEnum.DRAFT.getKey(),FlowStatusEnum.CANCELLATION.getKey()-1);
-        if(StringUtils.isNotEmpty(dto.getStatus())){
-            wrapper.eq("t1",Contract::getStatus,dto.getStatus());
+        wrapper.orderByDesc("t1", Contract::getCreateTime);
+        wrapper.between("t1", Contract::getStatus, FlowStatusEnum.DRAFT.getKey(), FlowStatusEnum.CANCELLATION.getKey() - 1);
+        if (StringUtils.isNotEmpty(dto.getStatus())) {
+            wrapper.eq("t1", Contract::getStatus, dto.getStatus());
         }
-        if(StringUtils.isNotEmpty(dto.getSellCorporationId())){
-            wrapper.eq("t1",Contract::getSellCorporationId,dto.getSellCorporationId());
+        if (StringUtils.isNotEmpty(dto.getSellCorporationId())) {
+            wrapper.eq("t1", Contract::getSellCorporationId, dto.getSellCorporationId());
         }
-        if(StringUtils.isNotEmpty(dto.getKeyword())){
-            wrapper.keyword(dto.getKeyword(),new SqlField("t1",Contract::getCode));
+        if (StringUtils.isNotEmpty(dto.getKeyword())) {
+            wrapper.keyword(dto.getKeyword(), new SqlField("t1", Contract::getCode));
         }
         Page<ContractVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         List<ContractVo> list = page.getRecords();
         if(CollectionUtils.isNotEmpty(list)){
             List<Long> customerIds = list.stream().map(Contract::getBuyCorporationId).collect(Collectors.toList());
-            List<Customer> customerList = customerService.list(Wrappers.<Customer>query().lambda().in(Customer::getId,customerIds));
-            Map<Long,List<Customer>> cusMap = customerList.stream().distinct().collect(Collectors.groupingBy(Customer::getId));
-            if(MapUtils.isNotEmpty(cusMap)){//客户
-                for(ContractVo p:list){
-                    List<Customer> customers = cusMap.getOrDefault(p.getBuyCorporationId(),null);
-                    p.setBuyCorporationName(customers==null?null:customers.get(0).getName());
+            List<Customer> customerList = customerService.list(Wrappers.<Customer>query().lambda().in(Customer::getId, customerIds));
+            Map<Long, List<Customer>> cusMap = customerList.stream().distinct().collect(Collectors.groupingBy(Customer::getId));
+
+            List<Long> ids = list.stream().map(ContractVo::getId).collect(Collectors.toList());
+            //获取交接单附件
+            Map<Long, List<FileInfoVo>> fileMap = ObsFileUtil.getFileMap(ids, 1);
+
+            //获取包装附件
+            Map<Long, List<FileInfoVo>> packageFileMap = ObsFileUtil.getFileMap(ids, 2);
+            for (ContractVo p : list) {
+                if (MapUtils.isNotEmpty(cusMap)) {//客户
+                    List<Customer> customers = cusMap.getOrDefault(p.getBuyCorporationId(), null);
+                    p.setBuyCorporationName(customers == null ? null : customers.get(0).getName());
                 }
+
+                //赋值交接单附件
+                if (MapUtils.isNotEmpty(fileMap)){
+                    List<FileInfoVo> fileInfoVos = fileMap.get(p.getId());
+                    p.setFileInfoVos(fileInfoVos);
+                }
+
+                //赋值包装附件信息
+                if (MapUtils.isNotEmpty(packageFileMap)){
+                    List<FileInfoVo>  packageFileInfoVOList= packageFileMap.get(p.getId());
+                    p.setPackageFileInfoVOList(packageFileInfoVOList);
+                }
+
             }
         }
         return page;
@@ -156,6 +178,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
 
     /**
      * 根据客户ID查询未包装的订单
+     *
      * @param customerId
      * @return
      */
@@ -213,6 +236,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
 
     /**
      * 查询销售额(合同总金额)
+     *
      * @param id (买方公司ID)
      */
     @Override
@@ -222,6 +246,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
 
     /**
      * 查询指定客户的每月合同总额
+     *
      * @param dto
      */
     @Override
@@ -232,6 +257,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
 
     /**
      * 查询成交单统计(合同)
+     *
      * @param query
      * @return
      */
@@ -242,20 +268,21 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
 
     /**
      * 销售趋势(数据看板-产品分析页面)
+     *
      * @param productInfoDto
      */
     @Override
-    public  List<Map<String, Object>> saleTrend(ProductInfoSelectDto productInfoDto) {
+    public List<Map<String, Object>> saleTrend(ProductInfoSelectDto productInfoDto) {
         //存放每月的月度销售额与月度销售量的列表
         List<Map<String, Object>> list = new ArrayList<>();
 
-        List<String> monthList = DateUtils.getMonthBetweenDate(productInfoDto.getBeginTime(),productInfoDto.getEndTime());
+        List<String> monthList = DateUtils.getMonthBetweenDate(productInfoDto.getBeginTime(), productInfoDto.getEndTime());
         //查询月度销售额与月度销售量
         QueryWrapper<ContractProduct> query = Wrappers.query();
         String beginTime = DateUtil.format(productInfoDto.getBeginTime(), "yyyy-MM");
         String endTime = DateUtil.format(productInfoDto.getEndTime(), "yyyy-MM");
-        query.ge("DATE_FORMAT(create_time,'%Y-%m')",beginTime);
-        query.le("DATE_FORMAT(create_time,'%Y-%m')",endTime);
+        query.ge("DATE_FORMAT(create_time,'%Y-%m')", beginTime);
+        query.le("DATE_FORMAT(create_time,'%Y-%m')", endTime);
         query.select("DATE_FORMAT(create_time,'%Y-%m') time,ifnull(SUM(amount),0) contractAmount," +
                 "ifnull(SUM(quantity),0) contractQuantity");
         query.groupBy("time");
@@ -265,17 +292,17 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
         //给每月赋值月度销售额与月度销售量的值
         for (String month : monthList) {
             //存放每月的月度销售额与月度销售量的值
-            Map<String,Object> map = new HashMap<>();
+            Map<String, Object> map = new HashMap<>();
             //赋值初使值
-            map.put("month",month);
-            map.put("contractAmount",new BigDecimal(0));
-            map.put("contractQuantity",new BigDecimal(0));
+            map.put("month", month);
+            map.put("contractAmount", new BigDecimal(0));
+            map.put("contractQuantity", new BigDecimal(0));
 
             //赋值
             List<ContractProduct> contracts = contractMap.get(month);
-            if (ObjectUtil.isNotEmpty(contracts)){
-                map.put("contractAmount",contracts.get(0).getContractAmount());
-                map.put("contractQuantity",contracts.get(0).getContractQuantity());
+            if (ObjectUtil.isNotEmpty(contracts)) {
+                map.put("contractAmount", contracts.get(0).getContractAmount());
+                map.put("contractQuantity", contracts.get(0).getContractQuantity());
             }
             list.add(map);
         }
@@ -290,37 +317,37 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
     public Map<String, Object> salesStatistics(ContractDto dto) {
         //添加查询条件
         QueryWrapper<Contract> query = Wrappers.<Contract>query();
-        selectTime(query,dto);
+        selectTime(query, dto);
         query.select("sum(amount) amount");
 
         //查询销售额
         Contract contract = baseMapper.selectOne(query);
         query.clear();
         //查询订单数
-        selectTime(query,dto);
+        selectTime(query, dto);
 
         Long count = baseMapper.selectCount(query);
 
         //查询下单的客户人数
         query.clear();
-        selectTime(query,dto);
+        selectTime(query, dto);
         query.select("count(DISTINCT(buy_corporation_id)) count");
         Contract contract1 = baseMapper.selectOne(query);
 
         //存放销售统计数据
-        Map<String,Object> map = new HashMap<>();
+        Map<String, Object> map = new HashMap<>();
         //初始化数据
-        map.put("amount",new BigDecimal(0));
-        map.put("contractCount",count);
-        map.put("customerCount",new BigDecimal(0));
+        map.put("amount", new BigDecimal(0));
+        map.put("contractCount", count);
+        map.put("customerCount", new BigDecimal(0));
 
         //赋值
-        if (ObjectUtil.isNotEmpty(contract)){
-            map.put("amount",contract.getAmount());
+        if (ObjectUtil.isNotEmpty(contract)) {
+            map.put("amount", contract.getAmount());
         }
 
-        if (ObjectUtil.isNotEmpty(contract1)){
-            map.put("customerCount",contract1.getCount());
+        if (ObjectUtil.isNotEmpty(contract1)) {
+            map.put("customerCount", contract1.getCount());
         }
         return map;
     }
@@ -331,12 +358,12 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
     @Override
     public List<ContractDto> countrySalesStatistics(ContractDto dto) {
         QueryWrapper<Object> query = Wrappers.query();
-        query.ge("DATE_FORMAT(cc.create_time,'%Y-%m')",dto.getBeginTime());
-        query.le("DATE_FORMAT(cc.create_time,'%Y-%m')",dto.getEndTime());
+        query.ge("DATE_FORMAT(cc.create_time,'%Y-%m')", dto.getBeginTime());
+        query.le("DATE_FORMAT(cc.create_time,'%Y-%m')", dto.getEndTime());
         query.groupBy("cc.buy_country_id");
         query.orderByDesc("amount");
         //查询销售国家统计信息
-        List<ContractDto> contractDtoList =  baseMapper.countrySalesStatistics(query);
+        List<ContractDto> contractDtoList = baseMapper.countrySalesStatistics(query);
         return contractDtoList;
     }
 
@@ -346,12 +373,12 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
     @Override
     public List<ContractDto> customSalesStatistics(ContractDto dto) {
         QueryWrapper<Object> query = Wrappers.query();
-        query.ge("DATE_FORMAT(cc.create_time,'%Y-%m')",dto.getBeginTime());
-        query.le("DATE_FORMAT(cc.create_time,'%Y-%m')",dto.getEndTime());
+        query.ge("DATE_FORMAT(cc.create_time,'%Y-%m')", dto.getBeginTime());
+        query.le("DATE_FORMAT(cc.create_time,'%Y-%m')", dto.getEndTime());
         query.groupBy("cc.buy_corporation_id");
         query.orderByDesc("amount");
         //查询销售国家统计信息
-        List<ContractDto> contractDtoList =  baseMapper.customSalesStatistics(query);
+        List<ContractDto> contractDtoList = baseMapper.customSalesStatistics(query);
         return contractDtoList;
     }
 
@@ -361,12 +388,12 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
     @Override
     public List<ContractDto> salesmanSalesStatistics(ContractDto dto) {
         QueryWrapper<Object> query = Wrappers.query();
-        query.ge("DATE_FORMAT(cc.create_time,'%Y-%m')",dto.getBeginTime());
-        query.le("DATE_FORMAT(cc.create_time,'%Y-%m')",dto.getEndTime());
+        query.ge("DATE_FORMAT(cc.create_time,'%Y-%m')", dto.getBeginTime());
+        query.le("DATE_FORMAT(cc.create_time,'%Y-%m')", dto.getEndTime());
         query.groupBy("cc.create_user");
         query.orderByDesc("amount");
         //查询销售国家统计信息
-        List<ContractDto> contractDtoList =  baseMapper.salesmanSalesStatistics(query);
+        List<ContractDto> contractDtoList = baseMapper.salesmanSalesStatistics(query);
         return contractDtoList;
     }
 
@@ -376,15 +403,38 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
     @Override
     public List<ContractDto> productSalesStatistics(ContractDto dto) {
         QueryWrapper<Object> query = Wrappers.query();
-        query.ge("DATE_FORMAT(cp.create_time,'%Y-%m')",dto.getBeginTime());
-        query.le("DATE_FORMAT(cp.create_time,'%Y-%m')",dto.getEndTime());
+        query.ge("DATE_FORMAT(cp.create_time,'%Y-%m')", dto.getBeginTime());
+        query.le("DATE_FORMAT(cp.create_time,'%Y-%m')", dto.getEndTime());
         query.groupBy("cp.product_id");
         query.orderByDesc("amount");
         //查询销售国家统计信息
-        List<ContractDto> contractDtoList =  baseMapper.productSalesStatistics(query);
+        List<ContractDto> contractDtoList = baseMapper.productSalesStatistics(query);
         return contractDtoList;
     }
 
+    /**
+     * 产品销售量统计(数据看板-销售分析页面开发)
+     */
+    @Override
+    public List<ContractDto> salesVolumeStatistics(ContractDto dto) {
+        QueryWrapper<Object> query = Wrappers.query();
+        query.ge("DATE_FORMAT(cp.create_time,'%Y-%m')", dto.getBeginTime());
+        query.le("DATE_FORMAT(cp.create_time,'%Y-%m')", dto.getEndTime());
+        query.groupBy("cp.product_id");
+        query.orderByDesc("quantity");
+        //查询销售商品统计信息
+        List<ContractDto> contractDtoList = baseMapper.salesVolumeStatistics(query);
+        return contractDtoList;
+    }
+
+    /**
+     * 合同交接单
+     */
+    @Override
+    public void contractHandover(ContractDto dto) {
+        ObsFileUtil.editFile(dto.getFileList(),dto.getId(),1);
+        ObsFileUtil.editFile(dto.getPackageFileList(),dto.getId(),2);
+    }
 
 
     /**
@@ -593,6 +643,10 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
     private void selectTime(QueryWrapper<Contract> query, ContractDto dto) {
         query.ge("DATE_FORMAT(create_time,'%Y-%m')", dto.getBeginTime());
         query.le("DATE_FORMAT(create_time,'%Y-%m')", dto.getEndTime());
+    //添加时间的查询条件
+    private void selectTime(QueryWrapper<Contract> query, ContractDto dto) {
+        query.ge("DATE_FORMAT(create_time,'%Y-%m')", dto.getBeginTime());
+        query.le("DATE_FORMAT(create_time,'%Y-%m')", dto.getEndTime());
     }
 
     private void setAreaId(ContractDto contractDto) {

+ 5 - 1
hx-sale/src/main/java/com/fjhx/sale/service/sample/SampleService.java

@@ -13,7 +13,7 @@ import com.fjhx.sale.entity.sample.dto.SampleDto;
  * 样品单表 服务类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-05-05
  */
 public interface SampleService extends BaseService<Sample> {
@@ -43,4 +43,8 @@ public interface SampleService extends BaseService<Sample> {
      */
     void delete(Long id);
 
+    /**
+     * 样品交接单
+     */
+    void sampleHandover(SampleDto dto);
 }

+ 50 - 13
hx-sale/src/main/java/com/fjhx/sale/service/sample/impl/SampleServiceImpl.java

@@ -7,6 +7,8 @@ import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.common.enums.FlowStatusEnum;
 import com.fjhx.customer.entity.customer.po.Customer;
 import com.fjhx.customer.service.customer.CustomerService;
+import com.fjhx.file.entity.FileInfoVo;
+import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.sale.entity.sample.po.Sample;
 import com.fjhx.sale.mapper.sample.SampleMapper;
 import com.fjhx.sale.service.sample.SampleService;
@@ -33,7 +35,7 @@ import java.util.stream.Collectors;
  * 样品单表 服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-05-05
  */
 @Service
@@ -45,6 +47,7 @@ public class SampleServiceImpl extends ServiceImpl<SampleMapper, Sample> impleme
 
     /**
      * 分页
+     *
      * @param dto
      * @return
      */
@@ -52,26 +55,51 @@ public class SampleServiceImpl extends ServiceImpl<SampleMapper, Sample> impleme
     public Page<SampleVo> getPage(SampleSelectDto dto) {
         IWrapper<Sample> wrapper = getWrapper();
         wrapper.orderByDesc("s", Sample::getCreateTime);
-        wrapper.between("s",Sample::getStatus, FlowStatusEnum.DRAFT.getKey(),FlowStatusEnum.CANCELLATION.getKey()-1);
-        if(StringUtils.isNotEmpty(dto.getStatus())){
-            wrapper.eq("s",Sample::getStatus,dto.getStatus());
+        wrapper.between("s", Sample::getStatus, FlowStatusEnum.DRAFT.getKey(), FlowStatusEnum.CANCELLATION.getKey() - 1);
+        if (StringUtils.isNotEmpty(dto.getStatus())) {
+            wrapper.eq("s", Sample::getStatus, dto.getStatus());
         }
-        if(StringUtils.isNotEmpty(dto.getKeyword())){
-            wrapper.keyword(dto.getKeyword(),new SqlField("s",Sample::getCode));
+        if (StringUtils.isNotEmpty(dto.getKeyword())) {
+            wrapper.keyword(dto.getKeyword(), new SqlField("s", Sample::getCode));
         }
         Page<SampleVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         List<SampleVo> list = page.getRecords();
-        if(CollectionUtils.isNotEmpty(list)){
+        if (CollectionUtils.isNotEmpty(list)) {
             List<Long> customerIds = list.stream().map(Sample::getBuyCorporationId).collect(Collectors.toList());
-            List<Customer> customerList = customerService.list(Wrappers.<Customer>query().lambda().in(Customer::getId,customerIds));
-            Map<Long,List<Customer>> cusMap = customerList.stream().distinct().collect(Collectors.groupingBy(Customer::getId));
-            if(MapUtils.isNotEmpty(cusMap)){//客户
-                for(SampleVo p:list){
-                    List<Customer> customers = cusMap.getOrDefault(p.getBuyCorporationId(),null);
-                    p.setBuyCorporationName(customers==null?null:customers.get(0).getName());
+            List<Customer> customerList = customerService.list(Wrappers.<Customer>query().lambda().in(Customer::getId, customerIds));
+            Map<Long, List<Customer>> cusMap = customerList.stream().distinct().collect(Collectors.groupingBy(Customer::getId));
+
+            List<Long> ids = list.stream().map(sampleVo -> sampleVo.getId()).collect(Collectors.toList());
+            //获取交接单附件
+            Map<Long, List<FileInfoVo>> fileMap = ObsFileUtil.getFileMap(ids, 1);
+
+            //获取包装附件
+            Map<Long, List<FileInfoVo>> packageFileMap = ObsFileUtil.getFileMap(ids, 2);
+
+            for (SampleVo p : list) {
+                if (MapUtils.isNotEmpty(cusMap)) {//客户
+                    List<Customer> customers = cusMap.getOrDefault(p.getBuyCorporationId(), null);
+                    p.setBuyCorporationName(customers == null ? null : customers.get(0).getName());
+                }
+
+                //赋值交接单附件
+                if (MapUtils.isNotEmpty(fileMap)){
+                    List<FileInfoVo> fileInfoVos = fileMap.get(p.getId());
+                    p.setFileInfoVos(fileInfoVos);
                 }
+
+                //赋值包装附件信息
+                if (MapUtils.isNotEmpty(packageFileMap)){
+                    List<FileInfoVo>  packageFileInfoVOList= packageFileMap.get(p.getId());
+                    p.setPackageFileInfoVOList(packageFileInfoVOList);
+                }
+
             }
+
+
         }
+
+
         return page;
     }
 
@@ -97,4 +125,13 @@ public class SampleServiceImpl extends ServiceImpl<SampleMapper, Sample> impleme
         this.removeById(id);
     }
 
+    /**
+     * 样品交接单(类型1 为交接单,2为包装指示)
+     */
+    @Override
+    public void sampleHandover(SampleDto dto) {
+        ObsFileUtil.editFile(dto.getFileList(),dto.getId(),1);
+        ObsFileUtil.editFile(dto.getPackageFileList(),dto.getId(),2);
+    }
+
 }

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

@@ -111,6 +111,16 @@
                 LEFT JOIN bytesailing_item.product_info pi ON cp.product_id = pi.id
             ${ew.customSqlSegment}
     </select>
+    <select id="salesVolumeStatistics" resultType="com.fjhx.sale.entity.contract.dto.ContractDto">
+
+        SELECT
+            SUM(cp.quantity) quantity,
+            pi.name productName
+        FROM
+            contract_product cp
+                LEFT JOIN bytesailing_item.product_info pi ON cp.product_id = pi.id
+            ${ew.customSqlSegment}
+    </select>
 
 
 </mapper>

+ 19 - 0
hx-wms/src/main/java/com/fjhx/wms/controller/stock/StockFrozenController.java

@@ -0,0 +1,19 @@
+package com.fjhx.wms.controller.stock;
+
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * <p>
+ * 冻结库存 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@RestController
+@RequestMapping("/stockFrozen")
+public class StockFrozenController {
+
+
+}

+ 17 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/dto/StockFrozenDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.wms.entity.stock.dto;
+
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 冻结库存新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class StockFrozenDto extends StockFrozen {
+
+}

+ 17 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/dto/StockFrozenSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.wms.entity.stock.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 冻结库存列表查询入参实体
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class StockFrozenSelectDto extends BaseSelectDto {
+
+}

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

@@ -26,7 +26,8 @@ public enum JournalType {
     BORDER_OF_LINE_IN(InOutType.IN, 16, "待入库 线边回仓", ""),
     COMPLETION_IN(InOutType.IN, 17, "待入库 完工入库", ""),
     PURCHASE_ARRIVAL_IN(InOutType.IN, 18, "待入库 采购到货", ""),
-    ARRIVAL_QUALITY(InOutType.IN, 19, "到货质检", "quality_info")
+    ARRIVAL_QUALITY(InOutType.IN, 19, "到货质检", "quality_info"),
+    PRODUCTION_TASK_OUT(InOutType.OUT, 20, "生产任务待出库出库", "production_task")
     ;
 
 

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

@@ -12,8 +12,8 @@ public enum StockWaitType {
     PURCHASE_ARRIVAL_IN(InOutType.IN, 3, "采购到货", ""),
     BACK_OUT(InOutType.OUT, 4, "退货出库", ""),
     JD_ORDER_OUT(InOutType.OUT, 5, "京东订单出库", "jd_order"),
-    SALE_ORDER_OUT(InOutType.OUT, 6, "销售订单出库", "order_info")
-    ;
+    SALE_ORDER_OUT(InOutType.OUT, 6, "销售订单出库", "order_info"),
+    PRODUCTION_TASK_OUT(InOutType.OUT, 7, "生产任务待出库", "production_task");
 
 
     /**

+ 16 - 5
hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/Stock.java

@@ -2,18 +2,17 @@ package com.fjhx.wms.entity.stock.po;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.common.core.domain.BasePo;
-
-import java.math.BigDecimal;
-import java.util.Date;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 库存
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-20
  */
 @Getter
@@ -36,7 +35,19 @@ public class Stock extends BasePo {
      */
     private BigDecimal quantity;
 
-    /**维多利亚扩展*/
+    /**
+     * 维多利亚扩展
+     */
     private String victoriatouristJson;
 
+    /**
+     * 冻结库存
+     */
+    private BigDecimal frozenQuantity;
+
+    /**
+     * 结存单价
+     */
+    private BigDecimal unitPrice;
+
 }

+ 33 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/StockFrozen.java

@@ -0,0 +1,33 @@
+package com.fjhx.wms.entity.stock.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 冻结库存
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+@TableName("stock_frozen")
+public class StockFrozen extends BasePo {
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 冻结库存
+     */
+    private BigDecimal frozenQuantity;
+
+}

+ 17 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/vo/StockFrozenVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.wms.entity.stock.vo;
+
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 冻结库存列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class StockFrozenVo extends StockFrozen {
+
+}

+ 17 - 0
hx-wms/src/main/java/com/fjhx/wms/mapper/stock/StockFrozenMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.wms.mapper.stock;
+
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * <p>
+ * 冻结库存 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+public interface StockFrozenMapper extends BaseMapper<StockFrozen> {
+
+}

+ 17 - 0
hx-wms/src/main/java/com/fjhx/wms/service/stock/StockFrozenService.java

@@ -0,0 +1,17 @@
+package com.fjhx.wms.service.stock;
+
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 冻结库存 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+public interface StockFrozenService extends BaseService<StockFrozen> {
+
+}

+ 21 - 0
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockFrozenServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.wms.service.stock.impl;
+
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import com.fjhx.wms.mapper.stock.StockFrozenMapper;
+import com.fjhx.wms.service.stock.StockFrozenService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 冻结库存 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Service
+public class StockFrozenServiceImpl extends ServiceImpl<StockFrozenMapper, StockFrozen> implements StockFrozenService {
+
+}

+ 10 - 0
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java

@@ -358,6 +358,10 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                 //判断传操作的库存是否为空 空赋值0
                 stock.setQuantity(BigDecimal.ZERO);
             }
+            if (ObjectUtil.isEmpty(stock.getFrozenQuantity())) {
+                //判断传操作的冻结库存是否为空 空赋值0
+                stock.setFrozenQuantity(BigDecimal.ZERO);
+            }
             newStocks.setQuantity(stock.getQuantity());
 
             //合并库存数量
@@ -365,6 +369,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
             //用来存储操作数据
             if (ObjectUtil.isNotEmpty(oldStocks)) {
                 BigDecimal quantity = oldStocks.getQuantity();
+                BigDecimal oldFrozenQuantity = oldStocks.getFrozenQuantity();
                 if (type == 1) {
                     //入库库存相加
                     quantity = quantity.add(stock.getQuantity());
@@ -374,6 +379,10 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                     if (quantity.compareTo(BigDecimal.ZERO) < 0) {
                         throw new ServiceException("库存不足无法出库");
                     }
+                    oldFrozenQuantity = oldFrozenQuantity.subtract(stock.getFrozenQuantity());
+                    if (oldFrozenQuantity.compareTo(BigDecimal.ZERO) < 0) {
+                        throw new ServiceException("冻结库存不足无法出库");
+                    }
                 } else if (type == 3) {
                     //维多利亚入库增加冻结库存
                     String victoriatouristJson = oldStocks.getVictoriatouristJson();
@@ -388,6 +397,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                 }
                 newStocks.setId(oldStocks.getId());
                 newStocks.setQuantity(quantity);
+                newStocks.setFrozenQuantity(oldFrozenQuantity);
             } else if (type == 2) {
                 ProductInfo productInfo = productInfoService.getById(stock.getProductId());
                 if (productInfo == null) {

+ 19 - 7
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitDetailsServiceImpl.java

@@ -39,17 +39,19 @@ import java.util.List;
 @Service
 public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMapper, StockWaitDetails> implements StockWaitDetailsService {
     @Autowired
-    ProductInfoService productInfoService;
+    private ProductInfoService productInfoService;
     @Autowired
-    StockWaitService stockWaitService;
+    private StockWaitService stockWaitService;
     @Autowired
-    StockJournalService stockJournalService;
+    private StockJournalService stockJournalService;
     @Autowired
-    StockJournalDetailsService stockJournalDetailsService;
+    private StockJournalDetailsService stockJournalDetailsService;
     @Autowired
-    StockService stockService;
+    private StockService stockService;
     @Autowired
-    WmsService wmsService;
+    private WmsService wmsService;
+    @Autowired
+    private StockFrozenService stockFrozenService;
 
     @Override
     public Page<StockWaitDetailsVo> getPage(StockWaitDetailsSelectDto dto) {
@@ -104,7 +106,9 @@ public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMap
     public void add(StockWaitDetailsDto stockWaitDetailsDto) {
         //更新已入库数量 根据明细id
         StockWaitDetails stockWaitDetails = getById(stockWaitDetailsDto.getId());
-        stockWaitDetails.setReceiptQuantity(stockWaitDetails.getReceiptQuantity().add(stockWaitDetailsDto.getQuantity()));
+        BigDecimal receiptQuantity = stockWaitDetails.getReceiptQuantity();
+        receiptQuantity = ObjectUtil.isEmpty(receiptQuantity) ? BigDecimal.ZERO : receiptQuantity;
+        stockWaitDetails.setReceiptQuantity(receiptQuantity.add(stockWaitDetailsDto.getQuantity()));
         if (stockWaitDetails.getReceiptQuantity().compareTo(stockWaitDetails.getQuantity()) > 0) {
             throw new ServiceException("出库数量+已出库数量不能大于待出库数量");
         }
@@ -146,6 +150,14 @@ public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMap
             //销售订单出库
             stockJournal.setType(JournalType.SALES_OUT.getDetailType());
             wmsService.outbound(stockWaitDetailsDto);
+        }else if (StockWaitType.PRODUCTION_TASK_OUT.getDetailType().equals(businessType)) {
+            //生产任务待出库
+            stockJournal.setType(JournalType.PRODUCTION_TASK_OUT.getDetailType());
+            //减少冻结库存
+            StockFrozen stockFrozen = stockFrozenService.getOne(q -> q.eq(StockFrozen::getProductId, stockWaitDetails.getProductId()));
+            BigDecimal subtract = stockFrozen.getFrozenQuantity().subtract(stockWaitDetailsDto.getQuantity());
+            stockFrozen.setFrozenQuantity(subtract);
+            stockFrozenService.updateById(stockFrozen);
         } else {
             throw new ServiceException("未知待出入库业务类型");
         }

+ 50 - 42
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitServiceImpl.java

@@ -12,6 +12,7 @@ import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.wms.entity.arrival.po.ArrivalStockRecords;
 import com.fjhx.wms.entity.arrival.po.ArrivalStockRecordsDetails;
+import com.fjhx.wms.entity.stock.dto.StockWaitDetailsDto;
 import com.fjhx.wms.entity.stock.dto.StockWaitDto;
 import com.fjhx.wms.entity.stock.dto.StockWaitSelectDto;
 import com.fjhx.wms.entity.stock.emums.JournalType;
@@ -144,6 +145,7 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
         ProductInfo byId = productInfoService.getById(stockWaitDetails.getProductId());
         result.setProductName(byId.getName());
         result.setQuantity(stockWaitDetails.getQuantity());
+        result.setStockWaitDetailsId(stockWaitDetails.getId());
         return result;
     }
 
@@ -174,53 +176,59 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
         return result;
     }
 
-    @Transactional(rollbackFor = Exception.class)
+    @DSTransactional
     @Override
     public void add(StockWaitDto stockWaitDto) {
         //更新已入库数量 根据明细id
         StockWaitDetails stockWaitDetails = stockWaitDetailsService.getOne(q->q.eq(StockWaitDetails::getStockWaitId,stockWaitDto.getId())
                 .or().eq(StockWaitDetails::getId,stockWaitDto.getId()));
-        BigDecimal receiptQuantity = stockWaitDetails.getReceiptQuantity();
-        receiptQuantity = ObjectUtil.isEmpty(receiptQuantity) ? BigDecimal.ZERO : receiptQuantity;
-        stockWaitDetails.setReceiptQuantity(receiptQuantity.add(stockWaitDto.getQuantity()));
-        if (stockWaitDetails.getReceiptQuantity().compareTo(stockWaitDetails.getQuantity()) > 0) {
-            throw new ServiceException("入库数量+已入库数量不能大于待采购数量");
-        }
-        stockWaitDetailsService.updateById(stockWaitDetails);
-        StockWait byId = getById(stockWaitDetails.getStockWaitId());
-        //创建出入库记录
-        StockJournal stockJournal = new StockJournal();
-        stockJournal.setOpType(byId.getType());
-        //根据待入库业务类型创建待出入库记录
-        StockWait stockWait = getById(stockWaitDetails.getStockWaitId());
-        Integer businessType = stockWait.getBusinessType();
-        if (StockWaitType.BORDER_OF_LINE_IN.getDetailType().equals(businessType)) {
-            //线边回仓库
-            stockJournal.setType(JournalType.BORDER_OF_LINE_IN.getDetailType());
-        } else if (StockWaitType.COMPLETION_IN.getDetailType().equals(businessType)) {
-            //完工入库
-            stockJournal.setType(JournalType.COMPLETION_IN.getDetailType());
-        } else if (StockWaitType.PURCHASE_ARRIVAL_IN.getDetailType().equals(businessType)) {
-            //采购到货
-            stockJournal.setType(JournalType.PURCHASE_ARRIVAL_IN.getDetailType());
-        } else if (StockWaitType.BACK_OUT.getDetailType().equals(businessType)) {
-            //退货出货
-            stockJournal.setType(JournalType.BACK_OUT.getDetailType());
-        } else {
-            throw new ServiceException("未知待入库业务类型");
-        }
-        stockJournal.setCode(byId.getType() == 1 ? CodeEnum.SIN_CODE.getCode() : CodeEnum.SOUT_CODE.getCode());
-        stockJournal.setWarehouseId(stockWaitDto.getWarehouseId());
-        stockJournal.setBusinessId(byId.getId());
-        //保存出入库记录
-        stockJournalService.save(stockJournal);
-        //操作库存
-        Stock stock = new Stock();
-        stock.setQuantity(stockWaitDto.getQuantity());
-        stock.setProductId(stockWaitDetails.getProductId());
-        List<StockJournalDetails> stockJournalDetailsList = stockService.ModifyInventory(stockJournal.getId(), byId.getType(), Arrays.asList(stock), stockWaitDto.getWarehouseId());
-        //保存出入库明细
-        stockJournalDetailsService.saveBatch(stockJournalDetailsList);
+        //-----------------
+        StockWaitDetailsDto stockWaitDetailsDto = BeanUtil.copyProperties(stockWaitDetails, StockWaitDetailsDto.class);
+        stockWaitDetailsDto.setBusinessType(stockWaitDto.getBusinessType());
+        stockWaitDetailsDto.setWarehouseId(stockWaitDto.getWarehouseId());
+        stockWaitDetailsService.add(stockWaitDetailsDto);
+
+//        BigDecimal receiptQuantity = stockWaitDetails.getReceiptQuantity();
+//        receiptQuantity = ObjectUtil.isEmpty(receiptQuantity) ? BigDecimal.ZERO : receiptQuantity;
+//        stockWaitDetails.setReceiptQuantity(receiptQuantity.add(stockWaitDto.getQuantity()));
+//        if (stockWaitDetails.getReceiptQuantity().compareTo(stockWaitDetails.getQuantity()) > 0) {
+//            throw new ServiceException("入库数量+已入库数量不能大于待采购数量");
+//        }
+//        stockWaitDetailsService.updateById(stockWaitDetails);
+//        StockWait byId = getById(stockWaitDetails.getStockWaitId());
+//        //创建出入库记录
+//        StockJournal stockJournal = new StockJournal();
+//        stockJournal.setOpType(byId.getType());
+//        //根据待入库业务类型创建待出入库记录
+//        StockWait stockWait = getById(stockWaitDetails.getStockWaitId());
+//        Integer businessType = stockWait.getBusinessType();
+//        if (StockWaitType.BORDER_OF_LINE_IN.getDetailType().equals(businessType)) {
+//            //线边回仓库
+//            stockJournal.setType(JournalType.BORDER_OF_LINE_IN.getDetailType());
+//        } else if (StockWaitType.COMPLETION_IN.getDetailType().equals(businessType)) {
+//            //完工入库
+//            stockJournal.setType(JournalType.COMPLETION_IN.getDetailType());
+//        } else if (StockWaitType.PURCHASE_ARRIVAL_IN.getDetailType().equals(businessType)) {
+//            //采购到货
+//            stockJournal.setType(JournalType.PURCHASE_ARRIVAL_IN.getDetailType());
+//        } else if (StockWaitType.BACK_OUT.getDetailType().equals(businessType)) {
+//            //退货出货
+//            stockJournal.setType(JournalType.BACK_OUT.getDetailType());
+//        } else {
+//            throw new ServiceException("未知待入库业务类型");
+//        }
+//        stockJournal.setCode(byId.getType() == 1 ? CodeEnum.SIN_CODE.getCode() : CodeEnum.SOUT_CODE.getCode());
+//        stockJournal.setWarehouseId(stockWaitDto.getWarehouseId());
+//        stockJournal.setBusinessId(byId.getId());
+//        //保存出入库记录
+//        stockJournalService.save(stockJournal);
+//        //操作库存
+//        Stock stock = new Stock();
+//        stock.setQuantity(stockWaitDto.getQuantity());
+//        stock.setProductId(stockWaitDetails.getProductId());
+//        List<StockJournalDetails> stockJournalDetailsList = stockService.ModifyInventory(stockJournal.getId(), byId.getType(), Arrays.asList(stock), stockWaitDto.getWarehouseId());
+//        //保存出入库明细
+//        stockJournalDetailsService.saveBatch(stockJournalDetailsList);
     }
 
     @DSTransactional

+ 4 - 0
hx-wms/src/main/resources/mapper/stock/StockFrozenMapper.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.fjhx.wms.mapper.stock.StockFrozenMapper">
+</mapper>

+ 3 - 1
hx-wms/src/main/resources/mapper/stock/StockMapper.xml

@@ -12,7 +12,9 @@
             s.create_time,
             s.update_user,
             s.update_time,
-            s.victoriatourist_json
+            s.victoriatourist_json,
+            s.unit_price,
+            s.frozen_quantity
         FROM
             stock s
                 LEFT JOIN bytesailing_item.product_info pi ON s.product_id = pi.id

+ 7 - 0
pom.xml

@@ -30,6 +30,7 @@
         <module>hx-victoriatourist</module>
         <module>hx-dingding</module>
         <module>hx-data</module>
+        <module>hx-jxst</module>
     </modules>
 
     <properties>
@@ -156,6 +157,12 @@
                 <version>${hx.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.fjhx</groupId>
+                <artifactId>hx-jxst</artifactId>
+                <version>${hx.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>