Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

1018653686@qq.com vor 1 Jahr
Ursprung
Commit
9b47bce5b2
68 geänderte Dateien mit 1953 neuen und 872 gelöschten Zeilen
  1. 0 5
      hx-admin/pom.xml
  2. 9 2
      hx-common/src/main/java/com/fjhx/common/entity/corporation/po/Corporation.java
  3. 5 0
      hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductInfoDto.java
  4. 2 1
      hx-item/src/main/java/com/fjhx/item/enums/ProductAvailableRecordType.java
  5. 2 0
      hx-item/src/main/java/com/fjhx/item/mapper/product/ProductInfoMapper.java
  6. 80 87
      hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java
  7. 5 0
      hx-item/src/main/resources/mapper/product/ProductInfoMapper.xml
  8. 6 0
      hx-jushuitan/src/main/java/com/fjhx/jushuitan/entity/jushuitan/dto/JushuitanConfigSelectDto.java
  9. 5 0
      hx-jushuitan/src/main/java/com/fjhx/jushuitan/entity/jushuitan/po/JushuitanConfig.java
  10. 5 0
      hx-jushuitan/src/main/java/com/fjhx/jushuitan/entity/jushuitan/vo/JushuitanConfigVo.java
  11. 52 0
      hx-jushuitan/src/main/java/com/fjhx/jushuitan/service/jushuitan/impl/JushuitanConfigServiceImpl.java
  12. 3 0
      hx-jushuitan/src/main/resources/mapper/jushuitan/JushuitanConfigMapper.xml
  13. 10 0
      hx-mes/src/main/java/com/fjhx/mes/controller/production/ProduceOrderDetailController.java
  14. 2 0
      hx-mes/src/main/java/com/fjhx/mes/entity/material/vo/MaterialPreparationVo.java
  15. 6 0
      hx-mes/src/main/java/com/fjhx/mes/entity/production/dto/ProduceOrderDetailSelectDto.java
  16. 18 8
      hx-mes/src/main/java/com/fjhx/mes/entity/production/vo/ProductionOrderDetailVo.java
  17. 5 0
      hx-mes/src/main/java/com/fjhx/mes/entity/production/vo/ProductionOrderVo.java
  18. 2 0
      hx-mes/src/main/java/com/fjhx/mes/entity/production/vo/ProductionReportingDetailVo.java
  19. 20 2
      hx-mes/src/main/java/com/fjhx/mes/service/material/impl/MaterialPreparationServiceImpl.java
  20. 15 8
      hx-mes/src/main/java/com/fjhx/mes/service/production/ProduceOrderDetailService.java
  21. 73 39
      hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProduceOrderDetailServiceImpl.java
  22. 168 16
      hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProduceOrderServiceImpl.java
  23. 13 0
      hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionReportingDetailServiceImpl.java
  24. 1 0
      hx-mes/src/main/resources/mapper/material/MaterialPreparationMapper.xml
  25. 2 1
      hx-mes/src/main/resources/mapper/production/ProduceOrderDetailMapper.xml
  26. 3 1
      hx-mes/src/main/resources/mapper/production/ProduceOrderMapper.xml
  27. 2 1
      hx-mes/src/main/resources/mapper/production/ProductionReportingDetailMapper.xml
  28. 7 0
      hx-purchase/src/main/java/com/fjhx/purchase/entity/subscribe/vo/SubscribeDetailVo.java
  29. 10 3
      hx-purchase/src/main/java/com/fjhx/purchase/mapper/subscribe/SubscribeDetailMapper.java
  30. 2 2
      hx-purchase/src/main/java/com/fjhx/purchase/service/invoice/impl/InvoiceServiceImpl.java
  31. 2 2
      hx-purchase/src/main/java/com/fjhx/purchase/service/pay/impl/PayServiceImpl.java
  32. 1 3
      hx-purchase/src/main/java/com/fjhx/purchase/service/purchase/impl/PurchaseDetailServiceImpl.java
  33. 52 43
      hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/impl/SubscribeDetailServiceImpl.java
  34. 20 2
      hx-purchase/src/main/resources/mapper/subscribe/SubscribeDetailMapper.xml
  35. 6 0
      hx-sale/pom.xml
  36. 398 0
      hx-sale/src/main/java/com/fjhx/sale/a-json/DeptPerfApi.json
  37. 45 0
      hx-sale/src/main/java/com/fjhx/sale/controller/dept/DeptPerfController.java
  38. 0 15
      hx-sale/src/main/java/com/fjhx/sale/controller/purchase/EhsdPurchaseController.java
  39. 6 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractProductDto.java
  40. 24 29
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/Contract.java
  41. 5 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/ContractProductBom.java
  42. 5 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/vo/ContractProductVo.java
  43. 17 0
      hx-sale/src/main/java/com/fjhx/sale/entity/dept/dto/DeptPerfDto.java
  44. 17 0
      hx-sale/src/main/java/com/fjhx/sale/entity/dept/dto/DeptPerfSelectDto.java
  45. 112 0
      hx-sale/src/main/java/com/fjhx/sale/entity/dept/po/DeptPerf.java
  46. 27 0
      hx-sale/src/main/java/com/fjhx/sale/entity/dept/vo/DeptPerfVo.java
  47. 10 8
      hx-sale/src/main/java/com/fjhx/sale/entity/purchase/vo/EhsdPurchaseVo.java
  48. 64 114
      hx-sale/src/main/java/com/fjhx/sale/flow/ContractFlow.java
  49. 256 280
      hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseFlow.java
  50. 26 0
      hx-sale/src/main/java/com/fjhx/sale/mapper/dept/DeptPerfMapper.java
  51. 30 7
      hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java
  52. 30 0
      hx-sale/src/main/java/com/fjhx/sale/service/dept/DeptPerfService.java
  53. 50 0
      hx-sale/src/main/java/com/fjhx/sale/service/dept/impl/DeptPerfServiceImpl.java
  54. 2 0
      hx-sale/src/main/java/com/fjhx/sale/service/purchase/EhsdPurchaseService.java
  55. 119 68
      hx-sale/src/main/java/com/fjhx/sale/service/purchase/impl/EhsdPurchaseServiceImpl.java
  56. 1 1
      hx-sale/src/main/java/com/fjhx/sale/service/sale/impl/SaleQuotationServiceImpl.java
  57. 32 0
      hx-sale/src/main/resources/mapper/dept/DeptPerfMapper.xml
  58. 0 13
      hx-supply/src/main/java/com/fjhx/supply/controller/supplier/SupplierInfoController.java
  59. 5 0
      hx-supply/src/main/java/com/fjhx/supply/entity/supplier/po/SupplierInfo.java
  60. 5 0
      hx-supply/src/main/java/com/fjhx/supply/entity/supplier/po/SupplierPrice.java
  61. 2 1
      hx-supply/src/main/java/com/fjhx/supply/entity/supplier/vo/SupplierInfoVo.java
  62. 2 0
      hx-supply/src/main/java/com/fjhx/supply/entity/supplier/vo/SupplierPriceVo.java
  63. 0 9
      hx-supply/src/main/java/com/fjhx/supply/service/supplier/SupplierInfoService.java
  64. 20 55
      hx-supply/src/main/java/com/fjhx/supply/service/supplier/impl/SupplierInfoServiceImpl.java
  65. 25 5
      hx-supply/src/main/java/com/fjhx/supply/service/supplier/impl/SupplierPriceServiceImpl.java
  66. 2 1
      hx-supply/src/main/resources/mapper/supplier/SupplierPriceMapper.xml
  67. 2 2
      hx-wms/src/main/java/com/fjhx/wms/service/warehouse/impl/WarehouseServiceImpl.java
  68. 0 38
      pom.xml

+ 0 - 5
hx-admin/pom.xml

@@ -61,11 +61,6 @@
 
         <dependency>
             <groupId>com.fjhx</groupId>
-            <artifactId>hx-ehsd</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.fjhx</groupId>
             <artifactId>hx-form</artifactId>
         </dependency>
 

+ 9 - 2
hx-common/src/main/java/com/fjhx/common/entity/corporation/po/Corporation.java

@@ -1,9 +1,7 @@
 package com.fjhx.common.entity.corporation.po;
 
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.common.core.domain.BasePo;
-import java.util.Date;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -134,4 +132,13 @@ public class Corporation extends BasePo {
      * 海关注册代码
      */
     private String crCode;
+
+    /**
+     * 联系人名称
+     */
+    private String contactName;
+    /**
+     * 联系人电话
+     */
+    private String contactPhone;
 }

+ 5 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductInfoDto.java

@@ -63,4 +63,9 @@ public class ProductInfoDto extends ProductInfo {
      * 产品id列表
      */
     private List<Long> productIds;
+
+    /**
+     * 生产文件列表
+     */
+    private List<ObsFile> prodFileList;
 }

+ 2 - 1
hx-item/src/main/java/com/fjhx/item/enums/ProductAvailableRecordType.java

@@ -12,7 +12,8 @@ public enum ProductAvailableRecordType {
     PURCHASE_UPDATE(3, "采购变更"),
     SALE_PASS(4, "销售合同通过"),
     HAND_IN(5, "手动入库"),
-    HAND_OUT(6, "手动出库");
+    HAND_OUT(6, "手动出库"),
+    SALE_CANCEL(7, "销售合同作废");
 
     /**
      * 类型

+ 2 - 0
hx-item/src/main/java/com/fjhx/item/mapper/product/ProductInfoMapper.java

@@ -28,6 +28,8 @@ public interface ProductInfoMapper extends BaseMapper<ProductInfo> {
      */
     Page<ProductInfoVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<ProductInfo> wrapper);
 
+    List<ProductInfoVo> getList(@Param("ew") IWrapper<ProductInfo> wrapper);
+
     /**
      * 根据产品IDS获取产品
      * @return

+ 80 - 87
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java

@@ -57,7 +57,6 @@ import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletResponse;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayOutputStream;
-import java.io.File;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.net.URL;
@@ -91,64 +90,10 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
     @Autowired
     private ProductStockInfoService productStockInfoService;
 
+
     @Override
     public Page<ProductInfoVo> getPage(ProductInfoSelectDto dto) {
-        IWrapper<ProductInfo> wrapper = getWrapper();
-        wrapper.eq("pi", ProductInfo::getType, dto.getType());
-        wrapper.eq("pi", ProductInfo::getDefinition, dto.getDefinition());
-
-        if (dto.getProductClassifyId() != null) {
-            List<Long> childIdList = productClassifyService.getChildIdList(dto.getProductClassifyId());
-            wrapper.in("pi", ProductInfo::getProductClassifyId, childIdList);
-        }
-
-        wrapper.like("pi", ProductInfo::getName, dto.getName());
-        wrapper.like("pi", ProductInfo::getCustomCode, dto.getCustomCode());
-        wrapper.like("pi", ProductInfo::getBarCode, dto.getBarCode());
-        wrapper.keyword(dto.getKeyword(),
-                new SqlField("pi", ProductInfo::getName),
-                new SqlField("pi", ProductInfo::getCode),
-                new SqlField("pi", ProductInfo::getCustomCode),
-                new SqlField("pi", ProductInfo::getSpec)
-        );
-
-        //过滤产品是否配置原材料
-        Integer isRawMaterial = dto.getIsRawMaterial();
-        if (ObjectUtil.isNotEmpty(isRawMaterial)) {
-            if (isRawMaterial.equals(1)) {
-                //过滤有配置原材料的产品
-                wrapper.isNotNull("pi.raw_material_id");
-                //同时过滤未配置工艺的的产品
-                wrapper.isNotNull("pi.technology_id");
-            } else {
-                //过滤没原材料的产品
-                wrapper.isNull("pi.raw_material_id");
-            }
-        }
-
-        //选择物料时不显示原材料分类的数据
-        Integer isNeRawMaterial = dto.getIsNeRawMaterial();
-        if (Objects.equals(isNeRawMaterial, 1)) {
-            List<Long> pcIds = productClassifyService.listObject(ProductClassify::getId, q -> q
-                    .eq(ProductClassify::getId, 100)
-                    .or().apply("FIND_IN_SET(parent_id_set, 100)")
-            );
-            if (ObjectUtil.isNotEmpty(pcIds)) {
-                wrapper.notIn("pi", ProductInfo::getProductClassifyId, pcIds);
-            }
-        }
-
-        //权限过滤:产品-子公司看自己的产品,总公司看全部,物料没有限制
-        Long companyId = SecurityUtils.getCompanyId();
-        if (!Objects.equals(companyId, 100L)) {
-            dto.setCompanyId(companyId);
-        }
-        wrapper.and(q1 -> q1.
-                and(q -> q.eq(ProductInfo::getDefinition, 1).eq(ProductInfo::getCompanyId, dto.getCompanyId()))
-                .or().eq(ProductInfo::getDefinition, 2)
-        );
-
-        wrapper.orderByDesc("pi", ProductInfo::getId);
+        IWrapper<ProductInfo> wrapper = getPageWrapper(dto);
         Page<ProductInfoVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
 
         List<ProductInfoVo> records = page.getRecords();
@@ -208,6 +153,66 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         return page;
     }
 
+    private IWrapper<ProductInfo> getPageWrapper(ProductInfoSelectDto dto) {
+        IWrapper<ProductInfo> wrapper = getWrapper();
+        wrapper.eq("pi", ProductInfo::getType, dto.getType());
+        wrapper.eq("pi", ProductInfo::getDefinition, dto.getDefinition());
+
+        if (dto.getProductClassifyId() != null) {
+            List<Long> childIdList = productClassifyService.getChildIdList(dto.getProductClassifyId());
+            wrapper.in("pi", ProductInfo::getProductClassifyId, childIdList);
+        }
+
+        wrapper.like("pi", ProductInfo::getName, dto.getName());
+        wrapper.like("pi", ProductInfo::getCustomCode, dto.getCustomCode());
+        wrapper.like("pi", ProductInfo::getBarCode, dto.getBarCode());
+        wrapper.keyword(dto.getKeyword(),
+                new SqlField("pi", ProductInfo::getName),
+                new SqlField("pi", ProductInfo::getCode),
+                new SqlField("pi", ProductInfo::getCustomCode),
+                new SqlField("pi", ProductInfo::getSpec)
+        );
+
+        //过滤产品是否配置原材料
+        Integer isRawMaterial = dto.getIsRawMaterial();
+        if (ObjectUtil.isNotEmpty(isRawMaterial)) {
+            if (isRawMaterial.equals(1)) {
+                //过滤有配置原材料的产品
+                wrapper.isNotNull("pi.raw_material_id");
+                //同时过滤未配置工艺的的产品
+                wrapper.isNotNull("pi.technology_id");
+            } else {
+                //过滤没原材料的产品
+                wrapper.isNull("pi.raw_material_id");
+            }
+        }
+
+        //选择物料时不显示原材料分类的数据
+        Integer isNeRawMaterial = dto.getIsNeRawMaterial();
+        if (Objects.equals(isNeRawMaterial, 1)) {
+            List<Long> pcIds = productClassifyService.listObject(ProductClassify::getId, q -> q
+                    .eq(ProductClassify::getId, 100)
+                    .or().apply("FIND_IN_SET(parent_id_set, 100)")
+            );
+            if (ObjectUtil.isNotEmpty(pcIds)) {
+                wrapper.notIn("pi", ProductInfo::getProductClassifyId, pcIds);
+            }
+        }
+
+        //权限过滤:产品-子公司看自己的产品,总公司看全部,物料没有限制
+        Long companyId = SecurityUtils.getCompanyId();
+        if (!Objects.equals(companyId, 100L)) {
+            dto.setCompanyId(companyId);
+        }
+        wrapper.and(q1 -> q1.
+                and(q -> q.eq("pi", ProductInfo::getDefinition, 1).eq("pi", ProductInfo::getCompanyId, dto.getCompanyId()))
+                .or().eq("pi", ProductInfo::getDefinition, 2)
+        );
+
+        wrapper.orderByDesc("pi", ProductInfo::getId);
+        return wrapper;
+    }
+
 
     @Override
     public ProductInfoVo detail(Long id) {
@@ -264,6 +269,7 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
 
         this.save(productInfoDto);
         ObsFileUtil.saveFile(productInfoDto.getFileList(), productInfoDto.getId());
+        ObsFileUtil.saveFile(productInfoDto.getProdFileList(), productInfoDto.getId(), 2);
     }
 
     @DSTransactional
@@ -300,6 +306,7 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
 
         this.updateById(productInfoDto);
         ObsFileUtil.editFile(productInfoDto.getFileList(), productInfoDto.getId());
+        ObsFileUtil.editFile(productInfoDto.getProdFileList(), productInfoDto.getId(), 2);
     }
 
     @DSTransactional
@@ -315,21 +322,20 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
     private void editFtpFile(ProductInfoDto productInfoDto) {
         //操作ftp文件
         String prodImgTempPath = productInfoDto.getProdImgPath();
-        String prodFileTempPath = productInfoDto.getProdFilePath();
+//        String prodFileTempPath = productInfoDto.getProdFilePath();
         //生产图片
         if (ObjectUtil.isNotEmpty(prodImgTempPath) && prodImgTempPath.startsWith("/temp")) {
-            File prodImgTemp = new File(prodImgTempPath);
-            String prodImgPath = String.format("/product/prodImg/%s/%s", productInfoDto.getCustomCode(), prodImgTemp.getName());
+            String prodImgPath = String.format("/product/prodImg/%s", productInfoDto.getId());
             JSONObject prodImgJson = ftpFileService.moveFolder(prodImgTempPath, prodImgPath);
             productInfoDto.setProdImgPath(prodImgJson.getString("path"));
         }
-        //生产文件
-        if (ObjectUtil.isNotEmpty(prodFileTempPath) && prodFileTempPath.startsWith("/temp")) {
-            File prodFileTemp = new File(prodFileTempPath);
-            String prodFilePath = String.format("/product/prodFile/%s/%s", productInfoDto.getCustomCode(), prodFileTemp.getName());
-            JSONObject prodFileJson = ftpFileService.moveFolder(prodFileTempPath, prodFilePath);
-            productInfoDto.setProdFilePath(prodFileJson.getString("path"));
-        }
+//        //生产文件
+//        if (ObjectUtil.isNotEmpty(prodFileTempPath) && prodFileTempPath.startsWith("/temp")) {
+//            File prodFileTemp = new File(prodFileTempPath);
+//            String prodFilePath = String.format("/product/prodFile/%s/%s", productInfoDto.getCustomCode(), prodFileTemp.getName());
+//            JSONObject prodFileJson = ftpFileService.moveFolder(prodFileTempPath, prodFilePath);
+//            productInfoDto.setProdFilePath(prodFileJson.getString("path"));
+//        }
     }
 
     /**
@@ -346,22 +352,20 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         if (ObjectUtil.isEmpty(pIds)) {
             return;
         }
-        //获取合同归属归属的物料可用库存
-        Map<Long, ProductStockInfo> availableQuantityMap = productStockInfoService.mapKEntity(ProductStockInfo::getId, q -> q
-                .in(ProductStockInfo::getProductId, pIds)
-                .eq(ProductStockInfo::getCompanyId, companyId)
-        );
 
         List<ProductAvailableRecord> availableRecordList = new ArrayList<>();
         for (InOutBo inOutBo : inOutList) {
-            ProductStockInfo productStockInfo = availableQuantityMap.get(inOutBo.getProductId());
+            //查询可用库存
+            ProductStockInfo productStockInfo = productStockInfoService.getOne(q -> q
+                    .eq(ProductStockInfo::getProductId, inOutBo.getProductId())
+                    .eq(ProductStockInfo::getCompanyId, companyId)
+            );
             if (ObjectUtil.isEmpty(productStockInfo)) {
                 productStockInfo = new ProductStockInfo();
                 productStockInfo.setAvailableQuantity(BigDecimal.ZERO);
                 productStockInfo.setCompanyId(companyId);
                 productStockInfo.setProductId(inOutBo.getProductId());
                 productStockInfoService.save(productStockInfo);
-                availableQuantityMap.put(inOutBo.getProductId(), productStockInfo);
             }
 
             BigDecimal availableQuantityNew;
@@ -765,19 +769,8 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
 
     @Override
     public void excelExport(HttpServletResponse httpServletResponse, ProductInfoSelectDto dto) {
-        IWrapper<ProductInfo> wrapper = IWrapper.getWrapper();
-        //权限过滤:产品-子公司看自己的产品,总公司看全部,物料没有限制
-        Long companyId = SecurityUtils.getCompanyId();
-        if (!Objects.equals(companyId, 100L)) {
-            dto.setCompanyId(companyId);
-        }
-        wrapper.and(q1 -> q1.
-                and(q -> q.eq(ProductInfo::getDefinition, 1).eq(ProductInfo::getCompanyId, dto.getCompanyId()))
-                .or().eq(ProductInfo::getDefinition, 2)
-        );
-
-        List<ProductInfo> productInfoList = this.list(wrapper);
-
+        IWrapper<ProductInfo> wrapper = getPageWrapper(dto);
+        List<ProductInfoVo> productInfoList = baseMapper.getList(wrapper);
         List<Long> pIds = productInfoList.stream().map(ProductInfo::getId).collect(Collectors.toList());
 
         //处理产品图片

+ 5 - 0
hx-item/src/main/resources/mapper/product/ProductInfoMapper.xml

@@ -48,6 +48,11 @@
         ${ew.customSqlSegment}
     </select>
 
+    <select id="getList" resultType="com.fjhx.item.entity.product.vo.ProductInfoVo">
+        <include refid="page"/>
+        ${ew.customSqlSegment}
+    </select>
+
     <select id="getListByProductIds" resultType="com.fjhx.item.entity.product.vo.ProductInfoVo">
         SELECT
         t1.*,

+ 6 - 0
hx-jushuitan/src/main/java/com/fjhx/jushuitan/entity/jushuitan/dto/JushuitanConfigSelectDto.java

@@ -14,4 +14,10 @@ import lombok.Setter;
 @Setter
 public class JushuitanConfigSelectDto extends BaseSelectDto {
 
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
+
 }

+ 5 - 0
hx-jushuitan/src/main/java/com/fjhx/jushuitan/entity/jushuitan/po/JushuitanConfig.java

@@ -55,4 +55,9 @@ public class JushuitanConfig extends BasePo {
      */
     private String remark;
 
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
 }

+ 5 - 0
hx-jushuitan/src/main/java/com/fjhx/jushuitan/entity/jushuitan/vo/JushuitanConfigVo.java

@@ -14,4 +14,9 @@ import lombok.Setter;
 @Setter
 public class JushuitanConfigVo extends JushuitanConfig {
 
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
 }

+ 52 - 0
hx-jushuitan/src/main/java/com/fjhx/jushuitan/service/jushuitan/impl/JushuitanConfigServiceImpl.java

@@ -1,6 +1,8 @@
 package com.fjhx.jushuitan.service.jushuitan.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+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.jushuitan.entity.jushuitan.dto.JushuitanConfigDto;
@@ -9,9 +11,16 @@ import com.fjhx.jushuitan.entity.jushuitan.po.JushuitanConfig;
 import com.fjhx.jushuitan.entity.jushuitan.vo.JushuitanConfigVo;
 import com.fjhx.jushuitan.mapper.jushuitan.JushuitanConfigMapper;
 import com.fjhx.jushuitan.service.jushuitan.JushuitanConfigService;
+import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.ruoyi.system.service.ISysDeptService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 
 /**
  * <p>
@@ -24,11 +33,48 @@ import org.springframework.stereotype.Service;
 @Service
 public class JushuitanConfigServiceImpl extends ServiceImpl<JushuitanConfigMapper, JushuitanConfig> implements JushuitanConfigService {
 
+    @Autowired
+    private ISysDeptService sysDeptService;
+
     @Override
     public Page<JushuitanConfigVo> getPage(JushuitanConfigSelectDto dto) {
         IWrapper<JushuitanConfig> wrapper = getWrapper();
+
+        //部门id过滤
+        wrapper.eq("jc", JushuitanConfig::getDeptId, dto.getDeptId());
+
+        //关键字过滤
+        String keyword = dto.getKeyword();
+        if (ObjectUtil.isNotEmpty(dto.getKeyword())) {
+            List<SysDept> deptKeyWord = sysDeptService.list(Wrappers.<SysDept>query().like("dept_name", keyword));
+            List<Long> deptKwIds = deptKeyWord.stream().map(SysDept::getDeptId).collect(Collectors.toList());
+            wrapper.and(q -> q
+                    .like(JushuitanConfig::getCompanyName, keyword)
+                    .or().like(JushuitanConfig::getAppKey, keyword)
+                    .or().like(JushuitanConfig::getAppSecret, keyword)
+                    .or().like(JushuitanConfig::getAccessToken, keyword)
+                    .or().like(JushuitanConfig::getRefreshToken, keyword)
+                    .or().like(JushuitanConfig::getRemark, keyword)
+                    .or().in(JushuitanConfig::getDeptId, deptKwIds)
+            );
+        }
+
         wrapper.orderByDesc("jc", JushuitanConfig::getId);
         Page<JushuitanConfigVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        List<JushuitanConfigVo> records = page.getRecords();
+        if (ObjectUtil.isEmpty(records)) {
+            return page;
+        }
+
+        //获取部门信息
+        List<Long> deptIds = records.stream().map(JushuitanConfig::getDeptId).collect(Collectors.toList());
+        List<SysDept> deptList = sysDeptService.list(Wrappers.<SysDept>query().in("dept_id", deptIds));
+        Map<Long, String> deprMap = deptList.stream().collect(Collectors.toMap(SysDept::getDeptId, SysDept::getDeptName));
+
+        for (JushuitanConfigVo record : records) {
+            //赋值部门名称
+            record.setDeptName(deprMap.get(record.getDeptId()));
+        }
         return page;
     }
 
@@ -36,6 +82,12 @@ public class JushuitanConfigServiceImpl extends ServiceImpl<JushuitanConfigMappe
     public JushuitanConfigVo detail(Long id) {
         JushuitanConfig JushuitanConfig = this.getById(id);
         JushuitanConfigVo result = BeanUtil.toBean(JushuitanConfig, JushuitanConfigVo.class);
+
+        //赋值部门名称
+        SysDept dept = sysDeptService.getOne(Wrappers.<SysDept>query().eq("dept_id", result.getDeptId()));
+        if (ObjectUtil.isNotEmpty(dept)) {
+            result.setDeptName(dept.getDeptName());
+        }
         return result;
     }
 

+ 3 - 0
hx-jushuitan/src/main/resources/mapper/jushuitan/JushuitanConfigMapper.xml

@@ -6,6 +6,9 @@
                jc.company_name,
                jc.app_key,
                jc.app_secret,
+               jc.access_token,
+               jc.refresh_token,
+               jc.dept_id,
                jc.remark,
                jc.create_user,
                jc.create_time,

+ 10 - 0
hx-mes/src/main/java/com/fjhx/mes/controller/production/ProduceOrderDetailController.java

@@ -11,6 +11,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -43,4 +45,12 @@ public class ProduceOrderDetailController {
         return produceOrderDetailService.detail(dto);
     }
 
+    /**
+     * 批量生产任务详情
+     */
+    @PostMapping("/detailByIds")
+    public List<ProductionOrderDetailVo> detailByIds(@RequestBody ProduceOrderDetailSelectDto dto) {
+        return produceOrderDetailService.detailByIds(dto.getTaskIds());
+    }
+
 }

+ 2 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/material/vo/MaterialPreparationVo.java

@@ -23,4 +23,6 @@ public class MaterialPreparationVo extends MaterialPreparation {
      */
     private String materialCode;
 
+    private String companyName;
+
 }

+ 6 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/production/dto/ProduceOrderDetailSelectDto.java

@@ -5,6 +5,7 @@ import lombok.Getter;
 import lombok.Setter;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * 生产订单明细列表查询入参实体
@@ -36,4 +37,9 @@ public class ProduceOrderDetailSelectDto extends BaseSelectDto {
      */
     private Long companyId;
 
+    /**
+     * 任务ID列表
+     */
+    private List<Long> taskIds;
+
 }

+ 18 - 8
hx-mes/src/main/java/com/fjhx/mes/entity/production/vo/ProductionOrderDetailVo.java

@@ -58,6 +58,11 @@ public class ProductionOrderDetailVo extends ProductionOrderDetail {
 	 * 产品高
 	 */
 	private BigDecimal productHeight;
+	/**
+	 * 产品备注
+	 */
+	private String productRemark;
+
 
 	/**
 	 * 交期
@@ -102,14 +107,19 @@ public class ProductionOrderDetailVo extends ProductionOrderDetail {
 	 */
 	private List<ProductionTaskProgressVo> productionTaskProgressList;
 
-	/**
-	 * BOM列表
-	 */
-	private List<ContractProductBomVo> contractProductBomList;
+    /**
+     * BOM列表
+     */
+    private List<ContractProductBomVo> contractProductBomList;
 
-	/**
-	 * 投产时间
-	 */
-	private Date produceTime;
+    /**
+     * 投产时间
+     */
+    private Date produceTime;
+
+    /**
+     * 生产公司Id
+     */
+    private String companyName;
 
 }

+ 5 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/production/vo/ProductionOrderVo.java

@@ -28,4 +28,9 @@ public class ProductionOrderVo extends ProductionOrder {
      */
     private String prodTag;
 
+    /**
+     * 归属公司名称
+     */
+    private String companyName;
+
 }

+ 2 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/production/vo/ProductionReportingDetailVo.java

@@ -29,4 +29,6 @@ public class ProductionReportingDetailVo extends ProductionReportingDetail {
      */
     private String createUserName;
 
+    private String companyName;
+
 }

+ 20 - 2
hx-mes/src/main/java/com/fjhx/mes/service/material/impl/MaterialPreparationServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fjhx.mes.service.material.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.item.service.product.ProductInfoService;
@@ -8,6 +9,7 @@ import com.fjhx.mes.entity.material.po.MaterialPreparation;
 import com.fjhx.mes.entity.material.vo.MaterialPreparationVo;
 import com.fjhx.mes.mapper.material.MaterialPreparationMapper;
 import com.fjhx.mes.service.material.MaterialPreparationService;
+import com.fjhx.tenant.utils.DeptUstil;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
@@ -15,7 +17,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 
 /**
@@ -47,9 +51,9 @@ public class MaterialPreparationServiceImpl extends ServiceImpl<MaterialPreparat
         //权限过滤:生产备料-子公司看自己的,总公司看全部
         Long companyId = SecurityUtils.getCompanyId();
         if (!Objects.equals(companyId, 100L)) {
-            wrapper.eq(MaterialPreparation::getCompanyId, companyId);
+            wrapper.eq("mp", MaterialPreparation::getCompanyId, companyId);
         } else {
-            wrapper.eq(MaterialPreparation::getCompanyId, dto.getCompanyId());
+            wrapper.eq("mp", MaterialPreparation::getCompanyId, dto.getCompanyId());
         }
 
         wrapper.orderByDesc("mp", MaterialPreparation::getCreateTime);
@@ -63,6 +67,20 @@ public class MaterialPreparationServiceImpl extends ServiceImpl<MaterialPreparat
 
         Page<MaterialPreparationVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
 
+        List<MaterialPreparationVo> records = page.getRecords();
+        if (ObjectUtil.isEmpty(records)) {
+            return page;
+        }
+
+        //获取生产公司信息
+        List<Long> companyIds = records.stream().map(MaterialPreparation::getCompanyId).collect(Collectors.toList());
+        Map<Long, String> companyNameMap = DeptUstil.getDeptNameMap(companyIds);
+
+        for (MaterialPreparationVo record : records) {
+            //赋值生产公司名称
+            record.setCompanyName(companyNameMap.get(record.getCompanyId()));
+        }
+
         return page;
     }
 

+ 15 - 8
hx-mes/src/main/java/com/fjhx/mes/service/production/ProduceOrderDetailService.java

@@ -7,6 +7,8 @@ import com.fjhx.mes.entity.production.po.ProductionOrderDetail;
 import com.fjhx.mes.entity.production.vo.ProductionOrderDetailVo;
 import com.ruoyi.common.core.service.BaseService;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -18,13 +20,18 @@ import com.ruoyi.common.core.service.BaseService;
  */
 public interface ProduceOrderDetailService extends BaseService<ProductionOrderDetail> {
 
-	/**
-	 * 生产任务分页
-	 */
-	Page<ProductionOrderDetailVo> getPage(ProduceOrderDetailSelectDto dto);
+    /**
+     * 生产任务分页
+     */
+    Page<ProductionOrderDetailVo> getPage(ProduceOrderDetailSelectDto dto);
+
+    /**
+     * 生产任务详情
+     */
+    ProductionOrderDetailVo detail(ProductionTaskDetailDto dto);
 
-	/**
-	 * 生产任务详情
-	 */
-	ProductionOrderDetailVo detail(ProductionTaskDetailDto dto);
+    /**
+     * 批量任务详情
+     */
+    List<ProductionOrderDetailVo> detailByIds(List<Long> taskIds);
 }

+ 73 - 39
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProduceOrderDetailServiceImpl.java

@@ -21,16 +21,15 @@ import com.fjhx.mes.service.production.ProduceOrderService;
 import com.fjhx.sale.entity.contract.po.ContractProductBom;
 import com.fjhx.sale.entity.contract.vo.ContractProductBomVo;
 import com.fjhx.sale.service.contract.ContractProductBomService;
+import com.fjhx.sale.service.contract.ContractProductService;
+import com.fjhx.tenant.utils.DeptUstil;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -51,6 +50,8 @@ public class ProduceOrderDetailServiceImpl extends ServiceImpl<ProduceOrderDetai
     @Autowired
     private ProductionTaskProgressMapper productionTaskProgressMapper;
     @Autowired
+    private ContractProductService contractProductService;
+    @Autowired
     private ContractProductBomService contractProductBomService;
     @Autowired
     private ProduceOrderService produceOrderService;
@@ -120,6 +121,10 @@ public class ProduceOrderDetailServiceImpl extends ServiceImpl<ProduceOrderDetai
         Map<Long, List<ProductionTaskProgressVo>> productionTaskProgressMap = productionTaskProgressList
                 .stream().collect(Collectors.groupingBy(ProductionTaskProgress::getTaskId));
 
+        //获取生产公司信息
+        List<Long> companyIds = records.stream().map(ProductionOrderDetail::getCompanyId).collect(Collectors.toList());
+        Map<Long, String> companyNameMap = DeptUstil.getDeptNameMap(companyIds);
+
 
         for (ProductionOrderDetailVo record : records) {
             //赋值产品信息
@@ -152,6 +157,9 @@ public class ProduceOrderDetailServiceImpl extends ServiceImpl<ProduceOrderDetai
 
             //赋值生产进度列表
             record.setProductionTaskProgressList(productionTaskProgressMap.get(record.getId()));
+
+            //赋值生产公司名称
+            record.setCompanyName(companyNameMap.get(record.getCompanyId()));
         }
 
         return page;
@@ -162,16 +170,24 @@ public class ProduceOrderDetailServiceImpl extends ServiceImpl<ProduceOrderDetai
         ProductionOrderDetailVo detail = BeanUtil.copyProperties(getById(dto.getId()), ProductionOrderDetailVo.class);
         Assert.notEmpty(detail, "查询不到任务明细信息!");
 
+        return detailByIds(Arrays.asList(detail.getId())).get(0);
+    }
+
+    @Override
+    public List<ProductionOrderDetailVo> detailByIds(List<Long> taskIds) {
+        Assert.notEmpty(taskIds, "任务id列表不能为空");
+
+        List<ProductionOrderDetail> productionOrderDetailList = this.list(q -> q.in(ProductionOrderDetail::getId, taskIds));
+        List<ProductionOrderDetailVo> voList = BeanUtil.copyToList(productionOrderDetailList, ProductionOrderDetailVo.class);
+
         //赋值订单信息
-        ProductionOrder productionOrder = produceOrderService.getById(detail.getProduceOrderId());
-        if (ObjectUtil.isNotEmpty(productionOrder)) {
-            detail.setOrderCode(productionOrder.getCode());
-            detail.setDeliveryPeriod(productionOrder.getDeliveryPeriod());
-        }
+        produceOrderService.attributeAssign(voList, ProductionOrderDetailVo::getProduceOrderId, (detail, order) -> {
+            detail.setOrderCode(order.getCode());
+            detail.setDeliveryPeriod(order.getDeliveryPeriod());
+        });
 
         //赋值产品信息
-        ProductInfo product = productInfoService.getById(detail.getProductId());
-        if (ObjectUtil.isNotEmpty(product)) {
+        productInfoService.attributeAssign(voList, ProductionOrderDetailVo::getProductId, (detail, product) -> {
             detail.setProductCode(product.getCustomCode());
             detail.setProductName(product.getName());
             detail.setProductUnit(product.getUnit());
@@ -179,41 +195,59 @@ public class ProduceOrderDetailServiceImpl extends ServiceImpl<ProduceOrderDetai
             detail.setProductLength(product.getLength());
             detail.setProductWidth(product.getWidth());
             detail.setProductHeight(product.getHeight());
-        }
-        //赋值原材料信息
-        ContractProductBom rawMaterialBom = contractProductBomService.getOne(q -> q
-                .eq(ContractProductBom::getContractProductId, detail.getContractDetailId())
-                .eq(ContractProductBom::getType, 1)
-        );
-        if (ObjectUtil.isNotEmpty(rawMaterialBom)) {
-            ProductInfo rawMaterial = productInfoService.getById(rawMaterialBom.getMaterialId());
-            if (ObjectUtil.isNotEmpty(rawMaterial)) {
-                detail.setRawMaterialCode(rawMaterial.getCustomCode());
-                detail.setRawMaterialName(rawMaterial.getName());
-                detail.setRawMaterialLength(rawMaterial.getLength());
-                detail.setRawMaterialWidth(rawMaterial.getWidth());
-                detail.setRawMaterialHeight(rawMaterial.getHeight());
-            }
-        }
-        //赋值BOM信息
-        List<ContractProductBom> bomList = contractProductBomService.list(q -> q
-                .eq(ContractProductBom::getContractProductId, detail.getContractDetailId())
-                .ne(ContractProductBom::getType, 1)
-        );
-        List<ContractProductBomVo> bomVoList = BeanUtil.copyToList(bomList, ContractProductBomVo.class);
-        productInfoService.attributeAssign(bomVoList, ContractProductBomVo::getMaterialId, (item, product1) -> {
+        });
+        //赋值产品备注
+        contractProductService.attributeAssign(voList, ProductionOrderDetailVo::getContractDetailId, (detail, product) -> {
+            detail.setProductRemark(product.getRemark());
+        });
+
+        //获取bom信息
+        List<Long> cpIds = voList.stream().map(ProductionOrderDetailVo::getContractDetailId).collect(Collectors.toList());
+        List<ContractProductBom> cpBomList = contractProductBomService.list(q -> q.in(ContractProductBom::getContractProductId, cpIds));
+        List<ContractProductBomVo> cpBomVoList = BeanUtil.copyToList(cpBomList, ContractProductBomVo.class);
+        productInfoService.attributeAssign(cpBomVoList, ContractProductBomVo::getMaterialId, (item, product1) -> {
             item.setProductCode(product1.getCustomCode());
             item.setProductName(product1.getName());
+
+            item.setProductLength(product1.getLength());
+            item.setProductWidth(product1.getWidth());
+            item.setProductHeight(product1.getHeight());
+
         });
-        detail.setContractProductBomList(bomVoList);
+        Map<Long, List<ContractProductBomVo>> bomMap = cpBomVoList.stream().collect(Collectors.groupingBy(ContractProductBom::getContractProductId));
+        //获取原材料
+        Map<Long, ContractProductBomVo> rawBomMap = cpBomVoList.stream()
+                .filter(item -> Objects.equals(item.getType(), 1))
+                .collect(Collectors.toMap(ContractProductBom::getContractProductId, Function.identity()));
+        //其他BOM
+        Map<Long, List<ContractProductBomVo>> otherBomMap = cpBomVoList.stream()
+                .filter(item -> !Objects.equals(item.getType(), 1))
+                .collect(Collectors.groupingBy(ContractProductBom::getContractProductId));
 
-        //赋值生产进度列表
+        //获取生产进度列表
         List<ProductionTaskProgressVo> productionTaskProgressList = productionTaskProgressMapper.getList(IWrapper.<ProductionTaskProgress>getWrapper()
-                .eq("ptp.task_id", detail.getId())
+                .in("ptp.task_id", taskIds)
         );
-        detail.setProductionTaskProgressList(productionTaskProgressList);
+        Map<Long, List<ProductionTaskProgressVo>> ptpMap = productionTaskProgressList.stream().collect(Collectors.groupingBy(ProductionTaskProgress::getTaskId));
+
+        for (ProductionOrderDetailVo detail : voList) {
+            //赋值原材料信息
+            ContractProductBomVo rawMaterialBom = rawBomMap.get(detail.getContractDetailId());
+            if (ObjectUtil.isNotEmpty(rawMaterialBom)) {
+                detail.setRawMaterialCode(rawMaterialBom.getProductCode());
+                detail.setRawMaterialName(rawMaterialBom.getProductName());
+                detail.setRawMaterialLength(rawMaterialBom.getProductLength());
+                detail.setRawMaterialWidth(rawMaterialBom.getProductWidth());
+                detail.setRawMaterialHeight(rawMaterialBom.getProductHeight());
+            }
+            //赋值BOM信息
+            detail.setContractProductBomList(otherBomMap.get(detail.getContractDetailId()));
+
+            //赋值生产进度列表
+            detail.setProductionTaskProgressList(ptpMap.get(detail.getId()));
+        }
 
-        return detail;
+        return voList;
     }
 
 }

+ 168 - 16
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProduceOrderServiceImpl.java

@@ -2,14 +2,20 @@ package com.fjhx.mes.service.production.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+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.common.entity.InOutBo;
+import com.fjhx.common.enums.InOutType;
+import com.fjhx.common.enums.PushBusinessTypeEnum;
 import com.fjhx.common.utils.Assert;
-import com.fjhx.item.entity.product.po.ProductBomDetail;
 import com.fjhx.item.entity.product.po.ProductInfo;
-import com.fjhx.item.service.product.ProductBomDetailService;
+import com.fjhx.item.entity.product.po.ProductStockInfo;
+import com.fjhx.item.enums.ProductAvailableRecordType;
 import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.item.service.product.ProductStockInfoService;
 import com.fjhx.mes.entity.material.po.MaterialPreparation;
 import com.fjhx.mes.entity.production.dto.ProduceOrderSelectDto;
 import com.fjhx.mes.entity.production.dto.ProductionOrderDto;
@@ -27,22 +33,33 @@ import com.fjhx.mes.service.production.ProduceOrderDetailService;
 import com.fjhx.mes.service.production.ProduceOrderService;
 import com.fjhx.mes.service.production.ProductionTaskProgressService;
 import com.fjhx.mes.service.work.WorkOrderService;
+import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
+import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 import com.fjhx.sale.entity.contract.po.Contract;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
+import com.fjhx.sale.entity.contract.po.ContractProductBom;
+import com.fjhx.sale.service.contract.ContractProductBomService;
 import com.fjhx.sale.service.contract.ContractProductService;
 import com.fjhx.sale.service.contract.ContractService;
+import com.fjhx.socket.core.PushTypeEnum;
+import com.fjhx.socket.core.WebSocketPush;
+import com.fjhx.tenant.utils.DeptUstil;
+import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
 import com.ruoyi.system.service.ISysDeptService;
+import com.ruoyi.system.utils.UserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
@@ -69,13 +86,19 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
     @Autowired
     private WorkOrderService workOrderService;
     @Autowired
-    private ProductBomDetailService productBomDetailService;
-    @Autowired
     private MaterialPreparationService materialPreparationService;
     @Autowired
     private ProductionProcessesMapper productionProcessesMapper;
     @Autowired
     private ProductionTaskProgressService productionTaskProgressService;
+    @Autowired
+    private ContractProductBomService contractProductBomService;
+    @Autowired
+    private ISysDeptService deptService;
+    @Autowired
+    private SubscribeDetailService subscribeDetailService;
+    @Autowired
+    private ProductStockInfoService productStockInfoService;
 
     @Override
     public Page<ProductionOrderVo> getPage(ProduceOrderSelectDto dto) {
@@ -122,8 +145,21 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         });
 
         Map<Long, List<ProductionOrderDetailVo>> produceOrderDetailMap = produceOrderDetailVos.stream().collect(Collectors.groupingBy(ProductionOrderDetail::getProduceOrderId));
+
+        //获取归属公司信息
+        Map<Long, String> sysDeptMap = new HashMap<>();
+        List<Long> companyIds = records.stream().map(ProductionOrder::getCompanyId).collect(Collectors.toList());
+        if (ObjectUtil.isNotEmpty(companyIds)) {
+            List<SysDept> deptList = sysDeptService.list(Wrappers.<SysDept>query().in("dept_id", companyIds));
+            sysDeptMap = deptList.stream().collect(Collectors.toMap(SysDept::getDeptId, SysDept::getDeptName));
+        }
+
+
         for (ProductionOrderVo record : records) {
             record.setProduceOrderDetailList(produceOrderDetailMap.get(record.getId()));
+
+            //赋值生产公司
+            record.setCompanyName(sysDeptMap.get(record.getCompanyId()));
         }
 
         return page;
@@ -154,9 +190,9 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         //权限过滤:生产排程-子公司看自己,总公司看全部
         Long companyId = SecurityUtils.getCompanyId();
         if (!Objects.equals(companyId, 100L)) {
-            wrapper.eq(ProductInfo::getCompanyId, companyId);
+            wrapper.eq("po", ProductInfo::getCompanyId, companyId);
         } else {
-            wrapper.eq(ProductInfo::getCompanyId, dto.getCompanyId());
+            wrapper.eq("po", ProductInfo::getCompanyId, dto.getCompanyId());
         }
 
         wrapper.groupBy("po.id");
@@ -164,6 +200,17 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         wrapper.orderByAsc("po", ProductionOrder::getCreateTime);
         wrapper.orderByAsc("po", ProductionOrder::getId);
         List<ProductionOrderVo> schedulingList = baseMapper.getSchedulingList(wrapper);
+
+        //获取生产部门信息
+        List<Long> companyIds = schedulingList.stream().map(ProductionOrderVo::getCompanyId).collect(Collectors.toList());
+        if (ObjectUtil.isNotEmpty(companyIds)) {
+            Map<Long, String> deptMap = DeptUstil.getDeptNameMap(companyIds);
+            for (ProductionOrderVo productionOrderVo : schedulingList) {
+                //赋值生产公司名称
+                productionOrderVo.setCompanyName(deptMap.get(productionOrderVo.getCompanyId()));
+            }
+        }
+
         return schedulingList;
     }
 
@@ -182,14 +229,32 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         //获取合同信息
         Contract contract = contractService.getById(contractId);
         Assert.notEmpty(contract, "查询不到合同信息!");
-        contractService.update(q -> q.eq(Contract::getId, contractId).set(Contract::getOrderDistributeStatus, 1));
+        contractService.update(q -> q
+                .eq(Contract::getId, contractId)
+                .set(Contract::getOrderDistributeStatus, 1)
+                .set(Contract::getOrderDistributeTime, new Date())
+                .set(BasePo::getUpdateTime, new Date())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+        );
 
         produceOrderDto.setCode(contract.getCode());
         produceOrderDto.setProduceStatus(0);
         this.save(produceOrderDto);
 
+        //创建待采购
+        createMaterialWaitPurchase(produceOrderDto);
+
         //创建生产任务
         createOrderDetails(produceOrderDto);
+
+        //消息推送:给归属公司的 子公司总经理
+        String title = String.format("您有新的生产订单,订单号【%s】,请及时跟进。", produceOrderDto.getCode());
+        JSONObject msg = new JSONObject();
+        msg.put("business_id", produceOrderDto.getId());
+        List<Long> generalManagerIds = UserUtil.getUserIdsByRoleKey("subsidiary_gm", companyId);
+        for (Long generalManagerId : generalManagerIds) {
+            WebSocketPush.byUser(PushTypeEnum.MESSAGE, generalManagerId, title, PushBusinessTypeEnum.CONTRACT_PRODUCTION_TAG_UPDATE.getType(), msg.toString());
+        }
     }
 
     /**
@@ -240,6 +305,94 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
     }
 
     /**
+     * 创建合同产品 物料待采购信息
+     */
+    private void createMaterialWaitPurchase(ProductionOrderDto productionOrderDto) {
+        //根据归属公司将数据赋值给指定公司
+        Long companyId = productionOrderDto.getCompanyId();
+        Long contractId = productionOrderDto.getContractId();
+
+        //获取合同产品信息
+        List<ContractProduct> contractProductList = contractProductService.list(q -> q.eq(ContractProduct::getContractId, contractId));
+        Map<Long, ContractProduct> productMap = contractProductList.stream().collect(Collectors.toMap(ContractProduct::getId, Function.identity()));
+
+        //获取物料列表
+        List<Long> cpIds = contractProductList.stream().map(ContractProduct::getId).collect(Collectors.toList());
+        List<ContractProductBom> cpBList = contractProductBomService.list(q -> q.in(ContractProductBom::getContractProductId, cpIds));
+
+        //合并所有相同物料
+        Map<Long, InOutBo> inOutBoMap = new ConcurrentHashMap<>();
+        for (ContractProductBom bom : cpBList) {
+            Long materialId = bom.getMaterialId();
+            ContractProduct contractProduct = productMap.get(bom.getContractProductId());
+            BigDecimal multiply = bom.getQuantity().multiply(contractProduct.getQuantity());
+
+            //合并相同物料
+            InOutBo inOutBo = inOutBoMap.get(materialId);
+            if (ObjectUtil.isEmpty(inOutBo)) {
+                inOutBo = new InOutBo();
+                inOutBo.setProductId(materialId);
+                inOutBo.setQuantity(BigDecimal.ZERO);
+            }
+            inOutBo.setQuantity(inOutBo.getQuantity().add(multiply));
+            inOutBoMap.put(materialId, inOutBo);
+        }
+
+        List<Long> materialIds = cpBList.stream().map(ContractProductBom::getMaterialId).collect(Collectors.toList());
+        Map<Long, ProductInfo> materialMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, materialIds));
+
+        //计算并生成待出库数据
+        List<SubscribeDetail> subscribeDetailList = new ArrayList<>();
+        for (InOutBo value : inOutBoMap.values()) {
+            Long materialId = value.getProductId();
+            BigDecimal multiply = value.getQuantity();
+
+            ProductInfo materialInfo = materialMap.get(materialId);
+            //获取产品安全库存
+            BigDecimal stockThreshold = materialInfo.getStockThreshold();
+            //获取可用库存
+            BigDecimal availableQuantity = BigDecimal.ZERO;
+            ProductStockInfo productStockInfo = productStockInfoService.getOne(q -> q.eq(ProductStockInfo::getProductId, materialId).eq(ProductStockInfo::getCompanyId, companyId));
+            if (ObjectUtil.isNotEmpty(productStockInfo)) {
+                availableQuantity = productStockInfo.getAvailableQuantity();
+            }
+            //计数需要采购的数量(需采购量 = 安全库存 - (可用库存 - 合同量)若 需采购量<0,则按0算不采购)
+            BigDecimal subtract = availableQuantity.subtract(multiply);
+            BigDecimal requiredQuantity = stockThreshold.subtract(subtract);
+
+            //计算可用库存
+            if (requiredQuantity.compareTo(BigDecimal.ZERO) < 0) {
+                //需要采购的数量<0 可用库存 = 可用库存 - 合同量
+                InOutBo inOutBo = new InOutBo();
+                inOutBo.setProductId(materialId);
+                inOutBo.setQuantity(multiply);
+                productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.OUT, contractId, ProductAvailableRecordType.SALE_PASS, companyId);
+            } else {
+                //需要采购的数量>=0 可用库存 = 安全库存
+                InOutBo inOutBo = new InOutBo();
+                inOutBo.setProductId(materialId);
+                inOutBo.setQuantity(stockThreshold);
+                productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.EQ, contractId, ProductAvailableRecordType.SALE_PASS, companyId);
+            }
+
+            //需要采购的数量大于0生成待采购数据
+            if (requiredQuantity.compareTo(BigDecimal.ZERO) > 0) {
+                SubscribeDetail subscribeDetail = new SubscribeDetail();
+                subscribeDetail.setProductId(materialId);
+                subscribeDetail.setCount(requiredQuantity);
+                subscribeDetail.setStatus(15);//待采购
+                subscribeDetail.setContractId(contractId);
+                subscribeDetail.setDataType(1);
+                subscribeDetail.setCompanyId(companyId);
+                subscribeDetailList.add(subscribeDetail);
+            }
+        }
+
+        //保存待采购明细
+        subscribeDetailService.saveBatch(subscribeDetailList);
+    }
+
+    /**
      * 创建生产任务
      */
     private synchronized void createOrderDetails(ProductionOrder produceOrder) {
@@ -318,22 +471,21 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         List<ProductionOrderDetail> productionOrderDetailList = produceOrderDetailService.list(q -> q
                 .eq(ProductionOrderDetail::getProduceOrderId, productionOrder.getId())
         );
+        //获取合同产品ids
+        List<Long> cpIds = productionOrderDetailList.stream()
+                .map(ProductionOrderDetail::getContractDetailId).collect(Collectors.toList());
+        Map<Long, List<ContractProductBom>> cpBMap = contractProductBomService.mapKGroup(ContractProductBom::getContractProductId,
+                q -> q.in(ContractProductBom::getContractProductId, cpIds)
+        );
 
         //获取产品id
-        List<Long> productIds = productionOrderDetailList.stream().map(ProductionOrderDetail::getProductId).collect(Collectors.toList());
-        Map<Long, ProductInfo> productInfoMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, productIds));
-        Map<Long, List<ProductBomDetail>> productBomDetailMap = productBomDetailService.mapKGroup(ProductBomDetail::getProductId, q -> q.in(ProductBomDetail::getProductId, productIds));
-
         for (ProductionOrderDetail productionOrderDetail : productionOrderDetailList) {
             productionOrderDetail.setProduceStatus(1);
             //创建备料
-            Long productId = productionOrderDetail.getProductId();
-            ProductInfo productInfo = productInfoMap.get(productId);
-            Assert.notEmpty(productInfo, "查询不到产品信息");
+            List<ContractProductBom> contractProductBomList = cpBMap.get(productionOrderDetail.getContractDetailId());
 
-            List<ProductBomDetail> productBomDetailList = productBomDetailMap.get(productId);
             List<MaterialPreparation> materialPreparationList = new ArrayList<>();
-            for (ProductBomDetail bomDetail : productBomDetailList) {
+            for (ContractProductBom bomDetail : contractProductBomList) {
                 BigDecimal multiply = bomDetail.getQuantity().multiply(productionOrderDetail.getQuantity());
 
                 MaterialPreparation materialPreparation = new MaterialPreparation();

+ 13 - 0
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionReportingDetailServiceImpl.java

@@ -22,6 +22,7 @@ import com.fjhx.mes.service.production.ProduceOrderService;
 import com.fjhx.mes.service.production.ProductionReportingDetailService;
 import com.fjhx.mes.service.production.ProductionTaskProgressService;
 import com.fjhx.mes.service.technology.TechnologyProcessLineService;
+import com.fjhx.tenant.utils.DeptUstil;
 import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
@@ -32,7 +33,9 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 
 /**
@@ -80,6 +83,16 @@ public class ProductionReportingDetailServiceImpl extends ServiceImpl<Production
         }
         //赋值创建人名称
         UserUtil.assignmentNickName(records, ProductionReportingDetail::getCreateUser, ProductionReportingDetailVo::setCreateUserName);
+
+        //获取生产公司信息
+        List<Long> companyIds = records.stream().map(ProductionReportingDetail::getCompanyId).collect(Collectors.toList());
+        Map<Long, String> companyNameMap = DeptUstil.getDeptNameMap(companyIds);
+
+        for (ProductionReportingDetailVo record : records) {
+            //赋值生产公司名称
+            record.setCompanyName(companyNameMap.get(record.getCompanyId()));
+        }
+
         return page;
     }
 

+ 1 - 0
hx-mes/src/main/resources/mapper/material/MaterialPreparationMapper.xml

@@ -23,6 +23,7 @@
                mp.create_time,
                mp.update_user,
                mp.update_time,
+               mp.company_id,
                pi.`name`      as materialName,
                pi.custom_code as materialCode
         from material_preparation mp

+ 2 - 1
hx-mes/src/main/resources/mapper/production/ProduceOrderDetailMapper.xml

@@ -20,7 +20,8 @@
 			   po.code        AS orderCode,
 			   po.create_time AS orderCreateTime,
 			   po.produce_time,
-			   po.delivery_period
+			   po.delivery_period,
+			   po.company_id
 		FROM production_order_detail pod
 				 LEFT JOIN production_order po ON pod.produce_order_id = po.id
 			${ew.customSqlSegment}

+ 3 - 1
hx-mes/src/main/resources/mapper/production/ProduceOrderMapper.xml

@@ -12,6 +12,7 @@
 			   po.create_time,
 			   po.update_user,
 			   po.update_time,
+			   po.company_id,
 			   c.prod_tag
 		from production_order po
 				 LEFT JOIN contract c ON po.contract_id = c.id
@@ -23,7 +24,8 @@
 			   GROUP_CONCAT(pi.`name` SEPARATOR ',') AS productName,
 			   po.create_time,
 			   po.produce_time,
-			   po.delivery_period
+			   po.delivery_period,
+			   po.company_id
 		FROM production_order po
 				 LEFT JOIN production_order_detail pod ON pod.produce_order_id = po.id
 				 LEFT JOIN product_info pi ON pod.product_id = pi.id

+ 2 - 1
hx-mes/src/main/resources/mapper/production/ProductionReportingDetailMapper.xml

@@ -11,7 +11,8 @@
                prd.update_user,
                prd.update_time,
                po.`code` AS orderCode,
-               pp.`name` AS processesName
+               pp.`name` AS processesName,
+               prd.company_id
         FROM production_reporting_detail prd
                  LEFT JOIN production_order_detail pod ON prd.production_task_id = pod.id
                  LEFT JOIN production_order po ON pod.produce_order_id = po.id

+ 7 - 0
hx-purchase/src/main/java/com/fjhx/purchase/entity/subscribe/vo/SubscribeDetailVo.java

@@ -120,5 +120,12 @@ public class SubscribeDetailVo extends SubscribeDetail {
      */
     private BigDecimal productHeight;
 
+    /**
+     * 合同生产标签
+     */
+    private String prodTag;
+
+    private String companyName;
+
 
 }

+ 10 - 3
hx-purchase/src/main/java/com/fjhx/purchase/mapper/subscribe/SubscribeDetailMapper.java

@@ -1,13 +1,13 @@
 package com.fjhx.purchase.mapper.subscribe;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
 import com.fjhx.purchase.entity.subscribe.vo.SubscribeDetailVo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
-import org.springframework.security.core.parameters.P;
 
 import java.util.List;
 
@@ -20,6 +20,7 @@ import java.util.List;
  * @author
  * @since 2023-04-03
  */
+@Mapper
 public interface SubscribeDetailMapper extends BaseMapper<SubscribeDetail> {
 
     /**
@@ -29,10 +30,16 @@ public interface SubscribeDetailMapper extends BaseMapper<SubscribeDetail> {
 
     /**
      * 根据IDS查询明细
+     *
      * @param ids
      * @return
      */
-    List<SubscribeDetailVo> getDetail(@Param("ids")List<Long> ids);
+    List<SubscribeDetailVo> getDetail(@Param("ids") List<Long> ids);
 
     List<SubscribeDetailVo> subscribeStatistics(@Param("ew") QueryWrapper<Object> query);
+
+    /**
+     * 根据id获取已采购数量
+     */
+    List<SubscribeDetail> getPurchaseCountByIds(List<Long> ids);
 }

+ 2 - 2
hx-purchase/src/main/java/com/fjhx/purchase/service/invoice/impl/InvoiceServiceImpl.java

@@ -68,9 +68,9 @@ public class InvoiceServiceImpl extends ServiceImpl<InvoiceMapper, Invoice> impl
         //权限过滤:发票-子公司看自己的,总公司看全部
         Long companyId = SecurityUtils.getCompanyId();
         if (!Objects.equals(companyId, 100L)) {
-            wrapper.eq(Invoice::getCompanyId, companyId);
+            wrapper.eq("t1", Invoice::getCompanyId, companyId);
         } else {
-            wrapper.eq(Invoice::getCompanyId, dto.getCompanyId());
+            wrapper.eq("t1", Invoice::getCompanyId, dto.getCompanyId());
         }
         wrapper.orderByDesc("t1", Invoice::getCreateTime);
         Page<InvoiceVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);

+ 2 - 2
hx-purchase/src/main/java/com/fjhx/purchase/service/pay/impl/PayServiceImpl.java

@@ -109,9 +109,9 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements PaySe
         //权限过滤:采购付款-子公司看自己的,总公司看全部
         Long companyId = SecurityUtils.getCompanyId();
         if (!Objects.equals(companyId, 100L)) {
-            wrapper.eq(Pay::getCompanyId, companyId);
+            wrapper.eq("p", Pay::getCompanyId, companyId);
         } else {
-            wrapper.eq(Pay::getCompanyId, dto.getCompanyId());
+            wrapper.eq("p", Pay::getCompanyId, dto.getCompanyId());
         }
 
         wrapper.orderByDesc("p", Pay::getCreateTime);

+ 1 - 3
hx-purchase/src/main/java/com/fjhx/purchase/service/purchase/impl/PurchaseDetailServiceImpl.java

@@ -1,10 +1,8 @@
 package com.fjhx.purchase.service.purchase.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-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.purchase.entity.purchase.dto.PurchaseDetailDto;
 import com.fjhx.purchase.entity.purchase.dto.PurchaseDetailSelectDto;
 import com.fjhx.purchase.entity.purchase.po.PurchaseDetail;
@@ -87,7 +85,7 @@ public class PurchaseDetailServiceImpl extends ServiceImpl<PurchaseDetailMapper,
     @Override
     public List<PurchaseDetailVo> getPurchaseCountListBySubscribeDetailIds(List<Long> subscribeDetailIds) {
         IWrapper<PurchaseDetail> wrapper = getWrapper();
-        wrapper.ne("p.status", "20");//过滤掉驳回数据
+        wrapper.in("p.status", 10, 30, 99);
         wrapper.in(PurchaseDetail::getSubscribeDetailId, subscribeDetailIds);
         return baseMapper.getPurchaseDetailList(wrapper);
     }

+ 52 - 43
hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/impl/SubscribeDetailServiceImpl.java

@@ -25,6 +25,7 @@ import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 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.fjhx.tenant.utils.DeptUstil;
 import com.fjhx.wms.service.warehouse.WarehouseService;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -97,7 +98,7 @@ public class SubscribeDetailServiceImpl extends ServiceImpl<SubscribeDetailMappe
 		List<Long> productIds = productList.stream().map(ProductInfoVo::getId).collect(Collectors.toList());
 		wrapper.in("t2", SubscribeDetail::getProductId, productIds);
 
-		// 待采购过滤掉指定状态 例如不要 99 作废
+		// 待采购过滤掉指定状态 例如不要 88 作废
 		if (StrUtil.isNotBlank(dto.getNeStatus())) {
 			wrapper.notIn("t2", SubscribeDetail::getStatus, dto.getNeStatus().split(","));
 		}
@@ -113,52 +114,60 @@ public class SubscribeDetailServiceImpl extends ServiceImpl<SubscribeDetailMappe
 		}
 
 		//按类型倒序 先显示合同数据 再显示申购数据
-		wrapper.orderByDesc("t2", SubscribeDetail::getDataType);
-		wrapper.orderByDesc("t2", SubscribeDetail::getCreateTime);
-
-		Page<SubscribeDetailVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
-		List<SubscribeDetailVo> list = page.getRecords();
-
-		if (list.size() == 0) {
-			return page;
-		}
-
-		// 赋值产品信息
-		for (SubscribeDetailVo s : list) {
-			Map<Long, ProductInfoVo> productMap = productList.stream().collect(Collectors.toMap(ProductInfoVo::getId, Function.identity()));
-			ProductInfoVo productInfo = productMap.get(s.getProductId());
-			s.setProductCode(productInfo.getCustomCode());
-			s.setProductName(productInfo.getName());
-			s.setProductType(productInfo.getType());
-			s.setProductCategory(productInfo.getClassifyName());
-			s.setProductUnit(productInfo.getUnit());
-			s.setProductDefinition(productInfo.getDefinition());
-			s.setProductCustomCode(productInfo.getCustomCode());
-			s.setProductSpec(productInfo.getSpec());
-
-			s.setProductLength(productInfo.getLength());
-			s.setProductWidth(productInfo.getWidth());
-			s.setProductHeight(productInfo.getHeight());
-		}
+        wrapper.orderByDesc("t2", SubscribeDetail::getDataType);
+        wrapper.orderByDesc("t2", SubscribeDetail::getCreateTime);
+
+        Page<SubscribeDetailVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        List<SubscribeDetailVo> records = page.getRecords();
+
+        if (records.size() == 0) {
+            return page;
+        }
+
+        //获取生产公司信息
+        List<Long> companyIds = records.stream().map(SubscribeDetail::getCompanyId).collect(Collectors.toList());
+        Map<Long, String> companyNameMap = DeptUstil.getDeptNameMap(companyIds);
+
+        // 赋值产品信息
+        for (SubscribeDetailVo record : records) {
+            Map<Long, ProductInfoVo> productMap = productList.stream().collect(Collectors.toMap(ProductInfoVo::getId, Function.identity()));
+            ProductInfoVo productInfo = productMap.get(record.getProductId());
+            record.setProductCode(productInfo.getCustomCode());
+            record.setProductName(productInfo.getName());
+            record.setProductType(productInfo.getType());
+            record.setProductCategory(productInfo.getClassifyName());
+            record.setProductUnit(productInfo.getUnit());
+            record.setProductDefinition(productInfo.getDefinition());
+            record.setProductCustomCode(productInfo.getCustomCode());
+            record.setProductSpec(productInfo.getSpec());
+
+            record.setProductLength(productInfo.getLength());
+            record.setProductWidth(productInfo.getWidth());
+            record.setProductHeight(productInfo.getHeight());
+
+
+            //赋值生产公司名称
+            record.setCompanyName(companyNameMap.get(record.getCompanyId()));
+        }
 
 		// 赋值采购数量
-		List<Long> subscribeDetailIds = list.stream().map(SubscribeDetail::getId).collect(Collectors.toList());
-		List<PurchaseDetailVo> purchaseDetailsList = purchaseDetailService.getPurchaseCountListBySubscribeDetailIds(subscribeDetailIds);
+        List<Long> subscribeDetailIds = records.stream().map(SubscribeDetail::getId).collect(Collectors.toList());
+        List<PurchaseDetailVo> purchaseDetailsList = purchaseDetailService.getPurchaseCountListBySubscribeDetailIds(subscribeDetailIds);
 //        List<PurchaseDetail> purchaseDetailsList = purchaseDetailService.list(q -> q.in(PurchaseDetail::getSubscribeDetailId, subscribeDetailIds));
 		Map<Long, List<PurchaseDetail>> purchaseDetailsMap = purchaseDetailsList.stream().collect(Collectors.groupingBy(PurchaseDetail::getSubscribeDetailId));
-		for (SubscribeDetailVo subscribeDetailVo : list) {
-			List<PurchaseDetail> purchaseDetails = purchaseDetailsMap.get(subscribeDetailVo.getId());
-			if (ObjectUtil.isEmpty(purchaseDetails)) {
-				subscribeDetailVo.setPurchaseCount(BigDecimal.ZERO);
-				continue;
-			}
-			BigDecimal count = purchaseDetails.stream().map(PurchaseDetail::getCount).reduce(BigDecimal.ZERO, BigDecimal::add);
-			subscribeDetailVo.setPurchaseCount(count);
-		}
-
-		corporationService.attributeAssign(list, SubscribeDetailVo::getCorporationId, (item, corporation) -> {
-			item.setCorporationName(corporation.getName());
-		});
+        for (SubscribeDetailVo subscribeDetailVo : records) {
+            List<PurchaseDetail> purchaseDetails = purchaseDetailsMap.get(subscribeDetailVo.getId());
+            if (ObjectUtil.isEmpty(purchaseDetails)) {
+                subscribeDetailVo.setPurchaseCount(BigDecimal.ZERO);
+                continue;
+            }
+            BigDecimal count = purchaseDetails.stream().map(PurchaseDetail::getCount).reduce(BigDecimal.ZERO, BigDecimal::add);
+            subscribeDetailVo.setPurchaseCount(count);
+        }
+
+        corporationService.attributeAssign(records, SubscribeDetailVo::getCorporationId, (item, corporation) -> {
+            item.setCorporationName(corporation.getName());
+        });
 
 		return page;
 	}

+ 20 - 2
hx-purchase/src/main/resources/mapper/subscribe/SubscribeDetailMapper.xml

@@ -12,7 +12,8 @@
                       t2.required_arrival_time AS requiredArrivalTime,
                       t2.put_warehouse_id      AS putWarehouseId,
                       t2.flow_id,
-                      t2.company_id            AS corporationId
+                      t2.company_id            AS corporationId,
+                      null                     AS prodTag
                FROM subscribe_detail t1
                         LEFT JOIN subscribe t2 ON t1.subscribe_id = t2.id
                    AND t1.data_type = 0
@@ -27,7 +28,8 @@
                       null           AS requiredArrivalTime,
                       null           AS putWarehouseId,
                       t2.flow_id,
-                      null           AS corporationId
+                      null           AS corporationId,
+                      t2.prod_tag    AS prodTag
                FROM subscribe_detail t1
                         LEFT JOIN contract t2 ON t1.contract_id = t2.id
                WHERE t1.data_type = 1)) t2
@@ -61,4 +63,20 @@
                  LEFT JOIN product_info pi ON sd.bussiness_id = pi.id
             ${ew.customSqlSegment}
     </select>
+    <select id="getPurchaseCountByIds" resultType="com.fjhx.purchase.entity.subscribe.po.SubscribeDetail">
+        SELECT
+        pp.subscribe_detail_id AS id,
+        sum( pp.quantity ) AS `Count`
+        FROM
+        ehsd_purchase_product pp
+        JOIN ehsd_purchase p ON pp.purchase_id = p.id
+        <where>
+            p.`status` IN ( 10, 30, 99 )
+            <foreach collection="ids" item="id" open="and pp.subscribe_detail_id IN (" separator="," close=")">
+                #{id}
+            </foreach>
+        </where>
+        GROUP BY
+        pp.subscribe_detail_id
+    </select>
 </mapper>

+ 6 - 0
hx-sale/pom.xml

@@ -37,6 +37,12 @@
             <groupId>com.fjhx</groupId>
             <artifactId>hx-purchase</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.5.3.1</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 398 - 0
hx-sale/src/main/java/com/fjhx/sale/a-json/DeptPerfApi.json

@@ -0,0 +1,398 @@
+{
+  "openapi": "3.0.1",
+  "tags": [
+    {
+      "name": "部门绩效"
+    }
+  ],
+  "paths": {
+    "/deptPerf/list": {
+      "post": {
+        "summary": "列表",
+        "tags": [
+          "部门绩效"
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "type": null,
+                "required": null,
+                "title": null,
+                "properties": null,
+                "items": null
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "成功",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object",
+                  "required": [
+                    "code",
+                    "success",
+                    "msg",
+                    "data"
+                  ],
+                  "title": null,
+                  "properties": {
+                    "code": {
+                      "type": "Integer",
+                      "required": null,
+                      "title": null,
+                      "properties": null,
+                      "items": null
+                    },
+                    "success": {
+                      "type": "boolean",
+                      "required": null,
+                      "title": null,
+                      "properties": null,
+                      "items": null
+                    },
+                    "msg": {
+                      "type": "string",
+                      "required": null,
+                      "title": null,
+                      "properties": null,
+                      "items": null
+                    },
+                    "data": {
+                      "type": "array",
+                      "required": null,
+                      "title": null,
+                      "properties": null,
+                      "items": {
+                        "type": "object",
+                        "required": null,
+                        "title": null,
+                        "properties": {
+                          "id": {
+                            "type": "integer",
+                            "required": null,
+                            "title": "部门绩效",
+                            "properties": null,
+                            "items": null
+                          },
+                          "deptId": {
+                            "type": "integer",
+                            "required": null,
+                            "title": "部门id",
+                            "properties": null,
+                            "items": null
+                          },
+                          "groupId": {
+                            "type": "integer",
+                            "required": null,
+                            "title": "组id",
+                            "properties": null,
+                            "items": null
+                          },
+                          "year": {
+                            "type": "integer",
+                            "required": null,
+                            "title": "年份",
+                            "properties": null,
+                            "items": null
+                          },
+                          "january": {
+                            "type": "number",
+                            "required": null,
+                            "title": "一月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "february": {
+                            "type": "number",
+                            "required": null,
+                            "title": "二月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "march": {
+                            "type": "number",
+                            "required": null,
+                            "title": "三月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "april": {
+                            "type": "number",
+                            "required": null,
+                            "title": "四月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "may": {
+                            "type": "number",
+                            "required": null,
+                            "title": "五月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "june": {
+                            "type": "number",
+                            "required": null,
+                            "title": "六月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "july": {
+                            "type": "number",
+                            "required": null,
+                            "title": "七月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "august": {
+                            "type": "number",
+                            "required": null,
+                            "title": "八月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "september": {
+                            "type": "number",
+                            "required": null,
+                            "title": "九月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "october": {
+                            "type": "number",
+                            "required": null,
+                            "title": "十月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "november": {
+                            "type": "number",
+                            "required": null,
+                            "title": "十一月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "december": {
+                            "type": "number",
+                            "required": null,
+                            "title": "十二月",
+                            "properties": null,
+                            "items": null
+                          },
+                          "createTime": {
+                            "type": "string",
+                            "required": null,
+                            "title": "创建时间",
+                            "properties": null,
+                            "items": null
+                          },
+                          "updateTime": {
+                            "type": "string",
+                            "required": null,
+                            "title": "修改时间",
+                            "properties": null,
+                            "items": null
+                          }
+                        },
+                        "items": null
+                      }
+                    }
+                  },
+                  "items": null
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/deptPerf/edit": {
+      "post": {
+        "summary": "编辑",
+        "tags": [
+          "部门绩效"
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "type": "object",
+                "required": null,
+                "title": null,
+                "properties": {
+                  "id": {
+                    "type": "integer",
+                    "required": null,
+                    "title": "部门绩效",
+                    "properties": null,
+                    "items": null
+                  },
+                  "deptId": {
+                    "type": "integer",
+                    "required": null,
+                    "title": "部门id",
+                    "properties": null,
+                    "items": null
+                  },
+                  "groupId": {
+                    "type": "integer",
+                    "required": null,
+                    "title": "组id",
+                    "properties": null,
+                    "items": null
+                  },
+                  "year": {
+                    "type": "integer",
+                    "required": null,
+                    "title": "年份",
+                    "properties": null,
+                    "items": null
+                  },
+                  "january": {
+                    "type": "number",
+                    "required": null,
+                    "title": "一月",
+                    "properties": null,
+                    "items": null
+                  },
+                  "february": {
+                    "type": "number",
+                    "required": null,
+                    "title": "二月",
+                    "properties": null,
+                    "items": null
+                  },
+                  "march": {
+                    "type": "number",
+                    "required": null,
+                    "title": "三月",
+                    "properties": null,
+                    "items": null
+                  },
+                  "april": {
+                    "type": "number",
+                    "required": null,
+                    "title": "四月",
+                    "properties": null,
+                    "items": null
+                  },
+                  "may": {
+                    "type": "number",
+                    "required": null,
+                    "title": "五月",
+                    "properties": null,
+                    "items": null
+                  },
+                  "june": {
+                    "type": "number",
+                    "required": null,
+                    "title": "六月",
+                    "properties": null,
+                    "items": null
+                  },
+                  "july": {
+                    "type": "number",
+                    "required": null,
+                    "title": "七月",
+                    "properties": null,
+                    "items": null
+                  },
+                  "august": {
+                    "type": "number",
+                    "required": null,
+                    "title": "八月",
+                    "properties": null,
+                    "items": null
+                  },
+                  "september": {
+                    "type": "number",
+                    "required": null,
+                    "title": "九月",
+                    "properties": null,
+                    "items": null
+                  },
+                  "october": {
+                    "type": "number",
+                    "required": null,
+                    "title": "十月",
+                    "properties": null,
+                    "items": null
+                  },
+                  "november": {
+                    "type": "number",
+                    "required": null,
+                    "title": "十一月",
+                    "properties": null,
+                    "items": null
+                  },
+                  "december": {
+                    "type": "number",
+                    "required": null,
+                    "title": "十二月",
+                    "properties": null,
+                    "items": null
+                  }
+                },
+                "items": null
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "成功",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object",
+                  "required": [
+                    "code",
+                    "success",
+                    "msg",
+                    "data"
+                  ],
+                  "title": null,
+                  "properties": {
+                    "code": {
+                      "type": "Integer",
+                      "required": null,
+                      "title": null,
+                      "properties": null,
+                      "items": null
+                    },
+                    "success": {
+                      "type": "boolean",
+                      "required": null,
+                      "title": null,
+                      "properties": null,
+                      "items": null
+                    },
+                    "msg": {
+                      "type": "string",
+                      "required": null,
+                      "title": null,
+                      "properties": null,
+                      "items": null
+                    },
+                    "data": {
+                      "type": null,
+                      "required": null,
+                      "title": null,
+                      "properties": null,
+                      "items": null
+                    }
+                  },
+                  "items": null
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}

+ 45 - 0
hx-sale/src/main/java/com/fjhx/sale/controller/dept/DeptPerfController.java

@@ -0,0 +1,45 @@
+package com.fjhx.sale.controller.dept;
+
+import com.fjhx.sale.entity.dept.dto.DeptPerfDto;
+import com.fjhx.sale.entity.dept.vo.DeptPerfVo;
+import com.fjhx.sale.service.dept.DeptPerfService;
+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;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 部门绩效 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2024-01-21
+ */
+@RestController
+@RequestMapping("/deptPerf")
+public class DeptPerfController {
+
+    @Autowired
+    private DeptPerfService deptPerfService;
+
+    /**
+     * 部门绩效列表
+     */
+    @PostMapping("/list")
+    public List<DeptPerfVo> list(@RequestBody DeptPerfDto dto) {
+        return deptPerfService.getList(dto);
+    }
+
+    /**
+     * 部门绩效编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody DeptPerfDto deptPerfDto) {
+        deptPerfService.edit(deptPerfDto);
+    }
+
+}

+ 0 - 15
hx-sale/src/main/java/com/fjhx/sale/controller/purchase/EhsdPurchaseController.java

@@ -61,13 +61,6 @@ public class EhsdPurchaseController {
         ehsdPurchaseService.add(ehsdPurchaseDto);
     }
 
-//    /**
-//     * ehsd采购表编辑
-//     */
-//    @PostMapping("/edit")
-//    public void edit(@RequestBody EhsdPurchaseDto ehsdPurchaseDto) {
-//        ehsdPurchaseService.edit(ehsdPurchaseDto);
-//    }
 
     /**
      * ehsd采购表删除
@@ -103,12 +96,4 @@ public class EhsdPurchaseController {
         return ehsdPurchaseService.getProductPriceInfo(dto);
     }
 
-    /**
-     * 采购pdf
-     */
-    @PostMapping("/getPurchaseDtoPdfInfo")
-    private void getPurchaseDtoPdfInfo(@RequestBody EhsdPurchaseDto dto) {
-        //
-    }
-
 }

+ 6 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/ContractProductDto.java

@@ -1,5 +1,6 @@
 package com.fjhx.sale.entity.contract.dto;
 
+import com.fjhx.file.entity.ObsFile;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
 import com.fjhx.sale.entity.contract.po.ContractProductBom;
 import lombok.Getter;
@@ -19,4 +20,9 @@ public class ContractProductDto extends ContractProduct {
 
     List<ContractProductBom> contractProductBomList;
 
+    /**
+     * 生产文件
+     */
+    private List<ObsFile> prodFileList;
+
 }

+ 24 - 29
hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/Contract.java

@@ -244,11 +244,6 @@ public class Contract extends BasePo {
     private String currencyRateJson;
 
     /**
-     * 尔弘时代JSON扩展字段
-     */
-    private String ehsdJson;
-
-    /**
      * beneficiaryName
      */
     private String beneficiaryName;
@@ -348,30 +343,30 @@ public class Contract extends BasePo {
     @Version
     private Integer version;
 
-	/**
-	 * 是否显示
-	 */
-	private Integer isShow;
-
-	/**
-	 * 数据JSON
-	 */
-	private String dataJson;
-
-	/**
-	 * 订单下发状态
-	 */
-	private Integer orderDistributeStatus;
-
-	/**
-	 * 交接单附件列表
-	 */
-	@TableField(exist = false)
-	private List<ObsFile> fileList;
-
-	/**
-	 * 包装附件列表
-	 */
+    /**
+     * 是否显示
+     */
+    private Integer isShow;
+
+    /**
+     * 订单下发状态
+     */
+    private Integer orderDistributeStatus;
+
+    /**
+     * 订单下发时间
+     */
+    private Date orderDistributeTime;
+
+    /**
+     * 交接单附件列表
+     */
+    @TableField(exist = false)
+    private List<ObsFile> fileList;
+
+    /**
+     * 包装附件列表
+     */
     @TableField(exist = false)
     private List<ObsFile> packageFileList;
 

+ 5 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/ContractProductBom.java

@@ -76,6 +76,11 @@ public class ContractProductBom extends BasePo {
     private Integer type;
 
     /**
+     * 合同id
+     */
+    private Long contractId;
+
+    /**
      * 合同产品表id
      */
     private Long contractProductId;

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

@@ -79,6 +79,11 @@ public class ContractProductVo extends ContractProduct {
     private String productType;
 
     /**
+     * 产品图片地址
+     */
+    private String productImgUrl;
+
+    /**
      * 所属分类id
      */
     private Long productCategoryId;

+ 17 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/dept/dto/DeptPerfDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.sale.entity.dept.dto;
+
+import com.fjhx.sale.entity.dept.po.DeptPerf;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 部门绩效新增编辑入参实体
+ *
+ * @author
+ * @since 2024-01-21
+ */
+@Getter
+@Setter
+public class DeptPerfDto extends DeptPerf {
+
+}

+ 17 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/dept/dto/DeptPerfSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.sale.entity.dept.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 部门绩效列表查询入参实体
+ *
+ * @author
+ * @since 2024-01-21
+ */
+@Getter
+@Setter
+public class DeptPerfSelectDto extends BaseSelectDto {
+
+}

+ 112 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/dept/po/DeptPerf.java

@@ -0,0 +1,112 @@
+package com.fjhx.sale.entity.dept.po;
+
+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.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 部门绩效
+ * </p>
+ *
+ * @author
+ * @since 2024-01-21
+ */
+@Getter
+@Setter
+@TableName("dept_perf")
+public class DeptPerf extends BasePo {
+
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
+    /**
+     * 组id
+     */
+    private Long groupId;
+
+    /**
+     * 年份
+     */
+    private Integer years;
+
+    /**
+     * 一月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal january;
+
+    /**
+     * 二月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal february;
+
+    /**
+     * 三月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal march;
+
+    /**
+     * 四月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal april;
+
+    /**
+     * 五月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal may;
+
+    /**
+     * 六月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal june;
+
+    /**
+     * 七月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal july;
+
+    /**
+     * 八月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal august;
+
+    /**
+     * 九月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal september;
+
+    /**
+     * 十月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal october;
+
+    /**
+     * 十一月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal november;
+
+    /**
+     * 十二月
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal december;
+
+}

+ 27 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/dept/vo/DeptPerfVo.java

@@ -0,0 +1,27 @@
+package com.fjhx.sale.entity.dept.vo;
+
+import com.fjhx.sale.entity.dept.po.DeptPerf;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 部门绩效列表查询返回值实体
+ *
+ * @author
+ * @since 2024-01-21
+ */
+@Getter
+@Setter
+public class DeptPerfVo extends DeptPerf {
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 组名称
+     */
+    private String groupName;
+
+}

+ 10 - 8
hx-sale/src/main/java/com/fjhx/sale/entity/purchase/vo/EhsdPurchaseVo.java

@@ -85,13 +85,15 @@ public class EhsdPurchaseVo extends EhsdPurchase {
 	 */
 	private String createUserName;
 
-	/**
-	 * 创建人手机
-	 */
-	private String createUserPhone;
+    /**
+     * 创建人手机
+     */
+    private String createUserPhone;
 
-	/**
-	 * 卖方传真
-	 */
-	private String sellCorporationFax;
+    /**
+     * 卖方传真
+     */
+    private String sellCorporationFax;
+
+    private String companyName;
 }

+ 64 - 114
hx-sale/src/main/java/com/fjhx/sale/flow/ContractFlow.java

@@ -12,19 +12,15 @@ import com.fjhx.common.enums.CodingRuleEnum;
 import com.fjhx.common.enums.FlowStatusEnum1;
 import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.service.coding.CodingRuleService;
-import com.fjhx.common.service.file.FtpFileService;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.flow.core.FlowDelegate;
 import com.fjhx.flow.enums.FlowStatusEnum;
-import com.fjhx.item.entity.product.po.ProductBomDetail;
-import com.fjhx.item.entity.product.po.ProductInfo;
-import com.fjhx.item.entity.product.po.ProductStockInfo;
 import com.fjhx.item.enums.ProductAvailableRecordType;
-import com.fjhx.item.service.product.ProductBomDetailService;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.item.service.product.ProductStockInfoService;
 import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
+import com.fjhx.purchase.mapper.subscribe.SubscribeDetailMapper;
 import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
 import com.fjhx.sale.entity.contract.dto.ContractProductDto;
@@ -38,17 +34,18 @@ import com.fjhx.sale.service.contract.ContractProjectService;
 import com.fjhx.sale.service.contract.ContractService;
 import com.ruoyi.common.annotation.LogicIgnore;
 import com.ruoyi.common.core.domain.BasePo;
-import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.service.ISysDeptService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -58,34 +55,26 @@ import java.util.stream.Collectors;
  * @DATE:2023/4/3 17:38
  */
 @Component
-//@DS(SourceConstant.SALE)
 public class ContractFlow extends FlowDelegate {
 
     @Autowired
     private CodingRuleService codingRuleService;
-
     @Autowired
     private ContractService contractService;
-
     @Autowired
     private ContractProductService contractProductService;
-
     @Autowired
     private ContractProjectService contractProjectService;
     @Autowired
-    private FtpFileService ftpFileService;
-    @Autowired
-    private ProductInfoService productInfoService;
+    private ContractProductBomService contractProductBomService;
     @Autowired
     private SubscribeDetailService subscribeDetailService;
     @Autowired
-    private ProductBomDetailService productBomDetailService;
-    @Autowired
-    private ISysDeptService deptService;
+    private SubscribeDetailMapper subscribeDetailMapper;
     @Autowired
     private ProductStockInfoService productStockInfoService;
     @Autowired
-    private ContractProductBomService contractProductBomService;
+    private ProductInfoService productInfoService;
 
     @Override
     public String getFlowKey() {
@@ -133,7 +122,6 @@ public class ContractFlow extends FlowDelegate {
      */
     @Override
     public void end(Long flowId, Long businessId, JSONObject submitData) {
-
         // 通过业务ID查询合同数据
         Contract contract = contractService.getById(businessId);
 
@@ -144,9 +132,6 @@ public class ContractFlow extends FlowDelegate {
         contract.setStatus(FlowStatusEnum1.PASS.getKey());
         contract.setApprovedDate(new Date());
         contractService.updateById(contract);
-
-        //生成物料待采购数据
-        createMaterialWaitPurchase(contract);
     }
 
     public Long start(ContractDto contract) {
@@ -177,16 +162,18 @@ public class ContractFlow extends FlowDelegate {
             //保存设计稿图
             ObsFileUtil.editFile(cp.getFileList(), cp.getId());
             //保存生产源文件
-            String prodFilePath = cp.getProdFilePath();
-            if (ObjectUtil.isNotEmpty(prodFilePath) && prodFilePath.startsWith("/temp")) {
-                String targetFolderPath = String.format("/contractProduct/%s", cp.getId());
-                com.alibaba.fastjson2.JSONObject prodFile = ftpFileService.moveFolder(prodFilePath, targetFolderPath);
-                cp.setProdFilePath(prodFile.getString("path"));
-            }
+            ObsFileUtil.copyFileAndSave(cp.getProdFileList(), cp.getId(), 1);
+//            String prodFilePath = cp.getProdFilePath();
+//            if (ObjectUtil.isNotEmpty(prodFilePath) && prodFilePath.startsWith("/temp")) {
+//                String targetFolderPath = String.format("/contractProduct/%s", cp.getId());
+//                com.alibaba.fastjson2.JSONObject prodFile = ftpFileService.moveFolder(prodFilePath, targetFolderPath);
+//                cp.setProdFilePath(prodFile.getString("path"));
+//            }
 
             //赋值产品BOM信息
             List<ContractProductBom> contractProductBomList = cp.getContractProductBomList();
             for (ContractProductBom contractProductBom : contractProductBomList) {
+                contractProductBom.setContractId(contract.getId());
                 contractProductBom.setContractProductId(cp.getId());
                 contractProductBom.setProductId(cp.getProductId());
             }
@@ -248,104 +235,67 @@ public class ContractFlow extends FlowDelegate {
     @Override
     public void cancellation(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
         super.cancellation(flowId, businessId, flowStatus);
+
+        Contract contract = contractService.getById(businessId);
+
         contractService.update(q -> q
                 .eq(Contract::getId, businessId)
                 .set(Contract::getStatus, FlowStatusEnum1.CANCELLATION.getKey())
                 .set(BasePo::getUpdateTime, new Date())
                 .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
         );
+
+        contractCancelEditAvailableQuantity(contract);
+
     }
 
     /**
-     * 创建合同产品 物料待采购信息
+     * 合同作废修改可用库存
      */
-    private void createMaterialWaitPurchase(Contract contract) {
-        //生成物料待采购数据
-        List<ContractProduct> contractProductList = contractProductService.list(q -> q.eq(ContractProduct::getContractId, contract.getId()));
-        List<Long> productIds = contractProductList.stream().map(ContractProduct::getProductId).collect(Collectors.toList());
-        //获取产品列表
-        Map<Long, ProductInfo> productInfoMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, productIds));
-        //获取物料信息
-        Map<Long, List<ProductBomDetail>> productBomMap = productBomDetailService.mapKGroup(ProductBomDetail::getProductId, q -> q.in(ProductBomDetail::getProductId, productIds));
-
-        //待采购列表
-        List<SubscribeDetail> subscribeDetailList = new ArrayList<>();
-
-        for (ContractProduct contractProduct : contractProductList) {
-            Long productId = contractProduct.getProductId();
-            ProductInfo productInfo = productInfoMap.get(productId);
-
-            //获取物料列表,以及原材料
-            List<ProductBomDetail> productBomDetails = productBomMap.get(productId);
-
-            if (ObjectUtil.isNotEmpty(productBomDetails)) {
-                List<Long> materialIds = productBomDetails.stream().map(ProductBomDetail::getMaterialId).collect(Collectors.toList());
-                Map<Long, ProductInfo> materialMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, materialIds));
-
-                //获取合同归属归属的物料可用库存
-                Map<Long, BigDecimal> availableQuantityMap = productStockInfoService.mapKV(ProductStockInfo::getId, ProductStockInfo::getAvailableQuantity, q -> q
-                        .in(ProductStockInfo::getProductId, materialIds)
-                        .eq(ProductStockInfo::getCompanyId, contract.getCompanyId())
-                );
-
-
-                //遍历物料列表
-                for (ProductBomDetail productBomDetail : productBomDetails) {
-                    Long materialId = productBomDetail.getMaterialId();
-                    ProductInfo materialInfo = materialMap.get(materialId);
-
-                    BigDecimal multiply = productBomDetail.getQuantity().multiply(contractProduct.getQuantity());
-
-                    //获取产品安全库存
-                    BigDecimal stockThreshold = materialInfo.getStockThreshold();
-                    //获取可用库存
-                    BigDecimal availableQuantity = availableQuantityMap.getOrDefault(materialId, BigDecimal.ZERO);
-                    //计数需要采购的数量(需采购量 = 安全库存 - (可用库存 - 合同量)若 需采购量<0,则按0算不采购)
-                    BigDecimal subtract = availableQuantity.subtract(multiply);
-                    BigDecimal requiredQuantity = stockThreshold.subtract(subtract);
-
-                    //计算可用库存
-                    if (requiredQuantity.compareTo(BigDecimal.ZERO) < 0) {
-                        //需要采购的数量<0 可用库存 = 可用库存 - 合同量
-                        InOutBo inOutBo = new InOutBo();
-                        inOutBo.setProductId(materialId);
-                        inOutBo.setQuantity(multiply);
-                        productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.OUT, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS, contract.getCompanyId());
-                    } else {
-                        //需要采购的数量>=0 可用库存 = 安全库存
-                        InOutBo inOutBo = new InOutBo();
-                        inOutBo.setProductId(materialId);
-                        inOutBo.setQuantity(stockThreshold);
-                        productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.EQ, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS, contract.getCompanyId());
-                    }
-
-                    //需要采购的数量大于0生成待采购数据
-                    if (requiredQuantity.compareTo(BigDecimal.ZERO) > 0) {
-                        SubscribeDetail subscribeDetail = new SubscribeDetail();
-                        subscribeDetail.setProductId(materialId);
-                        subscribeDetail.setCount(requiredQuantity);
-                        subscribeDetail.setStatus(15);//待采购
-                        subscribeDetail.setContractId(contract.getId());
-                        subscribeDetail.setContractDetailId(contractProduct.getId());
-                        subscribeDetail.setDataType(1);
-
-                        subscribeDetailList.add(subscribeDetail);
-                    }
-
-                }
-            }
-        }
+    private void contractCancelEditAvailableQuantity(Contract contract) {
+        Long businessId = contract.getId();
+        //可用库存=可用库存-((待采购量-已采购量)-合同量)
+        List<SubscribeDetail> subscribeDetailList = subscribeDetailService.list(q -> q.eq(SubscribeDetail::getContractId, businessId));
+
+        //获取物料id
+        List<Long> materialIds = subscribeDetailList.stream().map(SubscribeDetail::getProductId).collect(Collectors.toList());
 
-        //根据归属公司将数据赋值给指定公司
-        Long companyId = contract.getCompanyId();
-        SysDept company = deptService.getById(companyId);
-        if (ObjectUtil.isEmpty(companyId)) {
-            throw new ServiceException("归属公司不存在");
+        List<ContractProductBom> contractProductBomList = contractProductBomService.list(q -> q
+                .eq(ContractProductBom::getContractId, businessId)
+                .in(ContractProductBom::getMaterialId, materialIds)
+        );
+        Map<Long, List<ContractProductBom>> contractProductBomMap = contractProductBomList.stream().collect(Collectors.groupingBy(ContractProductBom::getMaterialId));
+        //获取已采购数量
+        List<Long> sdIds = subscribeDetailList.stream().map(SubscribeDetail::getId).collect(Collectors.toList());
+        List<SubscribeDetail> purchaseCountByIds = subscribeDetailMapper.getPurchaseCountByIds(sdIds);
+        Map<Long, BigDecimal> purchaseCountMap = purchaseCountByIds.stream().collect(Collectors.toMap(SubscribeDetail::getId, SubscribeDetail::getCount));
+
+        List<InOutBo> inOutBoList = new ArrayList<>();
+
+        for (SubscribeDetail subscribeDetail : subscribeDetailList) {
+            Long materialId = subscribeDetail.getProductId();
+            //作废待采购
+            subscribeDetail.setStatus(88);
+            BigDecimal purchaseCount = purchaseCountMap.getOrDefault(subscribeDetail.getId(), BigDecimal.ZERO);
+            //(待采购量-已采购量)
+            BigDecimal subtract = subscribeDetail.getCount().subtract(purchaseCount);
+            //获取合同量
+            List<ContractProductBom> contractProductBomList1 = contractProductBomMap.get(materialId);
+            BigDecimal reduce = contractProductBomList1.stream().map(ContractProductBom::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+            //((待采购量-已采购量)-合同量)
+            InOutBo inOutBo = new InOutBo();
+            inOutBo.setProductId(materialId);
+            inOutBo.setQuantity(subtract.subtract(reduce));
+            inOutBoList.add(inOutBo);
         }
-        //保存待采购明细
-        subscribeDetailService.saveBatch(subscribeDetailList);
 
+        //修改可用库存可用库存=可用库存-((待采购量-已采购量)-合同量)
+        productInfoService.editAvailableQuantity(
+                inOutBoList,
+                InOutType.OUT,
+                businessId,
+                ProductAvailableRecordType.SALE_CANCEL, contract.getCompanyId()
+        );
     }
 
-
 }

+ 256 - 280
hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseFlow.java

@@ -20,8 +20,7 @@ import com.fjhx.item.enums.ProductAvailableRecordType;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.purchase.entity.purchase.enums.PurchaseDataResourceEnum;
 import com.fjhx.purchase.entity.purchase.enums.PurchaseStatusEnum;
-import com.fjhx.purchase.entity.subscribe.enums.SubscribeDetailStatusEnum;
-import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
+import com.fjhx.purchase.mapper.subscribe.SubscribeDetailMapper;
 import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 import com.fjhx.sale.entity.contract.po.Contract;
 import com.fjhx.sale.entity.purchase.dto.EhsdPurchaseDto;
@@ -53,7 +52,6 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
-import java.util.stream.Collectors;
 
 /**
  * EHSD采购流程
@@ -64,281 +62,259 @@ import java.util.stream.Collectors;
 @Component
 public class EhsdPurchaseFlow extends FlowDelegate {
 
-	@Autowired
-	private EhsdPurchaseService purchaseService;
-
-	@Autowired
-	private EhsdPurchaseProductService purchaseProductService;
-
-	@Autowired
-	private EhsdPurchaseProjectService purchaseProjectService;
-	@Autowired
-	private SampleProductService sampleProductService;
-
-	@Autowired
-	private CodingRuleService codingRuleService;
-	@Autowired
-	private SubscribeDetailService subscribeDetailService;
-	@Autowired
-	private ContractService contractService;
-	@Autowired
-	private SampleService sampleService;
-	@Autowired
-	private ProductInfoService productInfoService;
-	@Autowired
-	private StockWaitService stockWaitService;
-	@Autowired
-	private StockWaitDetailsService stockWaitDetailsService;
-
-	@Override
-	public String getFlowKey() {
-		return "purchase_flow";
-	}
-
-	/**
-	 * 发起流程
-	 *
-	 * @param flowId     流程ID
-	 * @param submitData 采购数据
-	 * @return
-	 */
-	@Override
-	public Long start(Long flowId, JSONObject submitData) {
-		EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class);
-		purchase.setId(null);//清空id防止前端误传
-		purchase.setFlowId(flowId);//赋值流程id
-		purchase.setProcessInstanceId(getFlowKey());//赋值流程key
-
-		//赋值产品归属公司
-		Long companyId = purchase.getCompanyId();
-		if (ObjectUtil.isEmpty(companyId)) {
-			purchase.setCompanyId(SecurityUtils.getCompanyId());
-		}
-
-		Integer dataResource = purchase.getDataResource();
-		if (ObjectUtils.isEmpty(dataResource)) {
-			throw new ServiceException("数据来源类型不能为空!");
-		}
-
-		//采购单编号生成
-		if (0 == dataResource) {
-			//手动创建 编号规则
-			purchase.setCode(codingRuleService.createCode(CodingRuleEnum.EHSD_PURCHASE.getKey(), null));
-		} else if (1 == dataResource) {
-			//合同 编号规则
-			Contract contract = contractService.getById(purchase.getDataResourceId());
-			Assert.notEmpty(contract, "查询不到合同信息,无法生成编号");
-			long count = purchaseService.count(q -> q.eq(EhsdPurchase::getDataResourceId, contract.getId()));
-			purchase.setCode(contract.getCode() + "-" + (count + 1));
-		} else if (2 == dataResource) {
-			//样品单 编号规则
-			Sample sample = sampleService.getById(purchase.getDataResourceId());
-			Assert.notEmpty(sample, "查询不到样品单信息,无法生成编号");
-			long count = purchaseService.count(q -> q.eq(EhsdPurchase::getDataResourceId, sample.getId()));
-			purchase.setCode(sample.getCode() + "-" + (count + 1));
-		} else {
-			throw new ServiceException("未知数据来源类型");
-		}
-
-		//公共代码
-		purchase = connStart(purchase);
-
-		return purchase.getId();
-	}
-
-
-	/**
-	 * 公共代码块--发起
-	 */
-	public EhsdPurchaseDto connStart(EhsdPurchaseDto purchase) {
-		//赋值城市省份信息
-		CustomizeAreaUtil.setAreaId(purchase);
-		purchase.setSellCityId(purchase.getCityId());
-		purchase.setSellCountryId(purchase.getCountryId());
-		purchase.setSellProvinceId(purchase.getProvinceId());
-
-
-		purchase.setStatus(PurchaseStatusEnum.UNDER_REVIEW.getKey());
-		String nickName = SecurityUtils.getLoginUser().getUser().getNickName();
-		purchase.setUserName(nickName);
-		purchaseService.saveOrUpdate(purchase);
-
-		List<EhsdPurchaseProduct> purchaseProductList = purchase.getPurchaseProductList();
-		List<EhsdPurchaseProject> purchaseProjectList = purchase.getPurchaseProjectList();
-
-		//防止空指针
-		purchaseProjectList = (purchaseProjectList == null ? new ArrayList<>() : purchaseProjectList);
-		purchaseProductList = (purchaseProductList == null ? new ArrayList<>() : purchaseProductList);
-
-		//产品(采购明细)
-		for (EhsdPurchaseProduct s : purchaseProductList) {
-			s.setId(ObjectUtils.isNotEmpty(s.getId()) ? s.getId() : IdWorker.getId());
-			s.setPurchaseId(purchase.getId());
-		}
-		//修改或删除数据
-		purchaseProductService.editLinked(purchaseProductList, EhsdPurchaseProduct::getPurchaseId, purchase.getId());
-
-		//收费项目
-		for (EhsdPurchaseProject s : purchaseProjectList) {
-			s.setPurchaseId(purchase.getId());
-		}
-		purchaseProjectService.editLinked(purchaseProjectList, EhsdPurchaseProject::getPurchaseId, purchase.getId());
-
-		return purchase;
-	}
-
-	/**
-	 * 结束流程
-	 *
-	 * @param flowId     流程ID
-	 * @param businessId 业务ID
-	 * @param submitData 数据
-	 */
-	@Override
-	public void end(Long flowId, Long businessId, JSONObject submitData) {
-		//通过业务ID查询采购数据
-		EhsdPurchase purchase = purchaseService.getById(businessId);
-		if (ObjectUtils.isEmpty(purchase)) {
-			throw new ServiceException("采购单不存在,或已被删除");
-		}
-		//查询采购产品
-		List<EhsdPurchaseProduct> purchaseProductList = purchaseProductService.list(Wrappers.<EhsdPurchaseProduct>query().lambda().eq(EhsdPurchaseProduct::getPurchaseId, businessId));
-		List<SampleProduct> upSampleProduct = new ArrayList<>();
-		for (EhsdPurchaseProduct p : purchaseProductList) {
-			if (ObjectUtils.isNotEmpty(p.getDataResourceId()) &&
-					p.getDataResource() == PurchaseDataResourceEnum.DATA_RESOURCE_2.getKey()) {//如果采购的是样品单
-				SampleProduct sampleProduct = sampleProductService.getById(p.getDataResourceId());
-				BigDecimal expendQuantity = sampleProduct.getExpendQuantity().subtract(p.getQuantity());
-				sampleProduct.setExpendQuantity(expendQuantity);
-				upSampleProduct.add(sampleProduct);
-			}
-		}
-		if (CollectionUtils.isNotEmpty(upSampleProduct)) {//扣减样品单数量
-			sampleProductService.updateBatchById(upSampleProduct);
-		}
-		//修改采购状态为审批通过
-		purchase.setStatus(PurchaseStatusEnum.PASS.getKey());
-		purchase.setApprovedDate(new Date());
-		purchaseService.updateById(purchase);
-
-		if ("0".equals(purchase.getDataResource())) {
-			//修改申购明细状态
-			List<EhsdPurchaseProduct> purchaseDetailList = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getProductId, businessId));
-			List<Long> subscribeDetailIds = purchaseDetailList.stream().map(EhsdPurchaseProduct::getSubscribeDetailId).collect(Collectors.toList());
-			List<SubscribeDetail> subscribeDetails = subscribeDetailService.listByIds(subscribeDetailIds);
-			for (SubscribeDetail subscribeDetail : subscribeDetails) {
-				//获取申购明细下的所有采购记录 计算已采购数
-				List<EhsdPurchaseProduct> purchaseDetails = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getSubscribeDetailId,
-						subscribeDetail.getId()).eq(EhsdPurchaseProduct::getProductId, subscribeDetail.getProductId()));
-				BigDecimal count = purchaseDetails.stream()
-						.map(EhsdPurchaseProduct::getQuantity)
-						.reduce(BigDecimal.ZERO, BigDecimal::add);
-				if (count.compareTo(subscribeDetail.getCount()) >= 0) {
-					//修改为已采购
-					subscribeDetail.setStatus(SubscribeDetailStatusEnum.PURCHASED.getKey());
-				} else {
-					//修改为部分采购
-					subscribeDetail.setStatus(SubscribeDetailStatusEnum.LITT_PAID_AMOUNT.getKey());
-				}
-			}
-			subscribeDetailService.updateBatchById(subscribeDetails);
-		}
-
-
-		List<InOutBo> inOutBoList = new ArrayList<>();
-		for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
-			//如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 + 采购明细数量)
-			if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0)) {
-				InOutBo inOutBo = new InOutBo();
-				inOutBo.setProductId(purchaseProduct.getProductId());
-				inOutBo.setQuantity(purchaseProduct.getQuantity());
-				inOutBoList.add(inOutBo);
-			}
-		}
-		productInfoService.editAvailableQuantity(inOutBoList, InOutType.IN, businessId, ProductAvailableRecordType.PURCHASE_PASS, purchase.getCompanyId());
-
-
-		//采购审批通过 生成待入库数据
-		StockWait stockWait = new StockWait();
-		stockWait.setType(1);
-		stockWait.setBusinessType(StockWaitType.PURCHASE_ARRIVAL_IN.getDetailType());
-		stockWait.setBusinessId(purchase.getId());
-		stockWait.setBusinessCode(purchase.getCode());
-		stockWait.setStatus(0);
-		stockWait.setPurchaseId(purchase.getId());
-		stockWaitService.save(stockWait);
-		List<StockWaitDetails> stockWaitDetailsList = new ArrayList<>();
-		for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
-			StockWaitDetails stockWaitDetails = new StockWaitDetails();
-			stockWaitDetails.setStockWaitId(stockWait.getId());
-			stockWaitDetails.setBusinessDetailsId(purchaseProduct.getId());
-			stockWaitDetails.setPurchaseDetailId(purchaseProduct.getId());
-
-			stockWaitDetails.setProductId(purchaseProduct.getProductId());
-			stockWaitDetails.setQuantity(purchaseProduct.getQuantity());
-			stockWaitDetails.setStatus(0);
-
-			stockWaitDetailsList.add(stockWaitDetails);
-		}
-		stockWaitDetailsService.saveBatch(stockWaitDetailsList);
-	}
-
-	/**
-	 * 重新发起
-	 */
-	@Override
-	@LogicIgnore
-	@DSTransactional
-	public void relaunch(Long flowId, Long businessId, FlowStatusEnum flowStatus, JSONObject submitData) {
-		//删除采购合同
-		EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class);
-		if (ObjectUtils.isEmpty(purchase)) {
-			throw new ServiceException("采购数据不能为空");
-		}
-		purchase.setFlowId(flowId);
-		connStart(purchase);
-	}
-
-	/**
-	 * 驳回
-	 */
-	@Override
-	public void reject(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
-		purchaseService.update(q -> q
-				.eq(EhsdPurchase::getId, businessId)
-				.set(EhsdPurchase::getStatus, FlowStatusEnum1.REJECT.getKey())
-				.set(BasePo::getUpdateTime, new Date())
-				.set(BasePo::getUpdateUser, SecurityUtils.getUserId())
-		);
-	}
-
-	/**
-	 * 作废
-	 */
-	@Override
-	public void cancellation(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
-		EhsdPurchase purchase = purchaseService.getById(businessId);
-
-		super.cancellation(flowId, businessId, flowStatus);
-		purchaseService.update(q -> q
-				.eq(EhsdPurchase::getId, businessId)
-				.set(EhsdPurchase::getStatus, FlowStatusEnum1.CANCELLATION.getKey())
-				.set(BasePo::getUpdateTime, new Date())
-				.set(BasePo::getUpdateUser, SecurityUtils.getUserId())
-		);
-
-		//修改可用库存
-		List<InOutBo> inOutBoList = new ArrayList<>();
-		List<EhsdPurchaseProduct> purchaseProductList = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, businessId));
-		for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
-			//如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 + 采购明细数量)
-			if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0)) {
-				InOutBo inOutBo = new InOutBo();
-				inOutBo.setProductId(purchaseProduct.getProductId());
-				inOutBo.setQuantity(purchaseProduct.getQuantity());
-				inOutBoList.add(inOutBo);
-			}
-		}
-		productInfoService.editAvailableQuantity(inOutBoList, InOutType.OUT, businessId, ProductAvailableRecordType.PURCHASE_CANCEL, purchase.getCompanyId());
-	}
+    @Autowired
+    private EhsdPurchaseService purchaseService;
+
+    @Autowired
+    private EhsdPurchaseProductService purchaseProductService;
+
+    @Autowired
+    private EhsdPurchaseProjectService purchaseProjectService;
+    @Autowired
+    private SampleProductService sampleProductService;
+
+    @Autowired
+    private CodingRuleService codingRuleService;
+    @Autowired
+    private SubscribeDetailService subscribeDetailService;
+    @Autowired
+    private ContractService contractService;
+    @Autowired
+    private SampleService sampleService;
+    @Autowired
+    private ProductInfoService productInfoService;
+    @Autowired
+    private StockWaitService stockWaitService;
+    @Autowired
+    private StockWaitDetailsService stockWaitDetailsService;
+    @Autowired
+    private SubscribeDetailMapper subscribeDetailMapper;
+
+    @Override
+    public String getFlowKey() {
+        return "purchase_flow";
+    }
+
+    /**
+     * 发起流程
+     *
+     * @param flowId     流程ID
+     * @param submitData 采购数据
+     * @return
+     */
+    @Override
+    public Long start(Long flowId, JSONObject submitData) {
+        EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class);
+
+        if (ObjectUtil.isEmpty(purchase.getCurrency())) {
+            purchase.setCurrency("CNY");
+        }
+
+        purchase.setId(null);//清空id防止前端误传
+        purchase.setFlowId(flowId);//赋值流程id
+        purchase.setProcessInstanceId(getFlowKey());//赋值流程key
+
+        //赋值产品归属公司
+        Long companyId = purchase.getCompanyId();
+        if (ObjectUtil.isEmpty(companyId)) {
+            purchase.setCompanyId(SecurityUtils.getCompanyId());
+        }
+
+        Integer dataResource = purchase.getDataResource();
+        if (ObjectUtils.isEmpty(dataResource)) {
+            throw new ServiceException("数据来源类型不能为空!");
+        }
+
+        //采购单编号生成
+        if (0 == dataResource) {
+            //手动创建 编号规则
+            purchase.setCode(codingRuleService.createCode(CodingRuleEnum.EHSD_PURCHASE.getKey(), null));
+        } else if (1 == dataResource) {
+            //合同 编号规则
+            Contract contract = contractService.getById(purchase.getDataResourceId());
+            Assert.notEmpty(contract, "查询不到合同信息,无法生成编号");
+            long count = purchaseService.count(q -> q.eq(EhsdPurchase::getDataResourceId, contract.getId()));
+            purchase.setCode(contract.getCode() + "-" + (count + 1));
+        } else if (2 == dataResource) {
+            //样品单 编号规则
+            Sample sample = sampleService.getById(purchase.getDataResourceId());
+            Assert.notEmpty(sample, "查询不到样品单信息,无法生成编号");
+            long count = purchaseService.count(q -> q.eq(EhsdPurchase::getDataResourceId, sample.getId()));
+            purchase.setCode(sample.getCode() + "-" + (count + 1));
+        } else {
+            throw new ServiceException("未知数据来源类型");
+        }
+
+        //公共代码
+        purchase = connStart(purchase);
+
+
+        //回传单号给流程引擎
+        submitData.put("code", purchase.getCode());
+        submitData.put("currency", purchase.getCurrency());
+
+        return purchase.getId();
+    }
+
+
+    /**
+     * 公共代码块--发起
+     */
+    public EhsdPurchaseDto connStart(EhsdPurchaseDto purchase) {
+        //赋值城市省份信息
+        CustomizeAreaUtil.setAreaId(purchase);
+        purchase.setSellCityId(purchase.getCityId());
+        purchase.setSellCountryId(purchase.getCountryId());
+        purchase.setSellProvinceId(purchase.getProvinceId());
+
+
+        purchase.setStatus(PurchaseStatusEnum.UNDER_REVIEW.getKey());
+        String nickName = SecurityUtils.getLoginUser().getUser().getNickName();
+        purchase.setUserName(nickName);
+        purchaseService.saveOrUpdate(purchase);
+
+        List<EhsdPurchaseProduct> purchaseProductList = purchase.getPurchaseProductList();
+        List<EhsdPurchaseProject> purchaseProjectList = purchase.getPurchaseProjectList();
+
+        //防止空指针
+        purchaseProjectList = (purchaseProjectList == null ? new ArrayList<>() : purchaseProjectList);
+        purchaseProductList = (purchaseProductList == null ? new ArrayList<>() : purchaseProductList);
+
+        //产品(采购明细)
+        for (EhsdPurchaseProduct s : purchaseProductList) {
+            s.setId(ObjectUtils.isNotEmpty(s.getId()) ? s.getId() : IdWorker.getId());
+            s.setPurchaseId(purchase.getId());
+        }
+        //修改或删除数据
+        purchaseProductService.editLinked(purchaseProductList, EhsdPurchaseProduct::getPurchaseId, purchase.getId());
+
+        //收费项目
+        for (EhsdPurchaseProject s : purchaseProjectList) {
+            s.setPurchaseId(purchase.getId());
+        }
+        purchaseProjectService.editLinked(purchaseProjectList, EhsdPurchaseProject::getPurchaseId, purchase.getId());
+
+        return purchase;
+    }
+
+    /**
+     * 结束流程
+     *
+     * @param flowId     流程ID
+     * @param businessId 业务ID
+     * @param submitData 数据
+     */
+    @Override
+    public void end(Long flowId, Long businessId, JSONObject submitData) {
+        //通过业务ID查询采购数据
+        EhsdPurchase purchase = purchaseService.getById(businessId);
+        if (ObjectUtils.isEmpty(purchase)) {
+            throw new ServiceException("采购单不存在,或已被删除");
+        }
+        //查询采购产品
+        List<EhsdPurchaseProduct> purchaseProductList = purchaseProductService.list(Wrappers.<EhsdPurchaseProduct>query().lambda().eq(EhsdPurchaseProduct::getPurchaseId, businessId));
+        List<SampleProduct> upSampleProduct = new ArrayList<>();
+        for (EhsdPurchaseProduct p : purchaseProductList) {
+            if (ObjectUtils.isNotEmpty(p.getDataResourceId()) &&
+                    p.getDataResource() == PurchaseDataResourceEnum.DATA_RESOURCE_2.getKey()) {//如果采购的是样品单
+                SampleProduct sampleProduct = sampleProductService.getById(p.getDataResourceId());
+                BigDecimal expendQuantity = sampleProduct.getExpendQuantity().subtract(p.getQuantity());
+                sampleProduct.setExpendQuantity(expendQuantity);
+                upSampleProduct.add(sampleProduct);
+            }
+        }
+        if (CollectionUtils.isNotEmpty(upSampleProduct)) {//扣减样品单数量
+            sampleProductService.updateBatchById(upSampleProduct);
+        }
+        //修改采购状态为审批通过
+        purchase.setStatus(PurchaseStatusEnum.PASS.getKey());
+        purchase.setApprovedDate(new Date());
+        purchaseService.updateById(purchase);
+
+        //修改申购明细状态
+        purchaseService.updateSubscribeStatus(businessId);
+
+        List<InOutBo> inOutBoList = new ArrayList<>();
+        for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
+            //如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 + 采购明细数量)
+            if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0)) {
+                InOutBo inOutBo = new InOutBo();
+                inOutBo.setProductId(purchaseProduct.getProductId());
+                inOutBo.setQuantity(purchaseProduct.getQuantity());
+                inOutBoList.add(inOutBo);
+            }
+        }
+        productInfoService.editAvailableQuantity(inOutBoList, InOutType.IN, businessId, ProductAvailableRecordType.PURCHASE_PASS, purchase.getCompanyId());
+
+
+        //采购审批通过 生成待入库数据
+        StockWait stockWait = new StockWait();
+        stockWait.setType(1);
+        stockWait.setBusinessType(StockWaitType.PURCHASE_ARRIVAL_IN.getDetailType());
+        stockWait.setBusinessId(purchase.getId());
+        stockWait.setBusinessCode(purchase.getCode());
+        stockWait.setStatus(0);
+        stockWait.setPurchaseId(purchase.getId());
+        stockWaitService.save(stockWait);
+        List<StockWaitDetails> stockWaitDetailsList = new ArrayList<>();
+        for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
+            StockWaitDetails stockWaitDetails = new StockWaitDetails();
+            stockWaitDetails.setStockWaitId(stockWait.getId());
+            stockWaitDetails.setBusinessDetailsId(purchaseProduct.getId());
+            stockWaitDetails.setPurchaseDetailId(purchaseProduct.getId());
+
+            stockWaitDetails.setProductId(purchaseProduct.getProductId());
+            stockWaitDetails.setQuantity(purchaseProduct.getQuantity());
+            stockWaitDetails.setStatus(0);
+
+            stockWaitDetailsList.add(stockWaitDetails);
+        }
+        stockWaitDetailsService.saveBatch(stockWaitDetailsList);
+    }
+
+    /**
+     * 重新发起
+     */
+    @Override
+    @LogicIgnore
+    @DSTransactional
+    public void relaunch(Long flowId, Long businessId, FlowStatusEnum flowStatus, JSONObject submitData) {
+        //删除采购合同
+        EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class);
+        if (ObjectUtils.isEmpty(purchase)) {
+            throw new ServiceException("采购数据不能为空");
+        }
+        purchase.setFlowId(flowId);
+        connStart(purchase);
+    }
+
+    /**
+     * 驳回
+     */
+    @Override
+    public void reject(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
+        purchaseService.update(q -> q
+                .eq(EhsdPurchase::getId, businessId)
+                .set(EhsdPurchase::getStatus, FlowStatusEnum1.REJECT.getKey())
+                .set(BasePo::getUpdateTime, new Date())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+        );
+    }
+
+    /**
+     * 作废
+     */
+    @Override
+    public void cancellation(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
+        super.cancellation(flowId, businessId, flowStatus);
+
+        purchaseService.update(q -> q
+                .eq(EhsdPurchase::getId, businessId)
+                .set(EhsdPurchase::getStatus, FlowStatusEnum1.CANCELLATION.getKey())
+                .set(BasePo::getUpdateTime, new Date())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+        );
+    }
+
+
 }

+ 26 - 0
hx-sale/src/main/java/com/fjhx/sale/mapper/dept/DeptPerfMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.sale.mapper.dept;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.sale.entity.dept.dto.DeptPerfDto;
+import com.fjhx.sale.entity.dept.po.DeptPerf;
+import com.fjhx.sale.entity.dept.vo.DeptPerfVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 部门绩效 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2024-01-21
+ */
+public interface DeptPerfMapper extends BaseMapper<DeptPerf> {
+
+    /**
+     * 部门绩效列表
+     */
+    List<DeptPerfVo> getList(@Param("dto") DeptPerfDto dto);
+
+}

+ 30 - 7
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java

@@ -94,7 +94,6 @@ import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
 import com.ruoyi.framework.config.ThreadPoolConfig;
 import com.ruoyi.system.service.ISysDeptService;
-import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.utils.UserUtil;
 import org.apache.commons.collections4.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -138,10 +137,6 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
 
     @Autowired
     private CustomerService customerService;
-
-    @Autowired
-    private ISysUserService sysUserService;
-
     @Autowired
     private CorporationService corporationService;
 
@@ -425,6 +420,32 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
         // 获取交接单附件
         Map<Long, List<FileInfoVo>> fileMap = ObsFileUtil.getFileMap(ids, 1);
 
+        //获取合同产品明细
+        List<ContractProduct> productList = contractProductService.list(q -> q.in(ContractProduct::getContractId, ids));
+        List<ContractProductVo> contractProductVos = BeanUtil.copyToList(productList, ContractProductVo.class);
+        //赋值物料信息
+        productInfoService.attributeAssign(contractProductVos, ContractProduct::getProductId, (item, productInfo) -> {
+            item.setProductCode(productInfo.getCustomCode());
+            item.setProductName(productInfo.getName());
+            item.setProductLength(productInfo.getLength());
+            item.setProductWidth(productInfo.getWidth());
+            item.setProductHeight(productInfo.getHeight());
+        });
+        //赋值产品图片信息
+        List<Long> productIds = contractProductVos.stream().map(ContractProduct::getProductId).distinct().collect(Collectors.toList());
+        Map<Long, List<FileInfoVo>> productFileMap = ObsFileUtil.getFileMap(productIds, 0);
+        for (ContractProductVo contractProductVo : contractProductVos) {
+            List<FileInfoVo> fileInfoVoList = productFileMap.get(contractProductVo.getProductId());
+            if (ObjectUtil.isNotEmpty(fileInfoVoList)) {
+                FileInfoVo fileInfoVo = fileInfoVoList.get(0);
+                contractProductVo.setProductImgUrl(fileInfoVo.getFileUrl());
+            }
+        }
+
+
+        Map<Long, List<ContractProductVo>> cpMap = contractProductVos.stream().collect(Collectors.groupingBy(ContractProduct::getContractId));
+
+
         // 获取包装附件
         Map<Long, List<FileInfoVo>> packageFileMap = ObsFileUtil.getFileMap(ids, 2);
         for (ContractVo p : list) {
@@ -460,6 +481,9 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
             //赋值销售部门
             p.setDeptName(companyMap.get(p.getDeptId()));
 
+            //赋值产品明细
+            p.setContractProductList(cpMap.get(p.getId()));
+
         }
 
         // 赋值流程id
@@ -1040,7 +1064,6 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
         );
         Map<Long, List<EhsdPurchase>> purchaseMap = purchaseList.stream().collect(Collectors.groupingBy(EhsdPurchase::getDataResourceId));
         for (ContractBudgetVo v : list) {
-            v.setDataJson(null);
             v.setOtherIncomeAmount(BigDecimal.ZERO);//暂时先设置其他收入为0
 
             v.setRmbContractAmount(v.getAmount().multiply(v.getRate()));//计算汇算人民币
@@ -2727,7 +2750,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
             }
         }
         String collect = arr.stream().collect(Collectors.joining(","));
-        //消息推送 给归属公司的 子公司总经理
+        //消息推送给归属公司的 子公司总经理
         String title = String.format("合同【%s】发生生产标签变更,变更如下:%s", contract.getCode(), collect);
         JSONObject msg = new JSONObject();
         msg.put("business_id", dto.getId());

+ 30 - 0
hx-sale/src/main/java/com/fjhx/sale/service/dept/DeptPerfService.java

@@ -0,0 +1,30 @@
+package com.fjhx.sale.service.dept;
+
+import com.fjhx.sale.entity.dept.dto.DeptPerfDto;
+import com.fjhx.sale.entity.dept.po.DeptPerf;
+import com.fjhx.sale.entity.dept.vo.DeptPerfVo;
+import com.ruoyi.common.core.service.BaseService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 部门绩效 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-01-21
+ */
+public interface DeptPerfService extends BaseService<DeptPerf> {
+
+    /**
+     * 部门绩效列表
+     */
+    List<DeptPerfVo> getList(DeptPerfDto dto);
+
+    /**
+     * 部门绩效编辑
+     */
+    void edit(DeptPerfDto deptPerfDto);
+
+}

+ 50 - 0
hx-sale/src/main/java/com/fjhx/sale/service/dept/impl/DeptPerfServiceImpl.java

@@ -0,0 +1,50 @@
+package com.fjhx.sale.service.dept.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.utils.Assert;
+import com.fjhx.sale.entity.dept.dto.DeptPerfDto;
+import com.fjhx.sale.entity.dept.po.DeptPerf;
+import com.fjhx.sale.entity.dept.vo.DeptPerfVo;
+import com.fjhx.sale.mapper.dept.DeptPerfMapper;
+import com.fjhx.sale.service.dept.DeptPerfService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 部门绩效 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-01-21
+ */
+@Service
+public class DeptPerfServiceImpl extends ServiceImpl<DeptPerfMapper, DeptPerf> implements DeptPerfService {
+
+    @Override
+    public List<DeptPerfVo> getList(DeptPerfDto dto) {
+        Assert.notEmpty(dto.getYears(), "年份不能为空!");
+
+        List<DeptPerfVo> list = this.baseMapper.getList(dto);
+        for (DeptPerfVo deptPerfVo : list) {
+            if (ObjectUtil.isEmpty(deptPerfVo.getId())) {
+                deptPerfVo.setId(IdWorker.getId());
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public void edit(DeptPerfDto dto) {
+        Assert.notEmpty(dto.getId(), "Id不能为空!");
+        Assert.notEmpty(dto.getYears(), "年份不能为空!");
+        Assert.notEmpty(dto.getDeptId(), "部门Id不能为空!");
+        Assert.notEmpty(dto.getGroupId(), "组id不能为空!");
+
+        this.saveOrUpdate(dto);
+    }
+
+}

+ 2 - 0
hx-sale/src/main/java/com/fjhx/sale/service/purchase/EhsdPurchaseService.java

@@ -57,6 +57,8 @@ public interface EhsdPurchaseService extends BaseService<EhsdPurchase> {
      */
     void cancellation(Long id);
 
+    void updateSubscribeStatus(Long businessId);
+
     /**
      * 根据供应商查询无发票的采购合同
      */

+ 119 - 68
hx-sale/src/main/java/com/fjhx/sale/service/purchase/impl/EhsdPurchaseServiceImpl.java

@@ -13,14 +13,17 @@ import com.fjhx.account.entity.account.po.AccountManagement;
 import com.fjhx.account.service.account.AccountManagementService;
 import com.fjhx.area.utils.CustomizeAreaUtil;
 import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.entity.InOutBo;
 import com.fjhx.common.entity.corporation.po.Corporation;
 import com.fjhx.common.entity.documentary.bo.DocumentaryData;
 import com.fjhx.common.enums.FlowStatusEnum1;
+import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.service.corporation.CorporationService;
 import com.fjhx.common.service.documentary.GetDocumentaryBusinessTemplate;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.flow.entity.flow.po.FlowExample;
 import com.fjhx.flow.service.flow.FlowExampleService;
+import com.fjhx.item.enums.ProductAvailableRecordType;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.purchase.entity.invoice.po.InvoiceDetails;
 import com.fjhx.purchase.entity.invoice.vo.InvoiceDetailsVo;
@@ -29,9 +32,12 @@ import com.fjhx.purchase.entity.pay.po.PayDetail;
 import com.fjhx.purchase.entity.pay.vo.PayDetailVo;
 import com.fjhx.purchase.entity.pay.vo.PayVo;
 import com.fjhx.purchase.entity.purchase.bo.PurchaseDocumentaryBo;
+import com.fjhx.purchase.entity.purchase.enums.PurchaseDataResourceEnum;
 import com.fjhx.purchase.entity.purchase.enums.PurchaseStatusEnum;
+import com.fjhx.purchase.entity.subscribe.enums.SubscribeDetailStatusEnum;
 import com.fjhx.purchase.entity.subscribe.po.Subscribe;
 import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
+import com.fjhx.purchase.mapper.subscribe.SubscribeDetailMapper;
 import com.fjhx.purchase.service.invoice.InvoiceDetailsService;
 import com.fjhx.purchase.service.pay.PayDetailService;
 import com.fjhx.purchase.service.pay.PayService;
@@ -39,7 +45,6 @@ import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 import com.fjhx.purchase.service.subscribe.SubscribeService;
 import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
 import com.fjhx.sale.entity.contract.po.Contract;
-import com.fjhx.sale.entity.contract.po.ContractProduct;
 import com.fjhx.sale.entity.contract.vo.ContractBudgetVo;
 import com.fjhx.sale.entity.pack.po.PackDetail;
 import com.fjhx.sale.entity.pack.po.PackDetailProduct;
@@ -53,19 +58,17 @@ import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProject;
 import com.fjhx.sale.entity.purchase.vo.EhsdPurchaseDocumentaryVo;
 import com.fjhx.sale.entity.purchase.vo.EhsdPurchaseProductVo;
 import com.fjhx.sale.entity.purchase.vo.EhsdPurchaseVo;
-import com.fjhx.sale.entity.sample.po.SampleProduct;
 import com.fjhx.sale.mapper.purchase.EhsdPurchaseMapper;
-import com.fjhx.sale.service.contract.ContractProductService;
 import com.fjhx.sale.service.contract.ContractService;
 import com.fjhx.sale.service.pack.PackDetailProductService;
 import com.fjhx.sale.service.pack.PackDetailService;
 import com.fjhx.sale.service.purchase.*;
-import com.fjhx.sale.service.sample.SampleProductService;
 import com.fjhx.supply.entity.supplier.po.SupplierInfo;
 import com.fjhx.supply.entity.supplier.po.SupplierPrice;
 import com.fjhx.supply.entity.supplier.vo.SupplierPriceVo;
 import com.fjhx.supply.service.supplier.SupplierInfoService;
 import com.fjhx.supply.service.supplier.SupplierPriceService;
+import com.fjhx.tenant.utils.DeptUstil;
 import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.ruoyi.common.core.domain.entity.SysUser;
@@ -126,10 +129,6 @@ public class EhsdPurchaseServiceImpl extends ServiceImpl<EhsdPurchaseMapper, Ehs
     @Autowired
     private InvoiceDetailsService invoiceDetailsService;
     @Autowired
-    private ContractProductService contractProductService;
-    @Autowired
-    private SampleProductService sampleProductService;
-    @Autowired
     private SubscribeDetailService subscribeDetailService;
     @Autowired
     private AccountManagementService accountManagementService;
@@ -139,6 +138,10 @@ public class EhsdPurchaseServiceImpl extends ServiceImpl<EhsdPurchaseMapper, Ehs
     private ContractService contractService;
     @Autowired
     private SubscribeService subscribeService;
+    @Autowired
+    private EhsdPurchaseProductService purchaseProductService;
+    @Autowired
+    private SubscribeDetailMapper subscribeDetailMapper;
 
     /**
      * 分页
@@ -192,6 +195,15 @@ public class EhsdPurchaseServiceImpl extends ServiceImpl<EhsdPurchaseMapper, Ehs
         //赋值用户名称
         UserUtil.assignmentNickName(records, EhsdPurchase::getCreateUser, EhsdPurchase::setUserName);
 
+        //获取生产公司信息
+        List<Long> companyIds = records.stream().map(EhsdPurchase::getCompanyId).collect(Collectors.toList());
+        Map<Long, String> companyNameMap = DeptUstil.getDeptNameMap(companyIds);
+
+        for (EhsdPurchaseVo record : records) {
+            //赋值生产公司名称
+            record.setCompanyName(companyNameMap.get(record.getCompanyId()));
+        }
+
         return page;
     }
 
@@ -267,41 +279,54 @@ public class EhsdPurchaseServiceImpl extends ServiceImpl<EhsdPurchaseMapper, Ehs
         }
 
         //赋值产品待采购数量信息
-        if (ObjectUtils.isNotEmpty(ehsdPurchaseProductList)) {
-            //申购来源
-            List<EhsdPurchaseProductVo> subscribeSource = ehsdPurchaseProductVos.stream().filter(item -> Objects.equals(item.getDataResource(), 0)).collect(Collectors.toList());
-            if (ObjectUtils.isNotEmpty(subscribeSource)) {
-                List<Long> subscribeDetailSourceIds = subscribeSource.stream().map(EhsdPurchaseProductVo::getSubscribeDetailId).distinct().collect(Collectors.toList());
-                Map<Long, SubscribeDetail> contractProductMap = subscribeDetailService.mapKEntity(SubscribeDetail::getId, q -> q.in(SubscribeDetail::getId, subscribeDetailSourceIds));
-                for (EhsdPurchaseProductVo ehsdPurchaseProductVo : subscribeSource) {
-                    SubscribeDetail subscribeDetail = contractProductMap.get(ehsdPurchaseProductVo.getSubscribeDetailId());
-                    BigDecimal count = subscribeDetail.getCount();
-                    //获取已采购数量
-                    List<EhsdPurchaseProduct> ehsdPurchaseProductList1 = ehsdPurchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getDataResource, 0).eq(EhsdPurchaseProduct::getSubscribeDetailId, subscribeDetail.getId()));
-                    BigDecimal add = ObjectUtils.isEmpty(ehsdPurchaseProductList1) ? BigDecimal.ZERO : ehsdPurchaseProductList1.stream().map(EhsdPurchaseProduct::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
-                    ehsdPurchaseProductVo.setExpendQuantity(count.subtract(add));
-                }
-            }
-            //合同来源
-            List<EhsdPurchaseProductVo> contractSource = ehsdPurchaseProductVos.stream().filter(item -> Objects.equals(item.getDataResource(), 1)).collect(Collectors.toList());
-            if (ObjectUtils.isNotEmpty(contractSource)) {
-                List<Long> contractSourceIds = contractSource.stream().map(EhsdPurchaseProductVo::getDataResourceId).distinct().collect(Collectors.toList());
-                Map<Long, ContractProduct> contractProductMap = contractProductService.mapKEntity(ContractProduct::getId, q -> q.in(ContractProduct::getId, contractSourceIds));
-                for (EhsdPurchaseProductVo ehsdPurchaseProductVo : contractSource) {
-                    ContractProduct stringObjectMap = contractProductMap.get(ehsdPurchaseProductVo.getDataResourceId());
-                    ehsdPurchaseProductVo.setExpendQuantity(stringObjectMap.getExpendQuantity());
-                }
-            }
-            //样品单来源
-            List<EhsdPurchaseProductVo> sampleSource = ehsdPurchaseProductVos.stream().filter(item -> Objects.equals(item.getDataResource(), 2)).collect(Collectors.toList());
-            if (ObjectUtils.isNotEmpty(sampleSource)) {
-                List<Long> sampleSourceIds = sampleSource.stream().map(EhsdPurchaseProductVo::getDataResourceId).distinct().collect(Collectors.toList());
-                Map<Long, SampleProduct> sampleProductMap = sampleProductService.mapKEntity(SampleProduct::getId, q -> q.in(SampleProduct::getId, sampleSourceIds));
-                for (EhsdPurchaseProductVo ehsdPurchaseProductVo : sampleSource) {
-                    SampleProduct stringObjectMap = sampleProductMap.get(ehsdPurchaseProductVo.getDataResourceId());
-                    ehsdPurchaseProductVo.setExpendQuantity(stringObjectMap.getExpendQuantity());
-                }
+        if (ObjectUtils.isNotEmpty(ehsdPurchaseProductVos)) {
+            //合同和申购来源都是申购明细表
+            List<Long> subscribeDetailSourceIds = ehsdPurchaseProductVos.stream().map(EhsdPurchaseProductVo::getSubscribeDetailId).distinct().collect(Collectors.toList());
+            Map<Long, SubscribeDetail> contractProductMap = subscribeDetailService.mapKEntity(SubscribeDetail::getId, q -> q.in(SubscribeDetail::getId, subscribeDetailSourceIds));
+            for (EhsdPurchaseProductVo ehsdPurchaseProductVo : ehsdPurchaseProductVos) {
+                SubscribeDetail subscribeDetail = contractProductMap.get(ehsdPurchaseProductVo.getSubscribeDetailId());
+                BigDecimal count = subscribeDetail.getCount();
+                //获取已采购数量
+                List<EhsdPurchaseProduct> ehsdPurchaseProductList1 = ehsdPurchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getDataResource, 0).eq(EhsdPurchaseProduct::getSubscribeDetailId, subscribeDetail.getId()));
+                BigDecimal add = ObjectUtils.isEmpty(ehsdPurchaseProductList1) ? BigDecimal.ZERO : ehsdPurchaseProductList1.stream().map(EhsdPurchaseProduct::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+                ehsdPurchaseProductVo.setExpendQuantity(count.subtract(add));
             }
+
+
+//            //申购来源
+//            List<EhsdPurchaseProductVo> subscribeSource = ehsdPurchaseProductVos.stream().filter(item -> Objects.equals(item.getDataResource(), 0)).collect(Collectors.toList());
+//            if (ObjectUtils.isNotEmpty(subscribeSource)) {
+//                List<Long> subscribeDetailSourceIds = subscribeSource.stream().map(EhsdPurchaseProductVo::getSubscribeDetailId).distinct().collect(Collectors.toList());
+//                Map<Long, SubscribeDetail> contractProductMap = subscribeDetailService.mapKEntity(SubscribeDetail::getId, q -> q.in(SubscribeDetail::getId, subscribeDetailSourceIds));
+//                for (EhsdPurchaseProductVo ehsdPurchaseProductVo : subscribeSource) {
+//                    SubscribeDetail subscribeDetail = contractProductMap.get(ehsdPurchaseProductVo.getSubscribeDetailId());
+//                    BigDecimal count = subscribeDetail.getCount();
+//                    //获取已采购数量
+//                    List<EhsdPurchaseProduct> ehsdPurchaseProductList1 = ehsdPurchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getDataResource, 0).eq(EhsdPurchaseProduct::getSubscribeDetailId, subscribeDetail.getId()));
+//                    BigDecimal add = ObjectUtils.isEmpty(ehsdPurchaseProductList1) ? BigDecimal.ZERO : ehsdPurchaseProductList1.stream().map(EhsdPurchaseProduct::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+//                    ehsdPurchaseProductVo.setExpendQuantity(count.subtract(add));
+//                }
+//            }
+//            //合同来源
+//            List<EhsdPurchaseProductVo> contractSource = ehsdPurchaseProductVos.stream().filter(item -> Objects.equals(item.getDataResource(), 1)).collect(Collectors.toList());
+//            if (ObjectUtils.isNotEmpty(contractSource)) {
+//                List<Long> contractSourceIds = contractSource.stream().map(EhsdPurchaseProductVo::getDataResourceId).distinct().collect(Collectors.toList());
+//                Map<Long, ContractProduct> contractProductMap = contractProductService.mapKEntity(ContractProduct::getId, q -> q.in(ContractProduct::getId, contractSourceIds));
+//                for (EhsdPurchaseProductVo ehsdPurchaseProductVo : contractSource) {
+//                    ContractProduct stringObjectMap = contractProductMap.get(ehsdPurchaseProductVo.getDataResourceId());
+//                    ehsdPurchaseProductVo.setExpendQuantity(stringObjectMap.getExpendQuantity());
+//                }
+//            }
+//            //样品单来源
+//            List<EhsdPurchaseProductVo> sampleSource = ehsdPurchaseProductVos.stream().filter(item -> Objects.equals(item.getDataResource(), 2)).collect(Collectors.toList());
+//            if (ObjectUtils.isNotEmpty(sampleSource)) {
+//                List<Long> sampleSourceIds = sampleSource.stream().map(EhsdPurchaseProductVo::getDataResourceId).distinct().collect(Collectors.toList());
+//                Map<Long, SampleProduct> sampleProductMap = sampleProductService.mapKEntity(SampleProduct::getId, q -> q.in(SampleProduct::getId, sampleSourceIds));
+//                for (EhsdPurchaseProductVo ehsdPurchaseProductVo : sampleSource) {
+//                    SampleProduct stringObjectMap = sampleProductMap.get(ehsdPurchaseProductVo.getDataResourceId());
+//                    ehsdPurchaseProductVo.setExpendQuantity(stringObjectMap.getExpendQuantity());
+//                }
+//            }
         }
 
         //赋值产品信息
@@ -459,37 +484,63 @@ public class EhsdPurchaseServiceImpl extends ServiceImpl<EhsdPurchaseMapper, Ehs
         if (ObjectUtil.isNotEmpty(purchase) && purchase.getPayStatus() != 0) {
             throw new ServiceException("采购合同已付款,禁止作废");
         }
-        purchase.setStatus(FlowStatusEnum1.CANCELLATION.getKey());
-        this.updateById(purchase);
-        List<EhsdPurchaseProduct> list = ehsdPurchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, id));
-        if (ObjectUtils.isEmpty(list)) {
-            return;
+
+        this.update(q -> q
+                .eq(EhsdPurchase::getId, id)
+                .set(EhsdPurchase::getStatus, FlowStatusEnum1.CANCELLATION.getKey())
+                .set(BasePo::getUpdateTime, new Date())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+        );
+
+        //修改可用库存
+        List<InOutBo> inOutBoList = new ArrayList<>();
+        List<EhsdPurchaseProduct> purchaseProductList = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, id));
+        for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
+            //如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 + 采购明细数量)
+            if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0)) {
+                InOutBo inOutBo = new InOutBo();
+                inOutBo.setProductId(purchaseProduct.getProductId());
+                inOutBo.setQuantity(purchaseProduct.getQuantity());
+                inOutBoList.add(inOutBo);
+            }
         }
-        //回滚待采购数量
-        for (EhsdPurchaseProduct ehsdPurchaseProduct : list) {
-            Long dataResourceId = ehsdPurchaseProduct.getDataResourceId();
-            BigDecimal purchaseQuantity = ehsdPurchaseProduct.getQuantity();
-
-            //合同来源
-            if (ehsdPurchaseProduct.getDataResource() == 1) {
-                contractProductService.update(q -> q
-                        .eq(ContractProduct::getId, dataResourceId)
-                        .setSql("expend_quantity = expend_quantity + " + purchaseQuantity)
-                        .set(BasePo::getUpdateTime, new Date())
-                        .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
-                );
+        productInfoService.editAvailableQuantity(inOutBoList, InOutType.OUT, id, ProductAvailableRecordType.PURCHASE_CANCEL, purchase.getCompanyId());
+
+        //修改申购明细状态
+        updateSubscribeStatus(id);
+    }
+
+    /**
+     * 修改申购明细状态
+     */
+    @Override
+    public void updateSubscribeStatus(Long businessId) {
+        //修改申购明细状态
+        List<Long> subscribeDetailIds = purchaseProductService.listObject(EhsdPurchaseProduct::getSubscribeDetailId, q -> q
+                .eq(EhsdPurchaseProduct::getPurchaseId, businessId)
+        );
+        //获取已采购数量
+        List<SubscribeDetail> purchaseCountByIds = subscribeDetailMapper.getPurchaseCountByIds(subscribeDetailIds);
+        Map<Long, BigDecimal> purchaseCountMap = purchaseCountByIds.stream().collect(Collectors.toMap(SubscribeDetail::getId, SubscribeDetail::getCount));
+        //修改状态
+        List<SubscribeDetail> subscribeDetails = subscribeDetailService.listByIds(subscribeDetailIds);
+        for (SubscribeDetail subscribeDetail : subscribeDetails) {
+            //获取已采购数并计算状态
+            BigDecimal count = purchaseCountMap.getOrDefault(subscribeDetail.getId(), BigDecimal.ZERO);
+            if (count.compareTo(subscribeDetail.getCount()) >= 0) {
+                //修改为已采购
+                subscribeDetail.setStatus(SubscribeDetailStatusEnum.PURCHASED.getKey());
+            } else {
+                //修改为部分采购
+                subscribeDetail.setStatus(SubscribeDetailStatusEnum.LITT_PAID_AMOUNT.getKey());
             }
 
-            //样品单来源
-            if (ehsdPurchaseProduct.getDataResource() == 1) {
-                sampleProductService.update(q -> q
-                        .eq(SampleProduct::getId, dataResourceId)
-                        .setSql("expend_quantity = expend_quantity + " + purchaseQuantity)
-                        .set(BasePo::getUpdateTime, new Date())
-                        .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
-                );
+            if (count.compareTo(BigDecimal.ZERO) == 0) {
+                //修改为待采购
+                subscribeDetail.setStatus(SubscribeDetailStatusEnum.PAID_AMOUNT.getKey());
             }
         }
+        subscribeDetailService.updateBatchById(subscribeDetails);
     }
 
     /**

+ 1 - 1
hx-sale/src/main/java/com/fjhx/sale/service/sale/impl/SaleQuotationServiceImpl.java

@@ -216,7 +216,7 @@ public class SaleQuotationServiceImpl extends ServiceImpl<SaleQuotationMapper, S
         saleQuotationDto.setQuotationStatus(0);//报价状态未报价
         saveOrEdit(saleQuotationDto);
 
-        //消息推送 给归属公司的 子公司总经理
+        //消息推送给归属公司的 子公司总经理
         JSONObject msg = new JSONObject();
         msg.put("business_id", saleQuotationDto.getId());
         List<Long> generalManagerIds = UserUtil.getUserIdsByRoleKey("subsidiary_gm", saleQuotationDto.getCompanyId());

+ 32 - 0
hx-sale/src/main/resources/mapper/dept/DeptPerfMapper.xml

@@ -0,0 +1,32 @@
+<?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.sale.mapper.dept.DeptPerfMapper">
+    <select id="getList" resultType="com.fjhx.sale.entity.dept.vo.DeptPerfVo">
+        SELECT dep.id,
+               de.dept_id,
+               de.dept_name,
+               gr.dept_id                      AS groupId,
+               gr.dept_name                    AS groupName,
+               IFNULL(dep.years, #{dto.years}) AS years,
+               dep.january,
+               dep.february,
+               dep.march,
+               dep.april,
+               dep.may,
+               dep.june,
+               dep.july,
+               dep.august,
+               dep.september,
+               dep.october,
+               dep.november,
+               dep.december
+        FROM sys_dept gr
+                 LEFT JOIN sys_dept de ON gr.parent_id = de.dept_id
+                 LEFT JOIN dept_perf dep ON dep.group_id = gr.dept_id AND dep.years = #{dto.years}
+        WHERE gr.type != 0
+              AND FIND_IN_SET(100,gr.ancestors)
+              AND not gr.jst_distributor is null
+              AND gr.jst_distributor !=''
+    </select>
+
+</mapper>

+ 0 - 13
hx-supply/src/main/java/com/fjhx/supply/controller/supplier/SupplierInfoController.java

@@ -39,14 +39,6 @@ public class SupplierInfoController {
         return supplierInfoService.getPage(dto);
     }
 
-//    /**
-//     * 供应商分页 维多利亚
-//     */
-//    @PostMapping("/pageByWdly")
-//    public Page<SupplierInfoVo> pageByWdly(@RequestBody SupplierInfoSelectDto dto) {
-//        return supplierInfoService.getPageByWdly(dto);
-//    }
-
     /**
      * 供应商明细
      */
@@ -55,11 +47,6 @@ public class SupplierInfoController {
         return supplierInfoService.detail(dto.getId());
     }
 
-//    @PostMapping("/detailByWdly")
-//    public SupplierInfoVo detailByWdly(@RequestBody BaseSelectDto dto) {
-//        return supplierInfoService.detailByWdly(dto.getId());
-//    }
-
     /**
      * 供应商新增
      */

+ 5 - 0
hx-supply/src/main/java/com/fjhx/supply/entity/supplier/po/SupplierInfo.java

@@ -118,4 +118,9 @@ public class SupplierInfo extends BasePo {
      */
     private String fax;
 
+    /**
+     * 邮编
+     */
+    private String postalCode;
+
 }

+ 5 - 0
hx-supply/src/main/java/com/fjhx/supply/entity/supplier/po/SupplierPrice.java

@@ -37,4 +37,9 @@ public class SupplierPrice extends BasePo {
      */
     private BigDecimal price;
 
+    /**
+     * 归属公司id
+     */
+    private Long companyId;
+
 }

+ 2 - 1
hx-supply/src/main/java/com/fjhx/supply/entity/supplier/vo/SupplierInfoVo.java

@@ -1,6 +1,5 @@
 package com.fjhx.supply.entity.supplier.vo;
 
-import com.fjhx.area.service.ISetAreaName;
 import com.fjhx.area.service.SetCustomizeAreaName;
 import com.fjhx.supply.entity.supplier.po.SupplierInfo;
 import lombok.Getter;
@@ -22,4 +21,6 @@ public class SupplierInfoVo extends SupplierInfo implements SetCustomizeAreaName
 
     private String cityName;
 
+    private String companyName;
+
 }

+ 2 - 0
hx-supply/src/main/java/com/fjhx/supply/entity/supplier/vo/SupplierPriceVo.java

@@ -65,4 +65,6 @@ public class SupplierPriceVo extends SupplierPrice {
      */
     private String supplierName;
 
+    private String companyName;
+
 }

+ 0 - 9
hx-supply/src/main/java/com/fjhx/supply/service/supplier/SupplierInfoService.java

@@ -25,21 +25,12 @@ public interface SupplierInfoService extends BaseService<SupplierInfo> {
      * 供应商分页
      */
     Page<SupplierInfoVo> getPage(SupplierInfoSelectDto dto);
-//    /**
-//     * 供应商分页维多利亚
-//     */
-//    Page<SupplierInfoVo> getPageByWdly(SupplierInfoSelectDto dto);
 
     /**
      * 供应商明细
      */
     SupplierInfoVo detail(Long id);
 
-//    /**
-//     * 供应商明细 维多利亚
-//     */
-//    SupplierInfoVo detailByWdly(Long id);
-
     /**
      * 供应商新增
      */

+ 20 - 55
hx-supply/src/main/java/com/fjhx/supply/service/supplier/impl/SupplierInfoServiceImpl.java

@@ -21,6 +21,7 @@ import com.fjhx.supply.utils.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.fjhx.tenant.utils.DeptUstil;
 import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -29,10 +30,7 @@ import com.ruoyi.common.utils.wrapper.SqlField;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -65,8 +63,13 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
                 new SqlField("si", SupplierInfo::getCode)
         );
 
-        //权限过滤:供应商自己看自己
-        wrapper.eq("si", SupplierInfo::getCompanyId, SecurityUtils.getCompanyId());
+        //权限过滤:供应商自己看自己,总公司看全部
+        Long companyId = SecurityUtils.getCompanyId();
+        if (!Objects.equals(companyId, 100L)) {
+            wrapper.eq("si", SupplierInfo::getCompanyId, companyId);
+        } else {
+            wrapper.eq("si", SupplierInfo::getCompanyId, dto.getCompanyId());
+        }
 
         wrapper.orderByDesc("si", SupplierInfo::getId);
 
@@ -77,46 +80,20 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
             return page;
         }
         CustomizeAreaUtil.setAreaName(records);
+
+
+        //获取归属公司信息
+        List<Long> companyIds = records.stream().map(SupplierInfo::getCompanyId).collect(Collectors.toList());
+        Map<Long, String> companyNameMap = DeptUstil.getDeptNameMap(companyIds);
+
+        for (SupplierInfoVo record : records) {
+            //赋值生产公司名称
+            record.setCompanyName(companyNameMap.get(record.getCompanyId()));
+        }
+
         return page;
     }
 
-//    /**
-//     * 供应商分页维多利亚用
-//     */
-//    @Override
-//    public Page<SupplierInfoVo> getPageByWdly(SupplierInfoSelectDto dto) {
-//        IWrapper<SupplierInfo> wrapper = getWrapper();
-//        wrapper.orderByDesc("si", SupplierInfo::getId);
-//        wrapper.eq("si", SupplierInfo::getType, dto.getType());
-//        wrapper.keyword(dto,
-//                new SqlField("si", SupplierInfo::getName),
-//                new SqlField("si", SupplierInfo::getCode)
-//        );
-//        //根据账期过滤
-//        Integer accountPeriodType = dto.getAccountPeriodType();
-//        if (ObjectUtil.isNotEmpty(accountPeriodType)) {
-//            if (1 == accountPeriodType) {
-//                wrapper.isNotNull("json_unquote( si.victoriatourist_json -> '$.accountPeriod' )");
-//                wrapper.apply("json_unquote( si.victoriatourist_json -> '$.accountPeriod' ) !=''");
-//                wrapper.apply("json_unquote( si.victoriatourist_json -> '$.accountPeriod' ) !='0'");
-//            } else {
-//                wrapper.isNull("json_unquote( si.victoriatourist_json -> '$.accountPeriod' )");
-//                wrapper.or();
-//                wrapper.apply("json_unquote( si.victoriatourist_json -> '$.accountPeriod' ) =''");
-//                wrapper.or();
-//                wrapper.apply("json_unquote( si.victoriatourist_json -> '$.accountPeriod' ) ='0'");
-//            }
-//        }
-//        Page<SupplierInfoVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
-//
-//        List<SupplierInfoVo> records = page.getRecords();
-//        if (records.size() == 0) {
-//            return page;
-//        }
-//        CustomizeAreaUtil.setAreaName(records);
-//        return page;
-//    }
-
     @Override
     public SupplierInfoVo detail(Long id) {
         SupplierInfo SupplierInfo = this.getById(id);
@@ -125,18 +102,6 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
         return result;
     }
 
-//    @Override
-//    public SupplierInfoVo detailByWdly(Long id) {
-//        SupplierInfoVo result = detail(id);
-//
-//        //辅助前端 将账期和退换货期限 两个字段转为字符串
-//        JSONObject json = ObjectUtil.isNotEmpty(result.getVictoriatouristJson()) ? JSONObject.parseObject(result.getVictoriatouristJson()) : new JSONObject();
-//        json.put("accountPeriod",json.getString("accountPeriod"));
-//        json.put("returnPeriod",json.getString("returnPeriod"));
-//        result.setVictoriatouristJson(JSONObject.toJSONString(json,JSONWriter.Feature.WriteLongAsString));
-//        return result;
-//    }
-
     @DSTransactional
     @Override
     public void add(SupplierInfoDto supplierInfoDto) {

+ 25 - 5
hx-supply/src/main/java/com/fjhx/supply/service/supplier/impl/SupplierPriceServiceImpl.java

@@ -1,11 +1,9 @@
 package com.fjhx.supply.service.supplier.impl;
 
-import com.baomidou.dynamic.datasource.annotation.DS;
-import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 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.ProductClassifyService;
 import com.fjhx.item.service.product.ProductInfoService;
@@ -17,8 +15,10 @@ import com.fjhx.supply.entity.supplier.vo.SupplierPriceAddVo;
 import com.fjhx.supply.entity.supplier.vo.SupplierPriceVo;
 import com.fjhx.supply.mapper.supplier.SupplierPriceMapper;
 import com.fjhx.supply.service.supplier.SupplierPriceService;
+import com.fjhx.tenant.utils.DeptUstil;
 import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -70,6 +70,9 @@ public class SupplierPriceServiceImpl extends ServiceImpl<SupplierPriceMapper, S
         wrapper.eq("si", SupplierInfo::getType, dto.getSupplierType());
         wrapper.keyword(dto, new SqlField("si.name"));
 
+        //权限过滤:供应商价格自己看自己
+        wrapper.eq("sp", SupplierPrice::getCompanyId, SecurityUtils.getCompanyId());
+
         Page<SupplierPriceVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         List<SupplierPriceVo> records = page.getRecords();
 
@@ -92,6 +95,15 @@ public class SupplierPriceServiceImpl extends ServiceImpl<SupplierPriceMapper, S
             item.setProductClassifyName(productClassify.getName());
         });
 
+        //获取归属公司信息
+        List<Long> companyIds = records.stream().map(SupplierPrice::getCompanyId).collect(Collectors.toList());
+        Map<Long, String> companyNameMap = DeptUstil.getDeptNameMap(companyIds);
+
+        for (SupplierPriceVo record : records) {
+            //赋值生产公司名称
+            record.setCompanyName(companyNameMap.get(record.getCompanyId()));
+        }
+
 //        DynamicDataSourceContextHolder.clear();
         return page;
     }
@@ -102,6 +114,14 @@ public class SupplierPriceServiceImpl extends ServiceImpl<SupplierPriceMapper, S
 
         // 添加产品列表
         List<SupplierPrice> supplierPriceList = supplierPriceDto.getSupplierPriceList();
+        for (SupplierPrice supplierPrice : supplierPriceList) {
+            //赋值产品归属公司
+            Long companyId = supplierPrice.getCompanyId();
+            if (ObjectUtil.isEmpty(companyId)) {
+                supplierPrice.setCompanyId(SecurityUtils.getCompanyId());
+            }
+        }
+
         // 添加产品id列表
         List<Long> productInfoIdList = supplierPriceList.stream().map(SupplierPrice::getProductInfoId).collect(Collectors.toList());
 
@@ -115,7 +135,7 @@ public class SupplierPriceServiceImpl extends ServiceImpl<SupplierPriceMapper, S
 
         if (existSupplierPriceList.size() == 0) {
             supplierPriceList.forEach(item -> item.setSupplierInfoId(supplierPriceDto.getSupplierInfoId()));
-            saveBatch(supplierPriceList);
+            this.saveBatch(supplierPriceList);
             supplierPriceAddVo.setAddSuccess(true);
             return supplierPriceAddVo;
         }
@@ -135,7 +155,7 @@ public class SupplierPriceServiceImpl extends ServiceImpl<SupplierPriceMapper, S
                     supplierPrice.setId(existSupplierPrice.getId());
                 }
             }
-            saveOrUpdateBatch(supplierPriceList);
+            this.saveOrUpdateBatch(supplierPriceList);
             supplierPriceAddVo.setAddSuccess(true);
             return supplierPriceAddVo;
         }

+ 2 - 1
hx-supply/src/main/resources/mapper/supplier/SupplierPriceMapper.xml

@@ -7,7 +7,8 @@
                sp.product_info_id,
                sp.price,
                si.name supplierName,
-               si.type supplierType
+               si.type supplierType,
+               sp.company_id
         from supplier_price sp
                  inner join supplier_info si on sp.supplier_info_id = si.id
             ${ew.customSqlSegment}

+ 2 - 2
hx-wms/src/main/java/com/fjhx/wms/service/warehouse/impl/WarehouseServiceImpl.java

@@ -46,9 +46,9 @@ public class WarehouseServiceImpl extends ServiceImpl<WarehouseMapper, Warehouse
         //权限过滤:仓库-子公司看自己的,总公司看全部
         Long companyId = SecurityUtils.getCompanyId();
         if (!Objects.equals(companyId, 100L)) {
-            wrapper.eq(Warehouse::getCompanyId, companyId);
+            wrapper.eq("w", Warehouse::getCompanyId, companyId);
         } else {
-            wrapper.eq(Warehouse::getCompanyId, dto.getCompanyId());
+            wrapper.eq("w", Warehouse::getCompanyId, dto.getCompanyId());
         }
 
         wrapper.orderByDesc("w", Warehouse::getId);

+ 0 - 38
pom.xml

@@ -14,7 +14,6 @@
         <module>code</module>
         <module>hx-admin</module>
         <module>hx-customer</module>
-        <module>hx-ehsd</module>
         <module>hx-item</module>
         <module>hx-mes</module>
         <module>hx-supply</module>
@@ -65,16 +64,6 @@
             </dependency>
             <dependency>
                 <groupId>com.fjhx</groupId>
-                <artifactId>hx-ehsd</artifactId>
-                <version>${hx.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.fjhx</groupId>
-                <artifactId>hx-iot</artifactId>
-                <version>${hx.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.fjhx</groupId>
                 <artifactId>hx-item</artifactId>
                 <version>${hx.version}</version>
             </dependency>
@@ -95,51 +84,24 @@
             </dependency>
             <dependency>
                 <groupId>com.fjhx</groupId>
-                <artifactId>hx-oa</artifactId>
-                <version>${hx.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.fjhx</groupId>
                 <artifactId>hx-purchase</artifactId>
                 <version>${hx.version}</version>
             </dependency>
-
             <dependency>
                 <groupId>com.fjhx</groupId>
                 <artifactId>hx-sale</artifactId>
                 <version>${hx.version}</version>
             </dependency>
-
             <dependency>
                 <groupId>com.fjhx</groupId>
                 <artifactId>hx-account</artifactId>
                 <version>${hx.version}</version>
             </dependency>
-
-            <!--            <dependency>-->
-            <!--                <groupId>com.fjhx</groupId>-->
-            <!--                <artifactId>hx-victoriatourist</artifactId>-->
-            <!--                <version>${hx.version}</version>-->
-            <!--            </dependency>-->
-
-            <dependency>
-                <groupId>com.fjhx</groupId>
-                <artifactId>hx-dingding</artifactId>
-                <version>${hx.version}</version>
-            </dependency>
-
             <dependency>
                 <groupId>com.fjhx</groupId>
                 <artifactId>hx-form</artifactId>
                 <version>${hx.version}</version>
             </dependency>
-
-            <!--            <dependency>-->
-            <!--                <groupId>com.fjhx</groupId>-->
-            <!--                <artifactId>hx-jxst</artifactId>-->
-            <!--                <version>${hx.version}</version>-->
-            <!--            </dependency>-->
             <dependency>
                 <groupId>com.fjhx</groupId>
                 <artifactId>hx-jushuitan</artifactId>