Bladeren bron

Merge remote-tracking branch 'origin/master'

caozj 2 jaren geleden
bovenliggende
commit
a01271fa91
23 gewijzigde bestanden met toevoegingen van 676 en 120 verwijderingen
  1. 45 6
      hx-dingding/src/main/java/com/fjhx/controller/DingController.java
  2. 14 0
      hx-dingding/src/main/java/com/fjhx/entity/dto/GetUserTokenDto.java
  3. 27 53
      hx-dingding/src/main/java/com/fjhx/utils/DingUtil.java
  4. 5 1
      hx-item/pom.xml
  5. 41 0
      hx-item/src/main/java/com/fjhx/item/controller/product/ProductInfoController.java
  6. 5 0
      hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductInfoDto.java
  7. 18 3
      hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductInfoSelectDto.java
  8. 11 2
      hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductInfo.java
  9. 152 0
      hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductInfoEhsdJson.java
  10. 5 0
      hx-item/src/main/java/com/fjhx/item/entity/product/vo/ProductInfoVo.java
  11. 5 2
      hx-item/src/main/java/com/fjhx/item/mapper/product/ProductInfoMapper.java
  12. 27 0
      hx-item/src/main/java/com/fjhx/item/service/product/ProductInfoService.java
  13. 182 47
      hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java
  14. 23 0
      hx-item/src/main/resources/mapper/product/ProductInfoMapper.xml
  15. 0 0
      hx-sale/src/main/java/com/fjhx/sale/a-json/DocumentsPdfApi.json
  16. 12 1
      hx-sale/src/main/java/com/fjhx/sale/controller/contract/ContractController.java
  17. 2 0
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/Contract.java
  18. 21 1
      hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/ContractProduct.java
  19. 9 0
      hx-sale/src/main/java/com/fjhx/sale/service/contract/ContractService.java
  20. 49 4
      hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java
  21. 5 0
      hx-supply/src/main/java/com/fjhx/supply/controller/supplier/SupplierInfoController.java
  22. 5 0
      hx-supply/src/main/java/com/fjhx/supply/service/supplier/SupplierInfoService.java
  23. 13 0
      hx-supply/src/main/java/com/fjhx/supply/service/supplier/impl/SupplierInfoServiceImpl.java

+ 45 - 6
hx-dingding/src/main/java/com/fjhx/controller/DingController.java

@@ -2,12 +2,18 @@ package com.fjhx.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkoauth2_1_0.models.GetCorpAccessTokenResponseBody;
+import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
 import com.dingtalk.oapi.lib.aes.DingTalkEncryptor;
 import com.fjhx.constant.Constant;
+import com.fjhx.entity.dto.GetUserTokenDto;
+import com.fjhx.utils.DingUtil;
 import com.ruoyi.common.annotation.NonInterception;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.LinkedHashMap;
+
 @Slf4j
 @RestController
 @RequestMapping("/open")
@@ -21,7 +27,7 @@ public class DingController {
     /**
      * 创建应用,验证回调URL变更有效事件(第一次保存回调URL之后)
      */
-    private static final String EVENT_CHECK_UPADTE_SUITE_URL = "check_update_suite_url";
+    private static final String EVENT_CHECK_UPDATE_SUITE_URL = "check_update_suite_url";
 
     /**
      * suite_ticket推送事件
@@ -33,6 +39,16 @@ public class DingController {
      */
     private static final String EVENT_TMP_AUTH_CODE = "tmp_auth_code";
 
+    /**
+     * 高优先级数据,激活应用等
+     */
+    private static final String EVENT_SYNC_HTTP_PUSH_HIGH = "SYNC_HTTP_PUSH_HIGH";
+
+    /**
+     * 普通优先级数据,例如通讯录变更
+     */
+    private static final String EVENT_SYNC_HTTP_PUSH_MEDIUM = "SYNC_HTTP_PUSH_MEDIUM";
+
     @NonInterception
     @PostMapping(value = "/dingCallback")
     public Object dingCallback(
@@ -44,36 +60,46 @@ public class DingController {
         String params = "signature:" + signature + " timestamp:" + timestamp + " nonce:" + nonce + " body:" + body;
 
         try {
-            log.info("begin callback:" + params);
-            DingTalkEncryptor dingTalkEncryptor = new DingTalkEncryptor(Constant.TOKEN, Constant.ENCODING_AES_KEY, Constant.SUITE_KEY);
+            DingTalkEncryptor dingTalkEncryptor = new DingTalkEncryptor(
+                    Constant.TOKEN, Constant.ENCODING_AES_KEY, Constant.SUITE_KEY);
 
             // 从post请求的body中获取回调信息的加密数据进行解密处理
             String encrypt = body.getString("encrypt");
             String plainText = dingTalkEncryptor.getDecryptMsg(signature, timestamp.toString(), nonce, encrypt);
             JSONObject callBackContent = JSON.parseObject(plainText);
 
-            log.info("callBackContent:{}", callBackContent.toJSONString());
-
             // 根据回调事件类型做不同的业务处理
             String eventType = callBackContent.getString("EventType");
             switch (eventType) {
                 case EVENT_CHECK_CREATE_SUITE_URL:
                     log.info("验证新创建的回调URL有效性: " + plainText);
                     break;
-                case EVENT_CHECK_UPADTE_SUITE_URL:
+
+                case EVENT_CHECK_UPDATE_SUITE_URL:
                     log.info("验证更新回调URL有效性: " + plainText);
                     break;
+
                 case EVENT_SUITE_TICKET:
                     // suite_ticket用于用签名形式生成accessToken(访问钉钉服务端的凭证),需要保存到应用的db。
                     // 钉钉会定期向本callback url推送suite_ticket新值用以提升安全性。
                     // 应用在获取到新的时值时,保存db成功后,返回给钉钉success加密串(如本demo的return)
                     log.info("应用suite_ticket数据推送: " + plainText);
                     break;
+
                 case EVENT_TMP_AUTH_CODE:
                     // 本事件应用应该异步进行授权开通企业的初始化,目的是尽最大努力快速返回给钉钉服务端。用以提升企业管理员开通应用体验
                     // 即使本接口没有收到数据或者收到事件后处理初始化失败都可以后续再用户试用应用时从前端获取到corpId并拉取授权企业信息,进而初始化开通及企业。
                     log.info("企业授权开通应用事件: " + plainText);
                     break;
+
+                case EVENT_SYNC_HTTP_PUSH_HIGH:
+                    log.info("高优先级数据:" + plainText);
+                    break;
+
+                case EVENT_SYNC_HTTP_PUSH_MEDIUM:
+                    log.info("普通优先级数据:" + plainText);
+                    break;
+
                 default:
                     // 其他类型事件处理
                     log.info("其他类型事件: " + plainText);
@@ -88,4 +114,17 @@ public class DingController {
         }
 
     }
+
+    @PostMapping(value = "/dingApi/getUserToken")
+    public LinkedHashMap<String, Object> getUserToken(@RequestBody GetUserTokenDto dto) {
+        GetCorpAccessTokenResponseBody corpAccessToken = DingUtil.getCorpAccessToken(dto.getCorpId());
+        OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userInfo = DingUtil.getUserInfo(corpAccessToken.getAccessToken(), dto.getCode());
+
+        LinkedHashMap<String, Object> map = new LinkedHashMap<>();
+        map.put("tokenInfo", corpAccessToken);
+        map.put("userInfo", userInfo);
+        return map;
+    }
+
+
 }

+ 14 - 0
hx-dingding/src/main/java/com/fjhx/entity/dto/GetUserTokenDto.java

@@ -0,0 +1,14 @@
+package com.fjhx.entity.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class GetUserTokenDto {
+
+    private String code;
+
+    private String corpId;
+
+}

+ 27 - 53
hx-dingding/src/main/java/com/fjhx/utils/DingUtil.java

@@ -1,17 +1,16 @@
 package com.fjhx.utils;
 
 import cn.hutool.core.util.StrUtil;
-import com.aliyun.dingtalkcontact_1_0.models.GetUserHeaders;
-import com.aliyun.dingtalkcontact_1_0.models.GetUserResponseBody;
-import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenRequest;
-import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenResponseBody;
+import com.aliyun.dingtalkoauth2_1_0.Client;
+import com.aliyun.dingtalkoauth2_1_0.models.GetCorpAccessTokenRequest;
+import com.aliyun.dingtalkoauth2_1_0.models.GetCorpAccessTokenResponseBody;
 import com.aliyun.tea.TeaException;
 import com.aliyun.teaopenapi.models.Config;
-import com.aliyun.teautil.models.RuntimeOptions;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.OapiV2UserGetuserinfoRequest;
 import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
+import com.fjhx.constant.Constant;
 import com.ruoyi.common.exception.ServiceException;
 import com.taobao.api.ApiException;
 import lombok.extern.slf4j.Slf4j;
@@ -23,37 +22,29 @@ import lombok.extern.slf4j.Slf4j;
  * <p>
  * <a href="https://open.dingtalk.com/document/isvapp/basic-concepts"> 基础概念 </a>
  * <a href="https://open.dingtalk.com/document/isvapp/api-overview"> 钉钉api总览 </a>
- * <a href="https://open.dingtalk.com/document/isvapp/obtain-identity-credentials"> 获取登录用户的访问凭证 </a>
+ * <a href="https://open.dingtalk.com/document/isvapp/third-party-enterprise-application-logon-free"> 免登流程 </a>
  * </p>
  */
 
 @Slf4j
 public class DingUtil {
 
-    public static void main(String[] args) {
-        GetUserTokenResponseBody userToken = DingUtil.getUserToken("9688f43aebe531238c9398fa5004c7a7");
-        String accessToken = userToken.getAccessToken();
-    }
-
-    private static final String SUITE_KEY = "suite8j0xog63udtsaq7g";
-    private static final String SUITE_SECRET = "NdbWhD6Iu9n5h-3IKXeepmPwmcFbOw9Em7UeiJKyq3_Wa8LgmJ-G6b8SmsOJMrMc";
-
     /**
-     * 获取用户token
-     *
-     * <p>
-     * https://open.dingtalk.com/document/isvapp/obtain-user-token
+     * 获取第三方应用授权企业的accessToken
+     * https://open.dingtalk.com/document/isvapp/obtain-the-access_token-of-the-authorized-enterprise
      */
-    public static GetUserTokenResponseBody getUserToken(String code) {
-        GetUserTokenRequest getUserTokenRequest = new GetUserTokenRequest()
-                .setClientId(SUITE_KEY)
-                .setClientSecret(SUITE_SECRET)
-                .setCode(code)
-                .setGrantType("authorization_code");
+    public static GetCorpAccessTokenResponseBody getCorpAccessToken(String corpId) {
+
+        GetCorpAccessTokenRequest getCorpAccessTokenRequest = new GetCorpAccessTokenRequest()
+                .setSuiteKey(Constant.SUITE_KEY)
+                .setSuiteSecret(Constant.SUITE_SECRET)
+                .setAuthCorpId(corpId)
+                .setSuiteTicket("Kn3hJvJR34e8rUEob0W7nqxK2YHqobAyPsuIQXYR35SsJMp6rE5XQBz9nwXTrJRZaVmXc4z9KjYkzXdkUdS8O3");
 
         try {
-            com.aliyun.dingtalkoauth2_1_0.Client client = getClient2();
-            return client.getUserToken(getUserTokenRequest).getBody();
+            Client client = getClient2();
+            GetCorpAccessTokenResponseBody corpAccessToken = client.getCorpAccessToken(getCorpAccessTokenRequest).getBody();
+            return corpAccessToken;
         } catch (Exception e) {
 
             TeaException teaException;
@@ -74,44 +65,27 @@ public class DingUtil {
                 log.error("钉钉授权认证失败", teaException);
                 throw new ServiceException("发生未知异常,钉钉授权认证失败");
             }
+
         }
     }
 
     /**
-     * 获取用户信息
-     *
-     * <p>
+     * 通过免登码获取用户信息
      * https://open.dingtalk.com/document/isvapp/obtain-the-userid-of-a-user-by-using-the-log-free
      */
-    public static OapiV2UserGetuserinfoResponse.UserGetByCodeResponse getUserInfo(String code, String accessToken) {
-        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
-        OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
-        req.setCode(code);
-
+    public static OapiV2UserGetuserinfoResponse.UserGetByCodeResponse getUserInfo(String corpAccessToken, String code) {
         try {
-            OapiV2UserGetuserinfoResponse rsp = client.execute(req, accessToken);
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
+            OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
+            req.setCode(code);
+            OapiV2UserGetuserinfoResponse rsp = client.execute(req, corpAccessToken);
             return rsp.getResult();
         } catch (ApiException e) {
-            String message = "钉钉获取用户信息失败: code:" + e.getErrCode() + ",message:" + e.getErrMsg();
-            log.error(message);
-            throw new ServiceException(message);
+            log.error("通过免登码获取用户信息失败");
+            throw new ServiceException("通过免登码获取用户信息失败");
         }
     }
 
-    /**
-     * 获取用户个人信息
-     *
-     * <p>
-     * https://open.dingtalk.com/document/isvapp/tutorial-enabling-login-to-third-party-websites
-     */
-    public GetUserResponseBody getUserinfo(String accessToken) throws Exception {
-        com.aliyun.dingtalkcontact_1_0.Client client = getClient1();
-        GetUserHeaders getUserHeaders = new GetUserHeaders();
-        getUserHeaders.setXAcsDingtalkAccessToken(accessToken);
-
-        // 获取用户个人信息,如需获取当前授权人的信息,unionId参数必须传me
-        return client.getUserWithOptions("me", getUserHeaders, new RuntimeOptions()).getBody();
-    }
 
     private static com.aliyun.dingtalkcontact_1_0.Client getClient1() throws Exception {
         Config config = new Config();
@@ -120,7 +94,7 @@ public class DingUtil {
         return new com.aliyun.dingtalkcontact_1_0.Client(config);
     }
 
-    public static com.aliyun.dingtalkoauth2_1_0.Client getClient2() throws Exception {
+    private static com.aliyun.dingtalkoauth2_1_0.Client getClient2() throws Exception {
         Config config = new Config();
         config.protocol = "https";
         config.regionId = "central";

+ 5 - 1
hx-item/pom.xml

@@ -29,7 +29,11 @@
             <artifactId>easyexcel</artifactId>
             <version>2.2.11</version>
         </dependency>
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>hx-customer</artifactId>
+        </dependency>
 
     </dependencies>
 
-</project>
+</project>

+ 41 - 0
hx-item/src/main/java/com/fjhx/item/controller/product/ProductInfoController.java

@@ -58,6 +58,45 @@ public class ProductInfoController {
     }
 
     /**
+     * 客户产品库分页
+     */
+    @PostMapping("/getCustomerProductList")
+    public Page<ProductInfoVo> getCustomerProductList(@RequestBody ProductInfoSelectDto dto) {
+        return productInfoService.getCustomerProductList(dto);
+    }
+
+    /**
+     * 公司产品库分页
+     */
+    @PostMapping("/getConditionProductList")
+    public Page<ProductInfoVo> getConditionProductList(@RequestBody ProductInfoSelectDto dto) {
+        return productInfoService.getConditionProductList(dto);
+    }
+
+    /**
+     * 产品库新增 尔泓扩展
+     */
+    @PostMapping("/addByEhsd")
+    public void addByEhsd(@RequestBody ProductInfoDto productInfoDto) {
+        productInfoService.addByEhsd(productInfoDto);
+    }
+
+    /**
+     * 产品库编辑 尔泓扩展
+     */
+    @PostMapping("/editByEhsd")
+    public void editByEhsd(@RequestBody ProductInfoDto productInfoDto) {
+        productInfoService.editByEhsd(productInfoDto);
+    }
+    /**
+     * 产品库明细 尔泓扩展
+     */
+    @PostMapping("/detailByEhsd")
+    public ProductInfoVo detailByEhsd(@RequestBody BaseSelectDto dto) {
+        return productInfoService.detailByEhsd(dto.getId());
+    }
+
+    /**
      * 产品库明细
      */
     @PostMapping("/detail")
@@ -147,4 +186,6 @@ public class ProductInfoController {
         return productInfoService.productRanking(productInfoDto);
     }
 
+
+
 }

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

@@ -57,4 +57,9 @@ public class ProductInfoDto extends ProductInfo {
 
 
 
+    /**
+     * 图片列表
+     */
+    private List<ObsFile> imgList;
+
 }

+ 18 - 3
hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductInfoSelectDto.java

@@ -48,7 +48,7 @@ public class ProductInfoSelectDto extends BaseSelectDto {
     /**
      * 数量
      */
-    private  Integer count;
+    private Integer count;
 
     /**
      * 国家表ID
@@ -58,12 +58,27 @@ public class ProductInfoSelectDto extends BaseSelectDto {
     /**
      * 排序(10 销售量排序  20 销售额排序  30 采购量排序  40 采购额排序  50 生产总量排序)
      */
-    private  Integer sort;
+    private Integer sort;
 
     /**
      * 10 正序  20 倒序
      */
-    private  Integer orderBy;
+    private Integer orderBy;
+
+
+    /**
+     * 产品编号 ehsd
+     */
+    private String code;
+    /**
+     * 产品名称 ehsd
+     */
+    private String name;
+
+    /**
+     * 客户名称
+     */
+    private String customerName;
 
 
 }

+ 11 - 2
hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductInfo.java

@@ -69,13 +69,22 @@ public class ProductInfo extends BasePo {
      */
     private String remark;
 
-    /**维多利亚json*/
+    /**
+     * 维多利亚json
+     */
     private String victoriatouristJson;
 
-    /**产品spuid*/
+    /**
+     * 产品spuid
+     */
     private Long productSpuId;
 
     @TableField(exist = false)
     private Integer count;
 
+    /**
+     * 尔泓json
+     */
+    private String ehsdJson;
+
 }

+ 152 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductInfoEhsdJson.java

@@ -0,0 +1,152 @@
+package com.fjhx.item.entity.product.po;
+
+import com.fjhx.file.entity.ObsFile;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Getter
+@Setter
+public class ProductInfoEhsdJson {
+    /**
+     * 产品名称英文名
+     */
+    private String nameEnglish;
+    /**
+     * 销售指导价格
+     */
+    private BigDecimal price;
+    /**
+     * 产品成本价
+     */
+    private BigDecimal costPrice;
+    /**
+     * 材质英文
+     */
+    private String material;
+    /**
+     * 材质中文
+     */
+    private String materialChinese;
+    /**
+     * 产品型号 英文
+     */
+    private String productModelEn;
+    /**
+     * 产品尺寸 长
+     */
+    private String productLong;
+    /**
+     * 产品尺寸 宽
+     */
+    private String productWide;
+    /**
+     * 产品尺寸 高
+     */
+    private String productHigh;
+    /**
+     * 装箱尺寸 长
+     */
+    private String packagLong;
+    /**
+     * 装箱尺寸 宽
+     */
+    private String packagWide;
+    /**
+     * 装箱尺寸 高
+     */
+    private String packagHigh;
+    /**
+     * 内包装方式
+     */
+    private String innerPackMethod;
+    /**
+     * 外包装方式
+     */
+    private String outerPackMethod;
+    /**
+     * 净重(单位g)
+     */
+    private Double netWeight;
+
+    /**
+     * 毛重(单位g)
+     */
+    private Double grossWeight;
+
+    /**
+     * 海关编码
+     */
+    private String customsCode;
+    /**
+     * MOQ(最低订购量)
+     */
+    private Integer moq;
+    /**
+     * 销售单位
+     */
+    private String salesUnit;
+    /**
+     * 出入库单位
+     */
+    private String issueReceiptUnit;
+    /**
+     * 换算比例
+     */
+    private Double conversionScale;
+    /**
+     * 安全库存
+     */
+    private BigDecimal safetyStock;
+    /**
+     * 采购周期(单位:天)
+     */
+    private Integer procurementCycle;
+    /**
+     * 质检合格率
+     */
+    private BigDecimal qualityQualifiedRate;
+    /**
+     * (云仓)出入库规则:0、不启用;1、一物一码;2、一物一码&先入先出
+     */
+    private Integer firstInFirstOut;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 评估状态
+     */
+    private Integer assessStatus;
+    /**
+     * 产品分类英文名
+     */
+    private String categoryEnName;
+    /**
+     * 分类中文名
+     */
+    private String categoryCnName;
+    /**
+     * 客户id
+     */
+    private Long customerId;
+    /**
+     * 客户名称
+     */
+    private String customerName;
+    /**
+     * 图片列表
+     */
+    private List<ObsFile> imgList;
+    /**
+     * 附件列表
+     */
+    private List<ObsFile> attachmentList;
+
+    /**
+     * 产品类型 1公司产品 2客户产品
+     */
+    private String type;
+}

+ 5 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/vo/ProductInfoVo.java

@@ -46,4 +46,9 @@ public class ProductInfoVo extends ProductInfo {
      */
     private BigDecimal purchaseQuantity;
 
+    /**
+     * 创建人名称
+     */
+    private String createUserName;
+
 }

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

@@ -3,12 +3,11 @@ package com.fjhx.item.mapper.product;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.entity.product.vo.ProductInfoVo;
-import com.ruoyi.common.annotation.TenantIgnore;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.apache.ibatis.annotations.Param;
-import org.springframework.security.core.parameters.P;
 
 import java.util.List;
 
@@ -51,4 +50,8 @@ public interface ProductInfoMapper extends BaseMapper<ProductInfo> {
      * @param query
      */
     Page<ProductInfoVo> productRanking(@Param("page") Page<Object> page,@Param("ew") QueryWrapper<Object> query);
+    /**
+     * 客户产品库
+     */
+    Page<ProductInfoVo> getCustomerProductList(@Param("page") Page<Object> page, @Param("ew") IWrapper<ProductInfo> wrapper);
 }

+ 27 - 0
hx-item/src/main/java/com/fjhx/item/service/product/ProductInfoService.java

@@ -38,6 +38,16 @@ public interface ProductInfoService extends BaseService<ProductInfo> {
     Page<ProductInfoVo> getCombinationPage(ProductInfoSelectDto dto);
 
     /**
+     * 客户产品库 尔泓扩展
+     */
+    Page<ProductInfoVo> getCustomerProductList(ProductInfoSelectDto dto);
+
+    /**
+     * 公司产品库 尔泓扩展
+     */
+    Page<ProductInfoVo> getConditionProductList(ProductInfoSelectDto dto);
+
+    /**
      * 产品库明细
      */
     ProductInfoVo detail(Long id);
@@ -48,6 +58,21 @@ public interface ProductInfoService extends BaseService<ProductInfo> {
     void add(ProductInfoDto productInfoDto);
 
     /**
+     * 产品库新增 尔泓扩展
+     */
+    void addByEhsd(ProductInfoDto productInfoDto);
+
+    /**
+     * 产品库编辑 尔泓扩展
+     */
+    void editByEhsd(ProductInfoDto productInfoDto);
+
+    /**
+     * 产品库明细 尔泓扩展
+     */
+    ProductInfoVo detailByEhsd(Long id);
+
+    /**
      * 产品库新增 维多利亚
      */
     void addByWdly(ProductInfoDto productInfoDto);
@@ -110,4 +135,6 @@ public interface ProductInfoService extends BaseService<ProductInfo> {
      * @param productInfoDto
      */
     Page<ProductInfoVo> productRanking(ProductInfoSelectDto productInfoDto);
+
+
 }

+ 182 - 47
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java

@@ -6,17 +6,19 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.customer.entity.customer.po.Customer;
+import com.fjhx.customer.service.customer.CustomerService;
 import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.item.entity.product.dto.ProductInfoDto;
 import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
 import com.fjhx.item.entity.product.po.ProductClassify;
 import com.fjhx.item.entity.product.po.ProductInfo;
+import com.fjhx.item.entity.product.po.ProductInfoEhsdJson;
 import com.fjhx.item.entity.product.vo.ProductInfoVo;
 import com.fjhx.item.mapper.product.ProductInfoMapper;
 import com.fjhx.item.service.product.ProductClassifyService;
@@ -33,14 +35,12 @@ import com.ruoyi.common.utils.StringUtils;
 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 org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -61,6 +61,8 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
     private ProductClassifyService productClassifyService;
     @Autowired
     private ISysDeptService sysDeptService;
+    @Autowired
+    private CustomerService customerService;
 
     @Autowired
     private DictTenantDataService dictTenantDataService;
@@ -168,6 +170,84 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
     }
 
     @Override
+    public Page<ProductInfoVo> getCustomerProductList(ProductInfoSelectDto dto) {
+        IWrapper<ProductInfo> wrapper = getWrapper();
+        wrapper.eq("json_unquote(pi.ehsd_json -> '$.status')", 0);//状态 启用
+        wrapper.eq("json_unquote(pi.ehsd_json -> '$.assessStatus')", 3);//评估状态 具备
+//        wrapper.ne("json_unquote(pi.ehsd_json -> '$.customerId')", 0);//客户id不等于0
+        wrapper.eq("json_unquote(pi.ehsd_json -> '$.type')", 2);//客户产品
+        //根据产品名称/产品编号过滤
+        wrapper.like("pi", ProductInfo::getCode, dto.getCode());
+        if (ObjectUtil.isNotEmpty(dto.getName())) {
+            wrapper.and(q -> q.like("pi", ProductInfo::getName, dto.getName()))
+                    .or().like("json_unquote(pi.ehsd_json -> '$.englishName')", dto.getName());
+        }
+        //根据产品分类id过滤
+        wrapper.eq("pi", ProductInfo::getProductClassifyId, dto.getProductClassifyId());
+        //客户名称过滤
+        wrapper.like("c.name", dto.getCustomerName());
+
+        Page<ProductInfoVo> page = baseMapper.getCustomerProductList(dto.getPage(), wrapper);
+        List<ProductInfoVo> records = page.getRecords();
+        //赋值客户名称
+        List<Long> customerIds = new ArrayList<>();
+        for (ProductInfoVo record : records) {
+            ProductInfoEhsdJson productInfoEhsdJson = JSONObject.parseObject(record.getEhsdJson(), ProductInfoEhsdJson.class);
+            customerIds.add(productInfoEhsdJson.getCustomerId());
+        }
+        if (ObjectUtil.isNotEmpty(customerIds)) {
+            Map<Long, String> customerMap = customerService.mapKV(Customer::getId, Customer::getName, q -> q.in(Customer::getId, customerIds));
+            for (ProductInfoVo record : records) {
+                ProductInfoEhsdJson productInfoEhsdJson = JSONObject.parseObject(record.getEhsdJson(), ProductInfoEhsdJson.class);
+                String customerName = customerMap.get(productInfoEhsdJson.getCustomerId());
+                productInfoEhsdJson.setCustomerName(customerName);
+                record.setEhsdJson(JSONObject.toJSONString(productInfoEhsdJson));
+            }
+        }
+        //赋值创建人名称
+        UserUtil.assignmentNickName(page.getRecords(), ProductInfo::getCreateUser, ProductInfoVo::setCreateUserName);
+        return page;
+    }
+
+    @Override
+    public Page<ProductInfoVo> getConditionProductList(ProductInfoSelectDto dto) {
+        IWrapper<ProductInfo> wrapper = getWrapper();
+        wrapper.eq("json_unquote(pi.ehsd_json -> '$.status')", 0);//状态 启用
+        wrapper.eq("json_unquote(pi.ehsd_json -> '$.assessStatus')", 3);//评估状态 具备
+//        wrapper.eq("json_unquote(pi.ehsd_json -> '$.customerId')", 0);//客户id等于0
+        wrapper.eq("json_unquote(pi.ehsd_json -> '$.type')", 1);//公司产品
+        //根据产品名称/产品编号过滤
+        wrapper.like("pi", ProductInfo::getCode, dto.getCode());
+        if (ObjectUtil.isNotEmpty(dto.getName())) {
+            wrapper.and(q -> q.like("pi", ProductInfo::getName, dto.getName()))
+                    .or().like("json_unquote(pi.ehsd_json -> '$.englishName')", dto.getName());
+        }
+        //根据产品分类id过滤
+        wrapper.eq("pi", ProductInfo::getProductClassifyId, dto.getProductClassifyId());
+
+        Page<ProductInfoVo> page = baseMapper.getCustomerProductList(dto.getPage(), wrapper);
+        List<ProductInfoVo> records = page.getRecords();
+        //赋值客户名称
+        List<Long> customerIds = new ArrayList<>();
+        for (ProductInfoVo record : records) {
+            ProductInfoEhsdJson productInfoEhsdJson = JSONObject.parseObject(record.getEhsdJson(), ProductInfoEhsdJson.class);
+            customerIds.add(productInfoEhsdJson.getCustomerId());
+        }
+        if (ObjectUtil.isNotEmpty(customerIds)) {
+            Map<Long, String> customerMap = customerService.mapKV(Customer::getId, Customer::getName, q -> q.in(Customer::getId, customerIds));
+            for (ProductInfoVo record : records) {
+                ProductInfoEhsdJson productInfoEhsdJson = JSONObject.parseObject(record.getEhsdJson(), ProductInfoEhsdJson.class);
+                String customerName = customerMap.get(productInfoEhsdJson.getCustomerId());
+                productInfoEhsdJson.setCustomerName(customerName);
+                record.setEhsdJson(JSONObject.toJSONString(productInfoEhsdJson));
+            }
+        }
+        //赋值创建人名称
+        UserUtil.assignmentNickName(page.getRecords(), ProductInfo::getCreateUser, ProductInfoVo::setCreateUserName);
+        return page;
+    }
+
+    @Override
     public ProductInfoVo detail(Long id) {
         ProductInfo ProductInfo = this.getById(id);
         ProductInfoVo result = BeanUtil.toBean(ProductInfo, ProductInfoVo.class);
@@ -187,6 +267,57 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
 
     @DSTransactional
     @Override
+    public void addByEhsd(ProductInfoDto productInfoDto) {
+        //赋值初始状态
+        ProductInfoEhsdJson productInfoEhsdJson = JSONObject.parseObject(productInfoDto.getEhsdJson(), ProductInfoEhsdJson.class);
+        productInfoEhsdJson.setStatus(0);
+        productInfoEhsdJson.setAssessStatus(3);
+        if (ObjectUtil.isEmpty(productInfoEhsdJson.getCustomerId())) {
+            //如果客户id为空就赋值为0 公司产品
+            productInfoEhsdJson.setCustomerId(0l);
+        }
+        productInfoDto.setEhsdJson(JSONObject.toJSONString(productInfoEhsdJson));
+
+        // 赋值产品编号
+        productInfoDto.setCode(CodeEnum.PRODUCT.getCode());
+        // 排除名称重复
+        this.nameDuplication(ProductInfo::getName, productInfoDto.getName(), "产品名称重复");
+        this.save(productInfoDto);
+        //图片列表
+        ObsFileUtil.saveFile(productInfoDto.getImgList(), productInfoDto.getId(), 1);
+        //附件列表
+        ObsFileUtil.saveFile(productInfoDto.getFileList(), productInfoDto.getId(), 2);
+    }
+
+    @DSTransactional
+    @Override
+    public void editByEhsd(ProductInfoDto productInfoDto) {
+        // 禁止产品编号修改
+        productInfoDto.setCode(null);
+        // 排除名称重复
+        this.nameDuplication(ProductInfo::getName, productInfoDto.getName(), productInfoDto.getId(), "产品名称重复");
+        this.updateById(productInfoDto);
+        ObsFileUtil.editFile(productInfoDto.getImgList(), productInfoDto.getId(), 1);
+        ObsFileUtil.editFile(productInfoDto.getFileList(), productInfoDto.getId(), 2);
+    }
+
+    @Override
+    public ProductInfoVo detailByEhsd(Long id) {
+        ProductInfo ProductInfo = this.getById(id);
+        ProductInfoVo result = BeanUtil.toBean(ProductInfo, ProductInfoVo.class);
+
+        ProductInfoEhsdJson productInfoEhsdJson = JSONObject.parseObject(result.getEhsdJson(), ProductInfoEhsdJson.class);
+        //赋值客户名称
+        Customer customer = customerService.getById(productInfoEhsdJson.getCustomerId());
+        productInfoEhsdJson.setCustomerName(customer.getName());
+        result.setEhsdJson(JSONObject.toJSONString(productInfoEhsdJson));
+        //赋值创建人名称
+        UserUtil.assignmentNickName(Arrays.asList(result), ProductInfoVo::getCreateUser, ProductInfoVo::setCreateUserName);
+        return result;
+    }
+
+    @DSTransactional
+    @Override
     public void addByWdly(ProductInfoDto productInfoDto) {
         //处理维多利亚扩展
         String victoriatouristJson = productInfoDto.getVictoriatouristJson();
@@ -255,19 +386,20 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
 
     /**
      * 产品统计(数据看板-产品分析页面)
+     *
      * @param productInfoDto
      */
     @Override
     public Map<String, Object> productStatistics(ProductInfoDto productInfoDto) {
         if (ObjectUtil.isEmpty(productInfoDto) && ObjectUtil.isEmpty(productInfoDto.getBeginTime())
-                && StringUtils.isNotEmpty(productInfoDto.getEndTime())){
-            throw  new ServiceException("参数缺失:开始时间,结束时间不能为null");
+                && StringUtils.isNotEmpty(productInfoDto.getEndTime())) {
+            throw new ServiceException("参数缺失:开始时间,结束时间不能为null");
         }
         //存放产品统计数据
-        Map map  =new HashMap();
+        Map map = new HashMap();
 
         //存放产品类型数据
-        List<Map<String,Object>> typeList = new ArrayList<>();
+        List<Map<String, Object>> typeList = new ArrayList<>();
 
 
         QueryWrapper<ProductInfo> query = Wrappers.<ProductInfo>query();
@@ -275,10 +407,10 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         query.groupBy("type");
         //查询每个类型的总计
         List<ProductInfo> productInfos = baseMapper.selectList(query);
-        Map<String, List<ProductInfo>>  productInfoTotalMap= productInfos.stream().collect(Collectors.groupingBy(ProductInfo::getType));
+        Map<String, List<ProductInfo>> productInfoTotalMap = productInfos.stream().collect(Collectors.groupingBy(ProductInfo::getType));
 
-        query.ge("DATE_FORMAT(create_time,'%Y-%m-%d')",productInfoDto.getBeginTime());
-        query.le("DATE_FORMAT(create_time,'%Y-%m-%d')",productInfoDto.getEndTime());
+        query.ge("DATE_FORMAT(create_time,'%Y-%m-%d')", productInfoDto.getBeginTime());
+        query.le("DATE_FORMAT(create_time,'%Y-%m-%d')", productInfoDto.getEndTime());
         //查询每个类型的新增数量
         List<ProductInfo> productInfoList = baseMapper.selectList(query);
         Map<String, List<ProductInfo>> productInfoTypeMap = productInfoList.stream().collect(Collectors.groupingBy(ProductInfo::getType));
@@ -287,53 +419,54 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         //总计
         Integer total = productInfos.stream().map(ProductInfo::getCount).reduce(Integer::sum).orElse(0);
 
-        map.put("newTotal",newTotal);
-        map.put("total",total);
+        map.put("newTotal", newTotal);
+        map.put("total", total);
 
         //获取产品类型的字典数据
         DynamicDataSourceContextHolder.push(SourceConstant.BASE);
         List<DictTenantDataVo> dictTenantDataVoList = getDict("product_type");
         DynamicDataSourceContextHolder.poll();
 
-        if (ObjectUtil.isEmpty(dictTenantDataVoList)){
+        if (ObjectUtil.isEmpty(dictTenantDataVoList)) {
             return map;
         }
 
         for (DictTenantDataVo dictTenantDataVo : dictTenantDataVoList) {
             //存放每个类型的新增与总计
-            Map<String,Object> map1 = new HashMap<>();
+            Map<String, Object> map1 = new HashMap<>();
             //设置初使值
-            map1.put("type",dictTenantDataVo.getDictKey());
-            map1.put("typeNewTotal",0);
-            map1.put("typeTotal",0);
+            map1.put("type", dictTenantDataVo.getDictKey());
+            map1.put("typeNewTotal", 0);
+            map1.put("typeTotal", 0);
 
             //赋值新增的款数
             List<ProductInfo> productInfoNewList = productInfoTypeMap.get(dictTenantDataVo.getDictKey());
             if (ObjectUtil.isNotEmpty(productInfoNewList)) {
-                map1.put("typeNewTotal",productInfoNewList.get(0).getCount());
+                map1.put("typeNewTotal", productInfoNewList.get(0).getCount());
             }
 
             //赋值类型总计
             List<ProductInfo> productInfoTotalList = productInfoTotalMap.get(dictTenantDataVo.getDictKey());
-            if (ObjectUtil.isNotEmpty(productInfoTotalList)){
-                map1.put("typeTotal",productInfoTotalList.get(0).getCount());
+            if (ObjectUtil.isNotEmpty(productInfoTotalList)) {
+                map1.put("typeTotal", productInfoTotalList.get(0).getCount());
             }
             typeList.add(map1);
         }
-        map.put("typeList",typeList);
+        map.put("typeList", typeList);
 
         return map;
     }
 
     /**
      * 产品分布(数据看板-产品分析页面)
+     *
      * @param productInfoDto
      */
     @Override
     public List<ProductInfo> productDistribution(ProductInfoDto productInfoDto) {
         if (ObjectUtil.isEmpty(productInfoDto) && ObjectUtil.isEmpty(productInfoDto.getBeginTime())
-                && StringUtils.isNotEmpty(productInfoDto.getEndTime())){
-            throw  new ServiceException("参数缺失:开始时间,结束时间不能为null");
+                && StringUtils.isNotEmpty(productInfoDto.getEndTime())) {
+            throw new ServiceException("参数缺失:开始时间,结束时间不能为null");
         }
         QueryWrapper<ProductInfo> query = Wrappers.<ProductInfo>query();
         query.select("count(*) count,type");
@@ -345,39 +478,41 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
 
     /**
      * 产品类型排行(数据看板-产品分析页面)
+     *
      * @param productInfoDto
      */
     @Override
     public Page<ProductInfoVo> productTypeRanking(ProductInfoSelectDto productInfoDto) {
         QueryWrapper<Object> query = Wrappers.query();
-        query.ge("DATE_FORMAT(pc.create_time,'%Y-%m-%d')",productInfoDto.getBeginTime());
-        query.le("DATE_FORMAT(pc.create_time,'%Y-%m-%d')",productInfoDto.getEndTime());
-        query.eq(ObjectUtil.isNotEmpty(productInfoDto.getCountryId()),"bc.buy_country_id",productInfoDto.getCountryId());
-        sort(query,productInfoDto);
+        query.ge("DATE_FORMAT(pc.create_time,'%Y-%m-%d')", productInfoDto.getBeginTime());
+        query.le("DATE_FORMAT(pc.create_time,'%Y-%m-%d')", productInfoDto.getEndTime());
+        query.eq(ObjectUtil.isNotEmpty(productInfoDto.getCountryId()), "bc.buy_country_id", productInfoDto.getCountryId());
+        sort(query, productInfoDto);
         query.groupBy("pi.type");
-        Page<ProductInfoVo> productInfoVos = baseMapper.productTypeRanking(productInfoDto.getPage(),query);
+        Page<ProductInfoVo> productInfoVos = baseMapper.productTypeRanking(productInfoDto.getPage(), query);
         return productInfoVos;
     }
 
     /**
      * 产品排行(数据看板-产品分析页面)
+     *
      * @param productInfoDto
      */
     @Override
     public Page<ProductInfoVo> productRanking(ProductInfoSelectDto productInfoDto) {
         QueryWrapper<Object> query = Wrappers.query();
-        query.ge("DATE_FORMAT(pc.create_time,'%Y-%m-%d')",productInfoDto.getBeginTime());
-        query.le("DATE_FORMAT(pc.create_time,'%Y-%m-%d')",productInfoDto.getEndTime());
-        query.eq(ObjectUtil.isNotEmpty(productInfoDto.getCountryId()),"bc.buy_country_id",productInfoDto.getCountryId());
-        sort(query,productInfoDto);
+        query.ge("DATE_FORMAT(pc.create_time,'%Y-%m-%d')", productInfoDto.getBeginTime());
+        query.le("DATE_FORMAT(pc.create_time,'%Y-%m-%d')", productInfoDto.getEndTime());
+        query.eq(ObjectUtil.isNotEmpty(productInfoDto.getCountryId()), "bc.buy_country_id", productInfoDto.getCountryId());
+        sort(query, productInfoDto);
         query.groupBy("pi.name");
-        Page<ProductInfoVo> productInfoVos = baseMapper.productRanking(productInfoDto.getPage(),query);
+        Page<ProductInfoVo> productInfoVos = baseMapper.productRanking(productInfoDto.getPage(), query);
         return productInfoVos;
     }
 
 
     //根据字典编码获取字典的数据
-    private List<DictTenantDataVo> getDict(String code){
+    private List<DictTenantDataVo> getDict(String code) {
         DictTenantDataSelectDto dto = new DictTenantDataSelectDto();
         dto.setDictCode(code);
         List<DictTenantDataVo> dictTenantDataServiceList = dictTenantDataService.getList(dto);
@@ -385,17 +520,17 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
     }
 
     //排序(添加排序条件)
-    private void sort( QueryWrapper<Object> query,ProductInfoSelectDto productInfoDto){
-        if (productInfoDto.getOrderBy() ==10){//正序
-            query.orderByAsc(productInfoDto.getSort() ==10,"contractQuantity");
-            query.orderByAsc(productInfoDto.getSort() ==20,"contractAmount");
-            query.orderByAsc(productInfoDto.getSort() ==30,"purchaseQuantity");
-            query.orderByAsc(productInfoDto.getSort() ==40,"purchaseAmount");
-        }else if (productInfoDto.getOrderBy() == 20){//倒序
-            query.orderByDesc(productInfoDto.getSort() ==10,"contractQuantity");
-            query.orderByDesc(productInfoDto.getSort() ==20,"contractAmount");
-            query.orderByDesc(productInfoDto.getSort() ==30,"purchaseQuantity");
-            query.orderByDesc(productInfoDto.getSort() ==40,"purchaseAmount");
+    private void sort(QueryWrapper<Object> query, ProductInfoSelectDto productInfoDto) {
+        if (productInfoDto.getOrderBy() == 10) {//正序
+            query.orderByAsc(productInfoDto.getSort() == 10, "contractQuantity");
+            query.orderByAsc(productInfoDto.getSort() == 20, "contractAmount");
+            query.orderByAsc(productInfoDto.getSort() == 30, "purchaseQuantity");
+            query.orderByAsc(productInfoDto.getSort() == 40, "purchaseAmount");
+        } else if (productInfoDto.getOrderBy() == 20) {//倒序
+            query.orderByDesc(productInfoDto.getSort() == 10, "contractQuantity");
+            query.orderByDesc(productInfoDto.getSort() == 20, "contractAmount");
+            query.orderByDesc(productInfoDto.getSort() == 30, "purchaseQuantity");
+            query.orderByDesc(productInfoDto.getSort() == 40, "purchaseAmount");
         }
     }
 

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

@@ -82,4 +82,27 @@
                 left join bytesailing_purchase.purchase_detail pd on pi.id = pd.bussiness_id
             ${ew.customSqlSegment}
     </select>
+
+    <select id="getCustomerProductList" resultType="com.fjhx.item.entity.product.vo.ProductInfoVo">
+        SELECT pi.id,
+               pi.definition,
+               pi.product_classify_id,
+               pi.CODE,
+               pi.type,
+               pi.NAME,
+               pi.spec,
+               pi.unit,
+               pi.remark,
+               pi.custom_code,
+               pi.create_user,
+               pi.create_time,
+               pi.update_user,
+               pi.update_time,
+               pi.ehsd_json,
+               c.`name` customerName
+        FROM product_info pi
+                 LEFT JOIN product_classify pc ON pi.product_classify_id = pc.id
+                 LEFT JOIN bytesailing_customer.customer c ON json_unquote(pi.ehsd_json - > '$.customerId') = c.id
+            ${ew.customSqlSegment}
+    </select>
 </mapper>

File diff suppressed because it is too large
+ 0 - 0
hx-sale/src/main/java/com/fjhx/sale/a-json/DocumentsPdfApi.json


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

@@ -1,6 +1,8 @@
 package com.fjhx.sale.controller.contract;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
+import com.fjhx.item.entity.product.vo.ProductInfoVo;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
 import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
 import com.fjhx.sale.entity.contract.po.Contract;
@@ -12,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -19,7 +22,7 @@ import java.util.List;
  * 外销合同表 前端控制器
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-04-17
  */
 @RestController
@@ -93,4 +96,12 @@ public class ContractController {
         return contractService.getContractPdfInfo(dto.getId());
     }
 
+    /**
+     * 销售趋势(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    @PostMapping("/saleTrend")
+    public  List<Map<String, Object>> saleTrend(@RequestBody ProductInfoSelectDto productInfoDto) {
+        return contractService.saleTrend(productInfoDto);
+    }
 }

+ 2 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/Contract.java

@@ -246,4 +246,6 @@ public class Contract extends BasePo {
     @TableField(exist = false)
     private List<ContractProject> contractProjectList;
 
+
+
 }

+ 21 - 1
hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/ContractProduct.java

@@ -15,7 +15,7 @@ import lombok.Setter;
  * 外销合同-产品
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-04-17
  */
 @Getter
@@ -78,4 +78,24 @@ public class ContractProduct extends BasePo {
      */
     @TableField(exist = false)
     private List<ObsFile> fileList;
+
+
+    /**
+     * 时间
+     */
+    @TableField(exist = false)
+    private String time;
+
+    /**
+     * 月销售量
+     */
+    @TableField(exist = false)
+    private BigDecimal contractQuantity;
+
+
+    /**
+     * 月销售额
+     */
+    @TableField(exist = false)
+    private BigDecimal contractAmount;
 }

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

@@ -3,6 +3,8 @@ package com.fjhx.sale.service.contract;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.customer.entity.customer.dto.CustomerDto;
+import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
+import com.fjhx.item.entity.product.vo.ProductInfoVo;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
 import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
 import com.fjhx.sale.entity.contract.po.Contract;
@@ -12,6 +14,7 @@ import com.fjhx.sale.entity.sale.vo.SaleQuotationVo;
 import com.ruoyi.common.core.service.BaseService;
 
 import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -84,4 +87,10 @@ public interface ContractService extends BaseService<Contract> {
      * @return
      */
     List<SaleQuotationVo> contractStatistics(QueryWrapper<Object> query);
+
+    /**
+     * 销售趋势(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    List<Map<String, Object>> saleTrend(ProductInfoSelectDto productInfoDto);
 }

+ 49 - 4
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java

@@ -1,14 +1,17 @@
 package com.fjhx.sale.service.contract.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 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.account.controller.utils.DateUtils;
 import com.fjhx.area.utils.AreaUtil;
 import com.fjhx.common.entity.corporation.po.Corporation;
 import com.fjhx.common.entity.documentary.bo.DocumentaryData;
@@ -18,6 +21,8 @@ import com.fjhx.common.service.documentary.GetDocumentaryBusinessTemplate;
 import com.fjhx.customer.entity.customer.dto.CustomerDto;
 import com.fjhx.customer.entity.customer.po.Customer;
 import com.fjhx.customer.service.customer.CustomerService;
+import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
+import com.fjhx.item.entity.product.vo.ProductInfoVo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.sale.entity.contract.bo.ContractDocumentaryBo;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
@@ -47,10 +52,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.stream.Collectors;
@@ -231,6 +233,49 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
     }
 
     /**
+     * 销售趋势(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    @Override
+    public  List<Map<String, Object>> saleTrend(ProductInfoSelectDto productInfoDto) {
+        //存放每月的月度销售额与月度销售量的列表
+        List<Map<String, Object>> list = new ArrayList<>();
+
+        List<String> monthList = DateUtils.getMonthBetweenDate(productInfoDto.getBeginTime(),productInfoDto.getEndTime());
+        //查询月度销售额与月度销售量
+        QueryWrapper<ContractProduct> query = Wrappers.query();
+        String beginTime = DateUtil.format(productInfoDto.getBeginTime(), "yyyy-MM");
+        String endTime = DateUtil.format(productInfoDto.getEndTime(), "yyyy-MM");
+        query.ge("DATE_FORMAT(create_time,'%Y-%m')",beginTime);
+        query.le("DATE_FORMAT(create_time,'%Y-%m')",endTime);
+        query.select("DATE_FORMAT(create_time,'%Y-%m') time,ifnull(SUM(amount),0) contractAmount," +
+                "ifnull(SUM(quantity),0) contractQuantity");
+        query.groupBy("time");
+        List<ContractProduct> contractList = contractProductService.list(query);
+        Map<String, List<ContractProduct>> contractMap = contractList.stream().collect(Collectors.groupingBy(ContractProduct::getTime));
+
+        //给每月赋值月度销售额与月度销售量的值
+        for (String month : monthList) {
+            //存放每月的月度销售额与月度销售量的值
+            Map<String,Object> map = new HashMap<>();
+            //赋值初使值
+            map.put("month",month);
+            map.put("contractAmount",new BigDecimal(0));
+            map.put("contractQuantity",new BigDecimal(0));
+
+            //赋值
+            List<ContractProduct> contracts = contractMap.get(month);
+            if (ObjectUtil.isNotEmpty(contracts)){
+                map.put("contractAmount",contracts.get(0).getContractAmount());
+                map.put("contractQuantity",contracts.get(0).getContractQuantity());
+            }
+            list.add(map);
+        }
+
+        return list;
+    }
+
+    /**
      * 赋值外销合同信息
      *
      * @param contractPdfInfoVo param

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

@@ -55,6 +55,11 @@ 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/service/supplier/SupplierInfoService.java

@@ -33,6 +33,11 @@ public interface SupplierInfoService extends BaseService<SupplierInfo> {
     SupplierInfoVo detail(Long id);
 
     /**
+     * 供应商明细 维多利亚
+     */
+    SupplierInfoVo detailByWdly(Long id);
+
+    /**
      * 供应商新增
      */
     void add(SupplierInfoDto supplierInfoDto);

+ 13 - 0
hx-supply/src/main/java/com/fjhx/supply/service/supplier/impl/SupplierInfoServiceImpl.java

@@ -2,6 +2,7 @@ package com.fjhx.supply.service.supplier.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -99,6 +100,18 @@ 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(json.toJSONString());
+        return result;
+    }
+
     @DSTransactional
     @Override
     public void add(SupplierInfoDto supplierInfoDto) {

Some files were not shown because too many files changed in this diff