lmx 20 小时之前
父节点
当前提交
40fda32fb4
共有 100 个文件被更改,包括 13674 次插入0 次删除
  1. 304 0
      fs-common/src/main/java/com/fs/common/config/FSSysConfig.java
  2. 26 0
      fs-service/src/main/java/com/fs/pay/pay/config/PayConfig.java
  3. 12 0
      fs-service/src/main/java/com/fs/pay/pay/domain/CreateWxOrderResult.java
  4. 14 0
      fs-service/src/main/java/com/fs/pay/pay/domain/CreateZfbOrderResult.java
  5. 23 0
      fs-service/src/main/java/com/fs/pay/pay/domain/OrderCallback.java
  6. 23 0
      fs-service/src/main/java/com/fs/pay/pay/domain/OrderResult.java
  7. 11 0
      fs-service/src/main/java/com/fs/pay/pay/domain/QueryRefundListResult.java
  8. 18 0
      fs-service/src/main/java/com/fs/pay/pay/domain/QueryRefundResult.java
  9. 11 0
      fs-service/src/main/java/com/fs/pay/pay/domain/RefundList.java
  10. 13 0
      fs-service/src/main/java/com/fs/pay/pay/domain/RefundResult.java
  11. 24 0
      fs-service/src/main/java/com/fs/pay/pay/dto/OrderQueryDTO.java
  12. 24 0
      fs-service/src/main/java/com/fs/pay/pay/dto/RefundDTO.java
  13. 19 0
      fs-service/src/main/java/com/fs/pay/pay/dto/RefundOrderDTO.java
  14. 21 0
      fs-service/src/main/java/com/fs/pay/pay/dto/RefundOrderListDTO.java
  15. 39 0
      fs-service/src/main/java/com/fs/pay/pay/dto/WxJspayDTO.java
  16. 41 0
      fs-service/src/main/java/com/fs/pay/pay/dto/ZfbJspayDTO.java
  17. 50 0
      fs-service/src/main/java/com/fs/pay/pay/service/PayService.java
  18. 107 0
      fs-service/src/main/java/com/fs/pay/pay/service/impl/PayApiServiceImpl.java
  19. 83 0
      fs-service/src/main/java/com/fs/pay/pay/test.java
  20. 127 0
      fs-service/src/main/java/com/fs/pay/pay/util/PayUtil.java
  21. 19 0
      fs-service/src/main/java/com/fs/pay/service/IPayService.java
  22. 12 0
      fs-service/src/main/java/com/fs/pay/service/dto/CreatePayDTO.java
  23. 38 0
      fs-service/src/main/java/com/fs/pay/service/dto/OpenBusinessDTO.java
  24. 11 0
      fs-service/src/main/java/com/fs/pay/service/dto/OpenQueryDTO.java
  25. 15 0
      fs-service/src/main/java/com/fs/pay/service/dto/PayDTO.java
  26. 18 0
      fs-service/src/main/java/com/fs/pay/service/dto/PayNotifyDTO.java
  27. 11 0
      fs-service/src/main/java/com/fs/pay/service/dto/PayQueryDTO.java
  28. 11 0
      fs-service/src/main/java/com/fs/pay/service/dto/QueryFullBalanceDTO.java
  29. 14 0
      fs-service/src/main/java/com/fs/pay/service/dto/RefundDTO.java
  30. 15 0
      fs-service/src/main/java/com/fs/pay/service/dto/RefundNotifyDTO.java
  31. 16 0
      fs-service/src/main/java/com/fs/pay/service/dto/TradeOrder.java
  32. 11 0
      fs-service/src/main/java/com/fs/pay/service/dto/UploadDTO.java
  33. 368 0
      fs-service/src/main/java/com/fs/pay/service/impl/PayServiceImpl.java
  34. 26 0
      fs-service/src/main/java/com/fs/store/config/StoreConfig.java
  35. 121 0
      fs-service/src/main/java/com/fs/store/domain/FsExpressScrm.java
  36. 58 0
      fs-service/src/main/java/com/fs/store/domain/FsStoreCartScrm.java
  37. 129 0
      fs-service/src/main/java/com/fs/store/domain/FsStoreOrderItemScrm.java
  38. 263 0
      fs-service/src/main/java/com/fs/store/domain/FsStoreOrderScrm.java
  39. 97 0
      fs-service/src/main/java/com/fs/store/domain/FsStoreOrderStatusScrm.java
  40. 79 0
      fs-service/src/main/java/com/fs/store/domain/FsStoreProductAttrScrm.java
  41. 279 0
      fs-service/src/main/java/com/fs/store/domain/FsStoreProductAttrValueScrm.java
  42. 186 0
      fs-service/src/main/java/com/fs/store/domain/FsStoreProductScrm.java
  43. 663 0
      fs-service/src/main/java/com/fs/store/domain/FsUser.java
  44. 221 0
      fs-service/src/main/java/com/fs/store/domain/FsUserAddress.java
  45. 139 0
      fs-service/src/main/java/com/fs/store/domain/FsUserWatchCourseStatistics.java
  46. 77 0
      fs-service/src/main/java/com/fs/store/domain/FsUserWatchStatistics.java
  47. 137 0
      fs-service/src/main/java/com/fs/store/domain/FsWechatTemplate.java
  48. 43 0
      fs-service/src/main/java/com/fs/store/domain/Report.java
  49. 77 0
      fs-service/src/main/java/com/fs/store/dto/ExpressScrmInfoDTO.java
  50. 31 0
      fs-service/src/main/java/com/fs/store/dto/FsUserTransferParamDTO.java
  51. 16 0
      fs-service/src/main/java/com/fs/store/dto/ProductArrtScrmDTO.java
  52. 22 0
      fs-service/src/main/java/com/fs/store/dto/ProductAttrScrmCountDto.java
  53. 69 0
      fs-service/src/main/java/com/fs/store/mapper/FsExpressScrmMapper.java
  54. 96 0
      fs-service/src/main/java/com/fs/store/mapper/FsStoreCartScrmMapper.java
  55. 228 0
      fs-service/src/main/java/com/fs/store/mapper/FsStoreOrderItemScrmMapper.java
  56. 1035 0
      fs-service/src/main/java/com/fs/store/mapper/FsStoreOrderScrmMapper.java
  57. 62 0
      fs-service/src/main/java/com/fs/store/mapper/FsStoreOrderStatusScrmMapper.java
  58. 134 0
      fs-service/src/main/java/com/fs/store/mapper/FsStoreProductAttrValueScrmMapper.java
  59. 210 0
      fs-service/src/main/java/com/fs/store/mapper/FsStoreProductScrmMapper.java
  60. 72 0
      fs-service/src/main/java/com/fs/store/mapper/FsUserAddressMapper.java
  61. 320 0
      fs-service/src/main/java/com/fs/store/mapper/FsUserMapper.java
  62. 70 0
      fs-service/src/main/java/com/fs/store/mapper/FsWechatTemplateMapper.java
  63. 10 0
      fs-service/src/main/java/com/fs/store/param/ExpressScrmParam.java
  64. 18 0
      fs-service/src/main/java/com/fs/store/param/FsCustomerStoreOrderScrmListQueryParam.java
  65. 16 0
      fs-service/src/main/java/com/fs/store/param/FsMyStoreOrderScrmQueryParam.java
  66. 16 0
      fs-service/src/main/java/com/fs/store/param/FsProductAttrValueScrmParam.java
  67. 13 0
      fs-service/src/main/java/com/fs/store/param/FsStoreCartScrmCountParam.java
  68. 90 0
      fs-service/src/main/java/com/fs/store/param/FsStoreOrderScrmParam.java
  69. 26 0
      fs-service/src/main/java/com/fs/store/param/FsStoreOrderScrmStatisticsParam.java
  70. 18 0
      fs-service/src/main/java/com/fs/store/param/FsStoreProductAttrValueScrmQueryParam.java
  71. 150 0
      fs-service/src/main/java/com/fs/store/param/FsStoreProductScrmAddEditParam.java
  72. 31 0
      fs-service/src/main/java/com/fs/store/param/FsStoreProductScrmQueryParam.java
  73. 19 0
      fs-service/src/main/java/com/fs/store/param/FsStoreScrmStatisticsParam.java
  74. 17 0
      fs-service/src/main/java/com/fs/store/param/FsStoreTuiProductAttrValueScrmParam.java
  75. 13 0
      fs-service/src/main/java/com/fs/store/param/OrderScrmListParam.java
  76. 21 0
      fs-service/src/main/java/com/fs/store/param/ReportParam.java
  77. 26 0
      fs-service/src/main/java/com/fs/store/param/SelectCusListPageParam.java
  78. 84 0
      fs-service/src/main/java/com/fs/store/service/IFsExpressScrmService.java
  79. 73 0
      fs-service/src/main/java/com/fs/store/service/IFsStoreOrderItemScrmService.java
  80. 227 0
      fs-service/src/main/java/com/fs/store/service/IFsStoreOrderScrmService.java
  81. 64 0
      fs-service/src/main/java/com/fs/store/service/IFsStoreOrderStatusScrmService.java
  82. 113 0
      fs-service/src/main/java/com/fs/store/service/IFsStoreProductScrmService.java
  83. 266 0
      fs-service/src/main/java/com/fs/store/service/IFsUserService.java
  84. 68 0
      fs-service/src/main/java/com/fs/store/service/IFsWechatTemplateService.java
  85. 319 0
      fs-service/src/main/java/com/fs/store/service/impl/FsExpressScrmServiceImpl.java
  86. 117 0
      fs-service/src/main/java/com/fs/store/service/impl/FsStoreOrderItemScrmServiceImpl.java
  87. 2637 0
      fs-service/src/main/java/com/fs/store/service/impl/FsStoreOrderScrmServiceImpl.java
  88. 103 0
      fs-service/src/main/java/com/fs/store/service/impl/FsStoreOrderStatusScrmServiceImpl.java
  89. 775 0
      fs-service/src/main/java/com/fs/store/service/impl/FsStoreProductScrmServiceImpl.java
  90. 1141 0
      fs-service/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java
  91. 112 0
      fs-service/src/main/java/com/fs/store/service/impl/FsWechatTemplateServiceImpl.java
  92. 14 0
      fs-service/src/main/java/com/fs/store/vo/CompanyTuiMoneyStatisticsVO.java
  93. 12 0
      fs-service/src/main/java/com/fs/store/vo/DetailVO.java
  94. 14 0
      fs-service/src/main/java/com/fs/store/vo/ExpressScrmVO.java
  95. 43 0
      fs-service/src/main/java/com/fs/store/vo/FsCustomerStoreOrderScrmListQueryVO.java
  96. 51 0
      fs-service/src/main/java/com/fs/store/vo/FsMyStoreOrderScrmListQueryVO.java
  97. 239 0
      fs-service/src/main/java/com/fs/store/vo/FsPromotionOrderScrmVO.java
  98. 67 0
      fs-service/src/main/java/com/fs/store/vo/FsStoreCartScrmQueryVO.java
  99. 41 0
      fs-service/src/main/java/com/fs/store/vo/FsStoreCartScrmVO.java
  100. 101 0
      fs-service/src/main/java/com/fs/store/vo/FsStoreOrderItemScrmExportVO.java

+ 304 - 0
fs-common/src/main/java/com/fs/common/config/FSSysConfig.java

@@ -0,0 +1,304 @@
+package com.fs.common.config;
+
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 读取项目相关配置
+ *
+ */
+@Component
+@ConfigurationProperties(prefix = "fs-config")
+public class FSSysConfig
+{
+    //快递鸟
+    String kdnId;
+    String kdnKeyId;
+    String kdnUrl;
+    String kdnSubscribeUrl;
+    String kdnAddressUrl;
+    //腾讯云IM
+    Long sdkAppId;
+    String sdkAppKey;
+    //处方接口
+    String prescribeUrl;
+    String actId;
+    String appId;
+    String manuId;
+    String callbackUrl;
+    //erp接口
+//    Integer erpOpen;//是否开启ERP
+//    String erpAppKey;
+//    String erpSessionKey;
+//    String erpSecret;
+//    String erpUrl;
+//    String erpShopCode;//店铺CODE
+    //支付接口
+    Integer payOpen;//是否开启
+    String payPartnerId;
+    String payKey;
+    String payGateWayUrl;
+    String payNotifyUrl;
+    String refundNotifyUrl;
+    //金博erp
+//    private String kingbosan;//账套名称
+//    private String kingbosSecret;//金博密钥
+//    private String kingbosUrl;//金博地址
+//    private String corgid;//机构编码
+//    private String cwarehouseCode;
+//    private String cwarehouseName;
+
+
+
+    String commonApi;
+
+    public String getKdnId() {
+        return kdnId;
+    }
+
+    public void setKdnId(String kdnId) {
+        this.kdnId = kdnId;
+    }
+
+    public String getKdnKeyId() {
+        return kdnKeyId;
+    }
+
+    public void setKdnKeyId(String kdnKeyId) {
+        this.kdnKeyId = kdnKeyId;
+    }
+
+    public String getKdnUrl() {
+        return kdnUrl;
+    }
+
+    public void setKdnUrl(String kdnUrl) {
+        this.kdnUrl = kdnUrl;
+    }
+
+    public String getKdnSubscribeUrl() {
+        return kdnSubscribeUrl;
+    }
+
+    public void setKdnSubscribeUrl(String kdnSubscribeUrl) {
+        this.kdnSubscribeUrl = kdnSubscribeUrl;
+    }
+
+    public String getKdnAddressUrl() {
+        return kdnAddressUrl;
+    }
+
+    public void setKdnAddressUrl(String kdnAddressUrl) {
+        this.kdnAddressUrl = kdnAddressUrl;
+    }
+
+    public Long getSdkAppId() {
+        return sdkAppId;
+    }
+
+    public void setSdkAppId(Long sdkAppId) {
+        this.sdkAppId = sdkAppId;
+    }
+
+    public String getSdkAppKey() {
+        return sdkAppKey;
+    }
+
+    public void setSdkAppKey(String sdkAppKey) {
+        this.sdkAppKey = sdkAppKey;
+    }
+
+    public String getPrescribeUrl() {
+        return prescribeUrl;
+    }
+
+    public void setPrescribeUrl(String prescribeUrl) {
+        this.prescribeUrl = prescribeUrl;
+    }
+
+    public String getActId() {
+        return actId;
+    }
+
+    public void setActId(String actId) {
+        this.actId = actId;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getManuId() {
+        return manuId;
+    }
+
+    public void setManuId(String manuId) {
+        this.manuId = manuId;
+    }
+
+    public String getCallbackUrl() {
+        return callbackUrl;
+    }
+
+    public void setCallbackUrl(String callbackUrl) {
+        this.callbackUrl = callbackUrl;
+    }
+
+//    public Integer getErpOpen() {
+//        return erpOpen;
+//    }
+//
+//    public void setErpOpen(Integer erpOpen) {
+//        this.erpOpen = erpOpen;
+//    }
+//
+//    public String getErpAppKey() {
+//        return erpAppKey;
+//    }
+//
+//    public void setErpAppKey(String erpAppKey) {
+//        this.erpAppKey = erpAppKey;
+//    }
+//
+//    public String getErpSessionKey() {
+//        return erpSessionKey;
+//    }
+//
+//    public void setErpSessionKey(String erpSessionKey) {
+//        this.erpSessionKey = erpSessionKey;
+//    }
+//
+//    public String getErpSecret() {
+//        return erpSecret;
+//    }
+//
+//    public void setErpSecret(String erpSecret) {
+//        this.erpSecret = erpSecret;
+//    }
+//
+//    public String getErpUrl() {
+//        return erpUrl;
+//    }
+//
+//    public void setErpUrl(String erpUrl) {
+//        this.erpUrl = erpUrl;
+//    }
+//
+//    public String getErpShopCode() {
+//        return erpShopCode;
+//    }
+//
+//    public void setErpShopCode(String erpShopCode) {
+//        this.erpShopCode = erpShopCode;
+//    }
+
+    public Integer getPayOpen() {
+        return payOpen;
+    }
+
+    public void setPayOpen(Integer payOpen) {
+        this.payOpen = payOpen;
+    }
+
+    public String getPayPartnerId() {
+        return payPartnerId;
+    }
+
+    public void setPayPartnerId(String payPartnerId) {
+        this.payPartnerId = payPartnerId;
+    }
+
+    public String getPayKey() {
+        return payKey;
+    }
+
+    public void setPayKey(String payKey) {
+        this.payKey = payKey;
+    }
+
+    public String getPayGateWayUrl() {
+        return payGateWayUrl;
+    }
+
+    public void setPayGateWayUrl(String payGateWayUrl) {
+        this.payGateWayUrl = payGateWayUrl;
+    }
+
+    public String getPayNotifyUrl() {
+        return payNotifyUrl;
+    }
+
+    public void setPayNotifyUrl(String payNotifyUrl) {
+        this.payNotifyUrl = payNotifyUrl;
+    }
+
+    public String getRefundNotifyUrl() {
+        return refundNotifyUrl;
+    }
+
+    public void setRefundNotifyUrl(String refundNotifyUrl) {
+        this.refundNotifyUrl = refundNotifyUrl;
+    }
+
+//    public String getKingbosan() {
+//        return kingbosan;
+//    }
+//
+//    public void setKingbosan(String kingbosan) {
+//        this.kingbosan = kingbosan;
+//    }
+//
+//    public String getCorgid() {
+//        return corgid;
+//    }
+//
+//    public void setCorgid(String corgid) {
+//        this.corgid = corgid;
+//    }
+//
+//    public String getKingbosUrl() {
+//        return kingbosUrl;
+//    }
+//
+//    public void setKingbosUrl(String kingbosUrl) {
+//        this.kingbosUrl = kingbosUrl;
+//    }
+//
+//    public String getKingbosSecret() {
+//        return kingbosSecret;
+//    }
+//
+//    public void setKingbosSecret(String kingbosSecret) {
+//        this.kingbosSecret = kingbosSecret;
+//    }
+//
+//    public String getCwarehouseCode() {
+//        return cwarehouseCode;
+//    }
+//
+//    public void setCwarehouseCode(String cwarehouseCode) {
+//        this.cwarehouseCode = cwarehouseCode;
+//    }
+//
+//    public String getCwarehouseName() {
+//        return cwarehouseName;
+//    }
+//
+//    public void setCwarehouseName(String cwarehouseName) {
+//        this.cwarehouseName = cwarehouseName;
+//    }
+
+    public String getCommonApi() {
+        return commonApi;
+    }
+
+    public void setCommonApi(String commonApi) {
+        this.commonApi = commonApi;
+    }
+
+}

+ 26 - 0
fs-service/src/main/java/com/fs/pay/pay/config/PayConfig.java

@@ -0,0 +1,26 @@
+package com.fs.pay.pay.config;
+
+
+public interface PayConfig {
+    String url="https://tgpay.833006.net/";
+    String appId="wx45cf09091aead547";
+    String account  ="37519015371852";
+    String Key="86ab87aa9cf28f79f4e52cd33bb81647";
+    /*支付完成后回调地址*/
+    String notifyUrl="http://139.186.223.30:7016/app/pay/ybPayNotify";
+
+
+    /*微信支付*/
+    String wxJspayUrl = url+"tgPosp/services/payApi/wxJspay";
+    /*支付宝支付*/
+    String zfbUnifiedorderUrl =url+"tgPosp/services/payApi/unifiedorder";
+    /*支付订单查询*/
+    String orderQueryUrl =url+"/tgPosp/services/payApi/orderQuery";
+    /*退款*/
+    String refundUrl = url+"tgPosp/payApi/reverse/v2";
+    /*获取退款详情*/
+    String getRefundOrderUrl =url+"/tgPosp/payApi/queryRefund";
+    /*获取退款详情list*/
+    String getRefundOrderListUrl =url+"tgPosp/payApi/queryRefundList";
+
+}

+ 12 - 0
fs-service/src/main/java/com/fs/pay/pay/domain/CreateWxOrderResult.java

@@ -0,0 +1,12 @@
+package com.fs.pay.pay.domain;
+
+import lombok.Data;
+
+@Data
+public class CreateWxOrderResult {
+    private String status;         // 结果状态,100表示成功,101表示失败
+    private String message;        // 结果描述,返回内容
+    private String upOrderId;      // 交易订单号
+    private String pay_url;         // 支付跳转链接
+    private String pay_info;        // 原生js支付信息,JSON格式的字符串,作用于原生态js支付是的参数,如不需使用原生态js,请忽略
+}

+ 14 - 0
fs-service/src/main/java/com/fs/pay/pay/domain/CreateZfbOrderResult.java

@@ -0,0 +1,14 @@
+package com.fs.pay.pay.domain;
+
+import lombok.Data;
+
+@Data
+public class CreateZfbOrderResult {
+    private String status; // 状态码. 100: 成功, 101: 失败
+    private String message; // 结果描述
+    private String orderId; // 交易订单号
+    private String codeUrl; // 支付跳转链接. 直接跳转此链接可调起支付
+    private String account; // 账号
+    private String orderDesc; //订单说明
+    private String state; //Y	0:成功,1:失败,2:已撤销 4待支付 5:已退款申请成功6:已转入部分退款申请成功
+}

+ 23 - 0
fs-service/src/main/java/com/fs/pay/pay/domain/OrderCallback.java

@@ -0,0 +1,23 @@
+package com.fs.pay.pay.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class OrderCallback implements Serializable {
+    private String lowOrderId;           // 下游系统流水号,必须唯一
+    private String upOrderId;            // 交易订单号
+    private String account;              // 聚合支付账号
+    private String merchantId;           // 商户编号,商户在平台的商户号
+    private String payMoney;             // 支付金额,单位:元
+    private String channelID;            // 支付方式,WX表示微信,ZFB表示支付宝
+    private String state;                // 订单状态,0表示成功,1表示失败
+    private String orderDesc;            // 订单描述,失败状态时表示失败原因
+    private String payTime;              // 支付时间,格式为YYYY-MM-DD HH:mm:ss
+    private String openid;               // 订单描述,如果有openid返回则有值
+    private String attach;               // 附加信息
+    private String settlementChannel;    // 渠道编码,渠道专属编码
+    private String payoffType;           // 结算结果,返回为null
+
+}

+ 23 - 0
fs-service/src/main/java/com/fs/pay/pay/domain/OrderResult.java

@@ -0,0 +1,23 @@
+package com.fs.pay.pay.domain;
+
+import lombok.Data;
+
+@Data
+public class OrderResult {
+    private String channelOrderId; // 渠道订单号
+    private String upOrderId; // 交易订单号
+    private String payoffType; // 结算类型
+    private String payTime; // 支付时间
+    private String openid; // OpenID
+    private String settlementChannel; // 结算渠道
+    private String message; // 结果描述
+    private String lowOrderId; // 低频订单号
+    private String payMoney; // 支付金额
+    private String payType; // 支付类型
+    private String state; // 状态
+    private String account; // 账号
+    private String channelId; // 渠道ID
+    private String status; // 状态码
+    private String bankOrderId;
+    private String bankTrxId;
+}

+ 11 - 0
fs-service/src/main/java/com/fs/pay/pay/domain/QueryRefundListResult.java

@@ -0,0 +1,11 @@
+package com.fs.pay.pay.domain;
+
+import lombok.Data;
+
+@Data
+public class QueryRefundListResult {
+     String upOrderId;             // 交易订单号
+     String status;                // 结果,100:成功,101:失败
+     String message;               // 结果描述,错误信息描述
+     String refundOrderList;  // 退款订单列表
+}

+ 18 - 0
fs-service/src/main/java/com/fs/pay/pay/domain/QueryRefundResult.java

@@ -0,0 +1,18 @@
+package com.fs.pay.pay.domain;
+
+import lombok.Data;
+
+@Data
+public class QueryRefundResult {
+    private String refundNo;      // 系统退款订单号
+    private String orderId;       // 交易订单号
+    private String lowRefundNo;   // 商户退款订单号
+    private String refundState;   // 退款状态,"0":成功 "1":失败 "2":退款中
+    private String refundTime;    // 退款时间
+    private String refundMoney;   // 退款金额
+    private String remark;        // 备注
+    private String channelId;     // 通道ID
+    private String status;        // 结果,100:成功,101:失败
+    private String message;       // 结果描述,错误信息描述
+    private String state;         // 订单实际状态,0:成功,1:失败,2:已撤销,5:已退款申请成功,6:已转入部分退款申请成功
+}

+ 11 - 0
fs-service/src/main/java/com/fs/pay/pay/domain/RefundList.java

@@ -0,0 +1,11 @@
+package com.fs.pay.pay.domain;
+
+import lombok.Data;
+
+@Data
+public class RefundList {
+    Integer refundState;    // 退款状态,"0":成功 "1":失败 "2":退款中
+    String refundMoney;    // 退款金额
+    String lowRefundNo;    // 下游退款单号
+    String refundTime;     //退款时间
+}

+ 13 - 0
fs-service/src/main/java/com/fs/pay/pay/domain/RefundResult.java

@@ -0,0 +1,13 @@
+package com.fs.pay.pay.domain;
+
+import lombok.Data;
+
+@Data
+public class RefundResult {
+    private String status; // 结果
+    private String message; // 结果描述
+    private String account; // 聚合支付账号
+    private String upOrderId; // 交易订单号
+    private String lowRefundNo; // 下游订单号
+    private String state; // 0:成功,1:失败,2:已撤销 5:已退款申请成功 6:已转入部分退款申请成功
+}

+ 24 - 0
fs-service/src/main/java/com/fs/pay/pay/dto/OrderQueryDTO.java

@@ -0,0 +1,24 @@
+package com.fs.pay.pay.dto;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class OrderQueryDTO {
+    private String account;         //聚合支付账号
+    private String lowOrderId;      //下游订单号,与交易订单号二选一
+    private String upOrderId;       //交易订单号,与下游订单号二选一
+    private String isNeedUpInfo;
+
+
+    public Map<String, String> toMap() {
+        Map<String, String> params = new HashMap<>();
+        params.put("account", account);
+        params.put("lowOrderId", lowOrderId);
+        params.put("upOrderId", upOrderId);
+        params.put("isNeedUpInfo", isNeedUpInfo);
+        return params;
+    }
+}

+ 24 - 0
fs-service/src/main/java/com/fs/pay/pay/dto/RefundDTO.java

@@ -0,0 +1,24 @@
+package com.fs.pay.pay.dto;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class RefundDTO {
+    private String lowRefundNo; // 商户退款订单号
+    private String account;     //聚合支付账号
+    private String upOrderId;   //交易订单号
+    private String refundMoney; //退款金额
+
+
+    public Map<String, String> toMap() {
+        Map<String, String> map = new HashMap<>();
+        map.put("lowRefundNo", this.lowRefundNo);
+        map.put("account", this.account);
+        map.put("upOrderId", this.upOrderId);
+        map.put("refundMoney", this.refundMoney);
+        return map;
+    }
+}

+ 19 - 0
fs-service/src/main/java/com/fs/pay/pay/dto/RefundOrderDTO.java

@@ -0,0 +1,19 @@
+package com.fs.pay.pay.dto;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class RefundOrderDTO {
+    private String refundNo;
+    private String account;
+
+    public Map<String, String> toMap() {
+        Map<String, String> map = new HashMap<>();
+        map.put("refundNo", this.refundNo);
+        map.put("account", this.account);
+        return map;
+    }
+}

+ 21 - 0
fs-service/src/main/java/com/fs/pay/pay/dto/RefundOrderListDTO.java

@@ -0,0 +1,21 @@
+package com.fs.pay.pay.dto;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class RefundOrderListDTO {
+    private String account;  //账号
+    private String upOrderId;
+
+
+    public Map<String, String> toMap() {
+        Map<String, String> map = new HashMap<>();
+        map.put("account", this.account);
+        map.put("upOrderId", this.upOrderId);
+        return map;
+    }
+}
+

+ 39 - 0
fs-service/src/main/java/com/fs/pay/pay/dto/WxJspayDTO.java

@@ -0,0 +1,39 @@
+package com.fs.pay.pay.dto;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class WxJspayDTO {
+    private String account;         // 聚合支付账号
+    private String payMoney;        // 支付金额
+    private String lowOrderId;      // 下游订单号
+    private String body;            // 商品描述
+    private String isMinipg;        // 是否小程序
+    private String sign;            // 签名
+    private String notifyUrl;       // 回调通知地址
+    private String returnUrl;       // 交易完成后跳转的URL
+    private String openId;          // 微信用户在公众号的唯一标识
+    private String appId;           // 公众号AppID
+    private String attach;          // 附加信息
+    private String storeid;         //门店号
+
+
+    public Map<String, String> toMap() {
+        Map<String, String> params = new HashMap<>();
+        params.put("account", account);
+        params.put("payMoney", payMoney);
+        params.put("lowOrderId", lowOrderId);
+        params.put("body", body);
+        params.put("isMinipg", isMinipg);
+        params.put("notifyUrl", notifyUrl);
+        params.put("returnUrl", returnUrl);
+        params.put("openId", openId);
+        params.put("appId", appId);
+        params.put("attach", attach);
+        params.put("storeid", storeid);
+        return params;
+    }
+}

+ 41 - 0
fs-service/src/main/java/com/fs/pay/pay/dto/ZfbJspayDTO.java

@@ -0,0 +1,41 @@
+package com.fs.pay.pay.dto;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class ZfbJspayDTO {
+    /**
+     * 聚合支付账号
+     */
+    private String account;
+    /**
+     * 支付金额(单位:元)
+     */
+    private String payMoney;
+    /**
+     * 下游订单号
+     */
+    private String lowOrderId;
+    /**
+     * 商品描述
+     */
+    private String body;
+
+    private String notifyUrl;  //回调通知地址(必须是外网可以访问的地址,接收支付结果通知)
+
+    private String payType;  //0:微信,1:支付宝,4:银联,H:数字货币
+
+    public Map<String, String> toMap() {
+        Map<String, String> orderMap = new HashMap<>();
+        orderMap.put("lowOrderId", this.lowOrderId);
+        orderMap.put("payMoney", this.payMoney);
+        orderMap.put("account", this.account);
+        orderMap.put("body", this.body);
+        orderMap.put("notifyUrl", this.notifyUrl);
+        orderMap.put("payType", this.payType);
+        return orderMap;
+    }
+}

+ 50 - 0
fs-service/src/main/java/com/fs/pay/pay/service/PayService.java

@@ -0,0 +1,50 @@
+package com.fs.pay.pay.service;
+
+
+import com.fs.pay.pay.domain.*;
+import com.fs.pay.pay.dto.*;
+
+public interface PayService {
+    /**
+     * 创建微信订单
+     * @param wxJspayDTO 微信订单DTO
+     * @return 创建微信订单的结果
+     */
+    CreateWxOrderResult createWxOrder(WxJspayDTO wxJspayDTO);
+
+    /**
+     * 获取订单信息
+     * @param orderQueryDTO 订单查询DTO
+     * @return 订单查询结果
+     */
+    OrderResult getOrder(OrderQueryDTO orderQueryDTO);
+
+
+    /**
+     * 退款
+     * @param refundDTO 退款DTO
+     * @return 退款结果
+     */
+    RefundResult refund(RefundDTO refundDTO);
+
+    /**
+     * 获取退款订单信息
+     * @param refundOrderDTO 退款订单查询DTO
+     * @return 退款订单查询结果
+     */
+    QueryRefundResult getRefundOrder(RefundOrderDTO refundOrderDTO);
+    /**
+     * 创建支付宝订单
+     * @param zfbJspayDTO 支付宝订单DTO
+     * @return 创建支付宝订单的结果
+     */
+    CreateZfbOrderResult createZfbOrder(ZfbJspayDTO zfbJspayDTO);
+
+    /**
+     * 获取退款信息列表
+     * @param refundOrderListDTO 退款订单列表查询DTO
+     * @return 退款订单列表查询结果
+     */
+    QueryRefundListResult getRefundOrderList(RefundOrderListDTO refundOrderListDTO);
+}
+

+ 107 - 0
fs-service/src/main/java/com/fs/pay/pay/service/impl/PayApiServiceImpl.java

@@ -0,0 +1,107 @@
+package com.fs.pay.pay.service.impl;
+
+
+import com.fs.pay.pay.config.PayConfig;
+import com.fs.pay.pay.domain.*;
+import com.fs.pay.pay.dto.*;
+import com.fs.pay.pay.service.PayService;
+import org.json.JSONObject;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+import static com.fs.pay.pay.util.PayUtil.*;
+
+
+@Service
+public class PayApiServiceImpl implements PayService {
+
+    @Override
+    public CreateWxOrderResult createWxOrder(WxJspayDTO wxJspayDTO) {
+        wxJspayDTO.setAccount(PayConfig.account);
+        wxJspayDTO.setAppId(PayConfig.appId);
+        wxJspayDTO.setNotifyUrl(PayConfig.notifyUrl);
+        Map<String, String> map = wxJspayDTO.toMap();
+        String responseStr = endPayHttp(PayConfig.wxJspayUrl, map);
+        if (isSgin(responseStr)){
+            //请求失败101 或者验签失败
+        }
+        CreateWxOrderResult result = GsonFromJson(responseStr, CreateWxOrderResult.class);
+        return result;
+
+
+    }
+    @Override
+    public CreateZfbOrderResult createZfbOrder(ZfbJspayDTO zfbJspayDTO) {
+        zfbJspayDTO.setAccount(PayConfig.account);
+        zfbJspayDTO.setNotifyUrl(PayConfig.notifyUrl);
+        Map<String, String> map = zfbJspayDTO.toMap();
+        String responseStr = endPayHttp(PayConfig.zfbUnifiedorderUrl, map);
+        if (isSgin(responseStr)){
+            //请求失败101 或者验签失败
+        }
+        CreateZfbOrderResult result = GsonFromJson(responseStr, CreateZfbOrderResult.class);
+        return result;
+    }
+    //获取订单信息
+    @Override
+    public OrderResult getOrder(OrderQueryDTO o) {
+        o.setIsNeedUpInfo("1");
+        o.setAccount(PayConfig.account);
+        Map<String, String> map = o.toMap();
+        String responseStr = endPayHttp(PayConfig.orderQueryUrl, map);
+            if (isSgin(responseStr)){
+                //请求失败101 或者验签失败
+            }
+        OrderResult orderResponse = GsonFromJson(responseStr, OrderResult.class);
+            if (orderResponse.getStatus().equals("100")){
+                if (orderResponse.getState().equals("0")|| orderResponse.getState().equals("5")||orderResponse.getState().equals("6")  ){
+                    String upInfo = new JSONObject(responseStr).getString("upInfo");
+                    orderResponse.setBankOrderId(new JSONObject(upInfo).getString("bankOrderId"));
+                    orderResponse.setBankTrxId(new JSONObject(upInfo).getString("bankTrxId"));
+                }
+            }
+
+        return orderResponse;
+    }
+
+    @Override
+    public RefundResult refund(RefundDTO refundDTO) {
+        refundDTO.setAccount(PayConfig.account);
+        Map<String, String> map = refundDTO.toMap();
+        String responseStr = endPayHttp(PayConfig.refundUrl, map);
+        if (isSgin(responseStr)){
+            //请求失败101 或者验签失败
+        }
+        RefundResult result = GsonFromJson(responseStr, RefundResult.class);
+        return result;
+    }
+
+    //获取退款订单信息
+    @Override
+    public QueryRefundResult getRefundOrder(RefundOrderDTO o) {
+        o.setAccount(PayConfig.account);
+        Map<String, String> map = o.toMap();
+        String responseStr = endPayHttp(PayConfig.getRefundOrderUrl, map);
+        if (isSgin(responseStr)){
+            //请求失败101 或者验签失败
+        }
+        QueryRefundResult queryRefundResult = GsonFromJson(responseStr, QueryRefundResult.class);
+        return queryRefundResult;
+    }
+    //获取退款信息list
+    @Override
+    public QueryRefundListResult getRefundOrderList(RefundOrderListDTO o) {
+        o.setAccount(PayConfig.account);
+        Map<String, String> map = o.toMap();
+        String responseStr = endPayHttp(PayConfig.getRefundOrderListUrl, map);
+
+        if (isSgin(responseStr)){
+            //请求失败101 或者验签失败
+        }
+        QueryRefundListResult queryRefundResult = GsonFromJson(responseStr, QueryRefundListResult.class);
+        return queryRefundResult;
+    }
+
+
+}

+ 83 - 0
fs-service/src/main/java/com/fs/pay/pay/test.java

@@ -0,0 +1,83 @@
+package com.fs.pay.pay;
+
+
+import com.alibaba.fastjson.JSON;
+import com.fs.pay.pay.domain.*;
+import com.fs.pay.pay.dto.*;
+import com.fs.pay.pay.service.impl.PayApiServiceImpl;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
+
+public class test {
+    public static void main(String[] args) {
+        //测试
+        aaaa();
+    }
+
+    public static void aaaa(){
+        String jsonString = "{\"timeStamp\":\"1729158192\",\"package\":\"prepay_id=wx171743128046349ef84a7e4c9c86eb0001\",\"paySign\":\"W0I6ErE3Pzgr12sl22pfueU9jfBytUw+wZ14DjG2/u5f/5Pr4A8E3k3ZRtxNm2MGkBeZol1CksbQLA2GtxRXofBpOP+BwQtyJI37OvCkuHyyx1u9xi8XZOIFZAFVI977ova4qj+idT1/YPOr5G1dO212Aii0Z6a7RfoqgBrjxnrcX9+Y7q/0hOPyzwL5UnbNRrGO7RJu/3/1l0eTLaVQMt2vzttUoM7qShyfOh48mI80mhsP0CEkdyFOVjM4HR3H6e8HH7T5YXGSnrvxXFmk8czBLX03yo5LDMTPshYg1W8ip9Ux5DCbuS/llZAskWRr65gnv60+kZS7kKax5UYbvw==\",\"appId\":\"wx5e2e1e55be6c6e6d\",\"signType\":\"RSA\",\"nonceStr\":\"GxKHzHP7dzMXSFKU13ek3fI2VQphdpBz\"}";
+
+        // 使用 Fastjson 解析字符串到 Map
+        WxPayMpOrderResult map = JSON.parseObject(jsonString, WxPayMpOrderResult.class);
+        // 输出Map中的内容
+        System.out.println(map);
+    }
+
+    //获取订单信息
+    public static void get(){
+        PayApiServiceImpl payService = new PayApiServiceImpl();
+        OrderQueryDTO o = new OrderQueryDTO();
+//        o.setLowOrderId("payment-1696809795736043520");
+        o.setUpOrderId("91759384058468634624");
+        OrderResult order = payService.getOrder(o);
+        System.out.println(order);
+    }
+
+
+    //查询退款
+    public static void getTui(){
+        PayApiServiceImpl payService = new PayApiServiceImpl();
+        RefundOrderDTO o = new RefundOrderDTO();
+        o.setRefundNo("refund-1759384058195869696");
+        QueryRefundResult refundOrder = payService.getRefundOrder(o);
+        System.out.println(refundOrder);
+    }
+    //查询退款列表
+    public static void getTuiList(){
+        PayApiServiceImpl payService = new PayApiServiceImpl();
+        RefundOrderListDTO o = new RefundOrderListDTO();
+        o.setUpOrderId("91702858656661639168");
+        QueryRefundListResult refundOrderList = payService.getRefundOrderList(o);
+        System.out.println(refundOrderList);
+    }
+
+    //退款
+    public static void tui(){
+        PayApiServiceImpl payService = new PayApiServiceImpl();
+        RefundDTO refundDTO = new RefundDTO();
+        refundDTO.setLowRefundNo("refund-1769963820127617024");
+        refundDTO.setUpOrderId("91769963820878532608");
+        refundDTO.setRefundMoney("0.1");
+        RefundResult refund = payService.refund(refundDTO);
+        System.out.println(refund);
+    }
+
+
+
+    //创建微信订单
+    public static void createWx(){
+        PayApiServiceImpl payService = new PayApiServiceImpl();
+        WxJspayDTO p = new WxJspayDTO();
+        // 使用setter方法为对象赋值
+        p.setPayMoney("0.01");
+        p.setLowOrderId("orderWx123456121");
+        p.setBody("商品描述");
+        p.setIsMinipg("1");
+        p.setReturnUrl("http://dp2xf5.natappfree.cc/his/pay/xcx");
+        p.setOpenId("oim255fXLTU65z1u_92YSw1LwfcA");
+        p.setAttach("附加信息");
+        p.setStoreid("0");
+        CreateWxOrderResult wxOrder = payService.createWxOrder(p);
+        System.out.println(wxOrder);
+    }
+
+}

+ 127 - 0
fs-service/src/main/java/com/fs/pay/pay/util/PayUtil.java

@@ -0,0 +1,127 @@
+package com.fs.pay.pay.util;
+
+import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.sign.Md5Utils;
+import com.fs.pay.pay.config.PayConfig;
+import com.google.gson.Gson;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+
+@SuppressWarnings("all")
+public class PayUtil {
+
+
+    public static String endPayHttp(String url , Map<String,String> map){
+        //获取sign
+        String sign = sign(map);
+        map.put("sign",sign);
+        Gson gson = new Gson();
+        String json = gson.toJson(map);
+        HttpPost httpPost = new HttpPost(url);
+        httpPost.setHeader("Content-Type", "application/json");
+        StringEntity requestEntity = new StringEntity(json, "UTF-8");
+        httpPost.setEntity(requestEntity);
+        return  sendHttp(httpPost);
+    }
+
+    public static String sendHttp( HttpPost httpPost){
+        String responseText=null;
+        // 创建HttpClient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        // 发送请求,获取响应
+        try {
+            CloseableHttpResponse response = httpClient.execute(httpPost);
+            // 获取响应实体
+            HttpEntity entity = response.getEntity();
+            if (entity != null) {
+                responseText = EntityUtils.toString(entity, "UTF-8");
+            }
+            // 关闭响应
+            response.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            // 关闭HttpClient
+            try {
+                httpClient.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return responseText;
+    }
+
+
+
+    public static String sign(Map<String, String> formData) {
+        String secretyKey= PayConfig.Key;
+        if (formData == null) {
+            throw new IllegalArgumentException("数据不能为空");
+        } else if (formData.isEmpty()) {
+            return null;
+        } else if (secretyKey == null) {
+            throw new IllegalArgumentException("安全校验码数据不能为空");
+        } else {
+            Map<String, String> sortedMap = new TreeMap(formData);
+            if (sortedMap.containsKey("sign")) {
+                sortedMap.remove("sign");
+            }
+
+            StringBuffer stringToSign = new StringBuffer();
+            if (sortedMap.size() > 0) {
+                Iterator var4 = sortedMap.entrySet().iterator();
+
+                while(var4.hasNext()) {
+                    Map.Entry<String, String> entry = (Map.Entry)var4.next();
+                    if (StringUtils.isNotBlank((CharSequence)entry.getValue()) && entry.getValue() != null) {
+                        stringToSign.append((String)entry.getKey()).append("=").append((String)entry.getValue()).append("&");
+                    }
+                }
+                stringToSign.deleteCharAt(stringToSign.length() - 1);
+            }
+            stringToSign.append("&key="+secretyKey);
+            String hash = Md5Utils.hash(stringToSign.toString());
+
+            String signature = Md5Utils.hash(stringToSign.toString());
+
+            return signature.toUpperCase();
+        }
+    }
+
+        public static <T> T GsonFromJson(String json, Class<T> classOfT) {
+            Gson gson = new Gson();
+
+            return gson.fromJson(json, classOfT);
+        }
+
+
+
+    public static boolean isSgin(String s){
+        Gson gson = new Gson();
+        // 使用Type引用来获取Map类型
+        Type type = new com.google.gson.reflect.TypeToken<Map<String, String>>(){}.getType();
+        // 将JSON字符串转换为Map对象
+        Map<String, String> map = gson.fromJson(s, type);
+        String status = map.get("status");
+        if (status.equals("101")){
+            return true;
+        }
+        String sign = PayUtil.sign(map);
+        String sg = map.get("sign");
+        if (sg.equals(sign)){
+            return false;
+        }
+        return true;
+    }
+}

+ 19 - 0
fs-service/src/main/java/com/fs/pay/service/IPayService.java

@@ -0,0 +1,19 @@
+package com.fs.pay.service;
+
+import com.fs.common.core.domain.R;
+import com.fs.pay.service.dto.*;
+
+import java.util.Map;
+
+public interface IPayService
+{
+    R upload(UploadDTO param);
+    R openBusiness(OpenBusinessDTO param);
+    R openQuery(OpenQueryDTO param);
+    R queryFullBalance(QueryFullBalanceDTO param);
+    void createOrder(CreatePayDTO createPayDTO);
+    Map<String,String> payOrder(PayDTO payDTO);
+    R queryPayOrder(PayQueryDTO payQueryDTO);
+    R refundOrder(RefundDTO refundDTO);
+}
+

+ 12 - 0
fs-service/src/main/java/com/fs/pay/service/dto/CreatePayDTO.java

@@ -0,0 +1,12 @@
+package com.fs.pay.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class CreatePayDTO implements Serializable {
+    String merchOrderNo;//原交易订单号
+    List<TradeOrder> orders;
+}

+ 38 - 0
fs-service/src/main/java/com/fs/pay/service/dto/OpenBusinessDTO.java

@@ -0,0 +1,38 @@
+package com.fs.pay.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class OpenBusinessDTO implements Serializable {
+    String outUserId;
+    String name;
+    String shortName;
+    String businessType="BUSINESS";
+    String licenseNo;
+    String licenseUrl;
+    String handLicenceUrl;
+    String legalName;
+    String legalLicenceType="ID_CARD";
+    String legalCertNo;
+    String legalLicenceFrontUrl;
+    String legalLicenceBackUrl;
+    String contactName;
+    String contactMobile;
+    String contactCertNo;
+    String contactEmail;
+    String industry;
+    String province;
+    String city;
+    String district;
+    String address;
+    String bankCode;
+    String bankCardNo;
+    String bankCardType;
+    String openAccountLicenceNo;
+    String openAccountLicenceUrl;
+    String servicePhone;
+
+
+}

+ 11 - 0
fs-service/src/main/java/com/fs/pay/service/dto/OpenQueryDTO.java

@@ -0,0 +1,11 @@
+package com.fs.pay.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class OpenQueryDTO implements Serializable {
+    String outUserId;
+
+}

+ 15 - 0
fs-service/src/main/java/com/fs/pay/service/dto/PayDTO.java

@@ -0,0 +1,15 @@
+package com.fs.pay.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class PayDTO implements Serializable {
+    String origMerchOrderNo;
+    String openID;
+    String appID;
+    String payerOutUserId;//商户系统唯一标识
+    String payerOutUserName;//商户名 订单记录展示
+    String userIp;
+}

+ 18 - 0
fs-service/src/main/java/com/fs/pay/service/dto/PayNotifyDTO.java

@@ -0,0 +1,18 @@
+package com.fs.pay.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class PayNotifyDTO implements Serializable {
+    String amount;
+    String resultCode;//EXECUTE_SUCCESS
+    String orderStatus;//SUCCESS
+    String merchOrderNo;
+    String context;
+    String tradeOrders;
+    String bankTransactionId;
+    String bankSerialNo;
+
+}

+ 11 - 0
fs-service/src/main/java/com/fs/pay/service/dto/PayQueryDTO.java

@@ -0,0 +1,11 @@
+package com.fs.pay.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class PayQueryDTO implements Serializable {
+    String origMerchOrderNo;
+
+}

+ 11 - 0
fs-service/src/main/java/com/fs/pay/service/dto/QueryFullBalanceDTO.java

@@ -0,0 +1,11 @@
+package com.fs.pay.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class QueryFullBalanceDTO implements Serializable {
+    String outUserId;
+
+}

+ 14 - 0
fs-service/src/main/java/com/fs/pay/service/dto/RefundDTO.java

@@ -0,0 +1,14 @@
+package com.fs.pay.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class RefundDTO implements Serializable {
+    String merchOrderNo;
+    String origMerchOrderNo;
+    String amount;
+    Long orderId;
+
+}

+ 15 - 0
fs-service/src/main/java/com/fs/pay/service/dto/RefundNotifyDTO.java

@@ -0,0 +1,15 @@
+package com.fs.pay.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class RefundNotifyDTO implements Serializable {
+    String origMerchOrderNo;
+    String orderStatus;
+    String amount;
+    String chargeAmount;
+    String memo;
+
+}

+ 16 - 0
fs-service/src/main/java/com/fs/pay/service/dto/TradeOrder.java

@@ -0,0 +1,16 @@
+package com.fs.pay.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TradeOrder implements Serializable {
+    String subMerchOrderNo;//单笔交易订单号
+    String tradeName;//交易名称
+    String payeeOutUserId;//收款方账号
+    String payeeUserName;//	收款方名称
+    String amount;//交易金额
+    String needProfit;//是否需要分润
+
+}

+ 11 - 0
fs-service/src/main/java/com/fs/pay/service/dto/UploadDTO.java

@@ -0,0 +1,11 @@
+package com.fs.pay.service.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class UploadDTO implements Serializable {
+    String fileName;
+    String data;
+}

+ 368 - 0
fs-service/src/main/java/com/fs/pay/service/impl/PayServiceImpl.java

@@ -0,0 +1,368 @@
+package com.fs.pay.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fs.common.config.FSSysConfig;
+import com.fs.common.core.domain.R;
+import com.fs.common.exception.CustomException;
+import com.fs.common.utils.StringUtils;
+import com.fs.pay.service.IPayService;
+import com.fs.pay.service.dto.*;
+import com.fs.store.service.IFsStoreOrderService;
+import com.hc.openapi.tool.HcClient;
+import com.hc.openapi.tool.HcGateway;
+import com.hc.openapi.tool.util.Ids;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Service
+public class PayServiceImpl implements IPayService {
+    Logger logger= LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    FSSysConfig sysConfig;
+    @Autowired
+    private IFsStoreOrderService orderService;
+
+    @Override
+    public R upload(UploadDTO param) {
+
+        Map<String,String> data = new HashMap<String,String>();
+        //组装公共请求参数
+        data.put("partnerId", sysConfig.getPayPartnerId());
+        data.put("requestNo", Ids.gid());
+        data.put("service", "accountpay.img.upload");
+        data.put("fileName",param.getFileName());
+        data.put("data",param.getData());
+        HcClient hcClient = HcGateway.getOpenApiClientService();
+        String responseStr = hcClient.doPost(sysConfig.getPayGateWayUrl(),data,sysConfig.getPayKey());
+        //验签
+        boolean isPass = hcClient.verificationSign(responseStr,sysConfig.getPayKey());
+        if(isPass) {
+            JSONObject responseObject = JSON.parseObject(responseStr);
+            if(StringUtils.equals((String)responseObject.get("resultCode"), "EXECUTE_SUCCESS")) {
+                return R.ok().put("url", responseObject.get("url"));
+            }else {
+            }
+        }else {
+            //TODO 验签不过,进行业务逻辑处理
+        }
+        return R.error(responseStr);
+    }
+
+    @Override
+    public R openBusiness(OpenBusinessDTO param) {
+        Map<String,String> data = new HashMap<String,String>();
+        //组装公共请求参数
+        data.put("partnerId", sysConfig.getPayPartnerId());
+        data.put("requestNo", Ids.gid());
+        data.put("service", "accountpay.open.business");
+        data.put("outUserId",param.getOutUserId());
+        data.put("name",param.getName());
+        data.put("shortName",param.getShortName());
+        data.put("businessType",param.getBusinessType());
+        data.put("licenseNo",param.getLicenseNo());
+        data.put("licenseUrl",param.getLicenseUrl());
+        data.put("handLicenceUrl",param.getHandLicenceUrl());
+        data.put("legalName",param.getLegalName());
+        data.put("legalLicenceType",param.getLegalLicenceType());
+        data.put("legalCertNo",param.getLegalCertNo());
+        data.put("legalLicenceFrontUrl",param.getLegalLicenceFrontUrl());
+        data.put("legalLicenceBackUrl",param.getLegalLicenceBackUrl());
+        data.put("contactName",param.getContactName());
+        data.put("contactMobile",param.getContactMobile());
+        data.put("contactCertNo",param.getContactCertNo());
+        data.put("contactEmail",param.getContactEmail());
+        data.put("industry",param.getIndustry());
+        data.put("province",param.getProvince());
+        data.put("city",param.getCity());
+        data.put("district",param.getDistrict());
+        data.put("address",param.getAddress());
+        data.put("bankCode",param.getBankCode());
+        data.put("bankCardNo",param.getBankCardNo());
+        data.put("bankCardType",param.getBankCardType());
+        data.put("openAccountLicenceNo",param.getOpenAccountLicenceNo());
+        data.put("openAccountLicenceUrl",param.getOpenAccountLicenceUrl());
+        data.put("servicePhone",param.getServicePhone());
+        HcClient hcClient = HcGateway.getOpenApiClientService();
+        String responseStr = hcClient.doPost(sysConfig.getPayGateWayUrl(),data,sysConfig.getPayKey());
+        //验签
+        boolean isPass = hcClient.verificationSign(responseStr,sysConfig.getPayKey());
+        if(isPass) {
+            JSONObject responseObject = JSON.parseObject(responseStr);
+            if(StringUtils.equals((String)responseObject.get("resultCode"), "EXECUTE_SUCCESS")) {
+                return R.ok().put("data",responseStr);
+            }else {
+            }
+        }else {
+            //TODO 验签不过,进行业务逻辑处理
+        }
+        return R.error(responseStr);
+    }
+
+    @Override
+    public R openQuery(OpenQueryDTO param) {
+        Map<String,String> data = new HashMap<String,String>();
+        //组装公共请求参数
+        data.put("partnerId", sysConfig.getPayPartnerId());
+        data.put("requestNo", Ids.gid());
+        data.put("service", "accountpay.open.query");
+        data.put("outUserId",param.getOutUserId());
+        HcClient hcClient = HcGateway.getOpenApiClientService();
+        String responseStr = hcClient.doPost(sysConfig.getPayGateWayUrl(),data,sysConfig.getPayKey());
+        //验签
+        boolean isPass = hcClient.verificationSign(responseStr,sysConfig.getPayKey());
+        if(isPass) {
+            JSONObject responseObject = JSON.parseObject(responseStr);
+            if(StringUtils.equals((String)responseObject.get("resultCode"), "EXECUTE_SUCCESS")) {
+                return R.ok().put("data",responseStr);
+            }else {
+            }
+        }else {
+            //TODO 验签不过,进行业务逻辑处理
+        }
+        return R.error(responseStr);
+    }
+
+    @Override
+    public R queryFullBalance(QueryFullBalanceDTO param) {
+        Map<String,String> data = new HashMap<String,String>();
+        //组装公共请求参数
+        data.put("partnerId", sysConfig.getPayPartnerId());
+        data.put("requestNo", Ids.gid());
+        data.put("service", "accountpay.queryFullBalance");
+        data.put("outUserId",param.getOutUserId());
+        HcClient hcClient = HcGateway.getOpenApiClientService();
+        String responseStr = hcClient.doPost(sysConfig.getPayGateWayUrl(),data,sysConfig.getPayKey());
+        //验签
+        boolean isPass = hcClient.verificationSign(responseStr,sysConfig.getPayKey());
+        if(isPass) {
+            JSONObject responseObject = JSON.parseObject(responseStr);
+            if(StringUtils.equals((String)responseObject.get("resultCode"), "EXECUTE_SUCCESS")) {
+                return R.ok().put("data",responseStr);
+            }else {
+            }
+        }else {
+            //TODO 验签不过,进行业务逻辑处理
+        }
+        return R.error(responseStr);
+    }
+
+    @Override
+    public void createOrder(CreatePayDTO createPayDTO) {
+
+        Map<String,String> data = new HashMap<String,String>();
+        //组装公共请求参数
+        data.put("partnerId", sysConfig.getPayPartnerId());
+        data.put("signType", "MD5");
+        data.put("returnUrl", "");
+        //异步通知地址
+        data.put("notifyUrl", sysConfig.getPayNotifyUrl());
+        //标识每次请求,每次请求必须唯一
+        // Snowflake snowflake1 = IdUtil.getSnowflake(2, 2);
+        // Long id = snowflake1.nextId();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        data.put("requestNo", Ids.gid());
+        data.put("context","");
+        data.put("service", "accountpay.order.create");
+        data.put("merchOrderNo",createPayDTO.getMerchOrderNo());
+        Calendar calendar = new GregorianCalendar();
+        calendar.setTime(new Date());
+        calendar.add(Calendar.MINUTE,30);
+        data.put("expiredTime",sdf.format(calendar.getTime()));
+        data.put("tradeOrders",JSONUtil.toJsonStr(createPayDTO.getOrders()));
+        HcClient hcClient = HcGateway.getOpenApiClientService();
+        Date startTime=new Date();
+
+        logger.info("开始时间:"+startTime.getTime());
+        String responseStr = hcClient.doPost(sysConfig.getPayGateWayUrl(),data,sysConfig.getPayKey());
+        Date endTime=new Date();
+        logger.info("结束时间:"+endTime.getTime());
+        logger.info("用时:"+(endTime.getTime()-startTime.getTime())/1000);
+        //验签
+        boolean isPass = hcClient.verificationSign(responseStr,sysConfig.getPayKey());
+        if(isPass) {
+            JSONObject responseObject = JSON.parseObject(responseStr);
+            //订单创建成功
+            if(StringUtils.equals((String)responseObject.get("resultCode"), "EXECUTE_SUCCESS")) {
+
+            }else {
+                //失败
+                new CustomException("订单创建失败"+responseStr);
+            }
+        }else {
+            //TODO 验签不过,进行业务逻辑处理
+            new CustomException("订单创建验签失败"+responseStr);
+        }
+        new CustomException("订单创建失败"+responseStr);
+    }
+
+    @Override
+    public Map<String,String> payOrder(PayDTO payDTO) {
+
+        Map<String,String> data = new HashMap<String,String>();
+        //组装公共请求参数
+        data.put("partnerId",  sysConfig.getPayPartnerId());
+        data.put("signType", "MD5");
+        data.put("returnUrl", "");
+        data.put("notifyUrl", sysConfig.getPayNotifyUrl());
+        data.put("requestNo", Ids.gid());
+        data.put("context", "");
+        data.put("service", "accountpay.pay");
+        data.put("merchOrderNo", payDTO.getOrigMerchOrderNo());
+        //原交易订单,创建订单时merchOrderNO
+        data.put("origMerchOrderNo", payDTO.getOrigMerchOrderNo());
+        //支付方式
+        data.put("payChannel", "wx_mini");
+        data.put("openID", payDTO.getOpenID());
+        data.put("appID", payDTO.getAppID());
+        data.put("payerOutUserId", payDTO.getPayerOutUserId());
+        data.put("payerOutUserName", payDTO.getPayerOutUserName());
+        data.put("userIp",payDTO.getUserIp());
+        Date startTime=new Date();
+        logger.info("开始时间:"+startTime.getTime());
+        //执行请求
+        HcClient hcClient = HcGateway.getOpenApiClientService();
+        String responseStr = hcClient.doPost(sysConfig.getPayGateWayUrl(),data,sysConfig.getPayKey());
+
+        Date endTime=new Date();
+        logger.info("结束时间:"+endTime.getTime());
+        logger.info("用时:"+(endTime.getTime()-startTime.getTime())/1000);
+        //验签
+        logger.info("payXYD:"+responseStr);
+        boolean isPass = hcClient.verificationSign(responseStr,sysConfig.getPayKey());
+        if(isPass) {
+            JSONObject responseObject = JSON.parseObject(responseStr);
+            //返回结果异常设置为处理中
+            if(responseObject.get("resultCode")==null || StringUtils.isEmpty((String)responseObject.get("resultCode"))){
+                //log.error("返回结果为空gid:{}",order.getGid());
+                Map<String,String> map=new HashMap<>();
+                map.put("code","500");
+                return map;
+            }
+            //执行成功,判断订单状态
+            if(StringUtils.equals((String)responseObject.get("resultCode"), "EXECUTE_SUCCESS")) {
+                String orderStats = (String)responseObject.get("orderStatus");
+                if(StringUtils.equals(orderStats, "SUCCESS") || StringUtils.equals(orderStats, "WAIT_CONFIRM") ) {
+                    //订单成功处理
+
+                }
+                Map<String,String> map=new HashMap<>();
+                map.put("code","500");
+                return map;
+            }else if(StringUtils.equals((String)responseObject.get("resultCode"), "EXECUTE_PROCESSING")) {
+                //处理中,获取主扫扫码返回的支付链接或者公众号小程序返回的JSON串
+                String payInfo = (String)responseObject.get("payInfo");
+                cn.hutool.json.JSONObject jsonObject=JSONUtil.parseObj(payInfo);
+                Map<String,String> map=new HashMap<>();
+                map.put("timeStamp",jsonObject.getStr("timeStamp"));
+                map.put("nonceStr",jsonObject.getStr("nonceStr"));
+                map.put("packageValue",jsonObject.getStr("package"));
+                map.put("signType",jsonObject.getStr("signType"));
+                map.put("paySign",jsonObject.getStr("paySign"));
+                return map;
+            }else {
+                //执行失败
+                Map<String,String> map=new HashMap<>();
+                map.put("code","500");
+                return map;
+            }
+        }else {
+            //TODO 验签不过,进行业务逻辑处理
+            Map<String,String> map=new HashMap<>();
+            map.put("code","500");
+            return map;
+        }
+    }
+
+    @Override
+    public R queryPayOrder(PayQueryDTO payQueryDTO) {
+        Map<String,String> data = new HashMap<String,String>();
+        //组装公共请求参数
+        data.put("partnerId", sysConfig.getPayPartnerId());
+        data.put("signType", "MD5");
+        data.put("requestNo", Ids.gid());
+        data.put("context","");
+        data.put("service", "accountpay.pay.query");
+        data.put("origMerchOrderNo",payQueryDTO.getOrigMerchOrderNo());
+        HcClient hcClient = HcGateway.getOpenApiClientService();
+        String responseStr = hcClient.doPost(sysConfig.getPayGateWayUrl(),data,sysConfig.getPayKey());
+        logger.info("queryOrder:"+responseStr);
+        //验签
+        boolean isPass = hcClient.verificationSign(responseStr,sysConfig.getPayKey());
+        if(isPass) {
+            JSONObject responseObject = JSON.parseObject(responseStr);
+            String code=responseObject.get("orderStatus").toString();
+            if(code!=null&&code.equals("PROCESSING")) {
+                return R.ok();
+            }
+            else if(code!=null&&code.equals("SUCCESS")) {
+                return R.error("此订单已支付");
+            }
+            else if(code!=null&&code.equals("INIT")) {
+                return R.ok();
+            }
+            else {
+                //可重新支付
+                return R.ok("订单已关闭或支付失败");
+            }
+        }else {
+            //TODO 验签不过,进行业务逻辑处理
+            return R.error("验签不过,进行业务逻辑处理");
+        }
+    }
+
+    @Override
+    public R refundOrder(RefundDTO refundDTO) {
+        Map<String,String> data = new HashMap<String,String>();
+        //组装公共请求参数
+        data.put("partnerId", sysConfig.getPayPartnerId());
+        data.put("signType", "MD5");
+        data.put("returnUrl", "");
+        //异步通知地址
+        data.put("notifyUrl", sysConfig.getRefundNotifyUrl());
+        //标识每次请求,每次请求必须唯一
+        // Snowflake snowflake1 = IdUtil.getSnowflake(2, 2);
+        // Long id = snowflake1.nextId();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        data.put("requestNo", Ids.gid());
+        data.put("context","");
+        data.put("service", "accountpay.refund");
+        data.put("merchOrderNo",refundDTO.getMerchOrderNo());
+        data.put("origMerchOrderNo",refundDTO.getOrigMerchOrderNo());
+        data.put("amount",refundDTO.getAmount());
+        HcClient hcClient = HcGateway.getOpenApiClientService();
+        String responseStr = hcClient.doPost(sysConfig.getPayGateWayUrl(),data,sysConfig.getPayKey());
+        logger.info("refund:"+responseStr);
+        logger.info("refundDTO:"+JSONUtil.toJsonStr(refundDTO));
+
+        //验签
+        boolean isPass = hcClient.verificationSign(responseStr,sysConfig.getPayKey());
+        if(isPass) {
+            JSONObject responseObject = JSON.parseObject(responseStr);
+            if(((Boolean)responseObject.get("success"))) {
+//                if(refundDTO.getOrderId()!=null){
+//                    orderService.refundOrder(refundDTO.getOrderId());
+//                }
+//                else{
+//                }
+                return R.ok("操作成功");
+            }else {
+                //失败
+                return R.error("操作失败:"+responseStr);
+            }
+        }else {
+            //TODO 验签不过,进行业务逻辑处理
+            return R.error("验签不过,进行业务逻辑处理");
+        }
+
+    }
+}

+ 26 - 0
fs-service/src/main/java/com/fs/store/config/StoreConfig.java

@@ -0,0 +1,26 @@
+package com.fs.store.config;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class StoreConfig implements Serializable {
+
+    private String hotSearch;//热门搜索
+    private String certs;//资质证书
+    private BigDecimal serviceFee;//服务费
+    private Integer salesPriceRate;//成本售价比例
+    private Integer payRate;//支付比例
+    private Integer payAmount;//货到付款自定义金额
+    private Integer unPayTime;//未支付订单自动取消时间
+    private Integer tuiMoneyRate;//公司佣金比例 支付金额-(订单金额*rate%)
+    private Integer createMoneyRate;//公司制单金额最低比例
+    private Integer storeAfterSalesDay;//已完成订单售后有效天数
+    private String refundConsignee;
+    private String refundPhoneNumber;
+    private String refundAddress;
+    private Integer auditSwitch; // 订单审核开关
+
+}

+ 121 - 0
fs-service/src/main/java/com/fs/store/domain/FsExpressScrm.java

@@ -0,0 +1,121 @@
+package com.fs.store.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 快递公司对象 fs_express
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+public class FsExpressScrm extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 快递公司id */
+    private Long id;
+
+    /** 快递公司简称 */
+    @Excel(name = "快递公司简称")
+    private String code;
+
+    /** 快递公司全称 */
+    @Excel(name = "快递公司全称")
+    private String name;
+
+    /** 排序 */
+    @Excel(name = "排序")
+    private Long sort;
+
+    /** 是否显示 */
+    @Excel(name = "是否显示")
+    private Integer isShow;
+
+    /** 是否删除 */
+    @Excel(name = "是否删除")
+    private Integer isDel;
+
+
+    @Excel(name = "OMS编号")
+    private String omsCode;
+
+    public String getOmsCode() {
+        return omsCode;
+    }
+
+    public void setOmsCode(String omsCode) {
+        this.omsCode = omsCode;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setCode(String code) 
+    {
+        this.code = code;
+    }
+
+    public String getCode() 
+    {
+        return code;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setSort(Long sort) 
+    {
+        this.sort = sort;
+    }
+
+    public Long getSort() 
+    {
+        return sort;
+    }
+    public void setIsShow(Integer isShow) 
+    {
+        this.isShow = isShow;
+    }
+
+    public Integer getIsShow() 
+    {
+        return isShow;
+    }
+    public void setIsDel(Integer isDel) 
+    {
+        this.isDel = isDel;
+    }
+
+    public Integer getIsDel() 
+    {
+        return isDel;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("code", getCode())
+            .append("name", getName())
+            .append("sort", getSort())
+            .append("isShow", getIsShow())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .append("isDel", getIsDel())
+            .toString();
+    }
+}

+ 58 - 0
fs-service/src/main/java/com/fs/store/domain/FsStoreCartScrm.java

@@ -0,0 +1,58 @@
+package com.fs.store.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.*;
+
+/**
+ * 购物车对象 fs_store_cart
+ * 
+ * @author fs
+ * @date 2022-03-21
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class FsStoreCartScrm extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 购物车表ID */
+    private Long id;
+
+    /** 用户ID */
+    @Excel(name = "用户ID")
+    private Long userId;
+
+    /** 类型 */
+    @Excel(name = "类型")
+    private String type;
+
+    /** 商品ID */
+    @Excel(name = "商品ID")
+    private Long productId;
+
+    /** $column.columnComment */
+    @Excel(name = "商品ID")
+    private Long productAttrValueId;
+
+    /** 商品数量 */
+    @Excel(name = "商品数量")
+    private Integer cartNum;
+
+    /** 0 = 未购买 1 = 已购买 */
+    @Excel(name = "0 = 未购买 1 = 已购买")
+    private Integer isPay;
+
+    /** 是否删除 */
+    @Excel(name = "是否删除")
+    private Integer isDel;
+
+    /** 是否为立即购买 */
+    @Excel(name = "是否为立即购买")
+    private Integer isBuy;
+
+
+}

+ 129 - 0
fs-service/src/main/java/com/fs/store/domain/FsStoreOrderItemScrm.java

@@ -0,0 +1,129 @@
+package com.fs.store.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+
+/**
+ * 订单详情对象 fs_store_order_item_scrm
+ * 
+ * @author fs
+ * @date 2022-03-21
+ */
+public class FsStoreOrderItemScrm extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    private Long itemId;
+
+    /** 订单id */
+    @Excel(name = "订单id")
+    private Long orderId;
+
+    /** 订单号 */
+    @Excel(name = "订单号")
+    private String orderCode;
+
+    /** 购物车id 减数量用 */
+    @Excel(name = "购物车id 减数量用")
+    private Long cartId;
+
+    /** 商品ID */
+    @Excel(name = "商品ID")
+    private Long productId;
+
+    @Excel(name = "商品ID")
+    private String jsonInfo;
+
+    @Excel(name = "商品ID")
+    private Integer num;
+
+    /** 是否能售后0不能1能 */
+    @Excel(name = "是否能售后0不能1能")
+    private Integer isAfterSales;
+
+    private Integer isPrescribe;
+
+    public Integer getIsPrescribe() {
+        return isPrescribe;
+    }
+
+    public void setIsPrescribe(Integer isPrescribe) {
+        this.isPrescribe = isPrescribe;
+    }
+
+    public void setItemId(Long itemId)
+    {
+        this.itemId = itemId;
+    }
+
+    public Long getItemId() 
+    {
+        return itemId;
+    }
+    public void setOrderId(Long orderId) 
+    {
+        this.orderId = orderId;
+    }
+
+    public Long getOrderId() 
+    {
+        return orderId;
+    }
+    public void setOrderCode(String orderCode) 
+    {
+        this.orderCode = orderCode;
+    }
+
+    public String getOrderCode() 
+    {
+        return orderCode;
+    }
+    public void setCartId(Long cartId) 
+    {
+        this.cartId = cartId;
+    }
+
+    public Long getCartId() 
+    {
+        return cartId;
+    }
+    public void setProductId(Long productId) 
+    {
+        this.productId = productId;
+    }
+
+    public Long getProductId() 
+    {
+        return productId;
+    }
+
+    public void setJsonInfo(String jsonInfo) 
+    {
+        this.jsonInfo = jsonInfo;
+    }
+
+    public String getJsonInfo() 
+    {
+        return jsonInfo;
+    }
+    public void setNum(Integer num)
+    {
+        this.num = num;
+    }
+
+    public Integer getNum()
+    {
+        return num;
+    }
+    public void setIsAfterSales(Integer isAfterSales) 
+    {
+        this.isAfterSales = isAfterSales;
+    }
+
+    public Integer getIsAfterSales() 
+    {
+        return isAfterSales;
+    }
+
+
+}

+ 263 - 0
fs-service/src/main/java/com/fs/store/domain/FsStoreOrderScrm.java

@@ -0,0 +1,263 @@
+package com.fs.store.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 订单对象 fs_store_order
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+@Data
+public class FsStoreOrderScrm extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 订单ID */
+    private Long id;
+
+    /** 订单号 */
+    @Excel(name = "订单号")
+    private String orderCode;
+
+    /** 额外订单号 */
+    private String extendOrderId;
+
+    private String payOrderId;
+
+    private String bankOrderId;
+
+    /** 用户id */
+    private Long userId;
+
+    /** 用户姓名 */
+    @Excel(name = "收货人")
+    private String realName;
+
+    /** 用户电话 */
+    @Excel(name = "手机号")
+    private String userPhone;
+
+    /** 详细地址 */
+    @Excel(name = "详细地址")
+    private String userAddress;
+
+    /** 购物车id */
+    private String cartId;
+
+    /** 运费金额 */
+    private BigDecimal freightPrice;
+
+    /** 订单商品总数 */
+    @Excel(name = "订单商品总数")
+    private Long totalNum;
+
+    /** 订单总价 */
+    @Excel(name = "订单总价")
+    private BigDecimal totalPrice;
+
+    /** 邮费 */
+    private BigDecimal totalPostage;
+
+    /** 实际支付金额 */
+    @Excel(name = "应付金额")
+    private BigDecimal payPrice;
+
+    /** 支付邮费 */
+    private BigDecimal payPostage;
+
+    @Excel(name = "物流代收金额")
+    private BigDecimal payDelivery;
+
+    @Excel(name = "支付金额")
+    private BigDecimal payMoney;
+
+    /** 抵扣金额 */
+    private BigDecimal deductionPrice;
+
+    /** 优惠券id */
+    private Long couponId;
+
+    /** 优惠券金额 */
+    private BigDecimal couponPrice;
+
+    /** 支付状态 */
+    @Excel(name = "支付状态 1已支付 0未支付 2支付中")
+    private Integer paid;
+
+    /** 支付时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date payTime;
+
+    /** 支付方式 */
+    @Excel(name = "支付方式 1线上 2物流代收")
+    private String payType;
+
+    private Integer status;
+
+    /** 0 未退款 1 申请中 2 已退款 */
+    private Integer refundStatus;
+
+    /** 退款图片 */
+    @Excel(name = "退款图片")
+    private String refundReasonWapImg;
+
+    /** 退款用户说明 */
+    @Excel(name = "退款用户说明")
+    private String refundReasonWapExplain;
+
+    /** 退款时间 */
+
+    private Date refundReasonTime;
+
+    /** 前台退款原因 */
+    private String refundReasonWap;
+
+    /** 不退款的理由 */
+    private String refundReason;
+
+    /** 退款金额 */
+    private BigDecimal refundPrice;
+
+    /** 快递公司编号 */
+    @Excel(name = "快递公司编号")
+    private String deliverySn;
+
+    /** 快递名称/送货人姓名 */
+    @Excel(name = "快递名称")
+    private String deliveryName;
+
+    /** 发货类型 */
+    private String deliveryType;
+
+    /** 快递单号/手机号 */
+    @Excel(name = "快递单号")
+    private String deliveryId;
+
+    /** 消费赚取积分 */
+    private BigDecimal gainIntegral;
+
+    /** 使用积分 */
+    @Excel(name = "使用积分")
+    private BigDecimal useIntegral;
+
+    /** 实际支付积分 */
+    @Excel(name = "实际支付积分")
+    private BigDecimal payIntegral;
+
+    /** 给用户退了多少积分 */
+    private BigDecimal backIntegral;
+
+    /** 备注 */
+    @Excel(name = "备注")
+    private String mark;
+
+
+    /** 是否删除 */
+    private Integer isDel;
+
+    /** 成本价 */
+    private BigDecimal cost;
+
+    /** 核销码 */
+    private String verifyCode;
+
+    /** 门店id */
+    private Long storeId;
+
+    /** 配送方式 1=快递 ,2=门店自提 */
+    private Integer shippingType;
+
+    /** 支付渠道(0微信公众号1微信小程序) */
+    private Integer isChannel;
+
+    /** 是否提醒 */
+    private Integer isRemind;
+
+    /** 是否系统删除 */
+    private Integer isSysDel;
+
+    private Integer isPrescribe;
+
+    private Long prescribeId;
+
+    private Long companyId;
+
+    private Long companyUserId;
+
+    private Integer isPackage;
+
+    private String packageJson;
+
+    private String itemJson;
+
+    private Integer orderType;
+
+    private Long packageId;
+
+    private Integer orderCreateType;
+
+    private String storeHouseCode;
+
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date finishTime;
+
+    private Integer deliveryStatus;
+
+    private Integer deliveryPayStatus;
+
+    @Excel(name = "快递帐单日期")
+    private String deliveryTime;
+
+    @Excel(name = "快递结算日期")
+    private String deliveryPayTime;
+
+    private BigDecimal deliveryPayMoney;
+
+    private BigDecimal tuiMoney;
+
+    private Integer tuiMoneyStatus;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "回单导入时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date deliveryImportTime;
+
+    private Long tuiUserId;
+
+    private Integer tuiUserMoneyStatus;
+
+    private Long deptId;
+
+    private Integer isEditMoney;
+
+    private Long customerId;
+
+    private Integer isPayRemain;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "发货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date deliverySendTime;
+
+    //凭证
+    private String certificates;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date uploadTime;
+
+    private Long scheduleId; //归属档期id
+
+    private String orderVisit; //订单跟随阶段
+
+    private BigDecimal serviceFee;
+
+}

+ 97 - 0
fs-service/src/main/java/com/fs/store/domain/FsStoreOrderStatusScrm.java

@@ -0,0 +1,97 @@
+package com.fs.store.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+
+/**
+ * 订单操作记录对象 fs_store_order_status
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+public class FsStoreOrderStatusScrm extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 订单id */
+    @Excel(name = "订单id")
+    private Long orderId;
+
+    /** 操作类型 */
+    @Excel(name = "操作类型")
+    private String changeType;
+
+    /** 操作备注 */
+    @Excel(name = "操作备注")
+    private String changeMessage;
+
+    /** 操作时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date changeTime;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setOrderId(Long orderId) 
+    {
+        this.orderId = orderId;
+    }
+
+    public Long getOrderId() 
+    {
+        return orderId;
+    }
+    public void setChangeType(String changeType) 
+    {
+        this.changeType = changeType;
+    }
+
+    public String getChangeType() 
+    {
+        return changeType;
+    }
+    public void setChangeMessage(String changeMessage) 
+    {
+        this.changeMessage = changeMessage;
+    }
+
+    public String getChangeMessage() 
+    {
+        return changeMessage;
+    }
+    public void setChangeTime(Date changeTime) 
+    {
+        this.changeTime = changeTime;
+    }
+
+    public Date getChangeTime() 
+    {
+        return changeTime;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("orderId", getOrderId())
+            .append("changeType", getChangeType())
+            .append("changeMessage", getChangeMessage())
+            .append("changeTime", getChangeTime())
+            .toString();
+    }
+}

+ 79 - 0
fs-service/src/main/java/com/fs/store/domain/FsStoreProductAttrScrm.java

@@ -0,0 +1,79 @@
+package com.fs.store.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 商品属性对象 fs_store_product_attr
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+public class FsStoreProductAttrScrm extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 商品ID */
+    @Excel(name = "商品ID")
+    private Long productId;
+
+    /** 属性名 */
+    @Excel(name = "属性名")
+    private String attrName;
+
+    /** 属性值 */
+    @Excel(name = "属性值")
+    private String attrValues;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setProductId(Long productId) 
+    {
+        this.productId = productId;
+    }
+
+    public Long getProductId() 
+    {
+        return productId;
+    }
+    public void setAttrName(String attrName) 
+    {
+        this.attrName = attrName;
+    }
+
+    public String getAttrName() 
+    {
+        return attrName;
+    }
+    public void setAttrValues(String attrValues) 
+    {
+        this.attrValues = attrValues;
+    }
+
+    public String getAttrValues() 
+    {
+        return attrValues;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("productId", getProductId())
+            .append("attrName", getAttrName())
+            .append("attrValues", getAttrValues())
+            .toString();
+    }
+}

+ 279 - 0
fs-service/src/main/java/com/fs/store/domain/FsStoreProductAttrValueScrm.java

@@ -0,0 +1,279 @@
+package com.fs.store.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+/**
+ * 商品属性值对象 fs_store_product_attr_value
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+public class FsStoreProductAttrValueScrm extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 商品ID */
+    @Excel(name = "商品ID")
+    private Long productId;
+
+    /** 商品属性索引值 (attr_value|attr_value[|....]) */
+    @Excel(name = "商品属性索引值 (attr_value|attr_value[|....])")
+    private String sku;
+
+    /** 属性对应的库存 */
+    @Excel(name = "属性对应的库存")
+    private Integer stock;
+
+    /** 销量 */
+    @Excel(name = "销量")
+    private Integer sales;
+
+    /** 属性金额 */
+    @Excel(name = "属性金额")
+    private BigDecimal price;
+
+    /** 图片 */
+    @Excel(name = "图片")
+    private String image;
+
+    /** 成本价 */
+    @Excel(name = "成本价")
+    private BigDecimal cost;
+
+    /** 商品条码 */
+    @Excel(name = "商品条码")
+    private String barCode;
+
+    @Excel(name = "组合条码")
+    private String groupBarCode;
+
+    /** 原价 */
+    @Excel(name = "原价")
+    private BigDecimal otPrice;
+
+    /** 重量 */
+    @Excel(name = "重量")
+    private BigDecimal weight;
+
+    /** 体积 */
+    @Excel(name = "体积")
+    private BigDecimal volume;
+
+    /** 一级返佣 */
+    @Excel(name = "一级返佣")
+    private BigDecimal brokerage;
+
+    /** 二级返佣 */
+    @Excel(name = "二级返佣")
+    private BigDecimal brokerageTwo;
+
+    @Excel(name = "三级返佣")
+    private BigDecimal brokerageThree;
+
+
+    /** 需要多少积分兑换 */
+    @Excel(name = "需要多少积分兑换")
+    private Integer integral;
+
+    private BigDecimal agentPrice;
+
+    private Map<String, String> detail;
+
+    public BigDecimal getBrokerageThree() {
+        return brokerageThree;
+    }
+
+    public void setBrokerageThree(BigDecimal brokerageThree) {
+        this.brokerageThree = brokerageThree;
+    }
+
+    public String getGroupBarCode() {
+        return groupBarCode;
+    }
+
+    public void setGroupBarCode(String groupBarCode) {
+        this.groupBarCode = groupBarCode;
+    }
+
+    public BigDecimal getAgentPrice() {
+        return agentPrice;
+    }
+
+    public void setAgentPrice(BigDecimal agentPrice) {
+        this.agentPrice = agentPrice;
+    }
+
+    public Map<String, String> getDetail() {
+        return detail;
+    }
+
+    public void setDetail(Map<String, String> detail) {
+        this.detail = detail;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setProductId(Long productId)
+    {
+        this.productId = productId;
+    }
+
+    public Long getProductId()
+    {
+        return productId;
+    }
+    public void setSku(String sku)
+    {
+        this.sku = sku;
+    }
+
+    public String getSku()
+    {
+        return sku;
+    }
+    public void setStock(Integer stock)
+    {
+        this.stock = stock;
+    }
+
+    public Integer getStock()
+    {
+        return stock;
+    }
+    public void setSales(Integer sales)
+    {
+        this.sales = sales;
+    }
+
+    public Integer getSales()
+    {
+        return sales;
+    }
+    public void setPrice(BigDecimal price)
+    {
+        this.price = price;
+    }
+
+    public BigDecimal getPrice()
+    {
+        return price;
+    }
+    public void setImage(String image)
+    {
+        this.image = image;
+    }
+
+    public String getImage()
+    {
+        return image;
+    }
+    public void setCost(BigDecimal cost)
+    {
+        this.cost = cost;
+    }
+
+    public BigDecimal getCost()
+    {
+        return cost;
+    }
+    public void setBarCode(String barCode)
+    {
+        this.barCode = barCode;
+    }
+
+    public String getBarCode()
+    {
+        return barCode;
+    }
+    public void setOtPrice(BigDecimal otPrice)
+    {
+        this.otPrice = otPrice;
+    }
+
+    public BigDecimal getOtPrice()
+    {
+        return otPrice;
+    }
+    public void setWeight(BigDecimal weight)
+    {
+        this.weight = weight;
+    }
+
+    public BigDecimal getWeight()
+    {
+        return weight;
+    }
+    public void setVolume(BigDecimal volume)
+    {
+        this.volume = volume;
+    }
+
+    public BigDecimal getVolume()
+    {
+        return volume;
+    }
+    public void setBrokerage(BigDecimal brokerage)
+    {
+        this.brokerage = brokerage;
+    }
+
+    public BigDecimal getBrokerage()
+    {
+        return brokerage;
+    }
+    public void setBrokerageTwo(BigDecimal brokerageTwo)
+    {
+        this.brokerageTwo = brokerageTwo;
+    }
+
+    public BigDecimal getBrokerageTwo()
+    {
+        return brokerageTwo;
+    }
+    public void setIntegral(Integer integral)
+    {
+        this.integral = integral;
+    }
+
+    public Integer getIntegral()
+    {
+        return integral;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("productId", getProductId())
+            .append("sku", getSku())
+            .append("stock", getStock())
+            .append("sales", getSales())
+            .append("price", getPrice())
+            .append("image", getImage())
+            .append("cost", getCost())
+            .append("barCode", getBarCode())
+            .append("otPrice", getOtPrice())
+            .append("weight", getWeight())
+            .append("volume", getVolume())
+            .append("brokerage", getBrokerage())
+            .append("brokerageTwo", getBrokerageTwo())
+            .append("integral", getIntegral())
+            .toString();
+    }
+}

+ 186 - 0
fs-service/src/main/java/com/fs/store/domain/FsStoreProductScrm.java

@@ -0,0 +1,186 @@
+package com.fs.store.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * 商品对象 fs_store_product
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class FsStoreProductScrm extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 商品id */
+    private Long productId;
+
+    /** 商品图片 */
+    @Excel(name = "商品图片")
+    private String image;
+
+    @TableField(strategy = FieldStrategy.IGNORED)
+    private String video;
+
+    /** 轮播图 */
+    @Excel(name = "轮播图")
+    private String sliderImage;
+
+    /** 商品名称 */
+    @Excel(name = "商品名称")
+    private String productName;
+
+    /** 商品简介 */
+    @Excel(name = "商品简介")
+    private String productInfo;
+
+    /** 关键字 */
+    @Excel(name = "关键字")
+    private String keyword;
+
+    /** 产品条码(一维码) */
+    @Excel(name = "产品条码", readConverterExp = "一=维码")
+    private String barCode;
+
+    /** 分类id */
+    @Excel(name = "分类id")
+    private Long cateId;
+
+    /** 商品价格 */
+    @Excel(name = "商品价格")
+    private BigDecimal price;
+
+    /** 会员价格 */
+    @Excel(name = "会员价格")
+    private BigDecimal vipPrice;
+
+    /** 市场价 */
+    @Excel(name = "市场价")
+    private BigDecimal otPrice;
+
+    /** 邮费 */
+    @Excel(name = "邮费")
+    private BigDecimal postage;
+
+    /** 单位名 */
+    @Excel(name = "单位名")
+    private String unitName;
+
+    /** 排序 */
+    @Excel(name = "排序")
+    private Long sort;
+
+    /** 销量 */
+    @Excel(name = "销量")
+    private Long sales;
+
+    /** 库存 */
+    @Excel(name = "库存")
+    private Long stock;
+
+    /** 状态(0:未上架,1:上架) */
+    @Excel(name = "状态", dictType = "store_product_is_show", readConverterExp = "0=:未上架,1:上架")
+    private Integer isShow;
+
+    /** 是否热卖 */
+    @Excel(name = "是否热卖")
+    private Integer isHot;
+
+    /** 是否优惠 */
+    @Excel(name = "是否优惠")
+    private Integer isBenefit;
+
+    /** 是否精品 */
+    @Excel(name = "是否精品")
+    private Integer isBest;
+
+    /** 是否新品 */
+    @Excel(name = "是否新品")
+    private Integer isNew;
+
+    @Excel(name = "是否在商品展示")
+    private Integer isDisplay;
+
+    /** 产品描述 */
+    @Excel(name = "产品描述")
+    private String description;
+
+    /** 是否包邮 */
+    @Excel(name = "是否包邮")
+    private Integer isPostage;
+
+    /** 是否删除 */
+    @Excel(name = "是否删除")
+    private Integer isDel;
+
+    /** 获得积分 */
+    @Excel(name = "获得积分")
+    private BigDecimal giveIntegral;
+
+    /** 成本价 */
+    @Excel(name = "成本价")
+    private BigDecimal cost;
+
+    /** 是否优品推荐 */
+    @Excel(name = "是否优品推荐")
+    private Integer isGood;
+
+    /** 浏览量 */
+    @Excel(name = "浏览量")
+    private Long browse;
+
+    /** 产品二维码地址(用户小程序海报) */
+    @Excel(name = "产品二维码地址(用户小程序海报)")
+    private String codePath;
+
+    /** 运费模板ID */
+    @Excel(name = "运费模板ID")
+    private Integer tempId;
+
+    /** 规格 0单 1多 */
+    @Excel(name = "规格 0单 1多")
+    private Integer specType;
+
+    /** 是开启积分兑换 */
+    @Excel(name = "是开启积分兑换")
+    private Integer isIntegral;
+
+    /** 需要多少积分兑换 只在开启积分兑换时生效 */
+    @Excel(name = "需要多少积分兑换 只在开启积分兑换时生效")
+    private Long integral;
+
+    /** 商品类型:1非处方 2处方 */
+    @Excel(name = "商品类型:1非处方 2处方", dictType = "store_product_type")
+    private Integer productType;
+
+    /** 国药准字 */
+    @Excel(name = "国药准字")
+    private String prescribeCode;
+
+    /** 规格 */
+    @Excel(name = "规格")
+    private String prescribeSpec;
+
+    /** 生产厂家 */
+    @Excel(name = "生产厂家")
+    private String prescribeFactory;
+
+    /** 处方名 */
+    @Excel(name = "处方名")
+    private String prescribeName;
+
+    private Integer tuiCateId;
+
+    /** 指定企业 */
+    private String companyIds;
+
+}

+ 663 - 0
fs-service/src/main/java/com/fs/store/domain/FsUser.java

@@ -0,0 +1,663 @@
+package com.fs.store.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import com.vdurmont.emoji.EmojiParser;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户对象 fs_user
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+public class FsUser extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 用户id */
+    private Long userId;
+    private String username;
+    /** 用户密码(跟pwd) */
+    private String password;
+
+    /** 真实姓名 */
+    private String realName;
+
+    /** 生日 */
+    private Long birthday;
+
+    /** 身份证号码 */
+    private String idCard;
+
+    @Excel(name = "会员头像",sort = 2)
+    private String avatar;
+
+    /** 用户昵称 */
+    @Excel(name = "会员昵称", sort = 1)
+    private String nickname;
+
+    /** 用户备注 */
+    @Excel(name = "用户备注", sort = 12)
+    private String remark;
+
+
+    /** 手机号码 */
+    @Excel(name = "手机号码", sort = 3)
+    private String phone;
+
+    /** 最后一次登录ip */
+    private String lastIp;
+
+    /** 用户余额 */
+    @Excel(name = "用户余额", sort = 4)
+    private BigDecimal nowMoney;
+
+    /** 佣金金额 */
+    private BigDecimal brokeragePrice;
+
+    /** 用户剩余积分 */
+    @Excel(name = "积分", sort = 5)
+    private BigDecimal integral;
+
+    /** 连续签到天数 */
+    private Long signNum;
+
+    /** 1为正常,0为禁止 */
+    private Integer status;
+    private String statusText;
+
+    /** 等级 */
+    private Integer level;
+
+    /** 推广上级用户ID */
+    private Long spreadUserId;
+
+    /** 推广员关联时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date spreadTime;
+
+    /** 用户类型 */
+    private String userType;
+
+    /** 是否为推广员 */
+    private Integer isPromoter;
+
+    /** 用户购买次数 */
+    private Long payCount;
+
+    /** 下级人数 */
+    private Long spreadCount;
+
+    /** 详细地址 */
+    private String addres;
+
+
+    private String maOpenId;
+
+    private String mpOpenId;
+
+    private String unionId;
+
+    private Integer isDel;
+
+    private Integer isWeixinAuth;
+
+    private Long companyId;
+
+    private Long companyUserId;
+    private String companyUserName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date registerDate;
+    private String registerCode;
+    private String source;
+
+    private String userCode;
+
+    private Integer isVip;
+    private Date  vipStartDate;
+    private Date  vipEndDate;
+    private Integer vipLevel;
+    private Integer vipStatus;
+
+    private String jpushId;
+
+    private Integer sex;
+    private Integer isAddQw;
+    private Long qwExtId;
+    private Integer isShow;//是否展示购买以及订单状态
+
+
+
+    private String courseMaOpenId;//看课小程序openId
+
+    // 企微重粉
+    private Integer qwRepeat;
+    // 小程序(看课)重粉
+    private Integer userRepeat;
+    // 是否已购0 否 1程序内下单 2程序外下单
+    private Integer payOrder;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(exist = false)
+    private Date startCreateTime;
+
+    @TableField(exist = false)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date endCreateTime;
+
+    @TableField(exist = false)
+    private String companyUserNickName;
+
+    @ApiModelProperty(value = "所属公司")
+    @Excel(name = "所属公司", sort = 9)
+    private String companyName;
+
+
+
+    @ApiModelProperty(value = "是否点过注册链接 0:否 1:是")
+    @Excel(name = "是否点过注册链接 0:否 1:是")
+    private Integer isBecomeMember;
+
+    public Integer getQwRepeat() {
+        return qwRepeat;
+    }
+
+    public void setQwRepeat(Integer qwRepeat) {
+        this.qwRepeat = qwRepeat;
+    }
+
+    public Integer getUserRepeat() {
+        return userRepeat;
+    }
+
+    public void setUserRepeat(Integer userRepeat) {
+        this.userRepeat = userRepeat;
+    }
+
+    public Integer getPayOrder() {
+        return payOrder;
+    }
+
+    public void setPayOrder(Integer payOrder) {
+        this.payOrder = payOrder;
+    }
+
+    public Long getQwExtId() {
+        return qwExtId;
+    }
+
+    public void setQwExtId(Long qwExtId) {
+        this.qwExtId = qwExtId;
+    }
+
+    public String getCourseMaOpenId() {
+        return courseMaOpenId;
+    }
+
+    public void setCourseMaOpenId(String courseMaOpenId) {
+        this.courseMaOpenId = courseMaOpenId;
+    }
+    public String getStatusText() {
+        return statusText;
+    }
+
+    public void setStatusText(String statusText) {
+        this.statusText = statusText;
+    }
+
+    public String getCompanyUserName() {
+        return companyUserName;
+    }
+
+    public void setCompanyUserName(String companyUserName) {
+        this.companyUserName = companyUserName;
+    }
+    public Integer getIsAddQw() {
+        return isAddQw;
+    }
+
+    public void setIsAddQw(Integer isAddQw) {
+        this.isAddQw = isAddQw;
+    }
+
+    public Integer getIsShow() {
+        return isShow;
+    }
+
+    public void setIsShow(Integer isShow) {
+        this.isShow = isShow;
+    }
+
+    public String getJpushId() {
+        return jpushId;
+    }
+
+    public void setJpushId(String jpushId) {
+        this.jpushId = jpushId;
+    }
+
+    public Integer getSex() {
+        return sex;
+    }
+
+    public void setSex(Integer sex) {
+        this.sex = sex;
+    }
+
+    public Integer getIsVip() {
+        return isVip;
+    }
+
+    public void setIsVip(Integer isVip) {
+        this.isVip = isVip;
+    }
+
+    public Date getVipEndDate() {
+        return vipEndDate;
+    }
+
+    public void setVipEndDate(Date vipEndDate) {
+        this.vipEndDate = vipEndDate;
+    }
+
+    public Date getVipStartDate() {
+        return vipStartDate;
+    }
+
+    public void setVipStartDate(Date vipStartDate) {
+        this.vipStartDate = vipStartDate;
+    }
+
+    public Integer getVipLevel() {
+        return vipLevel;
+    }
+
+    public void setVipLevel(Integer vipLevel) {
+        this.vipLevel = vipLevel;
+    }
+
+    public Integer getVipStatus() {
+        return vipStatus;
+    }
+
+    public void setVipStatus(Integer vipStatus) {
+        this.vipStatus = vipStatus;
+    }
+
+    public String getUserCode() {
+        return userCode;
+    }
+
+    public void setUserCode(String userCode) {
+        this.userCode = userCode;
+    }
+
+    public String getMaOpenId() {
+        return maOpenId;
+    }
+
+    public void setMaOpenId(String maOpenId) {
+        this.maOpenId = maOpenId;
+    }
+
+    public String getMpOpenId() {
+        return mpOpenId;
+    }
+
+    public void setMpOpenId(String mpOpenId) {
+        this.mpOpenId = mpOpenId;
+    }
+
+    public String getUnionId() {
+        return unionId;
+    }
+
+    public void setUnionId(String unionId) {
+        this.unionId = unionId;
+    }
+
+    public Date getRegisterDate() {
+        return registerDate;
+    }
+
+    public void setRegisterDate(Date registerDate) {
+        this.registerDate = registerDate;
+    }
+
+    public String getRegisterCode() {
+        return registerCode;
+    }
+
+    public void setRegisterCode(String registerCode) {
+        this.registerCode = registerCode;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    public Long getCompanyUserId() {
+        return companyUserId;
+    }
+
+    public void setCompanyUserId(Long companyUserId) {
+        this.companyUserId = companyUserId;
+    }
+
+    public Integer getIsWeixinAuth() {
+        return isWeixinAuth;
+    }
+
+    public void setIsWeixinAuth(Integer isWeixinAuth) {
+        this.isWeixinAuth = isWeixinAuth;
+    }
+
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+    public void setUsername(String username)
+    {
+        this.username = username;
+    }
+
+    public String getUsername()
+    {
+        return username;
+    }
+    public void setPassword(String password)
+    {
+        this.password = password;
+    }
+
+    public String getPassword()
+    {
+        return password;
+    }
+    public void setRealName(String realName)
+    {
+        this.realName = realName;
+    }
+
+    public String getRealName()
+    {
+        return realName;
+    }
+    public void setBirthday(Long birthday)
+    {
+        this.birthday = birthday;
+    }
+
+    public Long getBirthday()
+    {
+        return birthday;
+    }
+    public void setIdCard(String idCard)
+    {
+        this.idCard = idCard;
+    }
+
+    public String getIdCard()
+    {
+        return idCard;
+    }
+
+    @Override
+    public String getRemark() {
+        return remark;
+    }
+
+    @Override
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public void setNickname(String nickname)
+    {
+        if(StringUtils.isNotEmpty(nickname)){
+            this.nickname= EmojiParser.parseToHtmlDecimal(nickname);
+        }
+        else{
+            this.nickname= nickname;
+        }
+    }
+
+    public String getNickname()
+    {
+        if(StringUtils.isNotEmpty(nickname)){
+            return EmojiParser.parseToUnicode(nickname);
+        }
+        else{
+            return nickname;
+        }
+    }
+    public void setAvatar(String avatar)
+    {
+        this.avatar = avatar;
+    }
+
+    public String getAvatar()
+    {
+        return avatar;
+    }
+    public void setPhone(String phone)
+    {
+        this.phone = phone;
+    }
+
+    public String getPhone()
+    {
+        return phone;
+    }
+    public void setLastIp(String lastIp)
+    {
+        this.lastIp = lastIp;
+    }
+
+    public String getLastIp()
+    {
+        return lastIp;
+    }
+    public void setNowMoney(BigDecimal nowMoney)
+    {
+        this.nowMoney = nowMoney;
+    }
+
+    public BigDecimal getNowMoney()
+    {
+        return nowMoney;
+    }
+    public void setBrokeragePrice(BigDecimal brokeragePrice)
+    {
+        this.brokeragePrice = brokeragePrice;
+    }
+
+    public BigDecimal getBrokeragePrice()
+    {
+        return brokeragePrice;
+    }
+//    public void setIntegral(BigDecimal integral)
+//    {
+//        this.integral = integral;
+//    }
+//
+//    public BigDecimal getIntegral()
+//    {
+//        return integral;
+//    }
+
+
+    public BigDecimal getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(BigDecimal integral) {
+        this.integral = integral;
+    }
+
+    public void setSignNum(Long signNum)
+    {
+        this.signNum = signNum;
+    }
+
+    public Long getSignNum()
+    {
+        return signNum;
+    }
+    public void setStatus(Integer status)
+    {
+        this.status = status;
+    }
+
+    public Integer getStatus()
+    {
+        return status;
+    }
+    public void setLevel(Integer level)
+    {
+        this.level = level;
+    }
+
+    public Integer getLevel()
+    {
+        return level;
+    }
+    public void setSpreadUserId(Long spreadUserId)
+    {
+        this.spreadUserId = spreadUserId;
+    }
+
+    public Long getSpreadUserId()
+    {
+        return spreadUserId;
+    }
+    public void setSpreadTime(Date spreadTime)
+    {
+        this.spreadTime = spreadTime;
+    }
+
+    public Date getSpreadTime()
+    {
+        return spreadTime;
+    }
+    public void setUserType(String userType)
+    {
+        this.userType = userType;
+    }
+
+    public String getUserType()
+    {
+        return userType;
+    }
+    public void setIsPromoter(Integer isPromoter)
+    {
+        this.isPromoter = isPromoter;
+    }
+
+    public Integer getIsPromoter()
+    {
+        return isPromoter;
+    }
+    public void setPayCount(Long payCount)
+    {
+        this.payCount = payCount;
+    }
+
+    public Long getPayCount()
+    {
+        return payCount;
+    }
+    public void setSpreadCount(Long spreadCount)
+    {
+        this.spreadCount = spreadCount;
+    }
+
+    public Long getSpreadCount()
+    {
+        return spreadCount;
+    }
+    public void setAddres(String addres)
+    {
+        this.addres = addres;
+    }
+
+    public String getAddres()
+    {
+        return addres;
+    }
+
+    public void setIsDel(Integer isDel)
+    {
+        this.isDel = isDel;
+    }
+
+    public Integer getIsDel()
+    {
+        return isDel;
+    }
+
+    public Date getStartCreateTime() {
+        return startCreateTime;
+    }
+
+    public Date getEndCreateTime() {
+        return endCreateTime;
+    }
+
+    public void setStartCreateTime(Date startCreateTime) {
+        this.startCreateTime = startCreateTime;
+    }
+
+    public void setEndCreateTime(Date endCreateTime) {
+        this.endCreateTime = endCreateTime;
+    }
+
+    public String getCompanyUserNickName() {
+        return companyUserNickName;
+    }
+
+    public void setCompanyUserNickName(String companyUserNickName) {
+        this.companyUserNickName = companyUserNickName;
+    }
+
+    public String getCompanyName() {
+        return companyName;
+    }
+
+    public void setCompanyName(String companyName) {
+        this.companyName = companyName;
+    }
+
+    public Integer getIsBecomeMember() {
+        return isBecomeMember;
+    }
+
+    public void setIsBecomeMember(Integer isBecomeMember) {
+        this.isBecomeMember = isBecomeMember;
+    }
+}

+ 221 - 0
fs-service/src/main/java/com/fs/store/domain/FsUserAddress.java

@@ -0,0 +1,221 @@
+package com.fs.store.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 用户地址对象 fs_user_address
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+public class FsUserAddress extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 用户地址id */
+    private Long id;
+
+    /** 用户id */
+    @Excel(name = "用户id")
+    private Long userId;
+
+    /** 收货人姓名 */
+    @Excel(name = "收货人姓名")
+    private String realName;
+
+    /** 收货人电话 */
+    @Excel(name = "收货人电话")
+    private String phone;
+
+    /** 收货人所在省 */
+    @Excel(name = "收货人所在省")
+    private String province;
+
+    /** 收货人所在市 */
+    @Excel(name = "收货人所在市")
+    private String city;
+
+    /** $column.columnComment */
+    @Excel(name = "收货人所在市")
+    private String cityId;
+
+    /** 收货人所在区 */
+    @Excel(name = "收货人所在区")
+    private String district;
+
+    /** 收货人详细地址 */
+    @Excel(name = "收货人详细地址")
+    private String detail;
+
+    /** 邮编 */
+    @Excel(name = "邮编")
+    private String postCode;
+
+    /** 经度 */
+    @Excel(name = "经度")
+    private String longitude;
+
+    /** 纬度 */
+    @Excel(name = "纬度")
+    private String latitude;
+
+    /** 是否默认 */
+    @Excel(name = "是否默认")
+    private Integer isDefault;
+
+    /** 是否删除 */
+    @Excel(name = "是否删除")
+    private Integer isDel;
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+    public void setRealName(String realName)
+    {
+        this.realName = realName.trim();
+    }
+
+    public String getRealName()
+    {
+        return realName;
+    }
+    public void setPhone(String phone)
+    {
+        this.phone = phone.trim();
+    }
+
+    public String getPhone()
+    {
+        return phone;
+    }
+    public void setProvince(String province)
+    {
+        this.province = province;
+    }
+
+    public String getProvince()
+    {
+        return province;
+    }
+    public void setCity(String city)
+    {
+        this.city = city;
+    }
+
+    public String getCity()
+    {
+        return city;
+    }
+    public void setCityId(String cityId)
+    {
+        this.cityId = cityId;
+    }
+
+    public String getCityId()
+    {
+        return cityId;
+    }
+    public void setDistrict(String district)
+    {
+        this.district = district;
+    }
+
+    public String getDistrict()
+    {
+        return district;
+    }
+    public void setDetail(String detail)
+    {
+        this.detail = detail.trim();
+    }
+
+    public String getDetail()
+    {
+        return detail;
+    }
+    public void setPostCode(String postCode)
+    {
+        this.postCode = postCode;
+    }
+
+    public String getPostCode()
+    {
+        return postCode;
+    }
+    public void setLongitude(String longitude)
+    {
+        this.longitude = longitude;
+    }
+
+    public String getLongitude()
+    {
+        return longitude;
+    }
+    public void setLatitude(String latitude)
+    {
+        this.latitude = latitude;
+    }
+
+    public String getLatitude()
+    {
+        return latitude;
+    }
+    public void setIsDefault(Integer isDefault)
+    {
+        this.isDefault = isDefault;
+    }
+
+    public Integer getIsDefault()
+    {
+        return isDefault;
+    }
+    public void setIsDel(Integer isDel)
+    {
+        this.isDel = isDel;
+    }
+
+    public Integer getIsDel()
+    {
+        return isDel;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("userId", getUserId())
+            .append("realName", getRealName())
+            .append("phone", getPhone())
+            .append("province", getProvince())
+            .append("city", getCity())
+            .append("cityId", getCityId())
+            .append("district", getDistrict())
+            .append("detail", getDetail())
+            .append("postCode", getPostCode())
+            .append("longitude", getLongitude())
+            .append("latitude", getLatitude())
+            .append("isDefault", getIsDefault())
+            .append("isDel", getIsDel())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}

+ 139 - 0
fs-service/src/main/java/com/fs/store/domain/FsUserWatchCourseStatistics.java

@@ -0,0 +1,139 @@
+package com.fs.store.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 会员看课统计-按课程统计对象 fs_user_watch_course_statistics
+ *
+ * @author fs
+ * @date 2025-06-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserWatchCourseStatistics extends BaseEntity{
+
+    /** 主键id */
+    private Long id;
+
+    /** 营期id */
+//    @Excel(name = "营期id")
+    private Long periodId;
+
+    /** 营期名称 */
+    @Excel(name = "营期名称")
+    private String periodName;
+
+    /** 营期开始日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "营期线", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date periodStartingTime;
+
+    /** 课程开始日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "播出时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date courseStartDateTime;
+
+    /** 课程id */
+//    @Excel(name = "课程id")
+    private Long courseId;
+
+    /** 课程名称 */
+    @Excel(name = "课程名称")
+    private String courseName;
+
+    /** 视频id */
+//    @Excel(name = "视频id")
+    private Long videoId;
+
+    /** 视频标题 */
+    @Excel(name = "视频小节")
+    private String videoTitle;
+
+    /** 销售公司id */
+//    @Excel(name = "销售公司id")
+    private Long companyId;
+
+    /** 销售公司名称 */
+    @Excel(name = "销售公司")
+    private String companyName;
+
+    /** 销售id */
+//    @Excel(name = "销售id")
+    private Long companyUserId;
+
+    /** 销售名称 */
+    @Excel(name = "所属销售")
+    private String companyUserName;
+
+    /** 新增会员数量 */
+    @Excel(name = "新增会员")
+    private Integer newUserNum;
+
+    /** 会员数量 */
+    @Excel(name = "会员数量")
+    private Integer userNum;
+
+    /** 观看人数 */
+    @Excel(name = "观看人数")
+    private Integer watchNum;
+
+    /** 上线率+% */
+    @Excel(name = "上线率")
+    private String onlineRatePercent;
+
+    /** 完播人数 */
+    @Excel(name = "完播人数")
+    private Integer completeWatchNum;
+
+    /** 上线率 */
+    private BigDecimal onlineRate;
+
+    /** 完播率 */
+//    @Excel(name = "完播率")
+    private BigDecimal completeWatchRate;
+
+    /** 完播率+% */
+    @Excel(name = "完播率")
+    private String completeWatchRatePercent;
+
+    /** 答题人数 */
+    @Excel(name = "答题人数")
+    private Integer answerNum;
+
+    /** 答题正确人数 */
+    @Excel(name = "正确人数")
+    private Integer answerRightNum;
+
+    /** 答题正确率 */
+//    @Excel(name = "正确率")
+    private BigDecimal answerRightRate;
+
+    /** 答题正确率+% */
+    @Excel(name = "正确率")
+    private String answerRightRatePercent;
+
+    /** 红包领取数量 */
+    @Excel(name = "红包领取个数")
+    private Integer redPacketNum;
+
+    /** 红包领取总额 */
+    @Excel(name = "红包领取总额")
+    private BigDecimal redPacketAmount;
+
+    /** 用户的创建日期 */
+    private Date userCreateDate;
+
+    /** 营期日期 */
+    @TableField(exist = false)
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date periodLine;
+
+}

+ 77 - 0
fs-service/src/main/java/com/fs/store/domain/FsUserWatchStatistics.java

@@ -0,0 +1,77 @@
+package com.fs.store.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 会员看课统计-按营期统计对象 fs_user_watch_statistics
+ *
+ * @author fs
+ * @date 2025-06-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserWatchStatistics extends BaseEntity{
+
+    /** 主键id */
+    private Long id;
+
+    /** 营期id */
+//    @Excel(name = "营期id")
+    private Long periodId;
+
+    /** 营期名称 */
+    @Excel(name = "营期名称")
+    private String periodName;
+
+    /** 营期开始日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "营期线", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date periodStartingTime;
+
+    /** 销售公司id */
+//    @Excel(name = "销售公司id")
+    private String companyId;
+
+    /** 销售公司名称 */
+    @Excel(name = "销售公司")
+    private String companyName;
+
+    /** 新增会员数量 */
+    @Excel(name = "新增会员数量")
+    private Integer newUserNum;
+
+    /** 会员数量 */
+    @Excel(name = "会员数量")
+    private Integer userNum;
+
+    /** 观看人数 */
+    @Excel(name = "观看人数")
+    private Integer watchNum;
+
+    /** 上线率+% */
+    @Excel(name = "上线率")
+    private String onlineRatePercent;
+
+    /** 完播人数 */
+    @Excel(name = "完播人数")
+    private Integer completeWatchNum;
+
+    /** 上线率 */
+    private BigDecimal onlineRate;
+
+    /** 完播率 */
+//    @Excel(name = "完播率")
+    private BigDecimal completeWatchRate;
+
+    /** 完播率+% */
+    @Excel(name = "完播率")
+    private String completeWatchRatePercent;
+
+}

+ 137 - 0
fs-service/src/main/java/com/fs/store/domain/FsWechatTemplate.java

@@ -0,0 +1,137 @@
+package com.fs.store.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 微信模板对象 fs_wechat_template
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+public class FsWechatTemplate extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 模板id */
+    private Integer id;
+
+    /** 模板编号 */
+    @Excel(name = "模板编号")
+    private String tempkey;
+
+    /** 模板名 */
+    @Excel(name = "模板名")
+    private String name;
+
+    /** 回复内容 */
+    @Excel(name = "回复内容")
+    private String content;
+
+    /** 模板ID */
+    @Excel(name = "模板ID")
+    private String tempId;
+
+    /** 状态 */
+    @Excel(name = "状态")
+    private Integer status;
+
+    /** $column.columnComment */
+    @Excel(name = "状态")
+    private Integer isDel;
+
+    /** 类型:template:模板消息 subscribe:订阅消息 */
+    @Excel(name = "类型:template:模板消息 subscribe:订阅消息")
+    private String type;
+
+    public void setId(Integer id) 
+    {
+        this.id = id;
+    }
+
+    public Integer getId() 
+    {
+        return id;
+    }
+    public void setTempkey(String tempkey) 
+    {
+        this.tempkey = tempkey;
+    }
+
+    public String getTempkey() 
+    {
+        return tempkey;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setContent(String content) 
+    {
+        this.content = content;
+    }
+
+    public String getContent() 
+    {
+        return content;
+    }
+    public void setTempId(String tempId) 
+    {
+        this.tempId = tempId;
+    }
+
+    public String getTempId() 
+    {
+        return tempId;
+    }
+    public void setStatus(Integer status) 
+    {
+        this.status = status;
+    }
+
+    public Integer getStatus() 
+    {
+        return status;
+    }
+    public void setIsDel(Integer isDel) 
+    {
+        this.isDel = isDel;
+    }
+
+    public Integer getIsDel() 
+    {
+        return isDel;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("tempkey", getTempkey())
+            .append("name", getName())
+            .append("content", getContent())
+            .append("tempId", getTempId())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .append("status", getStatus())
+            .append("isDel", getIsDel())
+            .append("type", getType())
+            .toString();
+    }
+}

+ 43 - 0
fs-service/src/main/java/com/fs/store/domain/Report.java

@@ -0,0 +1,43 @@
+package com.fs.store.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class Report {
+    //订单编号
+    @Excel(name = "订单编号")
+    private String orderSn;
+    //成单金额
+    @Excel(name = "成单金额")
+    private BigDecimal money;
+    //支付时间
+    @Excel(name = "支付时间" ,width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date payTime;
+    //订单状态
+    @Excel(name = "订单状态")
+    private String orderStatus;
+    //客户名称
+    @Excel(name = "客户名称")
+    private String userName;
+    //是否共享客户1是0否
+    @Excel(name = "是否共享客户")
+    private String status;
+    //共享销售
+    @Excel(name = "共享销售")
+    private String companyUserNames;
+    //分成比例
+    @Excel(name = "分成比例")
+    private BigDecimal proportion;
+    //我的业绩
+    @Excel(name = "我的业绩")
+    private BigDecimal myPerformance;
+    //客户id
+    @Excel(name = "客户id")
+    private Long customerId;
+}

+ 77 - 0
fs-service/src/main/java/com/fs/store/dto/ExpressScrmInfoDTO.java

@@ -0,0 +1,77 @@
+package com.fs.store.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ExpressScrmInfoDTO {
+
+    @JsonProperty("LogisticCode")
+    @ApiModelProperty(value = "物流运单号")
+    private String LogisticCode;
+
+    @JsonProperty("ShipperCode")
+    @ApiModelProperty(value = "快递公司编码")
+    private String ShipperCode;
+
+
+    @JsonProperty("Traces")
+    @ApiModelProperty(value = "物流轨迹")
+    private List<TracesDTO> Traces;
+
+
+    @JsonProperty("State")
+    @ApiModelProperty(value = "物流状态:0-暂无轨迹信息 1-已揽收 2-在途中,3-签收,4-问题件")
+
+    private String State;
+
+    @JsonProperty("StateEx")
+    @ApiModelProperty(value = "状态")
+    //增值物流状态:
+    //0-暂无轨迹信息
+    //1-已揽收
+    //2-在途中
+    // 201-到达派件城市
+    // 202-派件中
+    //211-已放入快递柜或驿站
+    //3-已签收
+    // 301-正常签收
+    // 302-派件异常后最终签收
+    // 304-代收签收
+    // 311-快递柜或驿站签收
+    //4-问题件
+    // 401-发货无信息
+    // 402-超时未签收
+    // 403-超时未更新
+    // 404-拒收(退件)
+    // 405-派件异常
+    // 406-退货签收
+    // 407-退货未签收
+    //412-快递柜或驿站超时未取
+    //10-待揽件
+    private String StateEx;
+
+
+    @JsonProperty("EBusinessID")
+    @ApiModelProperty(value = "用户ID")
+    private String EBusinessID;
+
+
+    @JsonProperty("Success")
+    @ApiModelProperty(value = "成功与否")
+    private boolean Success;
+
+
+    @JsonProperty("Reason")
+    @ApiModelProperty(value = "失败原因")
+    private String Reason;
+
+    private String ShipperName;
+
+    @JsonProperty("OrderCode")
+    @ApiModelProperty(value = "订单编号")
+    private String OrderCode;
+}

+ 31 - 0
fs-service/src/main/java/com/fs/store/dto/FsUserTransferParamDTO.java

@@ -0,0 +1,31 @@
+package com.fs.store.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 客户转移dto
+ */
+@Data
+public class FsUserTransferParamDTO implements Serializable {
+
+    /**
+     * 来源销售id
+     */
+    private Long sourceCompanyUserId;
+    /**
+     * 目标销售id
+     */
+    private Long targetCompanyUserId;
+    /**
+     * 客户id
+     */
+    private List<Long> userIds;
+
+    /**
+     * 转移提示内容/原因
+     */
+    private String content;
+}

+ 16 - 0
fs-service/src/main/java/com/fs/store/dto/ProductArrtScrmDTO.java

@@ -0,0 +1,16 @@
+package com.fs.store.dto;
+
+import lombok.*;
+
+import java.util.List;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ProductArrtScrmDTO {
+    private List<String> detail;
+    private String value;
+
+}

+ 22 - 0
fs-service/src/main/java/com/fs/store/dto/ProductAttrScrmCountDto.java

@@ -0,0 +1,22 @@
+package com.fs.store.dto;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+@Builder
+public class ProductAttrScrmCountDto {
+    private BigDecimal minPrice;
+
+    private BigDecimal minOtPrice;
+
+    private BigDecimal minCost;
+
+    private Integer stock;
+
+    private Integer minIntegral;
+}

+ 69 - 0
fs-service/src/main/java/com/fs/store/mapper/FsExpressScrmMapper.java

@@ -0,0 +1,69 @@
+package com.fs.store.mapper;
+
+import com.fs.store.domain.FsExpressScrm;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * 快递公司Mapper接口
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface FsExpressScrmMapper
+{
+    /**
+     * 查询快递公司
+     * 
+     * @param id 快递公司ID
+     * @return 快递公司
+     */
+    public FsExpressScrm selectFsExpressById(Long id);
+
+    /**
+     * 查询快递公司列表
+     * 
+     * @param fsExpress 快递公司
+     * @return 快递公司集合
+     */
+    public List<FsExpressScrm> selectFsExpressList(FsExpressScrm fsExpress);
+
+    /**
+     * 新增快递公司
+     * 
+     * @param fsExpress 快递公司
+     * @return 结果
+     */
+    public int insertFsExpress(FsExpressScrm fsExpress);
+
+    /**
+     * 修改快递公司
+     * 
+     * @param fsExpress 快递公司
+     * @return 结果
+     */
+    public int updateFsExpress(FsExpressScrm fsExpress);
+
+    /**
+     * 删除快递公司
+     * 
+     * @param id 快递公司ID
+     * @return 结果
+     */
+    public int deleteFsExpressById(Long id);
+
+    /**
+     * 批量删除快递公司
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsExpressByIds(Long[] ids);
+    @Select("select * from fs_express where code=#{code} limit limit 1 ")
+    FsExpressScrm selectFsExpressByCode(String code);
+    @Select("select * from fs_express where oms_code=#{omsCode} ")
+    FsExpressScrm selectFsExpressByOmsCode(String omsCode);
+    @Select("select * from fs_express where name=#{deliveryName} limit 1 ")
+    FsExpressScrm selectFsExpressByName(String deliveryName);
+}

+ 96 - 0
fs-service/src/main/java/com/fs/store/mapper/FsStoreCartScrmMapper.java

@@ -0,0 +1,96 @@
+package com.fs.store.mapper;
+
+import com.fs.store.domain.FsStoreCartScrm;
+import com.fs.store.param.FsStoreCartScrmCountParam;
+import com.fs.store.vo.FsStoreCartScrmQueryVO;
+import com.fs.store.vo.FsStoreCartScrmVO;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * 购物车Mapper接口
+ *
+ * @author fs
+ * @date 2022-03-21
+ */
+public interface FsStoreCartScrmMapper
+{
+    /**
+     * 查询购物车
+     *
+     * @param id 购物车ID
+     * @return 购物车
+     */
+    public FsStoreCartScrm selectFsStoreCartById(Long id);
+
+    /**
+     * 查询购物车列表
+     *
+     * @param fsStoreCart 购物车
+     * @return 购物车集合
+     */
+    public List<FsStoreCartScrm> selectFsStoreCartList(FsStoreCartScrm fsStoreCart);
+
+    /**
+     * 新增购物车
+     *
+     * @param fsStoreCart 购物车
+     * @return 结果
+     */
+    public int insertFsStoreCart(FsStoreCartScrm fsStoreCart);
+
+    /**
+     * 修改购物车
+     *
+     * @param fsStoreCart 购物车
+     * @return 结果
+     */
+    public int updateFsStoreCart(FsStoreCartScrm fsStoreCart);
+
+    /**
+     * 删除购物车
+     *
+     * @param id 购物车ID
+     * @return 结果
+     */
+    public int deleteFsStoreCartById(Long id);
+
+    /**
+     * 批量删除购物车
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsStoreCartByIds(Long[] ids);
+
+    @Select("select c.*,p.product_type,p.product_name,p.image as product_image,v.price,v.sku as product_attr_name,v.image as product_attr_image,v.stock from fs_store_cart c inner join fs_store_product p on p.product_id=c.product_id inner join fs_store_product_attr_value v on v.id=c.product_attr_value_id where c.is_pay=0 and c.is_del=0 and c.is_buy=0 and p.is_show=1 and p.is_del=0 and c.user_id= #{uid}")
+    List<FsStoreCartScrmVO> selectFsStoreCartListByUid(long uid);
+    @Delete({"<script>"+
+            "delete from fs_store_cart where id in"+
+           "<foreach collection='array' item='id' open='(' separator=',' close=')'>#{id}</foreach>"+
+            "</script>"})
+    int delCart(Long[] ids);
+    @Select("select c.*,p.cate_id,p.product_name,p.image as product_image,p.temp_id,p.product_type,v.price,v.sku as product_attr_name,v.image as product_attr_image,v.stock,v.cost,v.integral,v.weight,v.volume,v.bar_code,v.group_bar_code,v.brokerage,v.brokerage_two,v.brokerage_three from fs_store_cart c left join fs_store_product p on p.product_id=c.product_id left join fs_store_product_attr_value v on v.id=c.product_attr_value_id where find_in_set(c.id,#{ids})")
+    List<FsStoreCartScrmQueryVO> selectFsStoreCartListByIds(String ids);
+    @Update("update  fs_store_cart set is_pay=1 where find_in_set(id,#{cartIds})")
+    void updateIsPay(String cartIds);
+
+
+    @Select("select ifnull(sum(c.cart_num),0) from fs_store_cart c inner join fs_store_product p on p.product_id=c.product_id inner join fs_store_product_attr_value v on v.id=c.product_attr_value_id where c.is_pay=0 and c.is_del=0 and c.is_buy=0 and p.is_show=1 and p.is_del=0 and c.user_id= #{userId}")
+    Integer selectFsStoreCartCountByUserId(long userId);
+    @Select({"<script> " +
+            "select ifnull(sum(c.cart_num),0) from fs_store_cart c  " +
+            "where c.is_pay=0 and c.is_del=0 and c.is_buy=0 " +
+            "<if test = 'maps.userId != null     '> " +
+            "and c.user_id =#{maps.userId} " +
+            "</if>" +
+            "<if test = 'maps.productId != null    '> " +
+            "and c.product_id =#{maps.productId} " +
+            "</if>" +
+            "</script>"})
+    Integer selectFsStoreCartCount(@Param("maps") FsStoreCartScrmCountParam param);
+}

+ 228 - 0
fs-service/src/main/java/com/fs/store/mapper/FsStoreOrderItemScrmMapper.java

@@ -0,0 +1,228 @@
+package com.fs.store.mapper;
+
+import com.fs.store.domain.FsStoreOrderItemScrm;
+import com.fs.store.param.FsStoreOrderScrmParam;
+import com.fs.store.vo.FsStoreOrderItemScrmExportVO;
+import com.fs.store.vo.FsStoreOrderItemScrmVO;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * 订单详情Mapper接口
+ *
+ * @author fs
+ * @date 2022-03-21
+ */
+public interface FsStoreOrderItemScrmMapper
+{
+    /**
+     * 查询订单详情
+     *
+     * @param itemId 订单详情ID
+     * @return 订单详情
+     */
+    public FsStoreOrderItemScrm selectFsStoreOrderItemById(Long itemId);
+
+    /**
+     * 查询订单详情列表
+     *
+     * @param fsStoreOrderItem 订单详情
+     * @return 订单详情集合
+     */
+    public List<FsStoreOrderItemScrm> selectFsStoreOrderItemList(FsStoreOrderItemScrm fsStoreOrderItem);
+
+    /**
+     * 新增订单详情
+     *
+     * @param fsStoreOrderItem 订单详情
+     * @return 结果
+     */
+    public int insertFsStoreOrderItem(FsStoreOrderItemScrm fsStoreOrderItem);
+
+    /**
+     * 修改订单详情
+     *
+     * @param fsStoreOrderItem 订单详情
+     * @return 结果
+     */
+    public int updateFsStoreOrderItem(FsStoreOrderItemScrm fsStoreOrderItem);
+
+    /**
+     * 删除订单详情
+     *
+     * @param itemId 订单详情ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderItemById(Long itemId);
+
+    /**
+     * 批量删除订单详情
+     *
+     * @param itemIds 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderItemByIds(Long[] itemIds);
+
+    @Select("select * from fs_store_order_item where order_id=#{orderId}")
+    List<FsStoreOrderItemScrmVO> selectFsStoreOrderItemListByOrderId(Long orderId);
+    @Select("select * from fs_store_order_item where order_id=#{orderId}")
+    List<FsStoreOrderItemScrmVO> selectMyFsStoreOrderItemListByOrderId(Long id);
+
+    @Select({"<script> " +
+            "select i.*,o.user_id,o.status, o.real_name,o.user_phone,o.user_address,o.create_time,o.pay_time,o.delivery_sn,o.delivery_name,o.delivery_id, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber,o.upload_time ,CASE WHEN o.certificates IS NULL OR o.certificates = '' THEN 0 ELSE 1 END AS is_upload   " +
+            " ,p.title as package_name,cts.name as scheduleName from fs_store_order_item i left join fs_store_order o on o.id=i.order_id left join fs_user u on o.user_id=u.user_id  " +
+            " left join fs_store_product_package p on o.package_id=p.package_id left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id left join company_tcm_schedule cts on cts.id = o.schedule_id " +
+            "where 1=1 " +
+            "<if test = 'maps.orderCode != null and  maps.orderCode !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.orderCode},'%') " +
+            "</if>" +
+            "<if test = 'maps.deliveryId != null    '> " +
+            "and o.delivery_id =#{maps.deliveryId} " +
+            "</if>" +
+            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"     '> " +
+            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+            "</if>" +
+            "<if test = 'maps.phone != null and  maps.phone !=\"\"     '> " +
+            "and u.phone like CONCAT('%',#{maps.phone},'%') " +
+            "</if>" +
+            "<if test = 'maps.userPhone != null and  maps.userPhone !=\"\"     '> " +
+            "and o.user_phone like CONCAT('%',#{maps.userPhone},'%') " +
+            "</if>" +
+            "<if test = 'maps.status != null    '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null    '> " +
+            "and o.company_id =#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.isHealth != null and maps.isHealth !=  \"\"  '> " +
+            "and o.company_id is null " +
+            "</if>" +
+            "<if test = 'maps.notHealth != null and maps.notHealth !=  \"\"  '> " +
+            "and o.company_id is not null " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null    '> " +
+            "and o.company_user_id =#{maps.companyUserId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserNickName != null and  maps.companyUserNickName !=  \"\" '> " +
+            "and cu.nick_name like concat('%', #{maps.companyUserNickName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.orderType != null    '> " +
+            "and o.order_type =#{maps.orderType} " +
+            "</if>" +
+            "<if test = 'maps.createTimeList != null    '> " +
+            " AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.payTimeList != null    '> " +
+            " AND date_format(o.pay_time,'%y%m%d') &gt;= date_format(#{maps.payTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.pay_time,'%y%m%d') &lt;= date_format(#{maps.payTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliverySendTimeList != null    '> " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &gt;= date_format(#{maps.deliverySendTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &lt;= date_format(#{maps.deliverySendTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliveryImportTimeList != null    '> " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &gt;= date_format(#{maps.deliveryImportTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &lt;= date_format(#{maps.deliveryImportTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 0    '> " +
+            "and o.certificates is null  " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 1    '> " +
+            "and o.certificates is not null " +
+            "</if>" +
+            "<if test = 'maps.scheduleId != null    '> " +
+            "and o.schedule_id =#{maps.scheduleId} " +
+            "</if>" +
+            " order by o.id desc limit 50000"+
+            "</script>"})
+    List<FsStoreOrderItemScrmExportVO> selectFsStoreOrderItemListExportVO(@Param("maps")FsStoreOrderScrmParam fsStoreOrder);
+
+    @Select({"<script> " +
+            "select count(0) from fs_store_order_item i left join fs_store_order o on o.id=i.order_id left join fs_user u on o.user_id=u.user_id  " +
+            " left join fs_store_product_package p on o.package_id=p.package_id left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id left join company_tcm_schedule cts on cts.id = o.schedule_id " +
+            "where 1=1 " +
+            "<if test = 'maps.orderCode != null and  maps.orderCode !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.orderCode},'%') " +
+            "</if>" +
+            "<if test = 'maps.deliveryId != null    '> " +
+            "and o.delivery_id =#{maps.deliveryId} " +
+            "</if>" +
+            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"     '> " +
+            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+            "</if>" +
+            "<if test = 'maps.phone != null and  maps.phone !=\"\"     '> " +
+            "and u.phone like CONCAT('%',#{maps.phone},'%') " +
+            "</if>" +
+            "<if test = 'maps.realName != null and  maps.realName !=\"\"     '> " +
+            "and o.real_name like CONCAT('%',#{maps.realName},'%') " +
+            "</if>" +
+            "<if test = 'maps.userPhone != null and  maps.userPhone !=\"\"     '> " +
+            "and o.user_phone like CONCAT('%',#{maps.userPhone},'%') " +
+            "</if>" +
+            "<if test = 'maps.status != null    '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null    '> " +
+            "and o.company_id =#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.isHealth != null and maps.isHealth !=  \"\"  '> " +
+            "and o.company_id is null " +
+            "</if>" +
+            "<if test = 'maps.notHealth != null and maps.notHealth !=  \"\"  '> " +
+            "and o.company_id is not null " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null    '> " +
+            "and o.company_user_id =#{maps.companyUserId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserNickName != null and  maps.companyUserNickName !=  \"\" '> " +
+            "and cu.nick_name like concat('%', #{maps.companyUserNickName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.orderType != null    '> " +
+            "and o.order_type =#{maps.orderType} " +
+            "</if>" +
+            "<if test = 'maps.createTimeList != null    '> " +
+            " AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.payTimeList != null    '> " +
+            " AND date_format(o.pay_time,'%y%m%d') &gt;= date_format(#{maps.payTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.pay_time,'%y%m%d') &lt;= date_format(#{maps.payTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliverySendTimeList != null    '> " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &gt;= date_format(#{maps.deliverySendTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &lt;= date_format(#{maps.deliverySendTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliveryImportTimeList != null    '> " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &gt;= date_format(#{maps.deliveryImportTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &lt;= date_format(#{maps.deliveryImportTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 0    '> " +
+            "and o.certificates is null  " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 1    '> " +
+            "and o.certificates is not null " +
+            "</if>" +
+            "<if test = 'maps.scheduleId != null    '> " +
+            "and o.schedule_id =#{maps.scheduleId} " +
+            "</if>" +
+            " order by o.id desc "+
+            "</script>"})
+    Long itemsCount(@Param("maps")FsStoreOrderScrmParam fsStoreOrder);
+
+    @Update("update fs_store_order_item set order_code=#{orderCode} where order_id=#{orderId} ")
+    int updateFsStoreOrderCode(@Param("orderId")Long orderId, @Param("orderCode")String orderCode);
+
+    @Select("select i.* from fs_store_order o LEFT JOIN fs_store_order_item i ON o.id = i.order_id  " +
+            "where o.create_time >= '2023-10-11 00:00:00' AND o.create_time <= '2023-10-13 00:00:00' and o.status = 1 and i.json_info LIKE '%sb10324801+10104103+10104003%'  and  o.extend_order_id is null ")
+    List<FsStoreOrderItemScrm> selectOrderItem();
+
+    @Select("select id from fs_store_order where status = 1 and extend_order_id is null ")
+    List<Long> selectOrderIdByNoErp();
+
+    @Update("update fs_store_order_item set json_info=#{jsonInfo} where order_id=#{orderId} ")
+    int updateJsonInfo(FsStoreOrderItemScrm fsStoreOrderItem);
+}

+ 1035 - 0
fs-service/src/main/java/com/fs/store/mapper/FsStoreOrderScrmMapper.java

@@ -0,0 +1,1035 @@
+package com.fs.store.mapper;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fs.company.param.CompanyStatisticsParam;
+import com.fs.store.domain.FsStoreOrderItemScrm;
+import com.fs.store.domain.FsStoreOrderScrm;
+import com.fs.store.domain.Report;
+import com.fs.store.param.*;
+import com.fs.store.vo.*;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 订单Mapper接口
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface FsStoreOrderScrmMapper
+{
+    /**
+     * 查询订单
+     *
+     * @param id 订单ID
+     * @return 订单
+     */
+    public FsStoreOrderScrm selectFsStoreOrderById(Long id);
+
+    /**
+     * 查询订单列表
+     *
+     * @param fsStoreOrder 订单
+     * @return 订单集合
+     */
+    public List<FsStoreOrderScrm> selectFsStoreOrderList(FsStoreOrderScrm fsStoreOrder);
+
+    /**
+     * 新增订单
+     *
+     * @param fsStoreOrder 订单
+     * @return 结果
+     */
+    public int insertFsStoreOrder(FsStoreOrderScrm fsStoreOrder);
+
+    /**
+     * 修改订单
+     *
+     * @param fsStoreOrder 订单
+     * @return 结果
+     */
+    public int updateFsStoreOrder(FsStoreOrderScrm fsStoreOrder);
+
+    /**
+     * 删除订单
+     *
+     * @param id 订单ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderById(Long id);
+
+    /**
+     * 批量删除订单
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderByIds(Long[] ids);
+
+    @Select({"<script> " +
+            "select o.*,u.phone,u.register_code,u.register_date,u.source, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber   from fs_store_order o left join fs_user u on o.user_id=u.user_id  left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id  " +
+            "<if test = 'maps.productName != null and  maps.productName !=  \"\" '> " +
+            "left join fs_store_order_item oi on o.id = oi.order_id "+
+            "left join fs_store_product fsp on fsp.product_id = oi.product_id"+
+            "</if>" +
+            "where 1=1 " +
+            "<if test = 'maps.orderCode != null and  maps.orderCode !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.orderCode},'%') " +
+            "</if>" +
+            "<if test = 'maps.isPayRemain != null      '> " +
+            "and o.is_pay_remain =#{maps.isPayRemain} " +
+            "</if>" +
+            "<if test = 'maps.userId != null      '> " +
+            "and o.user_id =#{maps.userId} " +
+            "</if>" +
+            "<if test = 'maps.deliveryId != null  and  maps.deliveryId !=\"\"    '> " +
+            "and o.delivery_id =#{maps.deliveryId} " +
+            "</if>" +
+            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"     '> " +
+            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+            "</if>" +
+            "<if test = 'maps.realName != null and  maps.realName !=\"\"     '> " +
+            "and o.real_name like CONCAT('%',#{maps.realName},'%') " +
+            "</if>" +
+            "<if test = 'maps.phone != null and  maps.phone !=\"\"     '> " +
+            "and u.phone like CONCAT('%',#{maps.phone},'%') " +
+            "</if>" +
+            "<if test = 'maps.userPhone != null and  maps.userPhone !=\"\"     '> " +
+            "and o.user_phone like CONCAT('%',#{maps.userPhone},'%') " +
+            "</if>" +
+            "<if test = 'maps.status != null    '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 0    '> " +
+            "and o.certificates is null  " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 1    '> " +
+            "and o.certificates is not null " +
+            "</if>" +
+            "<if test = 'maps.deliveryStatus != null    '> " +
+            "and o.delivery_status =#{maps.deliveryStatus} " +
+            "</if>" +
+            "<if test = 'maps.deliveryPayStatus != null    '> " +
+            "and o.delivery_pay_status =#{maps.deliveryPayStatus} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null    '> " +
+            "and o.company_id =#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.isHealth != null and maps.isHealth !=  \"\"  '> " +
+            "and o.company_id is null " +
+            "</if>" +
+            "<if test = 'maps.notHealth != null '> " +
+            "and o.company_id is not null " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null    '> " +
+            "and o.company_user_id =#{maps.companyUserId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserNickName != null and  maps.companyUserNickName !=  \"\" '> " +
+            "and cu.nick_name like concat('%', #{maps.companyUserNickName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.productName != null and  maps.productName !=  \"\" '> " +
+            "and fsp.product_name like concat('%', #{maps.productName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.orderType != null    '> " +
+            "and o.order_type =#{maps.orderType} " +
+            "</if>" +
+            "<if test = 'maps.payType != null    '> " +
+            "and o.pay_type =#{maps.payType} " +
+            "</if>" +
+            "<if test = 'maps.scheduleId != null    '> " +
+            "and o.schedule_id =#{maps.scheduleId} " +
+            "</if>" +
+            "<if test = 'maps.createTimeList != null    '> " +
+            " AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +
+            "</if>" +
+
+            "<if test = 'maps.deliverySendTimeList != null    '> " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &gt;= date_format(#{maps.deliverySendTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &lt;= date_format(#{maps.deliverySendTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.paidStatus != null    '> " +
+            "and o.paid =#{maps.paidStatus} " +
+            "</if>" +
+            "<if test = 'maps.payTimeList != null    '> " +
+            " AND date_format(o.pay_time,'%y%m%d') &gt;= date_format(#{maps.payTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.pay_time,'%y%m%d') &lt;= date_format(#{maps.payTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliveryImportTimeList != null    '> " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &gt;= date_format(#{maps.deliveryImportTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &lt;= date_format(#{maps.deliveryImportTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deptId != null    '> " +
+            "  AND (o.dept_id = #{maps.deptId} OR o.dept_id IN ( SELECT t.dept_id FROM company_dept t WHERE find_in_set(#{maps.deptId}, ancestors) )) " +
+            "</if>" +
+            " ${maps.params.dataScope} "+
+            "<if test = 'maps.productName != null and  maps.productName !=  \"\" '> " +
+            " group by o.id "+
+            "</if>" +
+            " order by o.id desc "+
+            "</script>"})
+    List<FsStoreOrderScrmVO> selectFsStoreOrderListVO(@Param("maps")FsStoreOrderScrmParam param);
+
+
+    @Select({"<script> " +
+            "select o.*,u.phone,u.register_code,u.register_date,u.source, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber   from fs_store_order o left join fs_user u on o.user_id=u.user_id  left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id  " +
+            "<if test = 'maps.productName != null and  maps.productName !=  \"\" '> " +
+            "left join fs_store_order_item oi on o.id = oi.order_id "+
+            "left join fs_store_product fsp on fsp.product_id = oi.product_id"+
+            "</if>" +
+            "where 1=1  " +
+            "<if test = 'maps.orderCode != null and  maps.orderCode !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.orderCode},'%') " +
+            "</if>" +
+            "<if test = 'maps.isPayRemain != null      '> " +
+            "and o.is_pay_remain =#{maps.isPayRemain} " +
+            "</if>" +
+            "<if test = 'maps.orderVisit != null      '> " +
+            "and o.order_visit =#{maps.orderVisit} " +
+            "</if>" +
+            "<if test = 'maps.userId != null      '> " +
+            "and o.user_id =#{maps.userId} " +
+            "</if>" +
+            "<if test = 'maps.deliveryId != null  and  maps.deliveryId !=\"\"    '> " +
+            "and o.delivery_id =#{maps.deliveryId} " +
+            "</if>" +
+            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"     '> " +
+            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+            "</if>" +
+            "<if test = 'maps.realName != null and  maps.realName !=\"\"     '> " +
+            "and o.real_name like CONCAT('%',#{maps.realName},'%') " +
+            "</if>" +
+            "<if test = 'maps.phone != null and  maps.phone !=\"\"     '> " +
+            "and u.phone like CONCAT('%',#{maps.phone},'%') " +
+            "</if>" +
+            "<if test = 'maps.userPhone != null and  maps.userPhone !=\"\"     '> " +
+            "and o.user_phone like CONCAT('%',#{maps.userPhone},'%') " +
+            "</if>" +
+            "<if test = 'maps.status != null    '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 0    '> " +
+            "and o.certificates is null  " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 1    '> " +
+            "and o.certificates is not null " +
+            "</if>" +
+            "<if test = 'maps.deliveryStatus != null    '> " +
+            "and o.delivery_status =#{maps.deliveryStatus} " +
+            "</if>" +
+            "<if test = 'maps.deliveryPayStatus != null    '> " +
+            "and o.delivery_pay_status =#{maps.deliveryPayStatus} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null    '> " +
+            "and o.company_id =#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null    '> " +
+            "and o.company_user_id =#{maps.companyUserId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserNickName != null and  maps.companyUserNickName !=  \"\" '> " +
+            "and cu.nick_name like concat('%', #{maps.companyUserNickName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.productName != null and  maps.productName !=  \"\" '> " +
+            "and fsp.product_name like concat('%', #{maps.productName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.orderType != null    '> " +
+            "and o.order_type =#{maps.orderType} " +
+            "</if>" +
+            "<if test = 'maps.payType != null    '> " +
+            "and o.pay_type =#{maps.payType} " +
+            "</if>" +
+            "<if test = 'maps.scheduleId != null    '> " +
+            "and o.schedule_id =#{maps.scheduleId} " +
+            "</if>" +
+            "<if test = 'maps.createTimeList == null    '> " +
+            "and o.create_time >= '2023-10-01' " +
+            "</if>" +
+            "<if test = 'maps.createTimeList != null    '> " +
+            " AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +
+            "</if>" +
+
+            "<if test = 'maps.deliverySendTimeList != null    '> " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &gt;= date_format(#{maps.deliverySendTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &lt;= date_format(#{maps.deliverySendTimeList[1]},'%y%m%d') " +
+            "</if>" +
+
+            "<if test = 'maps.payTimeList != null    '> " +
+            " AND date_format(o.pay_time,'%y%m%d') &gt;= date_format(#{maps.payTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.pay_time,'%y%m%d') &lt;= date_format(#{maps.payTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliveryImportTimeList != null    '> " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &gt;= date_format(#{maps.deliveryImportTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &lt;= date_format(#{maps.deliveryImportTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deptId != null    '> " +
+            "  AND (o.dept_id = #{maps.deptId} OR o.dept_id IN ( SELECT t.dept_id FROM company_dept t WHERE find_in_set(#{maps.deptId}, ancestors) )) " +
+            "</if>" +
+            " ${maps.params.dataScope} "+
+            "<if test = 'maps.productName != null and  maps.productName !=  \"\" '> " +
+            " group by o.id "+
+            "</if>" +
+            " order by o.id desc "+
+            "</script>"})
+    List<FsStoreOrderScrmVO> selectFsStoreOrderAllListVO(@Param("maps")FsStoreOrderScrmParam param);
+
+    @Select({"<script> " +
+            "select o.*,u.phone,u.register_code,u.register_date,u.source, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber ,fp.pay_money as lastPayMoney   from fs_store_order o left join fs_user u on o.user_id=u.user_id  left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id  " +
+            " left join (select * from fs_store_payment where is_pay_remain = 1 and status = 1) fp on o.id = fp.order_id  "+
+            "<if test = 'maps.productName != null and  maps.productName !=  \"\" '> " +
+            "left join fs_store_order_item oi on o.id = oi.order_id "+
+            "left join fs_store_product fsp on fsp.product_id = oi.product_id"+
+            "</if>" +
+            "where 1=1 " +
+            "<if test = 'maps.orderCode != null and  maps.orderCode !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.orderCode},'%') " +
+            "</if>" +
+            "<if test = 'maps.isPayRemain != null      '> " +
+            "and o.is_pay_remain =#{maps.isPayRemain} " +
+            "</if>" +
+            "<if test = 'maps.userId != null      '> " +
+            "and o.user_id =#{maps.userId} " +
+            "</if>" +
+            "<if test = 'maps.deliveryId != null  and  maps.deliveryId !=\"\"    '> " +
+            "and o.delivery_id =#{maps.deliveryId} " +
+            "</if>" +
+            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"     '> " +
+            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+            "</if>" +
+            "<if test = 'maps.realName != null and  maps.realName !=\"\"     '> " +
+            "and o.real_name like CONCAT('%',#{maps.realName},'%') " +
+            "</if>" +
+            "<if test = 'maps.phone != null and  maps.phone !=\"\"     '> " +
+            "and u.phone like CONCAT('%',#{maps.phone},'%') " +
+            "</if>" +
+            "<if test = 'maps.userPhone != null and  maps.userPhone !=\"\"     '> " +
+            "and o.user_phone like CONCAT('%',#{maps.userPhone},'%') " +
+            "</if>" +
+            "<if test = 'maps.status != null    '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 0    '> " +
+            "and o.certificates is null  " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 1    '> " +
+            "and o.certificates is not null " +
+            "</if>" +
+            "<if test = 'maps.deliveryStatus != null    '> " +
+            "and o.delivery_status =#{maps.deliveryStatus} " +
+            "</if>" +
+            "<if test = 'maps.deliveryPayStatus != null    '> " +
+            "and o.delivery_pay_status =#{maps.deliveryPayStatus} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null    '> " +
+            "and o.company_id =#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.isHealth != null and maps.isHealth !=  \"\"  '> " +
+            "and o.company_id is null " +
+            "</if>" +
+            "<if test = 'maps.notHealth != null '> " +
+            "and o.company_id is not null " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null    '> " +
+            "and o.company_user_id =#{maps.companyUserId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserNickName != null and  maps.companyUserNickName !=  \"\" '> " +
+            "and cu.nick_name like concat('%', #{maps.companyUserNickName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.productName != null and  maps.productName !=  \"\" '> " +
+            "and fsp.product_name like concat('%', #{maps.productName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.orderType != null    '> " +
+            "and o.order_type =#{maps.orderType} " +
+            "</if>" +
+            "<if test = 'maps.payType != null    '> " +
+            "and o.pay_type =#{maps.payType} " +
+            "</if>" +
+            "<if test = 'maps.scheduleId != null    '> " +
+            "and o.schedule_id =#{maps.scheduleId} " +
+            "</if>" +
+            "<if test = 'maps.createTimeList != null    '> " +
+            " AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +
+            "</if>" +
+
+            "<if test = 'maps.deliverySendTimeList != null    '> " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &gt;= date_format(#{maps.deliverySendTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &lt;= date_format(#{maps.deliverySendTimeList[1]},'%y%m%d') " +
+            "</if>" +
+
+            "<if test = 'maps.payTimeList != null    '> " +
+            " AND date_format(o.pay_time,'%y%m%d') &gt;= date_format(#{maps.payTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.pay_time,'%y%m%d') &lt;= date_format(#{maps.payTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliveryImportTimeList != null    '> " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &gt;= date_format(#{maps.deliveryImportTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &lt;= date_format(#{maps.deliveryImportTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deptId != null    '> " +
+            "  AND (o.dept_id = #{maps.deptId} OR o.dept_id IN ( SELECT t.dept_id FROM company_dept t WHERE find_in_set(#{maps.deptId}, ancestors) )) " +
+            "</if>" +
+            " ${maps.params.dataScope} "+
+            "<if test = 'maps.productName != null and  maps.productName !=  \"\" '> " +
+            " group by o.id "+
+            "</if>" +
+            " order by o.id desc "+
+            "</script>"})
+    List<FsStoreOrderScrmVO> selectFsPayRemainListVO(@Param("maps")FsStoreOrderScrmParam param);
+
+    @Select({"<script> " +
+            "select f.phone as tuiNickName,o.*,u.phone,u.register_code,u.register_date,u.source, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber   from fs_store_order o left join fs_user u on o.user_id=u.user_id left join fs_user f on o.tui_user_id = f.user_id left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id  " +
+            "where 1=1 and o.tui_user_id is not null " +
+            "<if test = 'maps.orderCode != null and  maps.orderCode !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.orderCode},'%') " +
+            "</if>" +
+            "<if test = 'maps.isPayRemain != null      '> " +
+            "and o.is_pay_remain =#{maps.isPayRemain} " +
+            "</if>" +
+            "<if test = 'maps.userId != null      '> " +
+            "and o.user_id =#{maps.userId} " +
+            "</if>" +
+            "<if test = 'maps.deliveryId != null  and  maps.deliveryId !=\"\"    '> " +
+            "and o.delivery_id =#{maps.deliveryId} " +
+            "</if>" +
+            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"     '> " +
+            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+            "</if>" +
+            "<if test = 'maps.realName != null and  maps.realName !=\"\"     '> " +
+            "and o.real_name like CONCAT('%',#{maps.realName},'%') " +
+            "</if>" +
+            "<if test = 'maps.phone != null and  maps.phone !=\"\"     '> " +
+            "and u.phone like CONCAT('%',#{maps.phone},'%') " +
+            "</if>" +
+            "<if test = 'maps.userPhone != null and  maps.userPhone !=\"\"     '> " +
+            "and o.user_phone like CONCAT('%',#{maps.userPhone},'%') " +
+            "</if>" +
+            "<if test = 'maps.status != null    '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.deliveryStatus != null    '> " +
+            "and o.delivery_status =#{maps.deliveryStatus} " +
+            "</if>" +
+            "<if test = 'maps.deliveryPayStatus != null    '> " +
+            "and o.delivery_pay_status =#{maps.deliveryPayStatus} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null    '> " +
+            "and o.company_id =#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null    '> " +
+            "and o.company_user_id =#{maps.companyUserId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserNickName != null and  maps.companyUserNickName !=  \"\" '> " +
+            "and cu.nick_name like concat('%', #{maps.companyUserNickName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.orderType != null    '> " +
+            "and o.order_type =#{maps.orderType} " +
+            "</if>" +
+            "<if test = 'maps.createTimeList != null    '> " +
+            " AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +
+            "</if>" +
+
+            "<if test = 'maps.deliverySendTimeList != null    '> " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &gt;= date_format(#{maps.deliverySendTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &lt;= date_format(#{maps.deliverySendTimeList[1]},'%y%m%d') " +
+            "</if>" +
+
+            "<if test = 'maps.payTimeList != null    '> " +
+            " AND date_format(o.pay_time,'%y%m%d') &gt;= date_format(#{maps.payTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.pay_time,'%y%m%d') &lt;= date_format(#{maps.payTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliveryImportTimeList != null    '> " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &gt;= date_format(#{maps.deliveryImportTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &lt;= date_format(#{maps.deliveryImportTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deptId != null    '> " +
+            "  AND (o.dept_id = #{maps.deptId} OR o.dept_id IN ( SELECT t.dept_id FROM company_dept t WHERE find_in_set(#{maps.deptId}, ancestors) )) " +
+            "</if>" +
+            " ${maps.params.dataScope} "+
+            " order by o.id desc "+
+            "</script>"})
+    List<FsPromotionOrderScrmVO> selectFsPromotionOrderListVO(@Param("maps")FsStoreOrderScrmParam param);
+
+    @Select({"<script> " +
+            "select o.id,o.order_code,o.item_json,o.pay_price,o.status,o.is_package,o.package_json,o.delivery_id,o.finish_time  from fs_store_order o  " +
+            "where o.is_del=0 and o.is_sys_del=0 " +
+            "<if test = 'maps.status != null and maps.status != \"\"     '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.keyword != null and  maps.keyword !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.keyword},'%') " +
+            "</if>" +
+            "<if test = 'maps.deliveryStatus != null     '> " +
+            "and o.delivery_status =#{maps.deliveryStatus} " +
+            "</if>" +
+            "<if test = 'maps.userId != null     '> " +
+            "and o.user_id=#{maps.userId} " +
+            "</if>" +
+            " order by o.id desc "+
+            "</script>"})
+    List<FsMyStoreOrderScrmListQueryVO> selectFsMyStoreOrderListVO(@Param("maps")FsMyStoreOrderScrmQueryParam param);
+    @Select("select * from fs_store_order where order_code=#{orderCode}")
+    FsStoreOrderScrm selectFsStoreOrderByOrderCode(String orderCode);
+    @Update("update fs_store_order set status=-3 where id=#{orderId}")
+    int cancelOrder(Long orderId);
+    @Select({"<script> " +
+            "select o.*  from fs_store_order o  " +
+            "where o.is_del=0 and o.is_sys_del=0 " +
+            "<if test = 'maps.status != null and maps.status != \"\"     '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.keyword != null and  maps.keyword !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.keyword},'%') " +
+            "</if>" +
+            "<if test = 'maps.userId != null     '> " +
+            "and o.user_id=#{maps.userId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null     '> " +
+            "and o.company_user_id=#{maps.companyUserId} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null     '> " +
+            "and o.company_id=#{maps.companyId} " +
+            "</if>" +
+            " order by o.id desc "+
+            "</script>"})
+    List<FsMyStoreOrderScrmListQueryVO> selectFsCompanyStoreOrderListVO(@Param("maps")FsMyStoreOrderScrmQueryParam param);
+    @Select("select * from fs_store_order where extend_order_id=#{extendOrderId}")
+    FsStoreOrderScrm selectFsStoreOrderByExtendOrderId(String extendOrderId);
+    @Select({"<script> " +
+            "select b.number as tui_price,b.bill_type,b.create_time,o.id as order_id,o.order_code,o.pay_price,u.nickname,u.avatar from fs_user_bill b inner join  fs_store_order o on b.business_id=o.id left join fs_user u on u.user_id=o.user_id  " +
+            "where b.user_id=#{userId} and b.category='brokerage_price'   " +
+            " order by b.id desc"+
+            "</script>"})
+    List<FsStoreOrderScrmTuiVO> selectFsStoreOrderTuiListVO(String userId);
+    @Select({"<script> " +
+            "select ifnull(count(1),0) from fs_store_order o  " +
+            "where o.user_id=#{uid} and o.package_id=#{packageId} and o.status &lt;&gt; -3 " +
+            "</script>"})
+    int checkPackageOrderCount(@Param("uid") long uid, @Param("packageId")String packageId);
+    @Select({"<script> " +
+            "select ifnull(count(1),0) from fs_store_order o  " +
+            "where o.user_id=#{userId}  and o.status =#{status} " +
+            "</script>"})
+    int selectFsStoreOrderCount(@Param("userId")long userId,@Param("status")int status);
+
+    @Select({"<script> " +
+            "select * from fs_store_order o  " +
+            "where o.delivery_id=#{deliveryId}  limit 1 " +
+            "</script>"})
+    FsStoreOrderScrm selectFsStoreOrderByDeliveryId(@Param("deliveryId")String deliveryId);
+    @Select({"<script> " +
+            "select o.*,u.nickname,u.phone,u.register_code,u.register_date,u.source, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber   from fs_store_order o left join fs_user u on o.user_id=u.user_id  left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id  " +
+            "where 1=1 " +
+            "<if test = 'orderCode != null '> " +
+            "and o.order_code = #{orderCode} " +
+            "</if>" +
+            "</script>"})
+    FsStoreOrderScrmVO selectFsStoreOrderVOByOrderCode(@Param("orderCode") String orderCode);
+
+    Long selectFsStoreOrderTotalCount(@Param("type")int type,@Param("companyId")Long companyId,@Param("companyUserId")Long companyUserId);
+    @Select({"<script> " +
+            "select o.id as orderid ,o.order_code as order_code,o.create_time as orderdate,o.total_price as amount,o.real_name as customername,o.user_phone as tel,o.user_address as address,o.delivery_name as express,o.delivery_id as packageno   from fs_store_order o  " +
+            "where o.is_del=0 and o.is_sys_del=0 " +
+            "<if test = 'maps.companyId != null     '> " +
+            "and o.company_id =#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.startTime != null and maps.startTime != \"\"   '> " +
+            " AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.startTime},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.endTime != null and maps.endTime != \"\"   '> " +
+            " AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.endTime},'%y%m%d') " +
+            "</if>" +
+            " order by o.id desc "+
+            "</script>"})
+    List<OrderScrmListVO> selectCompanyStoreOrderListAPI(@Param("maps") OrderScrmListParam param);
+    @Select({"<script> " +
+            "select o.*  from fs_store_order o  " +
+            "where o.is_del=0 and o.is_sys_del=0 and o.status=3 " +
+            "and o.company_id =#{companyId} " +
+            "</script>"})
+    List<FsStoreOrderScrm> selectFsStoreOrderByCompanyId(@Param("companyId")Long companyId);
+    @Select({"<script> " +
+            "select * from fs_store_order o  " +
+            "where o.delivery_id=#{deliveryId} " +
+            "</script>"})
+    List<FsStoreOrderScrm> selectFsStoreOrderListByDeliveryId( @Param("deliveryId") String deliveryId);
+    @Select({"<script> " +
+            "select ifnull(count(1),0) from fs_store_order o  " +
+            "where o.company_id=#{companyId} and company_user_id=#{userId} " +
+            "<if test = 'type==1   '> " +
+            " AND date_format(o.create_time,'%y%m%d') = date_format(now(),'%y%m%d') " +
+            "</if>" +
+            "<if test = 'type==2   '> " +
+            " AND o.status=0 " +
+            "</if>" +
+            "</script>"})
+    Integer selectFsStoreOrderCountByType(@Param("companyId") Long companyId,@Param("userId") long userId, @Param("type")int type);
+    @Select({"<script> " +
+            "select o.*  from fs_store_order o  " +
+            "where o.is_del=0 and o.is_sys_del=0 and o.status &gt; 0 " +
+            "<if test = 'maps.userId != null     '> " +
+            "and o.user_id=#{maps.userId} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null     '> " +
+            "and o.company_id=#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.customerId != null     '> " +
+            "and o.customer_id=#{maps.customerId} " +
+            "</if>" +
+            "<if test = 'maps.userId != null     '> " +
+            "and o.user_id=#{maps.userId} " +
+            "</if>" +
+            " order by o.id desc "+
+            "</script>"})
+    List<FsCustomerStoreOrderScrmListQueryVO> selectFsCustomerStoreOrderListQuery(@Param("maps") FsCustomerStoreOrderScrmListQueryParam param);
+
+    List<JSONObject> selectFsStoreOrderCounts(Map<String, Object> toMap);
+
+    @Select({"<script> " +
+            "select u.nick_name, count(o.id) as order_count,sum(IFNULL(o.pay_price,0)) as pay_price  from  fs_store_order o left join company_user u on o.company_user_id=u.user_id  " +
+            "where o.status &gt; 0 " +
+            "<if test = 'maps.type != null and maps.type ==1 '> " +
+            "and TO_DAYS(o.create_time) = TO_DAYS(NOW()) " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==2 '> " +
+            "and TO_DAYS(NOW()) - TO_DAYS(o.create_time) &lt;= 1 " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==3 '> " +
+            "and YEARWEEK(DATE_FORMAT(o.create_time,'%Y-%m-%d')) = YEARWEEK(NOW()) " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==4 '> " +
+            "and YEARWEEK(DATE_FORMAT(o.create_time,'%Y-%m-%d')) = YEARWEEK(NOW())-1 " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==5 '> " +
+            "and DATE_FORMAT(o.create_time,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m') " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==6 '> " +
+            "and PERIOD_DIFF(DATE_FORMAT(NOW(),'%Y%m'),DATE_FORMAT(o.create_time,'%Y%m')) = 1 " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==7 '> " +
+            "and QUARTER(o.create_time) = QUARTER(NOW()) " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==8 '> " +
+            "and QUARTER(o.create_time) = QUARTER(DATE_SUB(NOW(),INTERVAL 1 QUARTER)) " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==9 '> " +
+            "and YEAR(o.create_time)=YEAR(NOW()) " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==10 '> " +
+            "and  YEAR(o.create_time) = YEAR(DATE_SUB(NOW(),INTERVAL 1 YEAR))" +
+            "</if>" +
+            "<if test = 'maps.startTime != null and maps.startTime != \"\" '> " +
+            "AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.startTime},'%y%m%d')"+
+            "</if>" +
+            "<if test = 'maps.endTime != null and maps.endTime != \"\" '> " +
+            "AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.endTime},'%y%m%d')"+
+            "</if>" +
+            "and  o.`company_user_id` IN " +
+            "<foreach  item='item' index='index' collection='maps.users' open='(' separator=',' close=')'> #{item}    </foreach>"+
+            " group by o.company_user_id "+
+            "</script>"})
+    List<FsStoreOrderScrmStatisticsVO> selectFsStoreOrderStatisticsList(@Param("maps") FsStoreScrmStatisticsParam param);
+
+    @Select("select * from fs_store_order where status=3 and tui_user_id > 0 and tui_user_money_status !=1 and DATE_ADD(finish_time,INTERVAL 7 DAY)  > now() ")
+    List<FsStoreOrderScrm> selectFsStoreOrderListByFinish7Day();
+
+    @Select({"<script> " +
+            "select o.*,cts.name as scheduleName,u.nickname,u.phone,cc.push_code,cc.create_time as customer_create_time,cc.source,cc.customer_code, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber ,p.title as package_title ,CASE WHEN o.certificates IS NULL OR o.certificates = '' THEN 0 ELSE 1 END AS is_upload  " +
+            " from fs_store_order o  left JOIN fs_store_product_package p on o.package_id=p.package_id left join fs_user u on o.user_id=u.user_id  " +
+            " left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id left join crm_customer cc on cc.customer_id=o.customer_id left join company_tcm_schedule cts on cts.id = o.schedule_id " +
+            "where 1=1 " +
+            "<if test = 'maps.orderCode != null and  maps.orderCode !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.orderCode},'%') " +
+            "</if>" +
+            "<if test = 'maps.userId != null      '> " +
+            "and o.user_id =#{maps.userId} " +
+            "</if>" +
+            "<if test = 'maps.deliveryId != null  and  maps.deliveryId !=\"\"    '> " +
+            "and o.delivery_id =#{maps.deliveryId} " +
+            "</if>" +
+            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"     '> " +
+            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+            "</if>" +
+            "<if test = 'maps.realName != null and  maps.realName !=\"\"     '> " +
+            "and o.real_name like CONCAT('%',#{maps.realName},'%') " +
+            "</if>" +
+            "<if test = 'maps.phone != null and  maps.phone !=\"\"     '> " +
+            "and u.phone like CONCAT('%',#{maps.phone},'%') " +
+            "</if>" +
+            "<if test = 'maps.userPhone != null and  maps.userPhone !=\"\"     '> " +
+            "and o.user_phone like CONCAT('%',#{maps.userPhone},'%') " +
+            "</if>" +
+            "<if test = 'maps.status != null    '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.deliveryStatus != null    '> " +
+            "and o.delivery_status =#{maps.deliveryStatus} " +
+            "</if>" +
+            "<if test = 'maps.deliveryPayStatus != null    '> " +
+            "and o.delivery_pay_status =#{maps.deliveryPayStatus} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null    '> " +
+            "and o.company_id =#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.isHealth != null and maps.isHealth !=  \"\"  '> " +
+            "and o.company_id is null " +
+            "</if>" +
+            "<if test = 'maps.notHealth != null and maps.notHealth !=  \"\"  '> " +
+            "and o.company_id is not null " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null    '> " +
+            "and o.company_user_id =#{maps.companyUserId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserNickName != null and  maps.companyUserNickName !=  \"\" '> " +
+            "and cu.nick_name like concat('%', #{maps.companyUserNickName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.orderType != null    '> " +
+            "and o.order_type =#{maps.orderType} " +
+            "</if>" +
+            "<if test = 'maps.payType != null    '> " +
+            "and o.pay_type =#{maps.payType} " +
+            "</if>" +
+            "<if test = 'maps.createTimeList != null    '> " +
+            " AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.payTimeList != null    '> " +
+            " AND date_format(o.pay_time,'%y%m%d') &gt;= date_format(#{maps.payTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.pay_time,'%y%m%d') &lt;= date_format(#{maps.payTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliverySendTimeList != null    '> " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &gt;= date_format(#{maps.deliverySendTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_send_time,'%y%m%d') &lt;= date_format(#{maps.deliverySendTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliveryImportTimeList != null    '> " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &gt;= date_format(#{maps.deliveryImportTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &lt;= date_format(#{maps.deliveryImportTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deptId != null    '> " +
+            "  AND (o.dept_id = #{maps.deptId} OR o.dept_id IN ( SELECT t.dept_id FROM company_dept t WHERE find_in_set(#{maps.deptId}, ancestors) )) " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 0    '> " +
+            "and o.certificates is null  " +
+            "</if>" +
+            "<if test = 'maps.scheduleId != null    '> " +
+            "and o.schedule_id =#{maps.scheduleId} " +
+            "</if>" +
+            "<if test = 'maps.isUpload != null and maps.isUpload == 1    '> " +
+            "and o.certificates is not null " +
+            "</if>" +
+            " ${maps.params.dataScope} "+
+            " order by o.id desc limit 50000"+
+            "</script>"})
+    List<FsStoreOrderScrmExportVO> selectFsStoreOrderListVOByExport(@Param("maps") FsStoreOrderScrmParam param);
+
+    @Select({"<script> " +
+            "select o.*, " +
+            "u.nickname,u.phone,cc.push_code,cc.create_time as customer_create_time,cc.source,cc.customer_code, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber ,p.title as package_title " +
+            " from fs_store_order o  left JOIN fs_store_product_package p on o.package_id=p.package_id left join fs_user u on o.user_id=u.user_id  " +
+            " left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id left join crm_customer cc on cc.customer_id=o.customer_id " +
+            "where 1=1 " +
+            "<if test = 'maps.orderCode != null and  maps.orderCode !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.orderCode},'%') " +
+            "</if>" +
+            "<if test = 'maps.userId != null      '> " +
+            "and o.user_id =#{maps.userId} " +
+            "</if>" +
+            "<if test = 'maps.deliveryId != null  and  maps.deliveryId !=\"\"    '> " +
+            "and o.delivery_id =#{maps.deliveryId} " +
+            "</if>" +
+            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"     '> " +
+            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+            "</if>" +
+            "<if test = 'maps.phone != null and  maps.phone !=\"\"     '> " +
+            "and u.phone like CONCAT('%',#{maps.phone},'%') " +
+            "</if>" +
+            "<if test = 'maps.userPhone != null and  maps.userPhone !=\"\"     '> " +
+            "and o.user_phone like CONCAT('%',#{maps.userPhone},'%') " +
+            "</if>" +
+            "<if test = 'maps.status != null    '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.deliveryStatus != null    '> " +
+            "and o.delivery_status =#{maps.deliveryStatus} " +
+            "</if>" +
+            "<if test = 'maps.deliveryPayStatus != null    '> " +
+            "and o.delivery_pay_status =#{maps.deliveryPayStatus} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null    '> " +
+            "and o.company_id =#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.isHealth != null and maps.isHealth !=  \"\"  '> " +
+            "and o.company_id is null " +
+            "</if>" +
+            "<if test = 'maps.notHealth != null and maps.notHealth !=  \"\"  '> " +
+            "and o.company_id is not null " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null    '> " +
+            "and o.company_user_id =#{maps.companyUserId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserNickName != null and  maps.companyUserNickName !=  \"\" '> " +
+            "and cu.nick_name like concat('%', #{maps.companyUserNickName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.orderType != null    '> " +
+            "and o.order_type =#{maps.orderType} " +
+            "</if>" +
+            "<if test = 'maps.payType != null    '> " +
+            "and o.pay_type =#{maps.payType} " +
+            "</if>" +
+            "<if test = 'maps.createTimeList != null    '> " +
+            " AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.payTimeList != null    '> " +
+            " AND date_format(o.pay_time,'%y%m%d') &gt;= date_format(#{maps.payTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.pay_time,'%y%m%d') &lt;= date_format(#{maps.payTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliveryImportTimeList != null    '> " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &gt;= date_format(#{maps.deliveryImportTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &lt;= date_format(#{maps.deliveryImportTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deptId != null    '> " +
+            "  AND (o.dept_id = #{maps.deptId} OR o.dept_id IN ( SELECT t.dept_id FROM company_dept t WHERE find_in_set(#{maps.deptId}, ancestors) )) " +
+            "</if>" +
+            " ${maps.params.dataScope} "+
+            " order by o.id desc"+
+            "</script>"})
+    List<FsStoreOrderScrmPromotionExportVO> selectFsPromotionOrderListVOByExport(@Param("maps") FsStoreOrderScrmParam param);
+
+    @Select("select o.order_id,sum(p.brokerage * o.num) as brokerage,sum(p.brokerage_two * o.num) as brokerage_two, " +
+            "sum(p.brokerage_three * o.num) as brokerage_three from fs_store_order_item o " +
+            "left join fs_store_product_attr_value p on o.product_id = p.product_id where o.order_id = #{orderId}")
+    FsStoreOrderScrmBrokerageVO selectBrokerage(Long orderId);
+
+    @Select({"<script> " +
+            "select o.*,fp.pay_money as lastPayMoney,u.nickname,u.phone,cc.push_code,cc.create_time as customer_create_time,cc.source,cc.customer_code, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber ,p.title as package_title " +
+            " from fs_store_order o  left JOIN fs_store_product_package p on o.package_id=p.package_id left join fs_user u on o.user_id=u.user_id  " +
+            " left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id left join crm_customer cc on cc.customer_id=o.customer_id left join (select * from fs_store_payment where is_pay_remain != 0 and status != 0) fp on o.id = fp.order_id " +
+            "where 1=1 " +
+            "<if test = 'maps.isPayRemain != null     '> " +
+            "and o.is_pay_remain = #{maps.isPayRemain} " +
+            "</if>" +
+            "<if test = 'maps.orderCode != null and  maps.orderCode !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.orderCode},'%') " +
+            "</if>" +
+            "<if test = 'maps.userId != null      '> " +
+            "and o.user_id =#{maps.userId} " +
+            "</if>" +
+            "<if test = 'maps.deliveryId != null  and  maps.deliveryId !=\"\"    '> " +
+            "and o.delivery_id =#{maps.deliveryId} " +
+            "</if>" +
+            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"     '> " +
+            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+            "</if>" +
+            "<if test = 'maps.phone != null and  maps.phone !=\"\"     '> " +
+            "and u.phone like CONCAT('%',#{maps.phone},'%') " +
+            "</if>" +
+            "<if test = 'maps.userPhone != null and  maps.userPhone !=\"\"     '> " +
+            "and o.user_phone like CONCAT('%',#{maps.userPhone},'%') " +
+            "</if>" +
+            "<if test = 'maps.status != null    '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.deliveryStatus != null    '> " +
+            "and o.delivery_status =#{maps.deliveryStatus} " +
+            "</if>" +
+            "<if test = 'maps.deliveryPayStatus != null    '> " +
+            "and o.delivery_pay_status =#{maps.deliveryPayStatus} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null    '> " +
+            "and o.company_id =#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null    '> " +
+            "and o.company_user_id =#{maps.companyUserId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserNickName != null and  maps.companyUserNickName !=  \"\" '> " +
+            "and cu.nick_name like concat('%', #{maps.companyUserNickName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.orderType != null    '> " +
+            "and o.order_type =#{maps.orderType} " +
+            "</if>" +
+            "<if test = 'maps.createTimeList != null    '> " +
+            " AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.payTimeList != null    '> " +
+            " AND date_format(o.pay_time,'%y%m%d') &gt;= date_format(#{maps.payTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.pay_time,'%y%m%d') &lt;= date_format(#{maps.payTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliveryImportTimeList != null    '> " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &gt;= date_format(#{maps.deliveryImportTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &lt;= date_format(#{maps.deliveryImportTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deptId != null    '> " +
+            "  AND (o.dept_id = #{maps.deptId} OR o.dept_id IN ( SELECT t.dept_id FROM company_dept t WHERE find_in_set(#{maps.deptId}, ancestors) )) " +
+            "</if>" +
+            " ${maps.params.dataScope} "+
+            " order by o.id desc "+
+            "</script>"})
+    List<FsStorePayRemainOrderScrmExportVO> selectFsStorePayRemainOrderListVOByExport(@Param("maps") FsStoreOrderScrmParam param);
+
+    @Select({"<script> " +
+            "select o.*,u.nickname,u.phone,u.register_code,u.register_date,u.source, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber   from fs_store_order o left join fs_user u on o.user_id=u.user_id  left join company c on c.company_id=o.company_id left join company_user cu on cu.user_id=o.company_user_id  " +
+            "where o.customer_id=#{maps.customerId} " +
+            "<if test = 'maps.orderCode != null and  maps.orderCode !=\"\"    '> " +
+            "and o.order_code like CONCAT('%',#{maps.orderCode},'%') " +
+            "</if>" +
+            "<if test = 'maps.deliveryId != null  and  maps.deliveryId !=\"\"    '> " +
+            "and o.delivery_id =#{maps.deliveryId} " +
+            "</if>" +
+            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"     '> " +
+            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+            "</if>" +
+            "<if test = 'maps.phone != null and  maps.phone !=\"\"     '> " +
+            "and u.phone like CONCAT('%',#{maps.phone},'%') " +
+            "</if>" +
+            "<if test = 'maps.userPhone != null and  maps.userPhone !=\"\"     '> " +
+            "and o.user_phone like CONCAT('%',#{maps.userPhone},'%') " +
+            "</if>" +
+            "<if test = 'maps.status != null    '> " +
+            "and o.status =#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.deliveryStatus != null    '> " +
+            "and o.delivery_status =#{maps.deliveryStatus} " +
+            "</if>" +
+            "<if test = 'maps.deliveryPayStatus != null    '> " +
+            "and o.delivery_pay_status =#{maps.deliveryPayStatus} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null    '> " +
+            "and o.company_id =#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null    '> " +
+            "and o.company_user_id =#{maps.companyUserId} " +
+            "</if>" +
+            "<if test = 'maps.companyUserNickName != null and  maps.companyUserNickName !=  \"\" '> " +
+            "and cu.nick_name like concat('%', #{maps.companyUserNickName}, '%') " +
+            "</if>" +
+            "<if test = 'maps.orderType != null    '> " +
+            "and o.order_type =#{maps.orderType} " +
+            "</if>" +
+            "<if test = 'maps.createTimeList != null    '> " +
+            " AND date_format(o.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.payTimeList != null    '> " +
+            " AND date_format(o.pay_time,'%y%m%d') &gt;= date_format(#{maps.payTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.pay_time,'%y%m%d') &lt;= date_format(#{maps.payTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deliveryImportTimeList != null    '> " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &gt;= date_format(#{maps.deliveryImportTimeList[0]},'%y%m%d') " +
+            " AND date_format(o.delivery_import_time,'%y%m%d') &lt;= date_format(#{maps.deliveryImportTimeList[1]},'%y%m%d') " +
+            "</if>" +
+            "<if test = 'maps.deptId != null    '> " +
+            "  AND (o.dept_id = #{maps.deptId} OR o.dept_id IN ( SELECT t.dept_id FROM company_dept t WHERE find_in_set(#{maps.deptId}, ancestors) )) " +
+            "</if>" +
+            " ${maps.params.dataScope} "+
+            " order by o.id desc "+
+            "</script>"})
+    List<FsStoreOrderScrmVO> selectFsCustomerStoreOrderListVO(@Param("maps")FsStoreOrderScrmParam param);
+
+    @Update("update fs_store_order set upload_time= #{uploadTime},certificates =#{certificates} where id = #{id}")
+    int uploadCredentials(FsStoreOrderScrm order);
+
+    @Select("select certificates from fs_store_order where id = #{id} ")
+    String getCredentialsById(Long id);
+    @Select("select id from fs_store_order where extend_order_id is  null and status=1 and create_time > #{startTime} ")
+    List<Long> selectFsStoreOrderToPushByIds(@Param("startTime")String startTime);
+
+    @Select(" SELECT * from fs_store_order WHERE order_create_type<>2 and item_json is NULL ORDER BY id DESC  LIMIT 30")
+    List<FsStoreOrderScrm> selectFsStoreOrderItemJson();
+
+    @Update(" update fs_store_order set item_json= #{itemJson} where id=#{id} ")
+    int uploadItemJson(FsStoreOrderScrm order);
+
+    @Select("select extend_order_id from fs_store_order where create_time >= '2023-09-18 00:00:00' AND create_time <= '2023-09-19 00:00:00' and extend_order_id is not null and status = 1 ")
+    List<String> selectErpCode();
+
+    @Update("update fs_store_order set delivery_id = #{deliveryId},status = #{status}  where extend_order_id =#{extendOrderId} ")
+    void updateDelivery(FsStoreOrderScrm fsStoreOrder);
+
+
+    @Select("select id from fs_store_order where create_time >= '2023-08-01 00:00:00' AND create_time <= '2023-09-01 00:00:00'  and status = 3 and delivery_status != 3  ")
+    List<Long> selectOrderId();
+
+    @Update("update fs_store_order set status = #{status}  where order_code =#{orderCode}")
+    void updateDeliveryStatus(FsStoreOrderScrm fsStoreOrder);
+
+    @Select("select id from fs_store_order where status = 2  and DATE(pay_time)>='2023-11-1' and DATE(create_time)<='2024-2-7' and company_id is null ")
+    List<Long> selectSyncExpressIds();
+
+
+    List<Long> selectAddTuiMoney();
+
+    @Select("select * from fs_store_order where delivery_type = 406 and pay_money <=1 and status = 2 and delivery_pay_status is null and pay_type != 3 ")
+    List<FsStoreOrderScrm> selectPayMoneyLessOne();
+
+    @Select("select * from fs_store_order_item where order_id = #{orderId}")
+    List<FsStoreOrderItemScrm> selectOrderItem(Long orderId);
+
+
+    @Select({"<script> " +
+            "select count(1) as tuiMoneyCount ,sum(IFNULL(l.tui_money,0)) as tuiMoney,u.nick_name as  nickName from  fs_store_order l left join company_user u on l.company_user_id=u.user_id  " +
+            "where l.status>0  " +
+            "<if test = 'maps.type != null and maps.type ==1 '> " +
+            "and TO_DAYS(l.create_time) = TO_DAYS(NOW()) " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==2 '> " +
+            "and TO_DAYS(NOW()) - TO_DAYS(l.create_time) &lt;= 1 " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==3 '> " +
+            "and YEARWEEK(DATE_FORMAT(l.create_time,'%Y-%m-%d')) = YEARWEEK(NOW()) " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==4 '> " +
+            "and YEARWEEK(DATE_FORMAT(l.create_time,'%Y-%m-%d')) = YEARWEEK(NOW())-1 " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==5 '> " +
+            "and DATE_FORMAT(l.create_time,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m') " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==6 '> " +
+            "and PERIOD_DIFF(DATE_FORMAT(NOW(),'%Y%m'),DATE_FORMAT(l.create_time,'%Y%m')) = 1 " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==7 '> " +
+            "and QUARTER(l.create_time) = QUARTER(NOW()) " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==8 '> " +
+            "and QUARTER(l.create_time) = QUARTER(DATE_SUB(NOW(),INTERVAL 1 QUARTER)) " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==9 '> " +
+            "and YEAR(l.create_time)=YEAR(NOW()) " +
+            "</if>" +
+            "<if test = 'maps.type != null and maps.type ==10 '> " +
+            "and  YEAR(l.create_time) = YEAR(DATE_SUB(NOW(),INTERVAL 1 YEAR))" +
+            "</if>" +
+            "and  l.company_user_id IN " +
+            "<foreach  item='item' index='index' collection='maps.users' open='(' separator=',' close=')'> #{item}    </foreach>"+
+            " group by l.company_user_id order by tuiMoney desc"+
+            "</script>"})
+    List<CompanyTuiMoneyStatisticsVO> selectSoreTuiMoneyStatisticsList(@Param("maps")CompanyStatisticsParam param);
+
+    List<JSONObject> selectTuiMoneyCounts(Map<String, Object> map);
+
+    @Select("select * from fs_store_order where user_id = #{userId} limit 1")
+    FsStoreOrderScrm selectOrderByUserIdLimit1(Long userId);
+
+    List<FsStoreOrderScrm> selectFsStoreOrderStatisticsByUserId(@Param("ids") List<Long> ids);
+
+    @Select("select id from fs_store_order WHERE `status`= 1  and  extend_order_id is null ")
+    List<Long> selectFsStoreOrderNoCreateOms();
+
+    @Select("select * from fs_store_order where status = 1 and extend_order_id is not null and delivery_id is null ")
+    List<FsStoreOrderScrm> selectUpdateExpress();
+
+    @Select("select fso.id from fs_store_order fso inner join fs_store_order_audit fsoa on fsoa.order_id = fso.id where fso.`status`= 1 and fso.extend_order_id is null and fsoa.audit_status = 4")
+    List<Long> selectFsStoreOrderNoCreateOmsAndReviewed();
+
+    List<Report> selectOrderByCustomerIds(@Param("map") ReportParam param);
+
+    int selectFsStoreOrderCount(FsStoreOrderScrmStatisticsParam param);
+
+    BigDecimal selectFsStoreOrderByPayPriceCount(FsStoreOrderScrmStatisticsParam param);
+}

+ 62 - 0
fs-service/src/main/java/com/fs/store/mapper/FsStoreOrderStatusScrmMapper.java

@@ -0,0 +1,62 @@
+package com.fs.store.mapper;
+
+import com.fs.store.domain.FsStoreOrderStatusScrm;
+
+import java.util.List;
+
+/**
+ * 订单操作记录Mapper接口
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface FsStoreOrderStatusScrmMapper
+{
+    /**
+     * 查询订单操作记录
+     * 
+     * @param id 订单操作记录ID
+     * @return 订单操作记录
+     */
+    public FsStoreOrderStatusScrm selectFsStoreOrderStatusById(Long id);
+
+    /**
+     * 查询订单操作记录列表
+     * 
+     * @param fsStoreOrderStatus 订单操作记录
+     * @return 订单操作记录集合
+     */
+    public List<FsStoreOrderStatusScrm> selectFsStoreOrderStatusList(FsStoreOrderStatusScrm fsStoreOrderStatus);
+
+    /**
+     * 新增订单操作记录
+     * 
+     * @param fsStoreOrderStatus 订单操作记录
+     * @return 结果
+     */
+    public int insertFsStoreOrderStatus(FsStoreOrderStatusScrm fsStoreOrderStatus);
+
+    /**
+     * 修改订单操作记录
+     * 
+     * @param fsStoreOrderStatus 订单操作记录
+     * @return 结果
+     */
+    public int updateFsStoreOrderStatus(FsStoreOrderStatusScrm fsStoreOrderStatus);
+
+    /**
+     * 删除订单操作记录
+     * 
+     * @param id 订单操作记录ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderStatusById(Long id);
+
+    /**
+     * 批量删除订单操作记录
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderStatusByIds(Long[] ids);
+}

+ 134 - 0
fs-service/src/main/java/com/fs/store/mapper/FsStoreProductAttrValueScrmMapper.java

@@ -0,0 +1,134 @@
+package com.fs.store.mapper;
+
+import com.fs.store.domain.FsStoreProductAttrValueScrm;
+import com.fs.store.param.FsProductAttrValueScrmParam;
+import com.fs.store.param.FsStoreProductAttrValueScrmQueryParam;
+import com.fs.store.param.FsStoreTuiProductAttrValueScrmParam;
+import com.fs.store.vo.FsStoreProductAttrValueScrmQueryVO;
+import com.fs.store.vo.FsStoreProductAttrValueScrmVO;
+import com.fs.store.vo.FsStoreTuiProductAttrValueScrmVO;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * 商品属性值Mapper接口
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface FsStoreProductAttrValueScrmMapper
+{
+    /**
+     * 查询商品属性值
+     *
+     * @param id 商品属性值ID
+     * @return 商品属性值
+     */
+        public FsStoreProductAttrValueScrm selectFsStoreProductAttrValueById(Long id);
+
+    /**
+     * 查询商品属性值列表
+     *
+     * @param fsStoreProductAttrValue 商品属性值
+     * @return 商品属性值集合
+     */
+    public List<FsStoreProductAttrValueScrm> selectFsStoreProductAttrValueList(FsStoreProductAttrValueScrm fsStoreProductAttrValue);
+
+    /**
+     * 新增商品属性值
+     *
+     * @param fsStoreProductAttrValue 商品属性值
+     * @return 结果
+     */
+    public int insertFsStoreProductAttrValue(FsStoreProductAttrValueScrm fsStoreProductAttrValue);
+
+    /**
+     * 修改商品属性值
+     *
+     * @param fsStoreProductAttrValue 商品属性值
+     * @return 结果
+     */
+    public int updateFsStoreProductAttrValue(FsStoreProductAttrValueScrm fsStoreProductAttrValue);
+
+    /**
+     * 删除商品属性值
+     *
+     * @param id 商品属性值ID
+     * @return 结果
+     */
+    public int deleteFsStoreProductAttrValueById(Long id);
+
+    /**
+     * 批量删除商品属性值
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsStoreProductAttrValueByIds(Long[] ids);
+    @Delete("delete from fs_store_product_attr_value where product_id=#{productId}")
+    int deleteFsStoreProductAttrValueByProductId(Long productId);
+    @Select("select * from fs_store_product_attr_value where  product_id=#{productId}")
+    List<FsStoreProductAttrValueScrm> selectFsStoreProductAttrValueByProductId(Long productId);
+    @Select("select ifnull(stock,0) from fs_store_product_attr_value where  id=#{productAttrValueId}")
+    int selectFsStoreProductStockById(Long productAttrValueId);
+
+    @Update("update fs_store_product_attr_value set stock=stock-#{num},sales=sales+#{num}" +
+            " where id=#{productAttrValueId} and stock >= #{num} ")
+    int decProductAttrStock(@Param("productAttrValueId")Long productAttrValueId, @Param("num") Integer cartNum);
+    @Update("update fs_store_product_attr_value set stock=stock+#{num}, sales=sales-#{num}" +
+            " where product_id=#{productId} and id=#{productAttrValueId}")
+    int incProductAttrStock(@Param("num")Long num,@Param("productId") Long productId,@Param("productAttrValueId") Long productAttrValueId);
+    @Select({"<script> " +
+            "select v.*,p.product_name,p.product_type,c.cate_name  from fs_store_product_attr_value v inner join fs_store_product p on p.product_id=v.product_id left join fs_store_product_category c on c.cate_id=p.cate_id   " +
+            "where 1=1 and v.bar_code is not null " +
+            "<if test = 'maps.productName != null and  maps.productName !=\"\"    '> " +
+            "and p.product_name like CONCAT('%',#{maps.productName},'%') " +
+            "</if>" +
+            "<if test = 'maps.productType != null    '> " +
+            "and p.product_type = #{maps.productType}  " +
+            "</if>" +
+            "<if test = 'maps.cateId != null    '> " +
+            "and (p.cate_id =#{maps.cateId} or c.pid=#{maps.cateId} )" +
+            "</if>" +
+
+            "<if test = 'maps.isShow != null    '> " +
+            "and p.is_show = #{maps.isShow}  " +
+            "</if>" +
+
+            "<if test = 'maps.companyId != null    '> " +
+            "and find_in_set(#{maps.companyId},p.company_ids)  " +
+            "</if>" +
+
+            " order by v.id desc "+
+            "</script>"})
+    List<FsStoreProductAttrValueScrmVO> selectFsStoreProductAttrValueListVO(@Param("maps")FsProductAttrValueScrmParam param);
+    @Select({"<script> " +
+            "select v.*,p.product_name from fs_store_product_attr_value v inner join fs_store_product p on p.product_id=v.product_id    " +
+            "where p.is_show=1 and p.is_display=1 and (v.brokerage &gt;0 || v.brokerage_two &gt;0) " +
+            "<if test = 'maps.productName != null and  maps.productName !=\"\"    '> " +
+            "and p.product_name like CONCAT('%',#{maps.productName},'%') " +
+            "</if>" +
+            "<if test = 'maps.tuiCateId != null and maps.tuiCateId !=0    '> " +
+            "and p.tui_cate_id =#{maps.tuiCateId} " +
+            "</if>" +
+            " order by v.id desc "+
+            "</script>"})
+    List<FsStoreProductAttrValueScrmQueryVO> selectStoreProductAttrValueListQuery(@Param("maps")FsStoreProductAttrValueScrmQueryParam param);
+
+    @Select({"<script> " +
+            "select v.*,p.tui_cate_id,p.product_name from fs_store_product_attr_value v inner join fs_store_product p on p.product_id=v.product_id    " +
+            "where p.is_show=1 and p.is_display=1 and (v.brokerage &gt;0 || v.brokerage_two &gt;0) " +
+            "<if test = 'maps.productName != null and  maps.productName !=\"\"    '> " +
+            "and p.product_name like CONCAT('%',#{maps.productName},'%') " +
+            "</if>" +
+            "<if test = 'maps.tuiCateId != null and maps.tuiCateId !=0    '> " +
+            "and p.tui_cate_id =#{maps.tuiCateId} " +
+            "</if>" +
+            " order by v.id desc "+
+            "</script>"})
+    List<FsStoreTuiProductAttrValueScrmVO> selectStoreTuiProductAttrValueVOList(@Param("maps")FsStoreTuiProductAttrValueScrmParam param);
+}

+ 210 - 0
fs-service/src/main/java/com/fs/store/mapper/FsStoreProductScrmMapper.java

@@ -0,0 +1,210 @@
+package com.fs.store.mapper;
+
+import com.fs.statis.dto.ModifyMoreDTO;
+import com.fs.store.domain.FsStoreProductScrm;
+import com.fs.store.param.FsStoreProductScrmQueryParam;
+import com.fs.store.vo.*;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * 商品Mapper接口
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface FsStoreProductScrmMapper
+{
+    /**
+     * 查询商品
+     *
+     * @param productId 商品ID
+     * @return 商品
+     */
+    public FsStoreProductScrm selectFsStoreProductById(Long productId);
+
+    /**
+     * 查询商品列表
+     *
+     * @param fsStoreProduct 商品
+     * @return 商品集合
+     */
+    public List<FsStoreProductScrm> selectFsStoreProductList(FsStoreProductScrm fsStoreProduct);
+
+    /**
+     * 新增商品
+     *
+     * @param fsStoreProduct 商品
+     * @return 结果
+     */
+    public int insertFsStoreProduct(FsStoreProductScrm fsStoreProduct);
+
+    /**
+     * 修改商品
+     *
+     * @param fsStoreProduct 商品
+     * @return 结果
+     */
+    public int updateFsStoreProduct(FsStoreProductScrm fsStoreProduct);
+
+    /**
+     * 删除商品
+     *
+     * @param productId 商品ID
+     * @return 结果
+     */
+    public int deleteFsStoreProductById(Long productId);
+
+    /**
+     * 批量删除商品
+     *
+     * @param productIds 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsStoreProductByIds(Long[] productIds);
+    @Select({"<script> " +
+            "select p.*,pc.cate_name  from fs_store_product p left join fs_store_product_category pc on p.cate_id=pc.cate_id   " +
+            "where 1=1 " +
+            "<if test = 'maps.productName != null and  maps.productName !=\"\"    '> " +
+            "and p.product_name like CONCAT('%',#{maps.productName},'%') " +
+            "</if>" +
+            "<if test = 'maps.cateId != null    '> " +
+            "and (pc.cate_id =#{maps.cateId} or pc.pid=#{maps.cateId} )" +
+            "</if>" +
+            "<if test = 'maps.productType != null    '> " +
+            "and p.product_type =#{maps.productType} " +
+            "</if>" +
+            "<if test = 'maps.isShow != null    '> " +
+            "and p.is_show =#{maps.isShow} " +
+            "</if>" +
+            "<if test = 'maps.companyIds != null and maps.companyIds != \"\" '> " +
+            "and find_in_set(#{maps.companyIds}, p.company_ids) " +
+            "</if>" +
+            " order by p.product_id desc "+
+            "</script>"})
+    List<FsStoreProductScrmListVO> selectFsStoreProductListVO(@Param("maps")FsStoreProductScrm fsStoreProduct);
+
+
+    @Select({"<script> " +
+            "  select p.*,pc.cate_name from (SELECT ave.bar_code as bar_code,p.product_id, p.image, p.slider_image,p.product_name, p.product_info,p.keyword, p.cate_id, p.price, p.vip_price, " +
+            " p.ot_price,p.agent_price, p.postage,p.unit_name,p.sort,p.sales,p.stock,p.is_show,p.is_hot,p.is_benefit,p.is_best,p.is_new,p.description,p.create_time,p.update_time,p.is_postage,p.is_del,p.give_integral," +
+            " p.cost,p.is_good,p.browse,p.code_path,p.temp_id,p.spec_type,p.is_integral,p.integral,p.product_type,p.prescribe_code, p.prescribe_spec,p.prescribe_factory,p.prescribe_name,p.is_display,p.tui_cate_id " +
+            " FROM fs_store_product p LEFT JOIN fs_store_product_attr_value ave on p.product_id=ave.product_id  WHERE ave.bar_code != '' and p.product_id is not null" +
+            ") p left join fs_store_product_category pc on p.cate_id=pc.cate_id   " +
+            " where 1=1 " +
+            "<if test = 'maps.productName != null and  maps.productName !=\"\"  '> " +
+            "and p.product_name like CONCAT('%',#{maps.productName},'%') " +
+            "</if>" +
+            "<if test = 'maps.barCode != null and  maps.barCode !=\"\"    '> " +
+            "and p.bar_code like CONCAT('%',#{maps.barCode},'%') " +
+            "</if>" +
+            "<if test = 'maps.cateId != null    '> " +
+            "and (pc.cate_id =#{maps.cateId} or pc.pid=#{maps.cateId} )" +
+            "</if>" +
+            "<if test = 'maps.productType != null    '> " +
+            "and p.product_type =#{maps.productType} " +
+            "</if>" +
+            "<if test = 'maps.isShow != null    '> " +
+            "and p.is_show =#{maps.isShow} " +
+            "</if>" +
+            " order by p.product_id desc "+
+            "</script>"})
+    List<FsStoreProductScrmListVO> selectFsStoreProductBarCodeListVO(@Param("maps")FsStoreProductScrm fsStoreProduct);
+
+    @Select("select * from fs_store_product where is_del=0 and is_show=1 and  is_best=1 and is_display=1 order by sort desc limit #{count}")
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductTuiQuery(int count);
+    @Select("select * from fs_store_product where  is_del=0 and is_show=1 order by sort desc limit #{count}")
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductByCateIdQuery(Long cateId);
+    @Select({"<script> " +
+            "select p.* from fs_store_product p  " +
+            "where is_del=0 and is_show=1  " +
+            "<if test = 'maps.productName != null and  maps.productName !=\"\"    '> " +
+            "and (p.product_name like CONCAT('%',#{maps.productName},'%')  or p.keyword like concat('%',#{maps.productName},'%') ) " +
+            "</if>" +
+            "<if test = 'maps.isDisplay != null and maps.isDisplay == 1   '> " +
+            "and p.is_display =#{maps.isDisplay}  " +
+            "</if>" +
+            "<if test = 'maps.companyId != null'> " +
+            "and find_in_set(#{maps.companyId}, p.company_ids) " +
+            "</if>" +
+            "<if test = 'maps.cateId != null    '> " +
+            "and p.cate_id =#{maps.cateId}  " +
+            "</if>" +
+            "<if test = 'maps.defaultOrder != null and maps.defaultOrder==\"desc\"  '> " +
+            "order by p.sort desc " +
+            "</if>" +
+            "<if test = 'maps.priceOrder != null and maps.priceOrder==\"desc\"   '> " +
+            "order by p.price desc " +
+            "</if>" +
+            "<if test = 'maps.priceOrder != null and maps.priceOrder==\"asc\"   '> " +
+            "order by p.price asc " +
+            "</if>" +
+            "<if test = 'maps.salesOrder != null  and maps.salesOrder==\"desc\" '> " +
+            "order by p.sales desc " +
+            "</if>" +
+            "<if test = 'maps.salesOrder != null  and maps.salesOrder==\"asc\" '> " +
+            "order by p.sales asc " +
+            "</if>" +
+            "<if test = 'maps.newOrder != null and maps.newOrder==\"desc\" '> " +
+            "and p.is_new =1 order by p.create_time desc  " +
+            "</if>" +
+            "</script>"})
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductListQuery(@Param("maps")FsStoreProductScrmQueryParam param);
+    @Select({"<script> " +
+            "select p.* from fs_store_product p  " +
+            "where is_del=0 and is_show=1 and product_id=#{productId} " +
+            "</script>"})
+    FsStoreProductScrmQueryVO selectFsStoreProductByIdQuery(Long productId);
+    @Update("update fs_store_product set stock=stock-#{num}, sales=sales+#{num}" +
+            " where product_id=#{productId} and stock >= #{num}")
+    int decProductAttrStock(@Param("productId")Long productId, @Param("num")Integer cartNum);
+    @Update("update fs_store_product set stock=stock+#{num}, sales=sales-#{num}" +
+            " where product_id=#{productId}")
+    int incStockDecSales( @Param("num")Long num, @Param("productId")Long productId);
+    @Select("select * from fs_store_product where is_del=0 and is_show=1 and  is_new=1 and is_display=1 order by sort desc limit #{count}")
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductNewQuery(int count);
+    @Select("select * from fs_store_product where is_del=0 and is_show=1 and  is_hot=1 and is_display=1 order by sort desc limit #{count}")
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductHotQuery(int count);
+    @Select("select * from fs_store_product where is_del=0 and is_show=1 and  is_good=1 and is_display=1 order by sort desc limit #{count}")
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductGoodQuery(int count);
+    @Select("select * from fs_store_product where is_del=0 and is_show=1 and  is_best=1 and is_display=1 order by sort desc")
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductTuiListQuery();
+    @Select("select * from fs_store_product where is_del=0 and is_show=1 and  is_good=1 and is_display=1 order by sort desc")
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductGoodListQuery();
+    @Select({"<script> " +
+            "select count(1) from fs_store_product  " +
+            "where 1=1 " +
+            "<if test = 'type != null and  type ==1  '> " +
+            "and  DATE_FORMAT(create_time, '%Y-%m-%d')  = DATE_FORMAT(NOW(), '%Y-%m-%d') " +
+            "</if>" +
+            "</script>"})
+    Long selectFsStoreProductCount(@Param("type") int type );
+
+    Long selectFsStoreProductCompanyCount(@Param("type") int type,@Param("companyIds") Long companyIds);
+
+    @Select({"<script> " +
+            "select * from fs_store_product where find_in_set(product_id,#{ids})  " +
+            "</script>"})
+    List<FsStoreProductActivityScrmListVO> selectFsStoreProductByIds(@Param("ids")String productIds);
+
+    @Update("update fs_store_product p set stock=(select sum(stock) from fs_store_product_attr_value where product_id=#{productId}) where product_id=#{productId}  ")
+    Integer updateStock(Long productId);
+    @Select("select * from fs_store_product where is_del=0 and find_in_set(product_id,#{productIds}) order by sort desc")
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductListByIds(@Param("productIds") String productIds);
+
+
+    @Select({"<script> " +
+            "  SELECT p.product_id, p.image, p.slider_image,p.product_name, p.product_info,p.keyword, p.cate_id," +
+            " p.vip_price, p.ot_price,p.agent_price, p.postage,p.unit_name,p.sort,p.sales,p.is_show,p.is_hot,p.is_benefit,p.is_best,p.is_new,p.description," +
+            " p.create_time,p.update_time,p.is_postage,p.is_del,p.give_integral, p.cost,p.is_good,p.browse,p.code_path,p.temp_id,p.spec_type,p.is_integral,p.integral," +
+            " p.product_type,p.prescribe_code,p.prescribe_spec,p.prescribe_factory,p.prescribe_name,ave.sku,ave.stock,ave.price,ave.bar_code,ave.group_bar_code,ave.weight,ave.volume FROM fs_store_product p " +
+            "  LEFT JOIN fs_store_product_attr_value ave on p.product_id=ave.product_id WHERE  p.product_id is not null " +
+            "</script>"})
+    List<FsStoreProductScrmExportVO> selectFsStoreProductExportList(@Param("maps")FsStoreProductScrm fsStoreProduct);
+
+
+    void batchModify(ModifyMoreDTO modifyMoreDTO);
+}

+ 72 - 0
fs-service/src/main/java/com/fs/store/mapper/FsUserAddressMapper.java

@@ -0,0 +1,72 @@
+package com.fs.store.mapper;
+
+import com.fs.store.domain.FsUserAddress;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * 用户地址Mapper接口
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface FsUserAddressMapper 
+{
+    /**
+     * 查询用户地址
+     * 
+     * @param id 用户地址ID
+     * @return 用户地址
+     */
+    public FsUserAddress selectFsUserAddressById(Long id);
+
+    /**
+     * 查询用户地址列表
+     * 
+     * @param fsUserAddress 用户地址
+     * @return 用户地址集合
+     */
+    public List<FsUserAddress> selectFsUserAddressList(FsUserAddress fsUserAddress);
+
+    /**
+     * 新增用户地址
+     * 
+     * @param fsUserAddress 用户地址
+     * @return 结果
+     */
+    public int insertFsUserAddress(FsUserAddress fsUserAddress);
+
+    /**
+     * 修改用户地址
+     * 
+     * @param fsUserAddress 用户地址
+     * @return 结果
+     */
+    public int updateFsUserAddress(FsUserAddress fsUserAddress);
+
+    /**
+     * 删除用户地址
+     * 
+     * @param id 用户地址ID
+     * @return 结果
+     */
+    public int deleteFsUserAddressById(Long id);
+
+    /**
+     * 批量删除用户地址
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsUserAddressByIds(Long[] ids);
+    @Select("select * from fs_user_address where user_id=#{uid} and is_default=1 and is_del=0 limit 1")
+    FsUserAddress selectFsUserAddressByDefaultAddress(long uid);
+    @Update("update fs_user_address set is_default=0 where user_id=#{userId}")
+    int clearIsDefalut(long userId);
+    @Select("select IFNULL(count(1),0) from fs_user_address where user_id=#{userId}  and is_del=0 " )
+    Integer selectFsUserAddressCountsByUserId(long userId);
+    @Update(" update fs_user_address set is_del=1 where user_id = #{userId}")
+    Integer delAllAddress(Long userId);
+}

+ 320 - 0
fs-service/src/main/java/com/fs/store/mapper/FsUserMapper.java

@@ -0,0 +1,320 @@
+package com.fs.store.mapper;
+
+import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
+import com.fs.his.vo.OptionsVO;
+import com.fs.qw.param.QwFsUserParam;
+import com.fs.qw.vo.QwFsUserVO;
+import com.fs.store.domain.FsUser;
+import com.fs.store.domain.FsUserWatchCourseStatistics;
+import com.fs.store.domain.FsUserWatchStatistics;
+import com.fs.store.dto.FsUserTransferParamDTO;
+import com.fs.store.param.SelectCusListPageParam;
+import com.fs.store.param.h5.CourseAnalysisParam;
+import com.fs.store.param.h5.FsUserPageListParam;
+import com.fs.store.param.h5.UserStatisticsCommonParam;
+import com.fs.store.vo.FSUserVO;
+import com.fs.store.vo.FsCompanyUserListQueryVO;
+import com.fs.store.vo.FsUserTuiVO;
+import com.fs.store.vo.h5.*;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户Mapper接口
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface FsUserMapper
+{
+    /**
+     * 查询用户
+     *
+     * @param userId 用户ID
+     * @return 用户
+     */
+    public FsUser selectFsUserById(Long userId);
+
+    /**
+     * 查询用户列表
+     *
+     * @param fsUser 用户
+     * @return 用户集合
+     */
+    public List<FsUser> selectFsUserList(FsUser fsUser);
+
+    /**
+     * 查询用户列表
+     *
+     * @param fsUser 用户
+     * @return 用户集合
+     */
+//    @Select({"<script> " +
+//            "select  b.total_amount,b.last_buy_time,p.pay_money as number,p.payment_id,p.pay_time," +
+//            " u.* FROM fs_user u LEFT JOIN  (" +
+//            " SELECT max(payment_id) as payment_id, max(pay_time) as last_buy_time,SUM(pay_money) as total_amount,user_id " +
+//            " FROM fs_store_payment" +
+//            " WHERE  status = 1 and user_id is not null group by user_id " +
+//            ") b ON u.user_id=b.user_id " +
+//            " LEFT JOIN fs_store_payment p ON u.user_id=p.user_id AND b.last_buy_time=p.pay_time AND b.payment_id=p.payment_id"+
+//            " WHERE 1=1 " +
+//            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"    '> " +
+//            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+//            "</if>" +
+//            "<if test = 'maps.phone != null   and  maps.phone !=\"\"   '> " +
+//            "and u.phone=#{maps.phone} " +
+//            "</if>" +
+//            "<if test = 'maps.registerDate != null and  maps.registerDate !=\"\"'> " +
+//            "and  DATE_FORMAT(u.register_date, '%Y-%m-%d')  = DATE_FORMAT(#{maps.registerDate}, '%Y-%m-%d') " +
+//            "</if>" +
+//            "<if test = 'maps.registerCode != null  and  maps.registerCode !=\"\"   '> " +
+//            "and u.register_code=#{maps.registerCode} " +
+//            "</if>" +
+//            "<if test='maps.status != null  and  maps.status !=\"\"'> and u.status = #{maps.status}</if>"+
+//            "<if test='maps.level != null  and  maps.level !=\"\"'> and u.level = #{maps.level}</if>"+
+//            "<if test='maps.isPromoter != null  and  maps.isPromoter !=\"\"'> and u.is_promoter = #{maps.isPromoter}</if>" +
+//            " order by user_id desc "+
+//            "</script>"}
+//            )
+    public List<FSUserVO> selectFsUserVOList(@Param("maps") FsUser fsUser);
+
+    /**
+     * 新增用户
+     *
+     * @param fsUser 用户
+     * @return 结果
+     */
+    public int insertFsUser(FsUser fsUser);
+
+    /**
+     * 修改用户
+     *
+     * @param fsUser 用户
+     * @return 结果
+     */
+    public int updateFsUser(FsUser fsUser);
+
+    /**
+     * 删除用户
+     *
+     * @param userId 用户ID
+     * @return 结果
+     */
+    public int deleteFsUserById(Long userId);
+
+    /**
+     * 批量删除用户
+     *
+     * @param userIds 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsUserByIds(Long[] userIds);
+
+    @Update("update fs_user set integral=integral-#{integral}" +
+            " where user_id=#{uid}")
+    int decIntegral(@Param("uid") Long uid, @Param("integral")double integral);
+    @Update("update fs_user set pay_count=pay_count+1" +
+            " where user_id=#{userId}")
+    int incPayCount(Long userId);
+    @Select("select * from fs_user where phone=#{phone}")
+    FsUser selectFsUserByPhone(String phone);
+
+
+    @Select("select  b.total_amount,b.last_buy_time,p.pay_money as number,p.payment_id,p.pay_time," +
+            " u.* FROM fs_user u LEFT JOIN  (" +
+            " SELECT max(payment_id) as payment_id, max(pay_time) as last_buy_time,SUM(pay_money) as total_amount,user_id " +
+            " FROM fs_store_payment" +
+            " WHERE  status = 1 and user_id is not null group by user_id " +
+            ") b ON u.user_id=b.user_id " +
+            " LEFT JOIN fs_store_payment p ON u.user_id=p.user_id AND b.last_buy_time=p.pay_time AND b.payment_id=p.payment_id"+
+            " WHERE u.user_id=#{userId}")
+    FSUserVO selectFsUserByUserId(Long userId);
+
+
+    @Select({"<script> " +
+            "select u.*,cu.nick_name as company_user_nick_name  from fs_user u left join company_user cu on u.company_user_id=cu.user_id " +
+            "where u.is_del=0 " +
+            "<if test = 'maps.nickname != null and  maps.nickname !=\"\"    '> " +
+            "and u.nickname like CONCAT('%',#{maps.nickname},'%') " +
+            "</if>" +
+            "<if test = 'maps.phone != null   and  maps.phone !=\"\"   '> " +
+            "and u.phone=#{maps.phone} " +
+            "</if>" +
+            "<if test = 'maps.companyId != null    '> " +
+            "and u.company_id=#{maps.companyId} " +
+            "</if>" +
+            "<if test = 'maps.status != null   and  maps.status !=\"\"   '> " +
+            "and u.status=#{maps.status} " +
+            "</if>" +
+            "<if test = 'maps.companyUserId != null    '> " +
+            "and u.company_user_id=#{maps.companyUserId} " +
+            "</if>" +
+            " order by u.create_time desc "+
+            "</script>"})
+    List<FsCompanyUserListQueryVO> selectFsCompanyUserListQuery(@Param("maps")FsUser fsUser);
+    @Select({"<script> " +
+            "select u.user_id,u.phone,u.avatar,u.nickname,ifnull((select sum(b.number) from fs_user_bill b where b.category='brokerage_price' and b.bill_type=1  and b.tui_user_id=u.user_id and b.user_id=#{userId} ),0)-ifnull((select sum(b.number) from fs_user_bill b where b.category='brokerage_price' and b.bill_type=0 and b.tui_user_id=u.user_id and b.user_id=#{userId}  ),0) as tui_money ,u.create_time from fs_user u " +
+            "where u.spread_user_id=#{userId} " +
+            "order by tui_money desc " +
+            "</script>"})
+    List<FsUserTuiVO> selectFsUserTuiList(String userId);
+
+    Long selectFsUserCount(@Param("type") int type,@Param("companyId") Long companyId,@Param("companyUserId") Long companyUserId);
+
+    @Select("select * from fs_user where ma_open_id=#{openid}")
+    FsUser selectFsUserByMaOpenId(String openid);
+
+    @Select("select * from fs_user where mp_open_id=#{openid}")
+    FsUser selectFsUserByMpOpenId(String openid);
+
+    @Select("select * from fs_user where union_id=#{unionId}")
+    FsUser selectFsUserByUnionId(String unionId);
+
+    @Select("select * from fs_user where course_ma_open_id=#{openId}")
+    FsUser selectFsUserByCourseMaOpenId(String openId);
+
+    Long selectCrmCustomerCount(int type, Long companyId);
+
+    @Select("select * from fs_user where user_code=#{userCode}")
+    FsUser selectFsUserByUserCode(String userCode);
+    @Select("select * from fs_user where user_id=#{userId} for update")
+    FsUser selectFsUserByIdForUpdate(Long userId);
+
+    @Select({"<script> " +
+            "select user_id, nick_name, phone FROM fs_user where is_del=0 "+
+            "  <if test=\"nickName != null  and nickName != ''\"> and nick_name like concat('%', #{nickName}, '%')</if>\n" +
+            "            <if test=\"phone != null  and phone != ''\"> and phone like concat('%', #{phone}, '%')</if>\n" +
+            "order by user_id desc"+
+            "</script>"})
+    List<QwFsUserVO> selecQwFsUserListVO(QwFsUserParam qwFsUserParam);
+
+    @Select({"<script> " +
+            "select user_id, nick_name, phone FROM fs_user where is_del=0 "+
+            "  <if test=\"nickName != null  and nickName != ''\"> and nick_name like concat('%', #{nickName}, '%')</if>\n" +
+            "            <if test=\"phone != null  and phone != ''\"> and phone =#{phone}</if>\n" +
+            "order by user_id desc"+
+            "</script>"})
+    List<QwFsUserVO> selectQwFsUserListVO(QwFsUserParam qwFsUserParam);
+
+
+    @Select("select * from fs_user where union_id=#{unionid} limit 1")
+    FsUser selectFsUserByUnionid(String unionId);
+
+
+    List<FsUser> selectFsUserListLimit(FsUser fsUser);
+
+    List<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param);
+    List<FsUserPageListVO> selectFsUserPageListNew(FsUserPageListParam param);
+    Long selectFsUserPageListCount(FsUserPageListParam param);
+
+    List<UserListCountVO> getUserNumber(@Param("userId") Long userId, @Param("companyId") Long companyId);
+
+    int getRepeatUserNumber(@Param("userId") Long userId);
+
+    UserDetailsVO getCountWatchCourse (@Param("userId") Long userId, @Param("fsUserId") Long fsUserId, @Param("dateTag") String dateTag);
+
+    UserDetailsVO getCountAnswer (@Param("userId") Long userId, @Param("fsUserId") Long fsUserId, @Param("dateTag") String dateTag);
+
+    UserDetailsVO getCountRedPacket(@Param("userId") Long userId, @Param("fsUserId") Long fsUserId, @Param("dateTag") String dateTag);
+
+    int batchUpdateFsUserByIds(@Param("ids") String[] ids, @Param("status") Integer status);
+
+    /**
+     * 查询销售会员总数,今日新增会员数
+     * @param companyUserId 销售ID
+     * @return map
+     */
+    Map<String, Long> getUserVipCountByCompanyUserId(@Param("companyUserId") Long companyUserId);
+
+    /**
+     * 分页获取客户
+     * @param param 参数
+     * @return 结果
+     */
+    List<FsUser> selectCusListPage(SelectCusListPageParam param);
+    Long selectCusListPageCount(SelectCusListPageParam param);
+
+    void transferCompanyUser(FsUserTransferParamDTO param);
+
+    FsUserSummaryCountVO countUserSummary(@Param("userId") Long userId, @Param("companyId") Long companyId);
+
+    List<FsUserSummaryCountTagVO> countTag(@Param("userId") Long userId, @Param("companyId") Long companyId);
+
+    Map<String, Long> countUserCourse(UserStatisticsCommonParam param);
+
+    Map<String, Long> countUserAnswer(UserStatisticsCommonParam param);
+
+    Map<String, Object> countUserRedPacket(UserStatisticsCommonParam param);
+
+    Map<String, Long> countCourseDetails(UserStatisticsCommonParam param);
+
+    List<FsUserRankingVO> countUserRankingByComplete(@Param("userId") Long userId, @Param("companyId") Long companyId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId")String periodId, @Param("videoId")String videoId, @Param("order")String order);
+
+    List<FsUserRankingVO> countUserRankingByRight(@Param("userId") Long userId, @Param("companyId") Long companyId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId")String periodId, @Param("videoId")String videoId, @Param("order")String order);
+
+    List<FsCourseRankingVO> countCourseRankingByComplete(@Param("userId") Long userId, @Param("companyId") Long companyId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId")String periodId, @Param("videoId")String videoId, @Param("order")String order);
+
+    List<FsCourseRankingVO> countCourseRankingByRight(@Param("userId") Long userId, @Param("companyId") Long companyId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId")String periodId, @Param("videoId")String videoId, @Param("order")String order);
+
+    List<FsCourseAnalysisCountVO> courseAnalysisCourseCount(CourseAnalysisParam param);
+
+    List<FsCourseAnalysisCountVO> courseAnalysisRedPacketCount(CourseAnalysisParam param);
+
+    List<FsCourseAnalysisCountVO> courseAnalysisAnswerCount(CourseAnalysisParam param);
+
+    CompanyUserSummaryCountVO companyUserCount(@Param("companyUserId")String companyUserId, @Param("companyId") Long companyId);
+
+    CompanyUserSummaryCountVO newUserRedPacketCount(@Param("companyUserId")String companyUserId, @Param("companyId") Long companyId);
+
+    List<FsUser> getFsUserByCompanyUserAndId(@Param("companyUserId")Long companyUserId, @Param("userId") Long userId);
+
+    /**
+     * 管理端统计看课的相关数据
+     * @param param
+     * @return
+     */
+    List<FsCourseAnalysisCountVO> courseAnalysisWatchLog(CourseAnalysisParam param);
+
+    int batchUpdateUserCompanyUser(@Param("userIds") List<Long> userIds, @Param("companyUserId") Long companyUserId, @Param("companyId") Long companyId);
+
+    int batchUpdateCompanyUserRelation(@Param("userIds") List<Long> userIds, @Param("companyUserId") Long companyUserId, @Param("companyId") Long companyId);
+
+    /**
+     * 查询会员选项列表
+     * @param params    参数
+     * @return  list
+     */
+    List<OptionsVO> selectUserListByMap(@Param("params") Map<String, Object> params);
+
+    /**
+     * 查询重粉用户是否存在
+     * @param userIds 会员ids
+     * @return
+     */
+    Integer selectFsUserByUserIds(@Param("userIds") String[] userIds, @Param("companyUserId") Long companyUserId);
+
+    /**
+     * 获取会员总数和新增总数-可以按营期/课程
+     * @return
+     */
+    List<FsUserWatchStatistics> selectFsUserTotal();
+
+    List<FsUserWatchCourseStatistics> selectWatchLogCount();
+
+    List<FsUserWatchCourseStatistics> selectRedPacketLogCount();
+
+    List<FsUserWatchCourseStatistics> selectAnswerLogCount();
+
+    List<FsUserWatchCourseStatistics> selectFsUserDetail();
+
+    List<FsUser> selectFsUserListByJointUserNameKey(String userNameKey);
+
+    Map<String, Long> countUserCourse2(UserStatisticsCommonParam param);
+
+    Map<String, Long> countCourseDetailsNew(UserStatisticsCommonParam param);
+
+}

+ 70 - 0
fs-service/src/main/java/com/fs/store/mapper/FsWechatTemplateMapper.java

@@ -0,0 +1,70 @@
+package com.fs.store.mapper;
+
+import com.fs.store.domain.FsWechatTemplate;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * 微信模板Mapper接口
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface FsWechatTemplateMapper 
+{
+    /**
+     * 查询微信模板
+     * 
+     * @param id 微信模板ID
+     * @return 微信模板
+     */
+    public FsWechatTemplate selectFsWechatTemplateById(Integer id);
+
+    /**
+     * 查询微信模板列表
+     * 
+     * @param fsWechatTemplate 微信模板
+     * @return 微信模板集合
+     */
+    public List<FsWechatTemplate> selectFsWechatTemplateList(FsWechatTemplate fsWechatTemplate);
+
+    /**
+     * 新增微信模板
+     * 
+     * @param fsWechatTemplate 微信模板
+     * @return 结果
+     */
+    public int insertFsWechatTemplate(FsWechatTemplate fsWechatTemplate);
+
+    /**
+     * 修改微信模板
+     * 
+     * @param fsWechatTemplate 微信模板
+     * @return 结果
+     */
+    public int updateFsWechatTemplate(FsWechatTemplate fsWechatTemplate);
+
+    /**
+     * 删除微信模板
+     * 
+     * @param id 微信模板ID
+     * @return 结果
+     */
+    public int deleteFsWechatTemplateById(Integer id);
+
+    /**
+     * 批量删除微信模板
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsWechatTemplateByIds(Integer[] ids);
+
+    @Select("select * from fs_wechat_template where tempkey=#{key}")
+    FsWechatTemplate selectFsWechatTemplateByKey(String key);
+    @Select("select temp_id from fs_wechat_template where status=1")
+    List<String> selectFsWechatTemplateIds();
+    @Select("select temp_id from fs_wechat_template where find_in_set(tempkey,#{key})")
+    List<String> selectFsWechatTemplateIdsByKeys(String key);
+}

+ 10 - 0
fs-service/src/main/java/com/fs/store/param/ExpressScrmParam.java

@@ -0,0 +1,10 @@
+package com.fs.store.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ExpressScrmParam implements Serializable {
+    private String packageno;
+}

+ 18 - 0
fs-service/src/main/java/com/fs/store/param/FsCustomerStoreOrderScrmListQueryParam.java

@@ -0,0 +1,18 @@
+package com.fs.store.param;
+
+import com.fs.common.param.BaseQueryParam;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FsCustomerStoreOrderScrmListQueryParam extends BaseQueryParam implements Serializable
+{
+
+    private Long companyId;
+
+    private Long customerId;
+
+    private Long userId;
+
+}

+ 16 - 0
fs-service/src/main/java/com/fs/store/param/FsMyStoreOrderScrmQueryParam.java

@@ -0,0 +1,16 @@
+package com.fs.store.param;
+
+import com.fs.common.param.BaseQueryParam;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FsMyStoreOrderScrmQueryParam extends BaseQueryParam implements Serializable
+{
+    private String status;
+    private Long userId;
+    private Long companyId;
+    private Long companyUserId;
+    private Integer deliveryStatus;
+}

+ 16 - 0
fs-service/src/main/java/com/fs/store/param/FsProductAttrValueScrmParam.java

@@ -0,0 +1,16 @@
+package com.fs.store.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FsProductAttrValueScrmParam implements Serializable
+{
+    private String productName;
+    private Long cateId;
+    private Integer productType;
+    private Integer isShow;
+    Integer tuiCateId;
+    private Long companyId;
+}

+ 13 - 0
fs-service/src/main/java/com/fs/store/param/FsStoreCartScrmCountParam.java

@@ -0,0 +1,13 @@
+package com.fs.store.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FsStoreCartScrmCountParam implements Serializable
+{
+    Long userId;
+    Long productId;
+
+}

+ 90 - 0
fs-service/src/main/java/com/fs/store/param/FsStoreOrderScrmParam.java

@@ -0,0 +1,90 @@
+package com.fs.store.param;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FsStoreOrderScrmParam extends BaseEntity implements Serializable
+{
+    private String orderCode;
+
+    private String nickname;
+
+    private String phone;
+
+    private String userPhone;
+
+    private Integer status;
+
+    private Long companyId;
+
+    private String isHealth;
+
+    private Integer notHealth;
+
+    private Long companyUserId;
+
+    private String createTimeRange;
+
+    private String[] createTimeList;
+
+    private String payTimeRange;
+
+    private String[] payTimeList;
+
+    private String deliverySendTimeRange;
+
+    private String[] deliverySendTimeList;
+
+    private String deliveryImportTimeRange;
+
+    private String[] deliveryImportTimeList;
+
+    private Integer orderType;
+
+
+    private String companyUserNickName;
+
+    private String deliveryId;
+
+    private Integer deliveryStatus;
+
+    private Integer deliveryPayStatus;
+
+    private Long deptId;
+
+    private Long userId;
+
+    private Long customerId;
+
+    private String realName;
+
+    private Integer isPayRemain;
+
+    private Integer payType;
+
+    private String productName;
+
+    private Integer isUpload;
+
+    /** 开始时间 */
+    @JsonIgnore
+    private String beginTime;
+
+    /** 结束时间 */
+    @JsonIgnore
+    private String endTime;
+
+    private Long scheduleId;
+
+    private String orderVisit;
+
+    /**
+     * 支付状态 待支付 1已支付
+     */
+    private int paidStatus;
+
+}

+ 26 - 0
fs-service/src/main/java/com/fs/store/param/FsStoreOrderScrmStatisticsParam.java

@@ -0,0 +1,26 @@
+package com.fs.store.param;
+
+import lombok.Data;
+
+@Data
+public class FsStoreOrderScrmStatisticsParam {
+
+    /**
+     * 开始时间
+     */
+    String startTime;
+    /**
+     * 结束时间
+     */
+    String endTime;
+
+    /**
+     * 是否已经支付
+     */
+    Integer paid;
+
+    /**
+     * 订单状态(-1 : 申请退款 -2 : 退货成功 1:待支付 2:待发货;3:待收货;4:待评价;5:已完成)
+     */
+    private Integer status;
+}

+ 18 - 0
fs-service/src/main/java/com/fs/store/param/FsStoreProductAttrValueScrmQueryParam.java

@@ -0,0 +1,18 @@
+package com.fs.store.param;
+
+import com.fs.common.param.BaseQueryParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FsStoreProductAttrValueScrmQueryParam extends BaseQueryParam implements Serializable
+{
+
+    @ApiModelProperty(value = "商品名")
+    String productName;
+    @ApiModelProperty(value = "推广分类")
+    Integer tuiCateId;
+
+}

+ 150 - 0
fs-service/src/main/java/com/fs/store/param/FsStoreProductScrmAddEditParam.java

@@ -0,0 +1,150 @@
+package com.fs.store.param;
+
+import com.fs.store.domain.FsStoreProductAttrValue;
+import com.fs.store.domain.FsStoreProductAttrValueScrm;
+import com.fs.store.dto.ProductArrtDTO;
+import com.fs.store.dto.ProductArrtScrmDTO;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 商品对象 fs_store_product
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+@Data
+public class FsStoreProductScrmAddEditParam implements Serializable
+{
+
+    /** 商品id */
+    private Long productId;
+
+    /** 商品图片 */
+    private String image;
+
+    private String video;
+
+    /** 轮播图 */
+    private String sliderImage;
+
+    /** 商品名称 */
+    private String productName;
+
+    /** 商品简介 */
+    private String productInfo;
+
+    /** 关键字 */
+    private String keyword;
+
+    /** 产品条码(一维码) */
+    private String barCode;
+
+    /** 分类id */
+    private Long cateId;
+
+    /** 商品价格 */
+    private BigDecimal price;
+
+    /** 会员价格 */
+    private BigDecimal vipPrice;
+
+    /** 市场价 */
+    private BigDecimal otPrice;
+
+    /** 邮费 */
+    private BigDecimal postage;
+
+    /** 单位名 */
+    private String unitName;
+
+    /** 排序 */
+    private Long sort;
+
+    /** 销量 */
+    private Long sales;
+
+    /** 库存 */
+    private Long stock;
+
+    /** 状态(0:未上架,1:上架) */
+    private Integer isShow;
+
+    /** 是否热卖 */
+    private Integer isHot;
+
+    /** 是否优惠 */
+    private Integer isBenefit;
+
+    /** 是否精品 */
+    private Integer isBest;
+
+    /** 是否新品 */
+    private Integer isNew;
+
+    private Integer isDisplay;
+
+    /** 产品描述 */
+    private String description;
+
+    /** 是否包邮 */
+    private Integer isPostage;
+
+    /** 是否删除 */
+    private Integer isDel;
+
+    /** 获得积分 */
+    private BigDecimal giveIntegral;
+
+    /** 成本价 */
+    private BigDecimal cost;
+
+    /** 是否优品推荐 */
+    private Integer isGood;
+
+    /** 浏览量 */
+    private Long browse;
+
+    /** 产品二维码地址(用户小程序海报) */
+    private String codePath;
+
+    /** 运费模板ID */
+    private Integer tempId;
+
+    /** 规格 0单 1多 */
+    private Integer specType;
+
+    /** 是开启积分兑换 */
+    private Integer isIntegral;
+
+    /** 需要多少积分兑换 只在开启积分兑换时生效 */
+    private Long integral;
+
+    /** 商品类型:1非处方 2处方 */
+    private Integer productType;
+
+    /** 国药准字 */
+    private String prescribeCode;
+
+    /** 规格 */
+    private String prescribeSpec;
+
+    /** 生产厂家 */
+    private String prescribeFactory;
+
+    /** 处方名 */
+    private String prescribeName;
+
+    private Integer tuiCateId;
+
+    //属性项目
+    private List<ProductArrtScrmDTO> items;
+    //sku结果集
+    private List<FsStoreProductAttrValueScrm> values;
+    // 指定企业
+    private String companyIds;
+
+}

+ 31 - 0
fs-service/src/main/java/com/fs/store/param/FsStoreProductScrmQueryParam.java

@@ -0,0 +1,31 @@
+package com.fs.store.param;
+
+import com.fs.common.param.BaseQueryParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FsStoreProductScrmQueryParam extends BaseQueryParam implements Serializable
+{
+    @ApiModelProperty(value = "分类ID")
+    Long cateId;
+    @ApiModelProperty(value = "商品名")
+    String productName;
+    @ApiModelProperty(value = "默认")
+    private String defaultOrder;
+    @ApiModelProperty(value = "是否新品")
+    private String newOrder;
+    @ApiModelProperty(value = "价格排序")
+    private String priceOrder;
+    @ApiModelProperty(value = "销量排序")
+    private String salesOrder;
+    @ApiModelProperty(value = "1 只显示商城展示的商品 0展示所有")
+    private Integer isDisplay=1;
+
+    // token 需用户端传入
+    private String token;
+    // 用户企业ID
+    private Long companyId;
+}

+ 19 - 0
fs-service/src/main/java/com/fs/store/param/FsStoreScrmStatisticsParam.java

@@ -0,0 +1,19 @@
+package com.fs.store.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+public class FsStoreScrmStatisticsParam implements Serializable
+{
+    Integer type;//"类型 1今天 2昨天 3 本周 4 上周 5本月 6上月 7本季度 8上季度 9本年 10去年
+    String userIds;//员工IDS 多个用,分割
+    Long[] users;
+    String startTime;
+    String endTime;
+    Long deptId;
+
+
+}

+ 17 - 0
fs-service/src/main/java/com/fs/store/param/FsStoreTuiProductAttrValueScrmParam.java

@@ -0,0 +1,17 @@
+package com.fs.store.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class FsStoreTuiProductAttrValueScrmParam implements Serializable
+{
+
+    @ApiModelProperty(value = "商品名")
+    String productName;
+    @ApiModelProperty(value = "推广分类")
+    Integer tuiCateId;
+
+}

+ 13 - 0
fs-service/src/main/java/com/fs/store/param/OrderScrmListParam.java

@@ -0,0 +1,13 @@
+package com.fs.store.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class OrderScrmListParam implements Serializable
+{
+    private String startTime;
+    private String endTime;
+    private Long companyId;
+}

+ 21 - 0
fs-service/src/main/java/com/fs/store/param/ReportParam.java

@@ -0,0 +1,21 @@
+package com.fs.store.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.param.BaseQueryParam;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class ReportParam extends BaseQueryParam {
+    private Long companyId;
+    private Long companyUserId;
+    private Double money;
+    private String rechargeNo;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date payTime;
+    private String status;
+    private String orderStatus;
+    private List<Long> customerIds;
+}

+ 26 - 0
fs-service/src/main/java/com/fs/store/param/SelectCusListPageParam.java

@@ -0,0 +1,26 @@
+package com.fs.store.param;
+
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class SelectCusListPageParam extends BaseEntity {
+    /**
+     * 公司id
+     */
+    private Long companyId;
+    /**
+     * 销售id
+     */
+    private Long companyUserId;
+
+    /**
+     * 手机号码
+     */
+    private String phone;
+
+    private Long pageNum;
+    private Long pageSize;
+}

+ 84 - 0
fs-service/src/main/java/com/fs/store/service/IFsExpressScrmService.java

@@ -0,0 +1,84 @@
+package com.fs.store.service;
+
+import com.fs.api.param.ExpressParam;
+import com.fs.api.vo.ExpressVO;
+import com.fs.common.core.domain.R;
+import com.fs.store.domain.FsExpressScrm;
+import com.fs.store.dto.ExpressInfoDTO;
+import com.fs.store.dto.ExpressScrmInfoDTO;
+import com.fs.store.param.ExpressScrmParam;
+import com.fs.store.vo.ExpressScrmVO;
+
+import java.util.List;
+
+/**
+ * 快递公司Service接口
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface IFsExpressScrmService
+{
+    /**
+     * 查询快递公司
+     * 
+     * @param id 快递公司ID
+     * @return 快递公司
+     */
+    public FsExpressScrm selectFsExpressById(Long id);
+
+    /**
+     * 查询快递公司列表
+     * 
+     * @param fsExpress 快递公司
+     * @return 快递公司集合
+     */
+    public List<FsExpressScrm> selectFsExpressList(FsExpressScrm fsExpress);
+
+    /**
+     * 新增快递公司
+     * 
+     * @param fsExpress 快递公司
+     * @return 结果
+     */
+    public int insertFsExpress(FsExpressScrm fsExpress);
+
+    /**
+     * 修改快递公司
+     * 
+     * @param fsExpress 快递公司
+     * @return 结果
+     */
+    public int updateFsExpress(FsExpressScrm fsExpress);
+
+    /**
+     * 批量删除快递公司
+     * 
+     * @param ids 需要删除的快递公司ID
+     * @return 结果
+     */
+    public int deleteFsExpressByIds(Long[] ids);
+
+    /**
+     * 删除快递公司信息
+     *
+     * @param id 快递公司ID
+     * @return 结果
+     */
+    public int deleteFsExpressById(Long id);
+
+    ExpressScrmInfoDTO getExpressInfo(String OrderCode, String ShipperCode, String LogisticCode, String lastFourNumber);
+
+    FsExpressScrm selectFsExpressByCode(String code);
+
+    FsExpressScrm selectFsExpressByOmsCode(String s);
+
+    FsExpressScrm selectFsExpressByName(String deliveryName);
+
+    void subscribeEspress(String orderCode, String deliverySn, String deliveryId, String userPhone);
+
+    R parseAddress(String content);
+
+
+    List<ExpressScrmVO> getExpressInfoAPI(ExpressScrmParam param);
+}

+ 73 - 0
fs-service/src/main/java/com/fs/store/service/IFsStoreOrderItemScrmService.java

@@ -0,0 +1,73 @@
+package com.fs.store.service;
+
+import com.fs.store.domain.FsStoreOrderItemScrm;
+import com.fs.store.param.FsStoreOrderScrmParam;
+import com.fs.store.vo.FsStoreOrderItemScrmExportVO;
+import com.fs.store.vo.FsStoreOrderItemScrmVO;
+
+import java.util.List;
+
+/**
+ * 订单详情Service接口
+ *
+ * @author fs
+ * @date 2022-03-21
+ */
+public interface IFsStoreOrderItemScrmService
+{
+    /**
+     * 查询订单详情
+     *
+     * @param itemId 订单详情ID
+     * @return 订单详情
+     */
+    public FsStoreOrderItemScrm selectFsStoreOrderItemById(Long itemId);
+
+    /**
+     * 查询订单详情列表
+     *
+     * @param fsStoreOrderItem 订单详情
+     * @return 订单详情集合
+     */
+    public List<FsStoreOrderItemScrm> selectFsStoreOrderItemList(FsStoreOrderItemScrm fsStoreOrderItem);
+
+    /**
+     * 新增订单详情
+     *
+     * @param fsStoreOrderItem 订单详情
+     * @return 结果
+     */
+    public int insertFsStoreOrderItem(FsStoreOrderItemScrm fsStoreOrderItem);
+
+    /**
+     * 修改订单详情
+     *
+     * @param fsStoreOrderItem 订单详情
+     * @return 结果
+     */
+    public int updateFsStoreOrderItem(FsStoreOrderItemScrm fsStoreOrderItem);
+
+    /**
+     * 批量删除订单详情
+     *
+     * @param itemIds 需要删除的订单详情ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderItemByIds(Long[] itemIds);
+
+    /**
+     * 删除订单详情信息
+     *
+     * @param itemId 订单详情ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderItemById(Long itemId);
+
+    List<FsStoreOrderItemScrmVO> selectFsStoreOrderItemListByOrderId(Long ordreId);
+
+    List<FsStoreOrderItemScrmExportVO> selectFsStoreOrderItemListExportVO(FsStoreOrderScrmParam fsStoreOrder);
+
+    Long countFsStoreOrderItemListExportVO(FsStoreOrderScrmParam fsStoreOrder);
+
+    int updateFsStoreOrderCode(Long orderId, String orderCode);
+}

+ 227 - 0
fs-service/src/main/java/com/fs/store/service/IFsStoreOrderScrmService.java

@@ -0,0 +1,227 @@
+package com.fs.store.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fs.api.param.OrderListParam;
+import com.fs.api.vo.OrderListVO;
+import com.fs.common.core.domain.R;
+import com.fs.company.domain.CompanyUser;
+import com.fs.erp.domain.ErpOrder;
+import com.fs.store.domain.FsStoreOrderScrm;
+import com.fs.store.dto.ExpressNotifyDTO;
+import com.fs.store.dto.ExpressResultDTO;
+import com.fs.store.dto.FsStoreOrderComputeDTO;
+import com.fs.store.dto.StoreOrderExpressExportDTO;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 订单Service接口
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface IFsStoreOrderScrmService
+{
+
+    /**
+     * 查询订单
+     *
+     * @param id 订单ID
+     * @return 订单
+     */
+    public FsStoreOrderScrm selectFsStoreOrderById(Long id);
+
+    /**
+     * 查询订单列表
+     *
+     * @param fsStoreOrder 订单
+     * @return 订单集合
+     */
+    public List<FsStoreOrderScrm> selectFsStoreOrderList(FsStoreOrderScrm fsStoreOrder);
+
+    /**
+     * 新增订单
+     *
+     * @param fsStoreOrder 订单
+     * @return 结果
+     */
+    public int insertFsStoreOrder(FsStoreOrderScrm fsStoreOrder);
+
+    /**
+     * 修改订单
+     *
+     * @param fsStoreOrder 订单
+     * @return 结果
+     */
+    public int updateFsStoreOrder(FsStoreOrderScrm fsStoreOrder);
+
+    /**
+     * 批量删除订单
+     *
+     * @param ids 需要删除的订单ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderByIds(Long[] ids);
+
+    /**
+     * 删除订单信息
+     *
+     * @param id 订单ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderById(Long id);
+
+    List<FsStoreOrderVO> selectFsStoreOrderListVO(FsStoreOrderParam param);
+
+    List<FsStoreOrderVO> selectFsStoreOrderAllListVO(FsStoreOrderParam param);
+
+    List<FsStoreOrderVO> selectPayRemainListVO(FsStoreOrderParam param);
+
+
+    List<FsPromotionOrderVO> selectFsPromotionOrderListVO(FsStoreOrderParam param);
+
+    R confirmOrder(long uid, FsStoreConfirmOrderParam cartParam);
+
+    FsStoreOrderComputeDTO computedOrder(long parseLong, FsStoreOrderComputedParam param);
+
+    R createOrder(long userId, FsStoreOrderCreateParam param);
+
+    void cancelOrder(Long orderId);
+
+    void refundPrescribeOrder(Long orderId);
+
+    void refundOrder(Long orderId);
+
+    void deliveryOrder(String orderCode,String deliveryId,String deliverCode,String deliverName);
+
+    void updateDeliveryOrder(Long id,String deliveryId,String deliverCode,String deliverName);
+
+    List<FsMyStoreOrderListQueryVO> selectFsMyStoreOrderListVO(FsMyStoreOrderQueryParam param);
+
+    FsStoreOrderScrm selectFsStoreOrderByOrderCode(String orderCode);
+
+    R getExpress(FsStoreOrderScrm order);
+
+    R createUserOrder(FsStoreOrderCreateUserParam param);
+
+    List<FsMyStoreOrderListQueryVO> selectFsCompanyStoreOrderListVO(FsMyStoreOrderQueryParam param);
+
+    FsStoreOrderScrm selectFsStoreOrderByExtendOrderId(String orderId);
+
+    List<FsStoreOrderTuiVO> selectFsStoreOrderTuiListVO(String userId);
+
+    R confirmPackageOrder(long userId, FsStoreConfirmPackageIdOrderParam param);
+
+    R createPackageOrder(long userId, FsStorePackageOrderCreateParam param);
+
+    R finishOrder(Long orderId);
+
+    String payConfirm(Integer type,Long orderId,String payCode,String tradeNo,String bankTransactionId,String bankSerialNo);
+
+    Integer selectFsStoreOrderCount(long userId, int status);
+
+    /**
+     * 根据时间查询订单总数
+     * @param param
+     * @return
+     */
+    Integer selectFsStoreOrderCount(FsStoreOrderStatisticsParam param);
+
+    R computedPackageOrder(long userId, FsStoreComputedPackageIdOrderParam param);
+
+    FsStoreOrderScrm selectFsStoreOrderByDeliveryId(String logisticCode);
+
+    String importExpress(List<StoreOrderExpressExportDTO> list, boolean updateSupport) throws InterruptedException;
+
+    R createOmsOrder(Long orderId) throws ParseException;
+
+    ErpOrder getErpOrder(FsStoreOrderScrm order) throws ParseException;
+
+    FsStoreOrderVO selectFsStoreOrderVOByOrderCode(String orderCode);
+
+    Long selectFsStoreOrderTotalCount(int type,Long companyId,Long companyUserId);
+
+    R editTuiMoney(FsStoreOrderEditTuiMoneyParam param);
+
+    List<OrderListVO> selectCompanyStoreOrderListAPI(OrderListParam param);
+
+    List<FsStoreOrderScrm> selectFsStoreOrderByCompanyId(Long companyId);
+
+    List<FsStoreOrderScrm> selectFsStoreOrderListByDeliveryId(String logisticCode);
+
+    R refundOrderMoney(Long orderId);
+
+    R updateExpress(FsStoreOrderExpressEditParam param);
+
+    R syncExpress(FsStoreOrderExpressEditParam param);
+
+    R addTuiMoney(FsStoreOrderAddTuiMoneyParam param);
+
+    R createSalesOrder(CompanyUser companyUser, String cateIds);
+
+    R getSalesOrder(String createOrderKey);
+
+    R addUserCart(long userId, String createOrderKey);
+
+    R updateSalseOrderMoney(String createOrderKey, BigDecimal money,BigDecimal payAmount);
+
+    Integer selectFsStoreOrderCountByType(Long companyId, long userId, int type);
+
+    List<FsCustomerStoreOrderListQueryVO> selectFsCustomerStoreOrderListQuery(FsCustomerStoreOrderListQueryParam param);
+
+    List<JSONObject> selectFsStoreOrderCounts(Map<String, Object> toMap);
+
+    List<FsStoreOrderStatisticsVO> selectFsStoreOrderStatisticsList(FsStoreStatisticsParam param);
+
+    List<FsStoreOrderExportVO> selectFsStoreOrderListVOByExport(FsStoreOrderParam param);
+
+    List<FsStoreOrderPromotionExportVO> selectFsPromotionOrderListVOByExport(FsStoreOrderParam param);
+
+    List<FsStorePayRemainOrderExportVO> selectFsStorePayRemainOrderListVOByExport(FsStoreOrderParam param);
+
+    List<FsStoreOrderScrm> selectFsStoreOrderListByFinish7Day();
+
+    List<FsStoreOrderVO> selectFsCustomerStoreOrderListVO(FsStoreOrderParam param);
+
+    String payRemainConfirm(String payCode,String tradeNo,String bankTransactionId,String bankSerialNo);
+
+    R auditPayRemain(Long orderId);
+
+    Boolean isEntityNull(FsStoreOrderParam param);
+
+    int uploadCredentials(FsStoreOrderScrm order);
+
+    String getCredentialsById(Long id);
+
+    List<Long> selectFsStoreOrderToPushByIds(String startTime);
+
+    List<FsStoreOrderScrm> selectFsStoreOrderItemJson();
+
+    int uploadItemJson(FsStoreOrderScrm order);
+
+    ExpressResultDTO updateDeliveryItem(ExpressNotifyDTO notifyDTO);
+
+    FsStoreOrderScrm selectOrderByUserIdLimit1(Long userId);
+
+
+    List<FsStoreOrderScrm> selectFsStoreOrderStatisticsByUserId(List<Long> fsUserIdList);
+
+
+    /**
+     * 完成订单
+     * @param orderId 订单id
+     * @return R
+     */
+    R finishStoreOrder(Long orderId);
+
+    /**
+     * 根据时间查询实际支付金额
+     *
+     * @param param
+     * @return
+     */
+    BigDecimal selectFsStoreOrderByPayPriceCount(FsStoreOrderStatisticsParam param);
+}

+ 64 - 0
fs-service/src/main/java/com/fs/store/service/IFsStoreOrderStatusScrmService.java

@@ -0,0 +1,64 @@
+package com.fs.store.service;
+
+import com.fs.store.domain.FsStoreOrderStatusScrm;
+
+import java.util.List;
+
+/**
+ * 订单操作记录Service接口
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface IFsStoreOrderStatusScrmService
+{
+    /**
+     * 查询订单操作记录
+     * 
+     * @param id 订单操作记录ID
+     * @return 订单操作记录
+     */
+    public FsStoreOrderStatusScrm selectFsStoreOrderStatusById(Long id);
+
+    /**
+     * 查询订单操作记录列表
+     * 
+     * @param fsStoreOrderStatus 订单操作记录
+     * @return 订单操作记录集合
+     */
+    public List<FsStoreOrderStatusScrm> selectFsStoreOrderStatusList(FsStoreOrderStatusScrm fsStoreOrderStatus);
+
+    /**
+     * 新增订单操作记录
+     * 
+     * @param fsStoreOrderStatus 订单操作记录
+     * @return 结果
+     */
+    public int insertFsStoreOrderStatus(FsStoreOrderStatusScrm fsStoreOrderStatus);
+
+    /**
+     * 修改订单操作记录
+     * 
+     * @param fsStoreOrderStatus 订单操作记录
+     * @return 结果
+     */
+    public int updateFsStoreOrderStatus(FsStoreOrderStatusScrm fsStoreOrderStatus);
+
+    /**
+     * 批量删除订单操作记录
+     * 
+     * @param ids 需要删除的订单操作记录ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderStatusByIds(Long[] ids);
+
+    /**
+     * 删除订单操作记录信息
+     * 
+     * @param id 订单操作记录ID
+     * @return 结果
+     */
+    public int deleteFsStoreOrderStatusById(Long id);
+
+    int create(Long id, String value, String desc);
+}

+ 113 - 0
fs-service/src/main/java/com/fs/store/service/IFsStoreProductScrmService.java

@@ -0,0 +1,113 @@
+package com.fs.store.service;
+
+import com.fs.common.core.domain.R;
+import com.fs.statis.dto.ModifyMoreDTO;
+import com.fs.store.domain.FsStoreProductScrm;
+import com.fs.store.param.FsStoreProductScrmAddEditParam;
+import com.fs.store.param.FsStoreProductScrmQueryParam;
+import com.fs.store.vo.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 商品Service接口
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface IFsStoreProductScrmService
+{
+    /**
+     * 查询商品
+     *
+     * @param productId 商品ID
+     * @return 商品
+     */
+    public FsStoreProductScrm selectFsStoreProductById(Long productId);
+
+    /**
+     * 查询商品列表
+     *
+     * @param fsStoreProduct 商品
+     * @return 商品集合
+     */
+    public List<FsStoreProductScrm> selectFsStoreProductList(FsStoreProductScrm fsStoreProduct);
+
+    /**
+     * 新增商品
+     *
+     * @param fsStoreProduct 商品
+     * @return 结果
+     */
+    public int insertFsStoreProduct(FsStoreProductScrm fsStoreProduct);
+
+    /**
+     * 修改商品
+     *
+     * @param fsStoreProduct 商品
+     * @return 结果
+     */
+    public int updateFsStoreProduct(FsStoreProductScrm fsStoreProduct);
+
+    /**
+     * 批量删除商品
+     *
+     * @param productIds 需要删除的商品ID
+     * @return 结果
+     */
+    public int deleteFsStoreProductByIds(Long[] productIds);
+
+    /**
+     * 删除商品信息
+     *
+     * @param productId 商品ID
+     * @return 结果
+     */
+    public int deleteFsStoreProductById(Long productId);
+
+    List<FsStoreProductScrmListVO> selectFsStoreProductListVO(FsStoreProductScrm fsStoreProduct);
+
+    List<FsStoreProductScrmListVO> selectFsStoreProductBarCodeListVO(FsStoreProductScrm fsStoreProduct);
+
+    Map<String,Object> getFormatAttr(Long productId, String jsonStr);
+
+
+    R addOrEdit(FsStoreProductScrmAddEditParam fsStoreProduct);
+
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductTuiQuery(int count);
+
+
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductListQuery(FsStoreProductScrmQueryParam param);
+
+    FsStoreProductScrmQueryVO selectFsStoreProductByIdQuery(Long productId);
+
+    void decProductStock(Long productId, Long productAttrValueId, Integer cartNum);
+
+    void incProductStock(Long num, Long productId, Long productAttrValueId);
+
+
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductNewQuery(int count);
+
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductHotQuery(int count);
+
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductGoodQuery(int count);
+
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductTuiListQuery();
+
+    List<FsStoreProductScrmListQueryVO> selectFsStoreProductGoodListQuery();
+
+    Long selectFsStoreProductCount(int type);
+    Long selectFsStoreProductCount(int type,Long companyId);
+
+    List<FsStoreProductActivityScrmListVO> selectFsStoreProductByIds(String productIds);
+
+    int updateStock(Long productId);
+
+    List<FsStoreProductScrmExportVO> selectFsStoreProductExportList(FsStoreProductScrm fsStoreProduct);
+
+    String importStoreProduct(List<FsStoreProductScrmExportVO> list, boolean updateSupport);
+
+    void batchModify(ModifyMoreDTO modifyMoreDTO);
+
+}

+ 266 - 0
fs-service/src/main/java/com/fs/store/service/IFsUserService.java

@@ -0,0 +1,266 @@
+package com.fs.store.service;
+
+import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.ResponseResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.course.param.newfs.FsUserCourseBeMemberParam;
+import com.fs.course.vo.newfs.FsCourseAnalysisVO;
+import com.fs.his.vo.OptionsVO;
+import com.fs.qw.param.QwFsUserParam;
+import com.fs.qw.vo.QwFsUserVO;
+import com.fs.store.domain.FsStoreOrder;
+import com.fs.store.domain.FsStoreOrderItem;
+import com.fs.store.domain.FsUser;
+import com.fs.store.dto.FsUserTransferParamDTO;
+import com.fs.store.param.SelectCusListPageParam;
+import com.fs.store.param.h5.CourseAnalysisParam;
+import com.fs.store.param.h5.FsUserPageListParam;
+import com.fs.store.param.h5.UserStatisticsCommonParam;
+import com.fs.store.vo.FSUserVO;
+import com.fs.store.vo.FsCompanyUserListQueryVO;
+import com.fs.store.vo.FsUserTuiVO;
+import com.fs.store.vo.h5.*;
+import com.github.pagehelper.PageInfo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户Service接口
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface IFsUserService
+{
+    /**
+     * 查询用户
+     *
+     * @param userId 用户ID
+     * @return 用户
+     */
+    public FsUser selectFsUserById(Long userId);
+
+    /**
+
+     * 查询用户
+     *
+     * @param userId 用户ID
+     * @return FSUserVO
+     */
+    public FSUserVO selectFsUserByUserId(Long userId);
+
+    /**
+     * 查询用户列表
+     *
+     * @param fsUser 用户
+     * @return 用户集合
+     */
+    public List<FsUser> selectFsUserList(FsUser fsUser);
+
+    /**
+     * 查询用户列表
+     *
+     * @param fsUser 用户
+     * @return 用户集合
+     */
+    public List<FSUserVO> selectFsUserVOList(FsUser fsUser);
+
+    /**
+     * 新增用户
+     *
+     * @param fsUser 用户
+     * @return 结果
+     */
+    public int insertFsUser(FsUser fsUser);
+
+    /**
+     * 修改用户
+     *
+     * @param fsUser 用户
+     * @return 结果
+     */
+    public int updateFsUser(FsUser fsUser);
+
+    /**
+     * 批量删除用户
+     *
+     * @param userIds 需要删除的用户ID
+     * @return 结果
+     */
+    public int deleteFsUserByIds(Long[] userIds);
+
+    /**
+     * 删除用户信息
+     *
+     * @param userId 用户ID
+     * @return 结果
+     */
+    public int deleteFsUserById(Long userId);
+
+    int decIntegral( Long uid,  double usedIntegral);
+
+    int incPayCount(Long userId);
+
+    FsUser selectFsUserByPhone(String phone);
+
+    TableDataInfo selectCusListPage(SelectCusListPageParam param);
+
+    List<FsCompanyUserListQueryVO> selectFsCompanyUserListQuery(FsUser fsUser);
+
+    List<FsUserTuiVO> selectFsUserTuiList(String userId);
+
+    Long selectFsUserCount(int type,Long companyI,Long companyUserId);
+
+    void addTuiMoney(FsStoreOrder order, List<FsStoreOrderItem> items);
+
+    void subTuiMoney(FsStoreOrder order);
+
+    void addMoney(FsStoreOrder order);
+
+    FsUser selectFsUserByMaOpenId(String openid);
+
+    FsUser selectFsUserByMpOpenId(String openid);
+
+    FsUser selectFsUserByUnionId(String unionId);
+
+
+    FsUser selectFsUserByCourseMaOpenId(String openId);
+
+
+    FsUser selectFsUserByUserCode(String userCode);
+
+    //CRM客户绑定 小程序客户之 查询小程序客户
+    List<QwFsUserVO> selecQwFsUserListVO(QwFsUserParam qwFsUserParam);
+
+    List<QwFsUserVO> selectQwFsUserListVO(QwFsUserParam qwFsUserParam);
+
+    R clearUserVip(Long l);
+
+    FsUser selectFsUserByUnionid(String unionId);
+
+    List<FsUser> getUserListLimit(FsUser fsUser);
+
+    PageInfo<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param);
+    TableDataInfo selectFsUserPageListNew(FsUserPageListParam param);
+    Long selectFsUserCount(FsUserPageListParam param);
+
+    UserListPageVO getUserNumber(Long userId);
+
+    UserDetailsVO getUserDetails(Long userId, Long fsUserId, String dateTag);
+
+    /**
+     * 查询重粉用户是否存在
+     * @param userIds
+     * @return
+     */
+    Integer selectFsUserByUserIds(String[] userIds, Long companyUserId);
+
+    Boolean disabledUser(String[] ids, boolean status);
+
+    void transfer(FsUserTransferParamDTO param);
+
+    /**
+     * 查询销售会员总数,今日新增会员数
+     * @param companyUserId 销售ID
+     * @return map
+     */
+    Map<String, Long> getUserVipCountByCompanyUserId(Long companyUserId);
+
+    /**
+     * 首页-获取用户总数
+     * @param userId 登录用户id
+     * @return vo
+     */
+    FsUserSummaryCountVO userSummaryCount(Long userId);
+
+    /**
+     * 首页数据统计-课程、答题、红包统计
+     * @param param 查询参数
+     * @return vo
+     */
+    FsUserStatisticsVO userStatistics(UserStatisticsCommonParam param);
+
+    /**
+     * 数据详情统计-根据课程id 视频id进行详情统计
+     * @param param 查询参数
+     * @return vo
+     */
+    FsUserStatisticsVO userStatisticsDetails(UserStatisticsCommonParam param);
+
+    /**
+     * 首页数据/详情-获取群管排行榜统计
+     * @param userId 登录用户id
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @param periodId 营期id
+     * @param videoId 视频id
+     * @param order 排序,asc-正序,desc-倒序
+     * @param type 类型,1-按完播率,2-按正确率
+     * @return vo
+     */
+    List<FsUserRankingVO> userRanking(Long userId, String startTime, String endTime, String periodId, String videoId, String order, Integer type);
+
+    /**
+     * 首页数据/详情-获取课程排行榜统计
+     * @param userId 登录用户id
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @param periodId 营期id
+     * @param videoId 视频id
+     * @param order 排序,asc-正序,desc-倒序
+     * @param type 类型,1-按完播率,2-按正确率
+     * @return vo
+     */
+    List<FsCourseRankingVO> courseRanking(Long userId, String startTime, String endTime, String periodId, String videoId, String order, Integer type);
+
+    /**
+     *
+     * @param param 查询参数
+     * @return vo
+     */
+    List<FsUserGraphicStatisticsVO> graphicStatistics(UserStatisticsCommonParam param);
+
+    /**
+     * 课程分析查询-某销售下课程视频的观看和答题情况统计
+     * @param param 参数
+     * @return vo
+     */
+    List<FsCourseAnalysisVO> courseAnalysis(CourseAnalysisParam param);
+
+    /**
+     * 查询某个群管(二级销售)的会员统计
+     * @param userId 登录用户id
+     * @param companyUserId 销售id
+     * @return vo
+     */
+    CompanyUserSummaryCountVO companyUserSummaryCount(Long userId, String companyUserId);
+
+    /**
+     * 成为销售的会员
+     * @param param
+     * @return 是否成功
+     */
+    ResponseResult<Boolean> becomeMember(FsUserCourseBeMemberParam param);
+
+    /**
+     * 查询会员选项列表
+     * @param params    参数
+     * @return  list
+     */
+    List<OptionsVO> selectUserListByMap(Map<String, Object> params);
+
+    /**
+     * 打重粉标签
+     * @param param
+     */
+    void setRepeatFansTag(FsUserCourseBeMemberParam param);
+
+    /**
+     * 根据组合key(用户昵称+id)查询用户信息
+     * @param userNameKey (用户昵称+id)
+     * @return
+     */
+    List<FsUser> selectFsUserListByJointUserNameKey(String userNameKey);
+
+}

+ 68 - 0
fs-service/src/main/java/com/fs/store/service/IFsWechatTemplateService.java

@@ -0,0 +1,68 @@
+package com.fs.store.service;
+
+import com.fs.store.domain.FsWechatTemplate;
+
+import java.util.List;
+
+/**
+ * 微信模板Service接口
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+public interface IFsWechatTemplateService 
+{
+    /**
+     * 查询微信模板
+     * 
+     * @param id 微信模板ID
+     * @return 微信模板
+     */
+    public FsWechatTemplate selectFsWechatTemplateById(Integer id);
+
+    /**
+     * 查询微信模板列表
+     * 
+     * @param fsWechatTemplate 微信模板
+     * @return 微信模板集合
+     */
+    public List<FsWechatTemplate> selectFsWechatTemplateList(FsWechatTemplate fsWechatTemplate);
+
+    /**
+     * 新增微信模板
+     * 
+     * @param fsWechatTemplate 微信模板
+     * @return 结果
+     */
+    public int insertFsWechatTemplate(FsWechatTemplate fsWechatTemplate);
+
+    /**
+     * 修改微信模板
+     * 
+     * @param fsWechatTemplate 微信模板
+     * @return 结果
+     */
+    public int updateFsWechatTemplate(FsWechatTemplate fsWechatTemplate);
+
+    /**
+     * 批量删除微信模板
+     * 
+     * @param ids 需要删除的微信模板ID
+     * @return 结果
+     */
+    public int deleteFsWechatTemplateByIds(Integer[] ids);
+
+    /**
+     * 删除微信模板信息
+     * 
+     * @param id 微信模板ID
+     * @return 结果
+     */
+    public int deleteFsWechatTemplateById(Integer id);
+
+    FsWechatTemplate selectFsWechatTemplateByKey(String key);
+
+    List<String> selectFsWechatTemplateIds();
+
+    List<String> selectFsWechatTemplateIdsByKeys(String key);
+}

+ 319 - 0
fs-service/src/main/java/com/fs/store/service/impl/FsExpressScrmServiceImpl.java

@@ -0,0 +1,319 @@
+package com.fs.store.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
+import com.fs.common.config.FSSysConfig;
+import com.fs.common.core.domain.R;
+import com.fs.common.exception.CustomException;
+import com.fs.common.utils.DateUtils;
+import com.fs.store.domain.FsExpressScrm;
+import com.fs.store.domain.FsStoreOrderScrm;
+import com.fs.store.dto.ExpressScrmInfoDTO;
+import com.fs.store.mapper.FsExpressScrmMapper;
+import com.fs.store.mapper.FsStoreOrderScrmMapper;
+import com.fs.store.param.ExpressScrmParam;
+import com.fs.store.service.IFsExpressScrmService;
+import com.fs.store.vo.ExpressScrmVO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Base64Utils;
+
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 快递公司Service业务层处理
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+@Service
+public class FsExpressScrmServiceImpl implements IFsExpressScrmService
+{
+
+    Logger logger = LoggerFactory.getLogger(FsExpressScrmServiceImpl.class);
+
+    @Autowired
+    private FsExpressScrmMapper fsExpressScrmMapper;
+    @Autowired
+    private FsStoreOrderScrmMapper fsStoreOrderScrmMapper;
+    @Autowired
+    private FSSysConfig sysConfig;
+    /**
+     * 查询快递公司
+     * 
+     * @param id 快递公司ID
+     * @return 快递公司
+     */
+    @Override
+    public FsExpressScrm selectFsExpressById(Long id)
+    {
+        return fsExpressScrmMapper.selectFsExpressById(id);
+    }
+
+    /**
+     * 查询快递公司列表
+     * 
+     * @param fsExpress 快递公司
+     * @return 快递公司
+     */
+    @Override
+    public List<FsExpressScrm> selectFsExpressList(FsExpressScrm fsExpress)
+    {
+        return fsExpressScrmMapper.selectFsExpressList(fsExpress);
+    }
+
+    /**
+     * 新增快递公司
+     * 
+     * @param fsExpress 快递公司
+     * @return 结果
+     */
+    @Override
+    public int insertFsExpress(FsExpressScrm fsExpress)
+    {
+        fsExpress.setCreateTime(DateUtils.getNowDate());
+        return fsExpressScrmMapper.insertFsExpress(fsExpress);
+    }
+
+    /**
+     * 修改快递公司
+     * 
+     * @param fsExpress 快递公司
+     * @return 结果
+     */
+    @Override
+    public int updateFsExpress(FsExpressScrm fsExpress)
+    {
+        fsExpress.setUpdateTime(DateUtils.getNowDate());
+        return fsExpressScrmMapper.updateFsExpress(fsExpress);
+    }
+
+    /**
+     * 批量删除快递公司
+     * 
+     * @param ids 需要删除的快递公司ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsExpressByIds(Long[] ids)
+    {
+        return fsExpressScrmMapper.deleteFsExpressByIds(ids);
+    }
+
+    /**
+     * 删除快递公司信息
+     * 
+     * @param id 快递公司ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsExpressById(Long id)
+    {
+        return fsExpressScrmMapper.deleteFsExpressById(id);
+    }
+
+    @Override
+    public ExpressScrmInfoDTO getExpressInfo(String OrderCode, String ShipperCode, String LogisticCode, String lastFourNumber)     {
+
+        //处理顺丰查询轨迹需手机号码后4位
+        String requestData;
+        if (ShipperCode.equals(ShipperCodeEnum.SF.getValue())) {
+            requestData = "{'OrderCode':'" + OrderCode + "','ShipperCode':'" + ShipperCode + "','LogisticCode':'" + LogisticCode + "','CustomerName':'" + lastFourNumber + "'}";
+        } else {
+            requestData = "{'OrderCode':'" + OrderCode + "','ShipperCode':'" + ShipperCode + "','LogisticCode':'" + LogisticCode + "'}";
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        try {
+            params.put("RequestData", URLEncoder.encode(requestData, "UTF-8"));
+            params.put("EBusinessID",sysConfig.getKdnId().trim());
+            params.put("RequestType", "8001");
+            String dataSign = encrypt(requestData, sysConfig.getKdnKeyId().trim(), "UTF-8");
+            params.put("DataSign", URLEncoder.encode(dataSign, "UTF-8"));
+            params.put("DataType", "2");
+
+            String result = HttpUtil.post(sysConfig.getKdnUrl().trim(), params);
+
+            //根据公司业务处理返回的信息......
+            ExpressScrmInfoDTO dto=JSONUtil.toBean(result,ExpressScrmInfoDTO.class);
+            return dto;
+        } catch (Exception e) {
+            throw  new CustomException(e.getMessage());
+        }
+
+    }
+
+    @Override
+    public FsExpressScrm selectFsExpressByCode(String code) {
+        return fsExpressScrmMapper.selectFsExpressByCode(code);
+    }
+
+    @Override
+    public FsExpressScrm selectFsExpressByOmsCode(String omsCode) {
+        return fsExpressScrmMapper.selectFsExpressByOmsCode(omsCode);
+    }
+
+    @Override
+    public FsExpressScrm selectFsExpressByName(String deliveryName) {
+        return fsExpressScrmMapper.selectFsExpressByName(deliveryName);
+    }
+
+    @Override
+    public void subscribeEspress(String orderCode, String deliverySn, String deliveryId, String userPhone) {
+        //处理顺丰查询轨迹需手机号码后4位
+        String requestData;
+        if (deliverySn.equals(ShipperCodeEnum.SF.getValue())) {
+            requestData = "{'OrderCode':'" + orderCode + "','ShipperCode':'" + deliverySn + "','LogisticCode':'" + deliveryId + "','CustomerName':'" + userPhone + "'}";
+        } else {
+            requestData = "{'OrderCode':'" + orderCode + "','ShipperCode':'" + deliverySn + "','LogisticCode':'" + deliveryId + "'}";
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        try {
+            params.put("RequestData", URLEncoder.encode(requestData, "UTF-8"));
+            params.put("EBusinessID",sysConfig.getKdnId().trim());
+            params.put("RequestType", "8008");
+            String dataSign = encrypt(requestData, sysConfig.getKdnKeyId().trim(), "UTF-8");
+            params.put("DataSign", URLEncoder.encode(dataSign, "UTF-8"));
+            params.put("DataType", "2");
+            String result = HttpUtil.post(sysConfig.getKdnSubscribeUrl().trim(), params);
+            logger.info("订阅物流:"+result);
+
+        } catch (Exception e) {
+            throw  new CustomException(e.getMessage());
+        }
+    }
+
+    @Override
+    public R parseAddress(String content) {
+        //处理顺丰查询轨迹需手机号码后4位
+        String requestData  = "{'Content':'" + content + "'}";
+
+        Map<String, Object> params = new HashMap<>();
+        try {
+            params.put("RequestData", URLEncoder.encode(requestData, "UTF-8"));
+            params.put("EBusinessID",sysConfig.getKdnId().trim());
+            params.put("RequestType", "6001");
+            String dataSign = encrypt(requestData, sysConfig.getKdnKeyId().trim(), "UTF-8");
+            params.put("DataSign", URLEncoder.encode(dataSign, "UTF-8"));
+            params.put("DataType", "2");
+            String result = HttpUtil.post(sysConfig.getKdnSubscribeUrl().trim(), params);
+            ExpressAddressDTO dto=JSONUtil.toBean(result,ExpressAddressDTO.class);
+            if(dto.getSuccess()){
+                return R.ok().put("data",dto.getData());
+            }
+            else{
+                return R.error(dto.getReason());
+            }
+        } catch (Exception e) {
+            throw  new CustomException(e.getMessage());
+        }
+    }
+
+    @Override
+    public List<ExpressScrmVO> getExpressInfoAPI(ExpressScrmParam param) {
+        FsStoreOrderScrm order=fsStoreOrderScrmMapper.selectFsStoreOrderByDeliveryId(param.getPackageno());
+        if(order!=null){
+
+            String lastFourNumber = "";
+            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+                lastFourNumber = order.getUserPhone();
+                if (lastFourNumber.length() == 11) {
+                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+                }
+            }
+
+            //处理顺丰查询轨迹需手机号码后4位
+            String requestData;
+            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+                requestData = "{'OrderCode':'" + order.getOrderCode() + "','ShipperCode':'" + order.getDeliverySn() + "','LogisticCode':'" + param.getPackageno() + "','CustomerName':'" + lastFourNumber + "'}";
+            } else {
+                requestData = "{'OrderCode':'" + order.getOrderCode() + "','ShipperCode':'" + order.getDeliverySn() + "','LogisticCode':'" + param.getPackageno() + "'}";
+            }
+
+            Map<String, Object> params = new HashMap<>();
+            try {
+                params.put("RequestData", URLEncoder.encode(requestData, "UTF-8"));
+                params.put("EBusinessID",sysConfig.getKdnId().trim());
+                params.put("RequestType", "8001");
+                String dataSign = encrypt(requestData, sysConfig.getKdnKeyId().trim(), "UTF-8");
+                params.put("DataSign", URLEncoder.encode(dataSign, "UTF-8"));
+                params.put("DataType", "2");
+
+                String result = HttpUtil.post(sysConfig.getKdnUrl().trim(), params);
+                //根据公司业务处理返回的信息......
+                ExpressScrmInfoDTO dto=JSONUtil.toBean(result,ExpressScrmInfoDTO.class);
+                if(dto!=null&&dto.getTraces()!=null){
+                    List<ExpressVO> list=new ArrayList<>();
+                    for(TracesDTO tracesDTO:dto.getTraces()){
+                        ExpressVO expressVO=new ExpressVO();
+                        expressVO.setLocation(tracesDTO.getLocation());
+                        expressVO.setRemark(tracesDTO.getAcceptStation());
+                        expressVO.setStatus(tracesDTO.getAction());
+                        expressVO.setTracedate(tracesDTO.getAcceptTime());
+                        list.add(expressVO);
+
+                    }
+                    return list;
+                }
+            } catch (Exception e) {
+                throw  new CustomException(e.getMessage());
+            }
+        }
+        return null;
+
+    }
+
+    /**
+     * Sign签名生成
+     *
+     * @param content  内容
+     * @param keyValue Appkey
+     * @param charset  编码方式
+     * @return DataSign签名
+     */
+    private String encrypt(String content, String keyValue, String charset) {
+        if (keyValue != null) {
+            content = content + keyValue;
+        }
+        byte[] src;
+        try {
+            src = MD5(content, charset).getBytes(charset);
+            return Base64Utils.encodeToString(src);
+        } catch (Exception e) {
+        }
+
+        return null;
+    }
+
+    /**
+     * MD5加密
+     *
+     * @param str     内容
+     * @param charset 编码方式
+     * @throws Exception
+     */
+    private String MD5(String str, String charset) throws Exception {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        md.update(str.getBytes(charset));
+        byte[] result = md.digest();
+        StringBuilder sb = new StringBuilder(32);
+        for (int i = 0; i < result.length; i++) {
+            int val = result[i] & 0xff;
+            if (val <= 0xf) {
+                sb.append("0");
+            }
+            sb.append(Integer.toHexString(val));
+        }
+        return sb.toString().toLowerCase();
+    }
+
+}

+ 117 - 0
fs-service/src/main/java/com/fs/store/service/impl/FsStoreOrderItemScrmServiceImpl.java

@@ -0,0 +1,117 @@
+package com.fs.store.service.impl;
+
+import com.fs.store.domain.FsStoreOrderItemScrm;
+import com.fs.store.mapper.FsStoreOrderItemScrmMapper;
+import com.fs.store.param.FsStoreOrderScrmParam;
+import com.fs.store.service.IFsStoreOrderItemScrmService;
+import com.fs.store.vo.FsStoreOrderItemScrmExportVO;
+import com.fs.store.vo.FsStoreOrderItemScrmVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 订单详情Service业务层处理
+ *
+ * @author fs
+ * @date 2022-03-21
+ */
+@Service
+public class FsStoreOrderItemScrmServiceImpl implements IFsStoreOrderItemScrmService
+{
+    @Autowired
+    private FsStoreOrderItemScrmMapper fsStoreOrderItemScrmMapper;
+
+    /**
+     * 查询订单详情
+     *
+     * @param itemId 订单详情ID
+     * @return 订单详情
+     */
+    @Override
+    public FsStoreOrderItemScrm selectFsStoreOrderItemById(Long itemId)
+    {
+        return fsStoreOrderItemScrmMapper.selectFsStoreOrderItemById(itemId);
+    }
+
+    /**
+     * 查询订单详情列表
+     *
+     * @param fsStoreOrderItem 订单详情
+     * @return 订单详情
+     */
+    @Override
+    public List<FsStoreOrderItemScrm> selectFsStoreOrderItemList(FsStoreOrderItemScrm fsStoreOrderItem)
+    {
+        return fsStoreOrderItemScrmMapper.selectFsStoreOrderItemList(fsStoreOrderItem);
+    }
+
+    /**
+     * 新增订单详情
+     *
+     * @param fsStoreOrderItem 订单详情
+     * @return 结果
+     */
+    @Override
+    public int insertFsStoreOrderItem(FsStoreOrderItemScrm fsStoreOrderItem)
+    {
+        return fsStoreOrderItemScrmMapper.insertFsStoreOrderItem(fsStoreOrderItem);
+    }
+
+    /**
+     * 修改订单详情
+     *
+     * @param fsStoreOrderItem 订单详情
+     * @return 结果
+     */
+    @Override
+    public int updateFsStoreOrderItem(FsStoreOrderItemScrm fsStoreOrderItem)
+    {
+        return fsStoreOrderItemScrmMapper.updateFsStoreOrderItem(fsStoreOrderItem);
+    }
+
+    /**
+     * 批量删除订单详情
+     *
+     * @param itemIds 需要删除的订单详情ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreOrderItemByIds(Long[] itemIds)
+    {
+        return fsStoreOrderItemScrmMapper.deleteFsStoreOrderItemByIds(itemIds);
+    }
+
+    /**
+     * 删除订单详情信息
+     *
+     * @param itemId 订单详情ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreOrderItemById(Long itemId)
+    {
+        return fsStoreOrderItemScrmMapper.deleteFsStoreOrderItemById(itemId);
+    }
+
+    @Override
+    public List<FsStoreOrderItemScrmVO> selectFsStoreOrderItemListByOrderId(Long ordreId) {
+        return fsStoreOrderItemScrmMapper.selectFsStoreOrderItemListByOrderId(ordreId);
+    }
+
+    @Override
+    public List<FsStoreOrderItemScrmExportVO> selectFsStoreOrderItemListExportVO(FsStoreOrderScrmParam fsStoreOrder) {
+        return fsStoreOrderItemScrmMapper.selectFsStoreOrderItemListExportVO(fsStoreOrder);
+    }
+
+    @Override
+    public Long countFsStoreOrderItemListExportVO(FsStoreOrderScrmParam fsStoreOrder) {
+        return fsStoreOrderItemScrmMapper.itemsCount(fsStoreOrder);
+    }
+
+    @Override
+    public int updateFsStoreOrderCode(Long orderId, String orderCode) {
+        return fsStoreOrderItemScrmMapper.updateFsStoreOrderCode(orderId,orderCode);
+    }
+}

+ 2637 - 0
fs-service/src/main/java/com/fs/store/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -0,0 +1,2637 @@
+package com.fs.store.service.impl;
+
+import cn.hutool.core.net.URLDecoder;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fs.common.config.FSSysConfig;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.common.exception.CustomException;
+import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyDept;
+import com.fs.company.domain.CompanyMoneyLogs;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyMapper;
+import com.fs.company.mapper.CompanyMoneyLogsMapper;
+import com.fs.company.service.ICompanyDeptService;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.erp.domain.*;
+import com.fs.erp.dto.*;
+import com.fs.erp.mapper.FsErpFinishPushMapper;
+import com.fs.erp.service.IErpOrderService;
+import com.fs.his.utils.ConfigUtil;
+import com.fs.huifuPay.domain.HuiFuRefundResult;
+import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
+import com.fs.huifuPay.service.HuiFuService;
+import com.fs.pay.pay.domain.RefundResult;
+import com.fs.pay.pay.service.PayService;
+import com.fs.pay.service.IPayService;
+import com.fs.store.config.StoreConfig;
+import com.fs.store.mapper.FsStoreCartScrmMapper;
+import com.fs.store.mapper.FsStoreOrderScrmMapper;
+import com.fs.store.mapper.FsUserAddressMapper;
+import com.fs.store.service.IFsStoreOrderScrmService;
+import com.fs.store.service.IFsStoreOrderStatusScrmService;
+import com.fs.store.service.IFsStoreProductScrmService;
+import com.fs.system.service.ISysConfigService;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import lombok.Synchronized;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.nio.charset.Charset;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * 订单Service业务层处理
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+@Service
+@EnableAspectJAutoProxy(proxyTargetClass = true,exposeProxy = true)
+@Slf4j
+public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService
+{
+
+    Logger logger= LoggerFactory.getLogger(getClass());
+    @Autowired
+    private CompanyMoneyLogsMapper moneyLogsMapper;
+    @Autowired
+    private IFsStoreOrderStatusScrmService orderStatusService;
+    @Autowired
+    private FsStoreCartScrmMapper cartMapper;
+
+    @Autowired
+    private FsUserAddressMapper userAddressMapper;
+
+    @Autowired
+    private FsStoreOrderScrmMapper fsStoreOrderMapper;
+
+    @Autowired
+    private IFsStoreProductScrmService productService;
+
+    @Autowired
+    private IFsUserService userService;
+
+    @Autowired
+    private IFsUserBillService billService;
+
+    @Autowired
+    RedisCache redisCache;
+
+    @Autowired
+    private IFsStoreCartService cartService;
+
+    @Autowired
+    private ApplicationEventPublisher publisher;
+
+    @Autowired
+    private IFsShippingTemplatesService shippingTemplatesService;
+
+    @Autowired
+    private IFsShippingTemplatesRegionService shippingTemplatesRegionService;
+
+    @Autowired
+    private IFsShippingTemplatesFreeService shippingTemplatesFreeService;
+    @Autowired
+    private IFsExpressService expressService;
+
+    @Autowired
+    private IPayService payService;
+    @Autowired
+    private FSSysConfig sysConfig;
+
+    @Autowired
+    private ConfigUtil configUtil;
+    @Autowired
+    IFsStorePaymentService paymentService;
+
+    @Autowired
+    IFsStoreProductPackageService productPackageService;
+
+    @Autowired
+    ICompanyUserService companyUserService;
+    @Autowired
+    private IFsStoreProductAttrValueService attrValueService;
+    @Autowired
+    private IFsStoreProductService storeProductService;
+
+    @Autowired
+    private IFsStoreCouponUserService couponUserService;
+    @Autowired
+    private ICompanyService companyService;
+    @Autowired
+    private IFsStoreOrderItemService storeOrderItemService;
+
+    @Autowired
+    private ISysConfigService configService;
+
+    @Autowired
+    private IFsStoreProductGroupService storeProductGroupService;
+
+    @Autowired
+    private FsStoreOrderItemMapper fsStoreOrderItemMapper;
+    @Autowired
+    ICompanyDeptService companyDeptService;
+    @Autowired
+    IFsPrescribeService prescribeService;
+
+    @Autowired
+    PayService ybPayService;
+
+    @Autowired
+    HuiFuService huiFuService;
+    @Autowired
+    private WxPayService wxPayService;
+    @Autowired
+    private WxPayProperties wxPayProperties;
+
+    @Autowired
+    private FsErpFinishPushMapper fsErpFinishPushMapper;
+
+    @Autowired
+    @Qualifier("erpOrderServiceImpl")
+    private IErpOrderService gyOrderService;
+
+    @Autowired
+    @Qualifier("wdtErpOrderServiceImpl")
+    private IErpOrderService wdtOrderService;
+
+    @Autowired
+    @Qualifier("k9OrderServiceImpl")
+    private IErpOrderService k9OrderService;
+
+    @Autowired
+    private IFsStoreOrderAuditService orderAuditService;
+    @Autowired
+    private IFsStoreOrderAuditLogService orderAuditLogService;
+    @Autowired
+    private CompanyMapper companyMapper;
+
+    /**
+     * 查询订单
+     *
+     * @param id 订单ID
+     * @return 订单
+     */
+    @Override
+    public FsStoreOrder selectFsStoreOrderById(Long id)
+    {
+        return fsStoreOrderMapper.selectFsStoreOrderById(id);
+    }
+
+    /**
+     * 查询订单列表
+     *
+     * @param fsStoreOrder 订单
+     * @return 订单
+     */
+    @Override
+    public List<FsStoreOrder> selectFsStoreOrderList(FsStoreOrder fsStoreOrder)
+    {
+        return fsStoreOrderMapper.selectFsStoreOrderList(fsStoreOrder);
+    }
+
+    /**
+     * 新增订单
+     *
+     * @param fsStoreOrder 订单
+     * @return 结果
+     */
+    @Override
+    public int insertFsStoreOrder(FsStoreOrder fsStoreOrder)
+    {
+        fsStoreOrder.setCreateTime(DateUtils.getNowDate());
+        return fsStoreOrderMapper.insertFsStoreOrder(fsStoreOrder);
+    }
+
+    /**
+     * 修改订单
+     *
+     * @param fsStoreOrder 订单
+     * @return 结果
+     */
+    @Override
+    public int updateFsStoreOrder(FsStoreOrder fsStoreOrder)
+    {
+        fsStoreOrder.setUpdateTime(DateUtils.getNowDate());
+        return fsStoreOrderMapper.updateFsStoreOrder(fsStoreOrder);
+    }
+
+    /**
+     * 批量删除订单
+     *
+     * @param ids 需要删除的订单ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreOrderByIds(Long[] ids)
+    {
+        return fsStoreOrderMapper.deleteFsStoreOrderByIds(ids);
+    }
+
+    /**
+     * 删除订单信息
+     *
+     * @param id 订单ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreOrderById(Long id)
+    {
+        return fsStoreOrderMapper.deleteFsStoreOrderById(id);
+    }
+
+    @Override
+    public List<FsStoreOrderVO> selectFsStoreOrderListVO(FsStoreOrderParam param) {
+        List<FsStoreOrderVO> list= fsStoreOrderMapper.selectFsStoreOrderListVO(param);
+        for(FsStoreOrderVO vo:list){
+            String nickName = vo.getUserPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2");
+            vo.setNickname(nickName);
+            if(StringUtils.isNotEmpty(vo.getItemJson())){
+                JSONArray jsonArray=JSONUtil.parseArray(vo.getItemJson());
+                List<FsStoreOrderItemVO> items=JSONUtil.toList(jsonArray, FsStoreOrderItemVO.class);
+                if(items.size()>0){
+                    vo.setItems(items);
+                }
+            }
+            //List<FsStoreOrderItemVO> items=storeOrderItemService.selectFsStoreOrderItemListByOrderId(vo.getId());
+            //vo.setItems(items);
+        }
+        return list;
+    }
+
+    @Override
+    public List<FsStoreOrderVO> selectFsStoreOrderAllListVO(FsStoreOrderParam param) {
+        List<FsStoreOrderVO> list= fsStoreOrderMapper.selectFsStoreOrderAllListVO(param);
+        for(FsStoreOrderVO vo:list){
+            String nickName = vo.getUserPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2");
+            vo.setNickname(nickName);
+            if(StringUtils.isNotEmpty(vo.getItemJson())){
+                JSONArray jsonArray=JSONUtil.parseArray(vo.getItemJson());
+                List<FsStoreOrderItemVO> items=JSONUtil.toList(jsonArray, FsStoreOrderItemVO.class);
+                if(items.size()>0){
+                    vo.setItems(items);
+                }
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public List<FsStoreOrderVO> selectPayRemainListVO(FsStoreOrderParam param) {
+        List<FsStoreOrderVO> list= fsStoreOrderMapper.selectFsPayRemainListVO(param);
+        for(FsStoreOrderVO vo:list){
+            String nickName = vo.getUserPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2");
+            vo.setNickname(nickName);
+            if(StringUtils.isNotEmpty(vo.getItemJson())){
+                JSONArray jsonArray=JSONUtil.parseArray(vo.getItemJson());
+                List<FsStoreOrderItemVO> items=JSONUtil.toList(jsonArray, FsStoreOrderItemVO.class);
+                if(items.size()>0){
+                    vo.setItems(items);
+                }
+            }
+
+        }
+        return list;
+    }
+
+
+    @Override
+    public List<FsPromotionOrderVO> selectFsPromotionOrderListVO(FsStoreOrderParam param) {
+        List<FsPromotionOrderVO> list = fsStoreOrderMapper.selectFsPromotionOrderListVO(param);
+        for(FsPromotionOrderVO vo:list){
+            String nickName = vo.getUserPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2");
+            String tuiNickName = vo.getTuiNickName().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2");
+            vo.setNickname(nickName);
+            vo.setTuiNickName(tuiNickName);
+            if(StringUtils.isNotEmpty(vo.getItemJson())){
+                JSONArray jsonArray=JSONUtil.parseArray(vo.getItemJson());
+                List<FsStoreOrderItemVO> items=JSONUtil.toList(jsonArray, FsStoreOrderItemVO.class);
+                if(items.size()>0){
+                    vo.setItems(items);
+                }
+            }
+
+        }
+        return list;
+    }
+
+    @Override
+    public R confirmOrder(long uid, FsStoreConfirmOrderParam cartParam) {
+        //获取地址信息和购物车信息
+        FsUserAddress address= userAddressMapper.selectFsUserAddressByDefaultAddress(uid);
+        List<FsStoreCartQueryVO>  carts=cartMapper.selectFsStoreCartListByIds(cartParam.getCartIds());
+        String uuid = IdUtil.randomUUID();
+        redisCache.setCacheObject("orderKey:"+uuid, cartParam.getCartIds(), 300, TimeUnit.SECONDS);
+        redisCache.setCacheObject("orderCarts:"+uuid, carts, 300, TimeUnit.SECONDS);
+        return R.ok().put("orderKey",uuid).put("address",address).put("carts",carts);
+
+    }
+
+    @Override
+    public FsStoreOrderComputeDTO computedOrder(long uid, FsStoreOrderComputedParam param) {
+        String cartIds = redisCache.getCacheObject("orderKey:" + param.getOrderKey());
+        if (ObjectUtil.isNull(cartIds)) {
+            throw new CustomException("订单已过期",501);
+        }
+        List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + param.getOrderKey());
+        BigDecimal payPrice=getOrderSumPrice(carts,"truePrice");
+        if(StringUtils.isNotEmpty(param.getCreateOrderKey()))
+        {
+            BigDecimal money=redisCache.getCacheObject("createOrderMoney:"+param.getCreateOrderKey());
+            if(money!=null){
+                payPrice=money;
+            }
+        }
+        BigDecimal serviceFee=BigDecimal.ZERO;
+        String configJson=configService.selectConfigByKey("store.config");
+        StoreConfig config=JSONUtil.toBean(configJson,StoreConfig.class);
+        if(config.getServiceFee()!=null){
+            serviceFee=config.getServiceFee();
+        }
+        payPrice = payPrice.add(serviceFee);
+        FsUserAddress userAddress = null;
+        if (param.getAddressId()!=null) {
+            userAddress = userAddressMapper.selectFsUserAddressById(param.getAddressId());
+        }
+        FsStoreOrderPriceDTO priceGroup = this.getOrderPriceGroup(carts, userAddress);
+        BigDecimal payPostage = priceGroup.getStorePostage();
+        payPrice = NumberUtil.add(payPrice, payPostage);
+
+        FsUser user=userService.selectFsUserById(uid);
+        // 积分抵扣
+        BigDecimal deductionPrice = BigDecimal.ZERO; //积分抵扣金额
+        double usedIntegral = 0; //使用了多少积分
+        if (param.getUseIntegral()!=null&&param.getUseIntegral()==1 && user.getIntegral().intValue() > 0) {
+            //如果积分总和小于用户积分 抵扣比例 计算抵扣价格
+            //默认配置
+            Double integralMax = Double.valueOf(100);
+            BigDecimal integralFull = new BigDecimal(100);
+            Double integralRatio = Double.valueOf(1);
+            String json=configService.selectConfigByKey("store.integral");
+            if(StringUtils.isEmpty(json)) {
+
+            }
+            else{
+                StoreIntegralConfig integralConfig=JSONUtil.toBean(json,StoreIntegralConfig.class);
+                integralMax = integralConfig.getIntegralMax();
+                integralFull = integralConfig.getIntegralFull();
+                integralRatio =integralConfig.getIntegralRatio();
+
+            }
+            if (priceGroup.getTotalPrice().compareTo(integralFull) >= 0) {
+                Double userIntegral = user.getIntegral().doubleValue();
+                if (integralMax.intValue() > 0 && Double.compare(userIntegral, integralMax) >= 0) {
+                    userIntegral = integralMax;
+                }
+                deductionPrice = BigDecimal.valueOf(NumberUtil.mul(userIntegral, integralRatio));
+                if (deductionPrice.compareTo(payPrice) < 0) {
+                    payPrice = NumberUtil.sub(payPrice, deductionPrice);
+                    usedIntegral = userIntegral;
+                } else {
+                    deductionPrice = payPrice;
+                    payPrice = BigDecimal.ZERO;
+                    usedIntegral = NumberUtil.round(NumberUtil.div(deductionPrice,
+                            BigDecimal.valueOf(integralRatio)), 2).doubleValue();
+                }
+            }
+        }
+
+        if (payPrice.compareTo(BigDecimal.ZERO) <= 0) {
+            payPrice = BigDecimal.ZERO;
+        }
+        //优惠券
+        if(param.getCouponUserId()!=null){
+            FsStoreCouponUser couponUser=couponUserService.selectFsStoreCouponUserById(param.getCouponUserId());
+            if(couponUser!=null&&couponUser.getStatus()==0){
+                if(couponUser.getUseMinPrice().compareTo(priceGroup.getTotalPrice())==-1){
+                    payPrice=payPrice.subtract(couponUser.getCouponPrice());
+                }
+            }
+        }
+
+        return FsStoreOrderComputeDTO.builder()
+                .totalPrice(priceGroup.getTotalPrice())
+                .payPrice(payPrice)
+                .payPostage(payPostage)
+                .deductionPrice(deductionPrice)
+                .usedIntegral(usedIntegral)
+                .payIntegral(priceGroup.getPayIntegral())
+                .serviceFee(serviceFee)
+                .build();
+    }
+
+
+    @Override
+    @Transactional
+    public R createOrder(long userId, FsStoreOrderCreateParam param) {
+        FsStoreOrderComputedParam computedParam=new FsStoreOrderComputedParam();
+        BeanUtils.copyProperties(param, computedParam);
+        //计算金额
+        FsStoreOrderComputeDTO dto=this.computedOrder(userId, computedParam);
+        String cartIds = redisCache.getCacheObject("orderKey:" + param.getOrderKey());
+//        Integer totalNum = 0;
+        BigDecimal integral = BigDecimal.ZERO;
+        if(cartIds!=null){
+            //获取购物车列表
+            List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + param.getOrderKey());
+            //获取地址
+            FsUserAddress address=userAddressMapper.selectFsUserAddressById(param.getAddressId());
+            //生成分布式唯一值
+            String orderSn = IdUtil.getSnowflake(0, 0).nextIdStr();
+            //是否使用积分
+            Boolean isIntegral=false;
+            //组合数据
+            FsStoreOrder storeOrder = new FsStoreOrder();
+            storeOrder.setStoreHouseCode("CK01");
+            storeOrder.setCompanyId(param.getCompanyId());
+            storeOrder.setCompanyUserId(param.getCompanyUserId());
+            if(param.getCompanyUserId()!=null){
+                CompanyUser companyUser=companyUserService.selectCompanyUserById(param.getCompanyUserId());
+                if(companyUser!=null){
+                    storeOrder.setDeptId(companyUser.getDeptId());
+                }
+            }
+            storeOrder.setUserId(userId);
+            storeOrder.setOrderCode(orderSn);
+            storeOrder.setRealName(address.getRealName());
+            storeOrder.setUserPhone(address.getPhone());
+            storeOrder.setUserAddress(address.getProvince() + " " + address.getCity() +
+                    " " + address.getDistrict() + " " + address.getDetail().trim());
+            storeOrder.setCartId(cartIds);
+            storeOrder.setTotalNum(Long.parseLong(String.valueOf(carts.size())));
+            storeOrder.setTotalPrice(dto.getTotalPrice());
+            storeOrder.setTotalPostage(dto.getPayPostage());
+
+            //优惠券处理
+            if(param.getCouponUserId()!=null){
+                FsStoreCouponUser couponUser=couponUserService.selectFsStoreCouponUserById(param.getCouponUserId());
+                if(couponUser!=null&&couponUser.getStatus()==0){
+                    storeOrder.setCouponId(couponUser.getId());
+                    storeOrder.setCouponPrice(couponUser.getCouponPrice());
+                    //更新优惠券状态
+                    couponUser.setStatus(1);
+                    couponUser.setUseTime(new Date());
+                    couponUserService.updateFsStoreCouponUser(couponUser);
+                }
+            }
+            //处理推荐人
+            FsUser user= userService.selectFsUserById(storeOrder.getUserId());
+            if(user.getSpreadUserId()!=null&&user.getSpreadUserId()>0){
+                storeOrder.setTuiUserId(user.getSpreadUserId());
+            }
+            else{
+                if(param.getTuiUserId()!=null){
+                    FsUser tuiUser= userService.selectFsUserById(param.getTuiUserId());
+                    if(tuiUser!=null&&tuiUser.getIsPromoter()==1){
+                        storeOrder.setTuiUserId(param.getTuiUserId());
+                    }
+                }
+            }
+            storeOrder.setPayPostage(dto.getPayPostage());
+            storeOrder.setDeductionPrice(dto.getDeductionPrice());
+            storeOrder.setPaid(0);
+            storeOrder.setPayType(param.getPayType());
+            if (isIntegral) {
+                storeOrder.setPayIntegral(integral);
+            }
+            storeOrder.setUseIntegral(BigDecimal.valueOf(dto.getUsedIntegral()));
+            storeOrder.setBackIntegral(BigDecimal.ZERO);
+            storeOrder.setGainIntegral(BigDecimal.ZERO);
+            storeOrder.setMark(param.getMark());
+            //todo 获取成本价
+            BigDecimal costPrice = this.getOrderSumPrice(carts, "costPrice");
+            storeOrder.setCost(costPrice);
+            storeOrder.setIsChannel(1);
+            storeOrder.setShippingType(1);
+            storeOrder.setCreateTime(new Date());
+
+            String json=configService.selectConfigByKey("store.config");
+            StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
+            if(config.getServiceFee()!=null){
+                storeOrder.setServiceFee(config.getServiceFee());
+            }
+
+            //后台制单处理
+            if(param.getPayPrice()!=null&&param.getPayPrice().compareTo(BigDecimal.ZERO)>0){
+                if (param.getPayPrice().compareTo(dto.getTotalPrice()) > 0) {
+                    return R.error("改价价格不能大于商品总价");
+                }
+                storeOrder.setPayPrice(param.getPayPrice());
+            }
+            else{
+                storeOrder.setPayPrice(dto.getPayPrice());
+            }
+
+            //付款方式
+            if(param.getPayType().equals("1")){
+                //全款支付
+                storeOrder.setStatus(0);
+            }
+            else if(param.getPayType().equals("2")){
+                //物流代收
+                storeOrder.setStatus(1);
+            }
+            else if(param.getPayType().equals("3")){
+                //货到付款
+                BigDecimal amount = param.getAmount();  //货到付款 自定义代收金额
+                if (amount != null && amount.compareTo(BigDecimal.ZERO) > 0){
+                    storeOrder.setStatus(0);
+                    storeOrder.setPayMoney(amount);
+                    storeOrder.setPayDelivery(storeOrder.getPayPrice().subtract(amount) );
+                } else {
+                    storeOrder.setStatus(1);
+                }
+            }
+            Boolean isPay = true;
+            if (param.getOrderCreateType() != null && param.getOrderCreateType() == 3 && param.getCompanyId()!=null){
+                //后台制单 判断是否需要付款
+                Company company = companyMapper.selectCompanyById(param.getCompanyId());
+                if(company!=null){
+                    if (company.getIsPay() != null && company.getIsPay() == 0) {
+                        //不需要付款
+                        storeOrder.setStatus(1); //待发货
+                        isPay = false;
+                    }
+                }
+            }
+            storeOrder.setOrderCreateType(param.getOrderCreateType());
+            Long prescribe = carts.stream().filter(item -> item.getProductType()!=null&&item.getProductType()==2).count();
+            if(prescribe>0){
+                storeOrder.setIsPrescribe(1);
+            } else {
+                storeOrder.setIsPrescribe(0);
+            }
+            if (storeOrder.getCustomerId() == null){
+                storeOrder.setCustomerId(param.getCustomerId());//6.13 添加客户id
+            }
+            Integer flag=fsStoreOrderMapper.insertFsStoreOrder(storeOrder);
+            if (flag==0) {
+                return R.error("订单创建失败");
+            }
+            if (!isPay){
+                // 添加订单审核
+                addOrderAudit(storeOrder);
+            }
+            //使用了积分扣积分
+            if (dto.getUsedIntegral() > 0) {
+                this.decIntegral(userId, dto.getUsedIntegral(), dto.getDeductionPrice().doubleValue(),storeOrder.getId().toString());
+            }
+            //减库存加销量
+            this.deStockIncSale(carts);
+            //保存OrderItem
+            List<FsStoreOrderItem> listOrderItem=new ArrayList<>();
+            //保存购物车商品信息
+            for(FsStoreCartQueryVO vo:carts){
+                FsStoreCartDTO fsStoreCartDTO=new FsStoreCartDTO();
+                fsStoreCartDTO.setProductId(vo.getProductId());
+                fsStoreCartDTO.setPrice(vo.getPrice());
+                fsStoreCartDTO.setSku(vo.getProductAttrName());
+                fsStoreCartDTO.setProductName(vo.getProductName());
+                fsStoreCartDTO.setNum(vo.getCartNum());
+                fsStoreCartDTO.setBarCode(vo.getBarCode());
+                fsStoreCartDTO.setGroupBarCode(vo.getGroupBarCode());
+                fsStoreCartDTO.setBrokerage(vo.getBrokerage());
+                fsStoreCartDTO.setBrokerageTwo(vo.getBrokerageTwo());
+                fsStoreCartDTO.setBrokerageThree(vo.getBrokerageThree());
+                if(StringUtils.isEmpty(vo.getProductAttrImage())){
+                    fsStoreCartDTO.setImage(vo.getProductImage());
+                }
+                else{
+                    fsStoreCartDTO.setImage(vo.getProductAttrImage());
+                }
+
+                FsStoreOrderItem item=new FsStoreOrderItem();
+                item.setOrderId(storeOrder.getId());
+                item.setOrderCode(orderSn);
+                item.setCartId(vo.getId());
+                item.setProductId(vo.getProductId());
+                item.setJsonInfo(JSONUtil.toJsonStr(fsStoreCartDTO));
+                item.setNum(vo.getCartNum());
+                item.setIsAfterSales(0);
+                //处方药
+                if(vo.getProductType().equals(2)){
+                    item.setIsPrescribe(1);
+                }
+                fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
+                listOrderItem.add(item);
+            }
+            if(listOrderItem.size()>0){
+                String itemJson=JSONUtil.toJsonStr(listOrderItem);
+                storeOrder.setItemJson(itemJson);
+                fsStoreOrderMapper.updateFsStoreOrder(storeOrder);
+            }
+            //购物车状态修改
+            cartMapper.updateIsPay(cartIds);
+
+            //删除缓存
+            redisCache.deleteObject("orderKey:" + param.getOrderKey());
+            redisCache.deleteObject("orderCarts:" + param.getOrderKey());
+
+            //添加记录
+            orderStatusService.create(storeOrder.getId(), OrderLogEnum.CREATE_ORDER.getValue(),
+                    OrderLogEnum.CREATE_ORDER.getDesc());
+
+            //加入redis,24小时自动取消
+            String redisKey = String.valueOf(StrUtil.format("{}{}",
+                    StoreConstants.REDIS_ORDER_OUTTIME_UNPAY, storeOrder.getId()));
+
+            if(config.getUnPayTime()!=null&&config.getUnPayTime()>0){
+                redisCache.setCacheObject(redisKey,storeOrder.getId(),config.getUnPayTime(), TimeUnit.MINUTES);
+            }
+            else{
+                redisCache.setCacheObject(redisKey,storeOrder.getId(),30, TimeUnit.MINUTES);
+            }
+            //添加支付到期时间
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(storeOrder.getCreateTime());
+            if (config.getUnPayTime() != null){
+                calendar.add(Calendar.MINUTE,config.getUnPayTime());
+            }
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String payLimitTime = format.format(calendar.getTime() );
+            redisCache.setCacheObject("orderAmount:"+storeOrder.getId(), storeOrder.getPayMoney(), 24, TimeUnit.HOURS);//物流代收自定义金额
+            //删除推荐订单KEY
+            String createOrderKey = param.getCreateOrderKey();
+            if(StringUtils.isNotEmpty(createOrderKey)){
+                redisCache.deleteObject("createOrderKey:"+ createOrderKey);
+                redisCache.deleteObject("orderCarts:" + createOrderKey);
+                redisCache.deleteObject("createOrderMoney:" + createOrderKey);
+                //货到付款自定义金额 key改为id存储
+                BigDecimal amount=redisCache.getCacheObject("createOrderAmount:"+createOrderKey);
+                redisCache.deleteObject("createOrderAmount:" + createOrderKey);
+                redisCache.setCacheObject("orderAmount:"+storeOrder.getId(), amount, 24, TimeUnit.HOURS);//物流代收自定义金额
+            }
+            return R.ok().put("order", storeOrder).put("payLimitTime",payLimitTime);
+        }
+        else{
+            return R.error("订单已过期");
+        }
+    }
+
+    /**
+     * 积分抵扣
+     */
+    private void decIntegral(Long uid, double usedIntegral, double deductionPrice,String busId) {
+        userService.decIntegral(uid, usedIntegral);
+        FsUser user=userService.selectFsUserById(uid);
+        //积分记录
+        billService.addBill(uid, BillDetailEnum.CATEGORY_2.getValue(),0, BillDetailEnum.TYPE_1.getDesc(),  usedIntegral, user.getIntegral().doubleValue(),
+                "购买商品使用" + usedIntegral + "积分抵扣" + deductionPrice + "元",busId,0l);
+
+    }
+
+    public void deStockIncSale(List<FsStoreCartQueryVO> cartInfo) {
+        for (FsStoreCartQueryVO storeCartVO : cartInfo) {
+            productService.decProductStock(storeCartVO.getProductId(),
+                    storeCartVO.getProductAttrValueId(),storeCartVO.getCartNum());
+        }
+    }
+
+    //未支付取消订单
+    @Override
+    public void cancelOrder(Long orderId) {
+        FsStoreOrder order= fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+        if(order.getStatus()==OrderInfoEnum.STATUS_0.getValue()){
+            if(!StringUtils.isEmpty(order.getExtendOrderId())){
+                redisCache.deleteObject(DELIVERY+":"+order.getExtendOrderId());
+            }
+            //退回积分
+            this.refundIntegral(order);
+            //退回优惠券
+            this.refundCoupon(order);
+            //退回库存
+            this.refundStock(order);
+            fsStoreOrderMapper.cancelOrder(orderId);
+            //添加记录
+            orderStatusService.create(order.getId(), OrderLogEnum.CANCEL_ORDER.getValue(),
+                    OrderLogEnum.CANCEL_ORDER.getDesc());
+//            if(order.getPaid()==1){
+//                //更新OMS
+//                ErpRefundUpdateRequest request=new ErpRefundUpdateRequest();
+//                request.setTid(order.getOrderCode());
+//                request.setOid(order.getOrderCode());
+//                request.setRefund_state(1);
+//                erpOrderService.refundUpdate(request);
+//            }
+            TemplateBean templateBean = TemplateBean.builder()
+                    .orderId(order.getId().toString())
+                    .orderCode(order.getOrderCode().toString())
+                    .remark("您的订单已取消")
+                    .userId(order.getUserId())
+                    .templateType(TemplateListenEnum.TYPE_1.getValue())
+                    .build();
+            publisher.publishEvent(new TemplateEvent(this, templateBean));
+        }
+    }
+
+    @Override
+    @Transactional
+    public void refundPrescribeOrder(Long orderId) {
+        FsStoreOrder order= fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+        if(order!=null&&order.getStatus()==OrderInfoEnum.STATUS_1.getValue()&&order.getRefundStatus()==0){
+            //退回积分
+            this.refundIntegral(order);
+            //退回库存
+            this.refundStock(order);
+            fsStoreOrderMapper.cancelOrder(orderId);
+            //退佣金
+            if(order.getTuiUserId()!=null&&order.getTuiUserId()>0){
+                userService.subTuiMoney(order);
+            }
+            if(order.getPayType().equals(3)){
+                //货到付款
+            }
+            else{
+                FsStoreOrder orderMap=new FsStoreOrder();
+                orderMap.setId(order.getId());
+                orderMap.setRefundPrice(order.getPayMoney());
+                orderMap.setRefundReason("拒绝开方自动退款");
+                orderMap.setRefundReasonTime(new Date());
+                fsStoreOrderMapper.updateFsStoreOrder(orderMap);
+                //将钱退还给用户
+                List<FsStorePayment> payments=paymentService.selectFsStorePaymentByOrderId(order.getId());
+                if(payments!=null){
+                    for(FsStorePayment payment:payments){
+                        //易宝退款
+                        com.fs.pay.pay.dto.RefundDTO refundDTO = new com.fs.pay.pay.dto.RefundDTO();
+                        refundDTO.setRefundMoney(payment.getPayMoney().toString());
+                        refundDTO.setLowRefundNo("refund-"+payment.getPayCode());
+                        refundDTO.setUpOrderId(payment.getTradeNo());
+                        RefundResult result=ybPayService.refund(refundDTO);
+                        if(result.getState().equals("5")||result.getState().equals("6")){
+                            payment.setRefundMoney(payment.getPayMoney());
+                            payment.setStatus(-1);
+                            payment.setRefundTime(new Date());
+                            paymentService.updateFsStorePayment(payment);
+                        }
+                        else{
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return;
+                        }
+
+                        //小雨点退款
+//                        RefundDTO refundDTO=new RefundDTO();
+//                        refundDTO.setMerchOrderNo(Ids.oid());
+//                        refundDTO.setAmount(payment.getPayMoney().toString());
+//                        if(payment.getIsPayRemain()!=null&&payment.getIsPayRemain().equals(1)){
+//                            refundDTO.setOrigMerchOrderNo("store_remain-"+payment.getPayCode());
+//                        }
+//                        else{
+//                            refundDTO.setOrigMerchOrderNo("store-"+payment.getPayCode());
+//                        }
+//                        payService.refundOrder(refundDTO);
+                    }
+                }
+            }
+        }
+    }
+
+
+    private void refundCoupon(FsStoreOrder order) {
+        if(order.getCouponId()!=null){
+            FsStoreCouponUser couponUser=couponUserService.selectFsStoreCouponUserById(order.getCouponId());
+            if(couponUser!=null){
+                couponUser.setStatus(0);
+                couponUser.setUseTime(null);
+                couponUserService.updateFsStoreCouponUser(couponUser);
+            }
+        }
+    }
+
+    //已支付退款
+    @Override
+    public void refundOrder(Long orderId) {
+
+        FsStoreOrder order= fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+        if(order!=null&&order.getStatus()==OrderInfoEnum.STATUS_1.getValue()&&order.getRefundStatus()==0){
+            //退回积分
+            this.refundIntegral(order);
+            //退回库存
+            this.refundStock(order);
+            fsStoreOrderMapper.cancelOrder(orderId);
+        }
+    }
+
+    @Override
+    public void deliveryOrder(String orderCode,String deliveryId,String deliverCode,String deliverName) {
+        FsStoreOrder order= fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderCode);
+        if(order!=null&&order.getStatus()==OrderInfoEnum.STATUS_1.getValue()){
+            FsExpress express=expressService.selectFsExpressByOmsCode(deliverCode);
+            if(express!=null){
+                order.setDeliveryName(deliverName);
+                order.setDeliverySn(express.getCode());
+            }
+            order.setStatus(OrderInfoEnum.STATUS_2.getValue());
+            order.setDeliveryId(deliveryId);
+            order.setDeliverySendTime(new Date());
+
+            fsStoreOrderMapper.updateFsStoreOrder(order);
+            orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
+                    OrderLogEnum.DELIVERY_GOODS.getDesc());
+            //订阅物流回调
+            String lastFourNumber = "";
+            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+                lastFourNumber = order.getUserPhone();
+                if (lastFourNumber.length() == 11) {
+                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+                }
+            }
+            expressService.subscribeEspress(order.getOrderCode(),order.getDeliverySn(),order.getDeliveryId(),lastFourNumber);
+
+            TemplateBean templateBean = TemplateBean.builder()
+                    .orderId(order.getId().toString())
+                    .orderCode(order.getOrderCode().toString())
+                    .deliveryId(order.getDeliveryId())
+                    .deliveryName(order.getDeliveryName())
+                    .userId(order.getUserId())
+                    .templateType(TemplateListenEnum.TYPE_2.getValue())
+                    .build();
+            publisher.publishEvent(new TemplateEvent(this, templateBean));
+        }
+    }
+
+    @Override
+    public void updateDeliveryOrder(Long id,String deliveryId,String deliverCode,String deliverName) {
+        FsStoreOrder order= fsStoreOrderMapper.selectFsStoreOrderById(id);
+        if(order!=null){
+            FsExpress express=expressService.selectFsExpressByOmsCode(deliverCode);
+            if(express!=null){
+            order.setDeliveryName(deliverName);
+            order.setDeliverySn(express.getCode());
+            order.setDeliveryId(deliveryId);
+            order.setDeliverySendTime(new Date());
+            fsStoreOrderMapper.updateFsStoreOrder(order);
+            orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
+                    OrderLogEnum.DELIVERY_GOODS.getDesc());
+            //订阅物流回调
+            String lastFourNumber = "";
+            if (express.getCode().equals(ShipperCodeEnum.SF.getValue())) {
+                lastFourNumber = order.getUserPhone();
+                if (lastFourNumber.length() == 11) {
+                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+                }
+            }
+            expressService.subscribeEspress(order.getOrderCode(),express.getCode(),deliveryId,lastFourNumber);
+            }
+        }
+    }
+
+
+    @Override
+    public List<FsMyStoreOrderListQueryVO> selectFsMyStoreOrderListVO(FsMyStoreOrderQueryParam param) {
+        List<FsMyStoreOrderListQueryVO> list= fsStoreOrderMapper.selectFsMyStoreOrderListVO(param);
+        for(FsMyStoreOrderListQueryVO vo:list){
+//          List<FsStoreOrderItemVO> items=fsStoreOrderItemMapper.selectMyFsStoreOrderItemListByOrderId(vo.getId());
+//          vo.setItems(items);
+            if(StringUtils.isNotEmpty(vo.getItemJson())){
+                JSONArray jsonArray=JSONUtil.parseArray(vo.getItemJson());
+                List<FsStoreOrderItemVO> items=JSONUtil.toList(jsonArray, FsStoreOrderItemVO.class);
+                if(items.size()>0){
+                    vo.setItems(items);
+                }
+            }
+            //处理是否可以申请售后
+            vo.setIsAfterSales(0);
+            if(vo.getStatus().equals(OrderInfoEnum.STATUS_3.getValue())){
+                //已完成订单
+                vo.setIsAfterSales(1);
+                if(vo.getFinishTime()!=null){
+                    String json=configService.selectConfigByKey("store.config");
+                    StoreConfig storeConfig=JSONUtil.toBean(json,StoreConfig.class);
+                    if(storeConfig.getStoreAfterSalesDay()!=null&&storeConfig.getStoreAfterSalesDay()>0){
+                        //判断完成时间是否超过指定时间
+                        Calendar calendar = new GregorianCalendar();
+                        calendar.setTime(vo.getFinishTime());
+                        calendar.add(calendar.DATE,storeConfig.getStoreAfterSalesDay()); //把日期往后增加一天,整数  往后推,负数往前移动
+                        if(calendar.getTime().getTime()<new Date().getTime()){
+                            vo.setIsAfterSales(0);
+                        }
+                    }
+                }
+            }
+            else if(vo.getStatus()==1||vo.getStatus()==2){
+                vo.setIsAfterSales(1);
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public FsStoreOrder selectFsStoreOrderByOrderCode(String orderCode) {
+        return fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderCode);
+    }
+
+    @Override
+    public R getExpress(FsStoreOrder order) {
+        //顺丰轨迹查询处理
+        String lastFourNumber = "";
+        if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+            lastFourNumber = order.getUserPhone();
+            if (lastFourNumber.length() == 11) {
+                lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+            }
+        }
+        ExpressInfoDTO dto=expressService.getExpressInfo(order.getOrderCode(),order.getDeliverySn(),order.getDeliveryId(),lastFourNumber);
+        dto.setShipperName(order.getDeliveryName());
+        FsExpress express=expressService.selectFsExpressByName(order.getDeliveryName());
+        return R.ok().put("data", dto).put("express",express).put("deliveryId",order.getDeliveryId());
+    }
+
+    @Override
+    @Transactional
+    public R createUserOrder(FsStoreOrderCreateUserParam param) {
+
+        List<String> cartIds=new ArrayList<>();
+        for(FsStoreProductAttrValueVO productAttrValue:param.getProducts()){
+            FsStoreCart storeCart = FsStoreCart.builder()
+                    .cartNum(productAttrValue.getCount())
+                    .productAttrValueId(productAttrValue.getId())
+                    .productId(productAttrValue.getProductId())
+                    .userId(param.getUserId())
+                    .isPay(0)
+                    .isDel(0)
+                    .isBuy(0)
+                    .build();
+            storeCart.setCreateTime(new Date());
+            cartService.checkProductStock(productAttrValue.getProductId(),storeCart.getProductAttrValueId());
+            cartService.insertFsStoreCart(storeCart);
+            cartIds.add(storeCart.getId().toString());
+        }
+        FsStoreConfirmOrderParam confirmOrderParam=new FsStoreConfirmOrderParam();
+        confirmOrderParam.setCartIds(StringUtils.join(cartIds.toArray(), ","));
+        confirmOrderParam.setType("buy");
+        R confirmResult=this.confirmOrder(param.getUserId(),confirmOrderParam);
+        if(confirmResult.get("code").equals(200)){
+            FsStoreOrderCreateParam createParam=new FsStoreOrderCreateParam();
+            createParam.setUserId(param.getUserId());
+            createParam.setAddressId(param.getAddressId());
+            createParam.setOrderKey(confirmResult.get("orderKey").toString());
+            createParam.setMark(param.getMark());
+            createParam.setUseIntegral(0);
+            createParam.setPayType(param.getPayType().toString());
+            createParam.setCompanyId(param.getCompanyId());
+            createParam.setCompanyUserId(param.getCompanyUserId());
+            createParam.setPaymentId(param.getPaymentId());
+            createParam.setPayPrice(param.getPayPrice());
+            createParam.setCustomerId(param.getCustomerId());
+            createParam.setAmount(param.getAmount());
+            createParam.setOrderCreateType(3); //后台制单
+            return this.createOrder(param.getUserId(),createParam);
+        }
+        else{
+            throw new CustomException("创建失败");
+        }
+    }
+
+    @Override
+    public List<FsMyStoreOrderListQueryVO> selectFsCompanyStoreOrderListVO(FsMyStoreOrderQueryParam param) {
+        List<FsMyStoreOrderListQueryVO> list=fsStoreOrderMapper.selectFsCompanyStoreOrderListVO(param);
+        for(FsMyStoreOrderListQueryVO vo:list){
+//          List<FsStoreOrderItemVO> items=fsStoreOrderItemMapper.selectMyFsStoreOrderItemListByOrderId(vo.getId());
+//          vo.setItems(items);
+            if(StringUtils.isNotEmpty(vo.getItemJson())){
+                JSONArray jsonArray=JSONUtil.parseArray(vo.getItemJson());
+                List<FsStoreOrderItemVO> items=JSONUtil.toList(jsonArray, FsStoreOrderItemVO.class);
+                if(items.size()>0){
+                    vo.setItems(items);
+                }
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public FsStoreOrder selectFsStoreOrderByExtendOrderId(String extendOrderId) {
+        return fsStoreOrderMapper.selectFsStoreOrderByExtendOrderId(extendOrderId);
+    }
+
+    @Override
+    public List<FsStoreOrderTuiVO> selectFsStoreOrderTuiListVO(String userId) {
+        return fsStoreOrderMapper.selectFsStoreOrderTuiListVO(userId);
+    }
+
+    @Override
+    public R confirmPackageOrder(long uid, FsStoreConfirmPackageIdOrderParam param) {
+        FsUserAddress address= userAddressMapper.selectFsUserAddressByDefaultAddress(uid);
+        FsStoreProductPackage storeProductPackage=productPackageService.selectFsStoreProductPackageById(param.getPackageId());
+        String uuid = IdUtil.randomUUID();
+        BigDecimal totalMoney=storeProductPackage.getPayMoney();
+        if(param.getCouponUserId()!=null){
+            FsStoreCouponUser couponUser=couponUserService.selectFsStoreCouponUserById(param.getCouponUserId());
+            if(couponUser!=null&&couponUser.getStatus()==0){
+                if(couponUser.getUseMinPrice().compareTo(storeProductPackage.getPayMoney())==-1){
+                    //
+                    totalMoney=totalMoney.subtract(couponUser.getCouponPrice());
+                }
+            }
+        }
+
+        redisCache.setCacheObject("orderKey:"+uuid, storeProductPackage.getPackageId().toString(), 300, TimeUnit.SECONDS);
+        return R.ok().put("orderKey",uuid).put("address",address).put("package",storeProductPackage).put("totalMoney",totalMoney);
+    }
+
+    @Override
+    @Transactional
+    public R createPackageOrder(long uid, FsStorePackageOrderCreateParam param) {
+        //计算金额
+        String packageId = redisCache.getCacheObject("orderKey:" + param.getOrderKey());
+        if(packageId!=null){
+            FsStoreProductPackage storeProductPackage=productPackageService.selectFsStoreProductPackageById(param.getPackageId());
+            if(storeProductPackage.getStatus().equals(0)){
+                return R.error("此套餐已下架" );
+            }
+            //限购处理
+            if(storeProductPackage.getLimitCount()!=null&&storeProductPackage.getLimitCount()>0){
+                //查看是否已购买
+                FsUser user=userService.selectFsUserById(uid);
+                if(!user.getLevel().equals(1)){
+                    if(fsStoreOrderMapper.checkPackageOrderCount(uid,packageId)>=storeProductPackage.getLimitCount()){
+                        return R.error("此套餐限购:"+storeProductPackage.getLimitCount()+"次");
+                    }
+                }
+            }
+            //获取地址
+            FsUserAddress address=userAddressMapper.selectFsUserAddressById(param.getAddressId());
+            //获取套餐数据
+            JSONArray jsonArray=JSONUtil.parseArray(storeProductPackage.getProducts());
+            List<StorePackageProductDTO> goodsList=JSONUtil.toList(jsonArray,StorePackageProductDTO.class);
+            //检测库存
+            Integer totalNum=0;
+            List<FsStoreCartQueryVO> carts=new ArrayList<>();
+            for (StorePackageProductDTO goods : goodsList) {
+                FsStoreProductAttrValue attrValue=attrValueService.selectFsStoreProductAttrValueById(goods.getId());
+                if(attrValue!=null&&attrValue.getProductId()!=null){
+                    FsStoreProduct product=storeProductService.selectFsStoreProductById(attrValue.getProductId());
+                    if(product!=null){
+                        totalNum += goods.getCount();
+                        FsStoreCartQueryVO vo=new FsStoreCartQueryVO();
+                        vo.setProductId(attrValue.getProductId());
+                        vo.setProductAttrValueId(goods.getId());
+                        vo.setCartNum(goods.getCount());
+                        vo.setProductName(product.getProductName());
+                        vo.setProductAttrName(attrValue.getSku());
+                        vo.setProductImage(product.getImage());
+                        vo.setBarCode(attrValue.getBarCode());
+                        vo.setGroupBarCode(attrValue.getGroupBarCode());
+                        vo.setPrice(product.getPrice());
+                        vo.setProductType(product.getProductType());
+                        carts.add(vo);
+
+                    }
+                }
+                cartService.checkProductStock(attrValue.getProductId(),attrValue.getId());
+            }
+            //生成分布式唯一值
+            String orderSn = IdUtil.getSnowflake(0, 0).nextIdStr();
+            //是否使用积分
+            Boolean isIntegral=false;
+            //组合数据
+            CompanyUser user= companyUserService.selectCompanyUserById(param.getCompanyUserId());
+            FsStoreOrder storeOrder = new FsStoreOrder();
+            //修改默认仓库
+
+            storeOrder.setStoreHouseCode("CK01");
+
+            if(user!=null){
+                storeOrder.setCompanyId(user.getCompanyId());
+                storeOrder.setDeptId(user.getDeptId());
+            }
+            BigDecimal totalMoney=storeProductPackage.getPayMoney();
+            //优惠券处理
+            if(param.getCouponUserId()!=null){
+                FsStoreCouponUser couponUser=couponUserService.selectFsStoreCouponUserById(param.getCouponUserId());
+                if(couponUser!=null&&couponUser.getStatus()==0){
+                    if(couponUser.getUseMinPrice().compareTo(storeProductPackage.getPayMoney())==-1){
+                        //
+                        totalMoney=totalMoney.subtract(couponUser.getCouponPrice());
+                        storeOrder.setCouponId(couponUser.getId());
+                        storeOrder.setCouponPrice(couponUser.getCouponPrice());
+                        //更新优惠券状态
+                        couponUser.setStatus(1);
+                        couponUser.setUseTime(new Date());
+                        couponUserService.updateFsStoreCouponUser(couponUser);
+                    }
+                }
+            }
+            storeOrder.setCompanyUserId(param.getCompanyUserId());
+            storeOrder.setUserId(uid);
+            storeOrder.setOrderCode(orderSn);
+            storeOrder.setRealName(address.getRealName());
+            storeOrder.setUserPhone(address.getPhone());
+            storeOrder.setUserAddress(address.getProvince() + " " + address.getCity() +
+                    " " + address.getDistrict() + " " + address.getDetail());
+
+            storeOrder.setTotalNum(Long.parseLong(String.valueOf(goodsList.size())));
+            storeOrder.setTotalPrice(storeProductPackage.getPayMoney());
+            storeOrder.setTotalPostage(BigDecimal.ZERO);
+
+            storeOrder.setPayPostage(BigDecimal.ZERO);
+            storeOrder.setDeductionPrice(BigDecimal.ZERO);
+            storeOrder.setPaid(0);
+            storeOrder.setUseIntegral(BigDecimal.ZERO);
+            storeOrder.setBackIntegral(BigDecimal.ZERO);
+            storeOrder.setGainIntegral(BigDecimal.ZERO);
+            storeOrder.setMark(param.getMark());
+            storeOrder.setIsChannel(1);
+            storeOrder.setShippingType(1);
+            storeOrder.setCreateTime(new Date());
+            storeOrder.setStatus(0);
+            storeOrder.setOrderCreateType(2);
+            storeOrder.setPayType(storeProductPackage.getPayType().toString());
+            storeOrder.setPayPrice(totalMoney);
+            storeOrder.setIsPackage(1);
+            FsStoreProductPackage productPackage=new FsStoreProductPackage();
+            productPackage.setTitle(storeProductPackage.getTitle());
+            productPackage.setImgUrl(storeProductPackage.getImgUrl());
+            productPackage.setDescs(storeProductPackage.getDescs());
+            productPackage.setPayMoney(storeOrder.getPayMoney());
+            productPackage.setPackageId(storeProductPackage.getPackageId());
+            storeOrder.setPackageJson(JSONUtil.toJsonStr(productPackage));
+            storeOrder.setPackageId(storeProductPackage.getPackageId());
+            Long prescribe = carts.stream().filter(item -> item.getProductType()!=null&&item.getProductType()==2).count();
+            if(prescribe>0){
+                storeOrder.setIsPrescribe(1);
+            } else {
+                storeOrder.setIsPrescribe(0);
+            }
+            Integer flag=fsStoreOrderMapper.insertFsStoreOrder(storeOrder);
+            if (flag==0) {
+                return R.error("订单创建失败");
+            }
+            //减库存加销量
+            this.deStockIncSale(carts);
+            //保存购物车商品信息
+            for(FsStoreCartQueryVO vo:carts){
+                FsStoreCartDTO fsStoreCartDTO=new FsStoreCartDTO();
+                fsStoreCartDTO.setProductId(vo.getProductId());
+                fsStoreCartDTO.setPrice(vo.getPrice());
+                fsStoreCartDTO.setSku(vo.getProductAttrName());
+                fsStoreCartDTO.setProductName(vo.getProductName());
+                fsStoreCartDTO.setNum(vo.getCartNum());
+                fsStoreCartDTO.setBarCode(vo.getBarCode());
+                fsStoreCartDTO.setGroupBarCode(vo.getGroupBarCode());
+                if(StringUtils.isEmpty(vo.getProductAttrImage())){
+                    fsStoreCartDTO.setImage(vo.getProductImage());
+                }
+                else{
+                    fsStoreCartDTO.setImage(vo.getProductAttrImage());
+                }
+                FsStoreOrderItem item=new FsStoreOrderItem();
+                item.setOrderId(storeOrder.getId());
+                item.setOrderCode(orderSn);
+                item.setCartId(vo.getId());
+                item.setProductId(vo.getProductId());
+                item.setJsonInfo(JSONUtil.toJsonStr(fsStoreCartDTO));
+                item.setNum(vo.getCartNum());
+                item.setIsAfterSales(0);
+                //处方药
+                if(vo.getProductType().equals(2)){
+                    item.setIsPrescribe(1);
+                }
+                fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
+            }
+            //删除缓存
+            redisCache.deleteObject("orderKey:" + param.getOrderKey());
+            //添加记录
+            orderStatusService.create(storeOrder.getId(), OrderLogEnum.CREATE_ORDER.getValue(),
+                    OrderLogEnum.CREATE_ORDER.getDesc());
+
+            //加入redis,30分钟自动取消
+            String redisKey = String.valueOf(StrUtil.format("{}{}",
+                    StoreConstants.REDIS_ORDER_OUTTIME_UNPAY, storeOrder.getId()));
+
+            //添加支付到期时间
+            String json=configService.selectConfigByKey("store.config");
+            StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
+            if(config.getUnPayTime()!=null&&config.getUnPayTime()>0){
+                redisCache.setCacheObject(redisKey,storeOrder.getId(),config.getUnPayTime(), TimeUnit.MINUTES);
+            }
+            else{
+                redisCache.setCacheObject(redisKey,storeOrder.getId(),30, TimeUnit.MINUTES);
+            }
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(storeOrder.getCreateTime());
+            calendar.add(Calendar.MINUTE,config.getUnPayTime());
+            SimpleDateFormat format = new   SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String payLimitTime = format.format(calendar.getTime() );
+            return R.ok().put("order", storeOrder).put("payLimitTime",payLimitTime);
+        }
+        else{
+            return R.error("订单已过期");
+        }
+    }
+
+    @Override
+    public synchronized R finishOrder(Long orderId) {
+        IFsStoreOrderService fsStoreOrderService = (IFsStoreOrderService) AopContext.currentProxy();
+        return fsStoreOrderService.finishStoreOrder(orderId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
+    public R finishStoreOrder(Long orderId){
+        FsStoreOrder order= fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+        if(order.getStatus()==OrderInfoEnum.STATUS_2.getValue()){
+            order.setFinishTime(new Date());
+            order.setStatus(3);
+            fsStoreOrderMapper.updateFsStoreOrder(order);
+            orderStatusService.create(order.getId(), OrderLogEnum.FINISH_ORDER.getValue(),
+                    OrderLogEnum.FINISH_ORDER.getDesc());
+            //写入公司余额 条件是只有全款订单才分,非全款后台导入
+            if(order.getCompanyId()!=null&&order.getCompanyId()>0&&order.getPayDelivery().compareTo(new BigDecimal(0))==0){
+                if(order.getTuiMoneyStatus()==null||order.getTuiMoneyStatus()!=1){
+                    companyService.addCompanyMoney(order);
+                }
+            }
+
+
+//            // 同步订单完成状态到erp
+//            // 如果是线上支付
+//            if("1".equals(order.getPayType())){
+//                FsErpFinishPush fsErpFinishPush = new FsErpFinishPush();
+//                fsErpFinishPush.setOrderId(orderId);
+//                fsErpFinishPush.setTaskStatus(0);
+//                fsErpFinishPush.setRetryCount(0);
+//                fsErpFinishPush.setCreateTime(new Date());
+//                fsErpFinishPushMapper.insert(fsErpFinishPush);
+//            }
+
+            //模板消息支付成功发布事件
+            TemplateBean templateBean = TemplateBean.builder()
+                    .orderId(order.getId().toString())
+                    .orderCode(order.getOrderCode().toString())
+                    .remark("您的订单已签收成功")
+                    .finishTime(order.getFinishTime())
+                    .userId(order.getUserId())
+                    .templateType(TemplateListenEnum.TYPE_3.getValue())
+                    .build();
+            publisher.publishEvent(new TemplateEvent(this, templateBean));
+            return R.ok("操作成功");
+        }
+        else {
+            return R.error("非法操作");
+        }
+    }
+
+    @Override
+    public BigDecimal selectFsStoreOrderByPayPriceCount(FsStoreOrderStatisticsParam param) {
+        return fsStoreOrderMapper.selectFsStoreOrderByPayPriceCount(param);
+    }
+
+    @Override
+    @Transactional
+    //类型1支付回调 类型2货到付款
+    public String payConfirm(Integer type,Long orderId,String payCode,String tradeNo,String bankTransactionId,String bankSerialNo) {
+        //支付订单
+//        try {
+            FsStoreOrder order=null;
+            if(type.equals(1)){
+                FsStorePayment storePayment=paymentService.selectFsStorePaymentByCode(payCode);
+                if(storePayment==null||!storePayment.getStatus().equals(0)){
+                    return "";
+                }
+                FsStorePayment storePaymentMap=new FsStorePayment();
+                storePaymentMap.setPaymentId(storePayment.getPaymentId());
+                storePaymentMap.setStatus(1);
+                storePaymentMap.setPayTime(new Date());
+                storePaymentMap.setTradeNo(tradeNo);
+                storePaymentMap.setBankSerialNo(bankSerialNo);
+                storePaymentMap.setBankTransactionId(bankTransactionId);
+                paymentService.updateFsStorePayment(storePaymentMap);
+                order=fsStoreOrderMapper.selectFsStoreOrderById(storePayment.getOrderId());
+                if(order!=null&&!order.getStatus().equals(OrderInfoEnum.STATUS_0.getValue())){
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    return "";
+                }
+                if(order!=null&&!order.getPaid().equals(0)){
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    return "";
+                }
+            }
+            else if(type.equals(2)){
+                //货到付款
+                order=fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+                if(!order.getStatus().equals(OrderInfoEnum.STATUS_0.getValue())){
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    return "";
+                }
+            }
+            //写入公司佣金 当有归属公司时只进行公司分佣
+            if(order.getCompanyId()!=null&&order.getCompanyId()>0){
+                companyService.addCompanyTuiMoney(order);
+                //没有归属公司对个人分佣
+            }
+            else if (order.getIsPackage()!=1&&order.getTuiUserId()!=null&&order.getTuiUserId()>0){
+                //处理佣金 套餐不分佣金
+                FsStoreOrderItem orderItemMap=new FsStoreOrderItem();
+                orderItemMap.setOrderId(order.getId());
+                List<FsStoreOrderItem> items= storeOrderItemService.selectFsStoreOrderItemList(orderItemMap);
+                userService.addTuiMoney(order,items);
+            }
+            //增加用户购买次数
+            userService.incPayCount(order.getUserId());
+            //增加状态
+            orderStatusService.create(order.getId(), OrderLogEnum.PAY_ORDER_SUCCESS.getValue(),
+                    OrderLogEnum.PAY_ORDER_SUCCESS.getDesc());
+            FsStoreOrder storeOrder = new FsStoreOrder();
+            storeOrder.setId(order.getId());
+            storeOrder.setPaid(OrderInfoEnum.PAY_STATUS_1.getValue());
+            storeOrder.setStatus(OrderInfoEnum.STATUS_1.getValue());
+            storeOrder.setPayTime(new Date());
+            fsStoreOrderMapper.updateFsStoreOrder(storeOrder);
+            // 添加订单审核
+            addOrderAudit(order);
+            return "SUCCESS";
+
+
+
+            //非处方直接提交OMS
+//            if(order.getIsPrescribe().equals(0)){
+//                createOmsOrder(order.getId());
+//            }
+//            else if(order.getIsPrescribe().equals(1)){
+//                //是否已开方
+//                FsPrescribe prescribe=prescribeService.selectFsPrescribeByOrderId(order.getId());
+//                if(prescribe!=null&&prescribe.getStatus()==1){
+//                    createOmsOrder(order.getId());
+//                }
+//            }
+//        }
+//        catch (Exception e){
+//            logger.info("payConfirm:"+e.getMessage());
+//            logger.info("payConfirm:"+e.getLocalizedMessage());
+//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+//            return "";
+//        }
+    }
+
+    /**
+     * 添加审核
+     * @param order 订单信息
+     */
+    private void addOrderAudit(FsStoreOrder order) {
+        if (!getAuditSwitch()) {
+            return;
+        }
+
+        FsStoreOrderAudit orderAudit = new FsStoreOrderAudit();
+        orderAudit.setOrderId(order.getId());
+        orderAudit.setCompanyId(order.getCompanyId());
+        orderAudit.setCompanyUserId(order.getCompanyUserId());
+        orderAudit.setAuditStatus(OrderAuditStateEnum.COMPANY_PENDING.getValue());
+        orderAudit.setCreateTime(LocalDateTime.now());
+        orderAuditService.save(orderAudit);
+
+        FsStoreOrderAuditLog auditLog = new FsStoreOrderAuditLog();
+        auditLog.setAuditId(orderAudit.getId());
+        auditLog.setOrderId(order.getId());
+        auditLog.setContent("系统:提交审核");
+        auditLog.setCreateTime(LocalDateTime.now());
+        orderAuditLogService.save(auditLog);
+    }
+
+    /**
+     * 获取是否需要订单审核
+     * @return boolean
+     */
+    private boolean getAuditSwitch() {
+        try {
+            String json = configService.selectConfigByKey("store.config");
+            StoreConfig config = JSONUtil.toBean(json,StoreConfig.class);
+            return config.getAuditSwitch() == 1;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    public  boolean containsAddress(String companyName) {
+        String[] items= {"新疆","西藏","内蒙古","海南"};
+        boolean found = false;
+        for (String item : items) {
+            if (companyName.contains(item)) {
+                found = true;
+                break;
+            }
+        }
+        return found;
+    }
+
+
+    @Override
+    public R createOmsOrder(Long orderId) throws ParseException {
+        FsStoreOrder order=fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+        FsErpConfig erpConfig = configUtil.getErpConfig();
+        List<Long> noErpCompany = erpConfig.getNoErpCompany();
+        if (noErpCompany.contains(order.getCompanyId())) {
+            log.info("订单:{},相关公司不推送erp", order.getOrderCode());
+            return R.error("订单:" + order.getOrderCode() +",相关公司不推送erp");
+        }
+        IErpOrderService erpOrderService = getErpService();
+        if(!StringUtils.isEmpty(order.getExtendOrderId())&&order.getStatus()!=1){
+            return R.error("订单:" + order.getOrderCode() +",已推送erp/订单状态不正确");
+        }
+        ErpOrder erpOrder = getErpOrder(order);
+        ErpOrderResponse response= erpOrderService.addOrder(erpOrder);
+//        ErpOrderResponse response= k9OrderService.addOmsOrder(order.getId());
+
+        //写入日志
+        logger.info("ErpCreate:"+order.getOrderCode()+":"+JSONUtil.toJsonStr(response));
+        //支付成功后 将订单号写入待发货的REDIS中
+        redisCache.setCacheObject(DELIVERY+":"+response.getCode(),order.getOrderCode());
+        //写入外部订单号
+        order.setExtendOrderId(response.getCode());
+        fsStoreOrderMapper.updateFsStoreOrder(order);
+        return R.ok("订单:" + order.getOrderCode() +",创建erp订单成功");
+    }
+
+    @Override
+    public ErpOrder getErpOrder(FsStoreOrder order) throws ParseException {
+        FsErpConfig erpConfig = configUtil.getErpConfig();
+        ErpOrder erpOrder=new ErpOrder();
+        if (order.getCompanyId()!=null){
+            erpOrder.setVip_code(order.getUserId().toString()+ order.getCompanyId().toString());
+        }else {
+            erpOrder.setVip_code(order.getUserId().toString());
+        }
+        erpOrder.setPlatform_code(order.getOrderCode());
+        erpOrder.setWarehouse_code(erpConfig.getErpWarehouseCode());
+        erpOrder.setShop_code(erpConfig.getErpShopCode());
+
+//      erpOrder.setPost_fee(order.getTotalPostage().doubleValue());
+        erpOrder.setSeller_memo(order.getMark());
+        // order.setCurrency_code("JCZD");
+        List<ErpOrderPayment> payments=new ArrayList<>();
+        ErpOrderPayment payment=new ErpOrderPayment();
+        payment.setPay_type_code("weixin");
+        payment.setPayment(order.getPayMoney().doubleValue());
+        //payment.setPaytime(new Timestamp(System.currentTimeMillis()));
+        if(order.getPayTime()!=null){
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String timeString = sdf.format(order.getPayTime());
+            Date date = sdf.parse(timeString); // 时间格式转为时间戳
+            long timeLong = date.getTime();
+            payment.setPaytime(new Timestamp(timeLong));
+        }
+        payments.add(payment);
+        if(order.getCompanyId()!=null){
+
+            FsExpress  express=expressService.selectFsExpressByOmsCode("SF");
+            erpOrder.setExpress_code(express.getOmsCode());
+            order.setDeliveryName(express.getName());
+            order.setDeliverySn(express.getCode());
+
+        }
+        else{
+            FsExpress express=expressService.selectFsExpressByOmsCode("SF");
+            erpOrder.setExpress_code(express.getOmsCode());
+            order.setDeliveryName(express.getName());
+            order.setDeliverySn(express.getCode());
+        }
+        erpOrder.setPayments(payments);
+        if(order.getCompanyId()!=null){
+            Company company=companyService.selectCompanyById(order.getCompanyId());
+            if(company!=null){
+                erpOrder.setSeller_memo(company.getCompanyName());
+            }
+        }
+        if(order.getCompanyUserId()!=null){
+            CompanyUser companyUser=companyUserService.selectCompanyUserById(order.getCompanyUserId());
+            if(companyUser!=null){
+                CompanyDept dept=companyDeptService.selectCompanyDeptById(companyUser.getDeptId());
+                if(dept!=null){
+                    List<String> names=companyDeptService.selectCompanyDeptNamesByIds(dept.getAncestors());
+                    if(names!=null&&names.size()>0){
+                        //写备注
+                        erpOrder.setSeller_memo(erpOrder.getSeller_memo()+"-"+StringUtils.join(names, ",")+","+dept.getDeptName() );
+                    }
+                }
+                erpOrder.setSeller_memo(erpOrder.getSeller_memo()+"-"+companyUser.getNickName());
+            }
+        }
+
+
+        erpOrder.setSeller_memo(erpOrder.getSeller_memo()+"-"+ order.getDeliveryName());
+
+        ErpRemarkDTO remarkDTO=new ErpRemarkDTO();
+        remarkDTO.setTotalPrice(order.getTotalPrice());
+        remarkDTO.setPayPrice(order.getPayPrice());
+        remarkDTO.setDeliveryMoney(order.getPayDelivery());
+        remarkDTO.setPayMoney(order.getPayMoney());
+        remarkDTO.setCouponMoney(order.getCouponPrice());
+        remarkDTO.setOrderId(order.getOrderCode());
+        remarkDTO.setYdMoney(order.getPayPrice().subtract(order.getPayMoney().subtract(order.getPayDelivery())));
+
+        if(order.getPayTime()!=null){
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String format = sdf.format(order.getPayTime());
+            remarkDTO.setPayTime(format);
+        }
+        erpOrder.setSeller_memo(erpOrder.getSeller_memo()+JSONUtil.toJsonStr(remarkDTO));
+
+        erpOrder.setOrder_type_code("order");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        erpOrder.setDeal_datetime(sdf.format(new Date()));
+        FsStoreOrderItem itemMap=new FsStoreOrderItem();
+        itemMap.setOrderId(order.getId());
+        List<FsStoreOrderItem> orderItems=storeOrderItemService.selectFsStoreOrderItemList(itemMap);
+        List<ErpOrderItem> details=new ArrayList<>();
+        for(FsStoreOrderItem orderItem: orderItems){
+            FsStoreCartDTO cartDTO= JSONUtil.toBean(orderItem.getJsonInfo(),FsStoreCartDTO.class);
+            //如果是组合码,查询出真实的商品数据 然后写入
+            if(StringUtils.isNotEmpty(cartDTO.getGroupBarCode())){
+                FsStoreProductGroup group=storeProductGroupService.selectFsStoreProductGroupByBarCode(cartDTO.getGroupBarCode().trim());
+                if(group!=null){
+                    JSONArray jsonArray=JSONUtil.parseArray(group.getProducts());
+                    List<StoreProductGroupDTO> productGroupDTOS=JSONUtil.toList(jsonArray, StoreProductGroupDTO.class);
+                    if(productGroupDTOS!=null){
+                        for(StoreProductGroupDTO dto:productGroupDTOS){
+                            FsStoreProductAttrValue attrValue=attrValueService.selectFsStoreProductAttrValueById(dto.getId());
+                            ErpOrderItem item=new ErpOrderItem();
+                            item.setItem_code(attrValue.getBarCode());
+                            item.setPrice(attrValue.getPrice().toString());
+                            item.setQty(dto.getCount()*cartDTO.getNum());
+                            item.setRefund(0);
+                            details.add(item);
+                        }
+                    }
+                }
+            }
+            else{
+                ErpOrderItem item=new ErpOrderItem();
+                item.setItem_code(cartDTO.getBarCode().trim());
+                item.setPrice(cartDTO.getPrice().toString());
+                item.setQty(cartDTO.getNum());
+                item.setRefund(0);
+                details.add(item);
+            }
+        }
+        erpOrder.setDetails(details);
+        erpOrder.setReceiver_name(order.getRealName());
+        if(order.getUserPhone().length()>11){
+            erpOrder.setReceiver_phone(order.getUserPhone());
+        }
+        else{
+            erpOrder.setReceiver_mobile(order.getUserPhone());
+        }
+        String[] address= order.getUserAddress().split(" ");
+        erpOrder.setReceiver_province(address[0]);
+        erpOrder.setReceiver_city(address[1]);
+        erpOrder.setReceiver_district(address[2]);
+        //处理地址多空隔问题
+        if(address.length>3){
+            StringBuffer addrs=new StringBuffer();
+            for(int i=3;i<address.length;i++){
+                addrs.append(address[i]);
+            }
+            erpOrder.setReceiver_address(addrs.toString());
+        }
+        else if(address.length==3){
+            erpOrder.setReceiver_address(address[2]);
+        }
+        //处理地址字符问题
+        erpOrder.setReceiver_address(erpOrder.getReceiver_address().replace("+","加"));
+        erpOrder.setReceiver_address(erpOrder.getReceiver_address().replace("\n",""));
+        return erpOrder;
+    }
+
+    @Override
+    public FsStoreOrderVO selectFsStoreOrderVOByOrderCode(String orderCode) {
+        return fsStoreOrderMapper.selectFsStoreOrderVOByOrderCode(orderCode);
+    }
+
+    @Override
+    public Long selectFsStoreOrderTotalCount(int type,Long companyId,Long companyUserId) {
+        return fsStoreOrderMapper.selectFsStoreOrderTotalCount(type,companyId,companyUserId);
+    }
+
+    @Override
+    @Transactional
+    public R editTuiMoney(FsStoreOrderEditTuiMoneyParam param) {
+        FsStoreOrder order= fsStoreOrderMapper.selectFsStoreOrderById(param.getOrderId());
+        if(order.getTuiMoney()!=null&&order.getTuiMoney().compareTo(new BigDecimal(0))==1){
+            if(order.getTuiMoneyStatus().equals(0)){
+                order.setTuiMoneyStatus(1);
+                orderStatusService.create(order.getId(), OrderLogEnum.UNLOCK_TUI_MONEY.getValue(),
+                        OrderLogEnum.UNLOCK_TUI_MONEY.getDesc());
+                //写入公司余额
+                Company company=companyService.selectCompanyById(order.getCompanyId());
+                company.setMoney(company.getMoney().add(order.getTuiMoney()));
+                companyService.updateCompany(company);
+                //写入日志
+                CompanyMoneyLogs log=new CompanyMoneyLogs();
+                log.setCompanyId(order.getCompanyId());
+                log.setRemark("订单佣金解冻");
+                log.setMoney(order.getTuiMoney());
+                log.setLogsType(4);
+                log.setBalance(company.getMoney());
+                log.setCreateTime(new Date());
+                log.setBusinessId(order.getId().toString());
+                moneyLogsMapper.insertCompanyMoneyLogs(log);
+                fsStoreOrderMapper.updateFsStoreOrder(order);
+                return R.ok("解冻成功");
+            }
+            else{
+                order.setTuiMoneyStatus(0);
+                //写入公司余额
+                Company company=companyService.selectCompanyById(order.getCompanyId());
+                company.setMoney(company.getMoney().subtract(order.getTuiMoney()));
+                companyService.updateCompany(company);
+                //写入日志
+                CompanyMoneyLogs log=new CompanyMoneyLogs();
+                log.setCompanyId(order.getCompanyId());
+                log.setRemark("订单佣金冻结");
+                log.setMoney(order.getTuiMoney().multiply(new BigDecimal(-1)));
+                log.setLogsType(5);
+                log.setBalance(company.getMoney());
+                log.setCreateTime(new Date());
+                log.setBusinessId(order.getId().toString());
+                moneyLogsMapper.insertCompanyMoneyLogs(log);
+                fsStoreOrderMapper.updateFsStoreOrder(order);
+                return R.ok("冻结成功");
+            }
+
+        }
+        else {
+            return R.error("推广佣金不存在");
+        }
+    }
+
+    @Override
+    public List<OrderListVO> selectCompanyStoreOrderListAPI(OrderListParam param) {
+        List<OrderListVO> list=fsStoreOrderMapper.selectCompanyStoreOrderListAPI(param);
+        if(list!=null){
+            for(OrderListVO vo:list){
+                List<ProductListVO> productList=new ArrayList<>();
+                FsStoreOrderItem map=new FsStoreOrderItem();
+                map.setOrderId(vo.getOrderid());
+                List<FsStoreOrderItem> items=fsStoreOrderItemMapper.selectFsStoreOrderItemList(map);
+                if(items!=null){
+                    for(FsStoreOrderItem item:items){
+                        FsStoreCartDTO cartDTO= JSONUtil.toBean(item.getJsonInfo(),FsStoreCartDTO.class);
+                        ProductListVO productListVO=new ProductListVO();
+                        productListVO.setProductid(cartDTO.getProductId());
+                        productListVO.setProductname(cartDTO.getProductName());
+                        productListVO.setProductprice(cartDTO.getPrice());
+                        productListVO.setProductqty(cartDTO.getNum());
+                        productList.add(productListVO);
+                    }
+                }
+                vo.setProductList(productList);
+            }
+
+        }
+        return list;
+    }
+
+    @Override
+    public List<FsStoreOrder> selectFsStoreOrderByCompanyId(Long companyId) {
+        return fsStoreOrderMapper.selectFsStoreOrderByCompanyId(companyId);
+    }
+
+    @Override
+    public List<FsStoreOrder> selectFsStoreOrderListByDeliveryId(String logisticCode) {
+        return fsStoreOrderMapper.selectFsStoreOrderListByDeliveryId(logisticCode);
+    }
+
+    @Override
+    @Transactional
+    public R refundOrderMoney(Long orderId) {
+        IErpOrderService erpOrderService = getErpService();
+        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+        if(order.getStatus()==-2){
+            return R.error("已退款");
+        }
+        if(order.getStatus()!=1&&order.getStatus()!=2){
+            return R.error("非法操作");
+        }
+        if (order.getExtendOrderId()==null){
+            return R.error("暂未推送至erp,请稍后再试!");
+        }
+        if(StringUtils.isNotEmpty(order.getExtendOrderId())){
+            ErpRefundUpdateRequest request=new ErpRefundUpdateRequest();
+            request.setTid(order.getOrderCode());
+            request.setOid(order.getOrderCode());
+            request.setRefund_state(1);
+            BaseResponse response=erpOrderService.refundUpdate(request);
+//            if(response.getSuccess()){
+//            }
+//            else{
+//                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+//                return R.error(response.getErrorDesc());
+//            }
+        }
+        order.setStatus(-2);
+        order.setRefundPrice(order.getPayMoney());
+        order.setRefundStatus(OrderInfoEnum.REFUND_STATUS_2.getValue());
+        fsStoreOrderMapper.updateFsStoreOrder(order);
+
+        //退库存
+        //获取订单下的商品
+        List<FsStoreOrderItemVO> orderItemVOS=fsStoreOrderItemMapper.selectFsStoreOrderItemListByOrderId(order.getId());
+        for(FsStoreOrderItemVO vo:orderItemVOS){
+            if(vo.getIsAfterSales()==1){
+                productService.incProductStock(vo.getNum(), vo.getProductId(), vo.getProductAttrValueId());
+            }
+
+        }
+        if(order.getPayType().equals(3)){
+            //货到付款
+        }
+        else{
+            //将钱退还给用户
+            List<FsStorePayment> payments=paymentService.selectFsStorePaymentByOrderId(order.getId());
+            if(payments!=null){
+                for(FsStorePayment payment:payments){
+                    if (payment.getPayMode()==null||payment.getPayMode().equals("wx")){
+                        WxPayConfig payConfig = new WxPayConfig();
+                        String json = configService.selectConfigByKey("store.pay");
+                        FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
+                        payConfig.setAppId(fsPayConfig.getAppId());
+                        payConfig.setMchId(fsPayConfig.getWxMchId());
+                        payConfig.setMchKey(fsPayConfig.getWxMchKey());
+                        payConfig.setKeyPath(wxPayProperties.getKeyPath());
+                        payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                        payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                        wxPayService.setConfig(payConfig);
+                        WxPayRefundRequest refundRequest = new WxPayRefundRequest();
+                        refundRequest.setOutTradeNo("store-"+payment.getPayCode());
+                        refundRequest.setOutRefundNo("store-"+payment.getPayCode());
+                        refundRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(payment.getPayMoney().toString()));
+                        refundRequest.setRefundFee(WxPayUnifiedOrderRequest.yuanToFen(payment.getPayMoney().toString()));
+                        try {
+                            WxPayRefundResult refundResult = wxPayService.refund(refundRequest);
+                            WxPayRefundQueryResult refundQueryResult = wxPayService.refundQuery("", refundResult.getOutTradeNo(), refundResult.getOutRefundNo(), refundResult.getRefundId());
+                            if(refundQueryResult!=null&&refundQueryResult.getResultCode().equals("SUCCESS")){
+                                FsStorePayment paymentMap=new FsStorePayment();
+                                paymentMap.setPaymentId(payment.getPaymentId());
+                                paymentMap.setStatus(-1);
+                                paymentMap.setRefundTime(DateUtils.getNowDate());
+                                paymentMap.setRefundMoney(payment.getPayMoney());
+                                paymentService.updateFsStorePayment(paymentMap);
+                            }
+                            else {
+                                return R.error("退款请求失败"+refundQueryResult.getErrCodeDes());
+                            }
+                        } catch (WxPayException e) {
+                            return R.error("退款请求失败"+e.getErrCodeDes());
+                        }
+                    }else if (payment.getPayMode()!=null&&payment.getPayMode().equals("hf")){
+                        V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
+                        request.setOrdAmt(payment.getPayMoney().toString());
+                        request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
+                        request.setReqSeqId("refund-"+payment.getPayCode());
+                        Map<String, Object> extendInfoMap = new HashMap<>();
+                        extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
+                        request.setExtendInfo(extendInfoMap);
+                        HuiFuRefundResult refund = huiFuService.refund(request);
+                        logger.info("退款:"+refund);
+                        if((refund.getResp_code().equals("00000000")||refund.getResp_code().equals("00000100"))&&(refund.getTrans_stat().equals("S")||refund.getTrans_stat().equals("P"))){
+                            payment.setRefundMoney(payment.getPayMoney());
+                            payment.setStatus(-1);
+                            payment.setRefundTime(new Date());
+                            paymentService.updateFsStorePayment(payment);
+                        }else {
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return R.error(refund.getResp_desc());
+                        }
+
+                    }else {
+                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                        return R.error("支付类型异常");
+                    }
+
+
+                }
+            }
+        }
+        orderStatusService.create(order.getId(), OrderLogEnum.REFUND_ORDER_SUCCESS.getValue(),
+                OrderLogEnum.REFUND_ORDER_SUCCESS.getDesc());
+        if(order.getTuiUserId()!=null&&order.getTuiUserId()>0){
+            userService.subTuiMoney(order);
+        }
+        return R.ok();
+
+    }
+
+    @Override
+    public R updateExpress(FsStoreOrderExpressEditParam param) {
+        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderById(param.getOrderId());
+        FsErpConfig erpConfig = configUtil.getErpConfig();
+        List<Long> noErpCompany = erpConfig.getNoErpCompany();
+        if (noErpCompany.contains(order.getCompanyId())) {
+            logger.info("订单:{},相关公司不推送erp", order.getOrderCode());
+            return R.ok("订单:"+ order.getOrderCode()+"相关公司不推送erp");
+        }
+        IErpOrderService erpOrderService = getErpService();
+        if(order.getStatus()!=1){
+            return R.error("只有待发货状态可以同步");
+        }
+        if(order.getExtendOrderId()==null){
+            return R.error("未生成管易云订单");
+        }
+        ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+        request.setCode(order.getExtendOrderId());
+        ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+        if(response.getOrders()!=null&&response.getOrders().size()>0){
+            for(ErpOrderQuery orderQuery : response.getOrders()){
+                if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
+                    for(ErpDeliverys delivery:orderQuery.getDeliverys()){
+                        if(delivery.getDelivery()&& StringUtils.isNotEmpty(delivery.getMail_no())){
+                            FsStoreOrder map=new FsStoreOrder();
+                            map.setStatus(OrderInfoEnum.STATUS_2.getValue());
+                            map.setId(order.getId());
+                            map.setDeliverySn(response.getOrders().get(0).getDeliverys().get(0).getExpress_code());
+                            map.setDeliveryName(response.getOrders().get(0).getDeliverys().get(0).getExpress_name());
+                            map.setDeliveryId(response.getOrders().get(0).getDeliverys().get(0).getMail_no());
+                            fsStoreOrderMapper.updateFsStoreOrder(map);
+                            orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
+                                    OrderLogEnum.DELIVERY_GOODS.getDesc());
+                            TemplateBean templateBean = TemplateBean.builder()
+                                    .orderId(order.getId().toString())
+                                    .orderCode(order.getOrderCode().toString())
+                                    .deliveryId(order.getDeliveryId())
+                                    .deliveryName(order.getDeliveryName())
+                                    .userId(order.getUserId())
+                                    .templateType(TemplateListenEnum.TYPE_2.getValue())
+                                    .build();
+                            publisher.publishEvent(new TemplateEvent(this, templateBean));
+                            return R.ok();
+                        }
+                    }
+
+                }
+            }
+        }
+        return R.error("未生成运单信息");
+    }
+
+    @Override
+    @Transactional
+    public R syncExpress(FsStoreOrderExpressEditParam param) {
+        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderById(param.getOrderId());
+        String lastFourNumber = "";
+        if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+            lastFourNumber = order.getUserPhone();
+            if (lastFourNumber.length() == 11) {
+                lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+            }
+        }
+        ExpressInfoDTO dto=expressService.getExpressInfo(order.getOrderCode(),order.getDeliverySn(),order.getDeliveryId(),lastFourNumber);
+        FsStoreOrder map=new FsStoreOrder();
+        map.setDeliveryStatus(Integer.parseInt(dto.getState()));
+        map.setId(order.getId());
+        map.setDeliveryType(dto.getStateEx());
+        fsStoreOrderMapper.updateFsStoreOrder(map);
+        //如果是正常签收,更新订单状态
+        if(dto.getState().equals("3")&&(dto.getStateEx().equals("301")||dto.getStateEx().equals("302")||dto.getStateEx().equals("304")||dto.getStateEx().equals("311"))){
+            finishOrder(order.getId());
+        }
+        return null;
+    }
+
+    @Override
+    @Synchronized
+    public R addTuiMoney(FsStoreOrderAddTuiMoneyParam param) {
+        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderById(param.getOrderId());
+        if(order.getStatus()!=OrderInfoEnum.STATUS_3.getValue()) {
+            return R.error("订单未完成,不能分佣金");
+        }
+        if (order.getCompanyId() != null && order.getCompanyId() > 0 && order.getPayDelivery().compareTo(new BigDecimal(0)) == 0) {
+            if (order.getTuiMoneyStatus() == null || order.getTuiMoneyStatus() != 1) {
+                companyService.addCompanyMoney(order);
+                return R.ok();
+            }
+            else{
+                return R.error("此订单已分佣,不能重复分佣");
+            }
+        }
+        else{
+            return R.error("此订单不能手动分佣");
+        }
+    }
+
+    @Override
+    public R createSalesOrder(CompanyUser companyUser, String cateIds) {
+        List<FsStoreCartQueryVO>  carts=cartMapper.selectFsStoreCartListByIds(cateIds);
+        String uuid = IdUtil.randomUUID();
+        redisCache.setCacheObject("createOrderKey:"+uuid, companyUser.getCompanyId()+"-"+companyUser.getUserId(), 24, TimeUnit.HOURS);
+        redisCache.setCacheObject("orderCarts:"+uuid, carts, 24, TimeUnit.HOURS);
+        //计算总价
+        BigDecimal totalMoney= BigDecimal.ZERO;
+        for(FsStoreCartQueryVO vo:carts){
+            totalMoney=totalMoney.add(vo.getPrice().multiply(new BigDecimal(vo.getCartNum().toString())));
+        }
+        redisCache.setCacheObject("createOrderMoney:"+uuid, totalMoney, 24, TimeUnit.HOURS);
+        return R.ok().put("orderKey",uuid).put("carts",carts);
+    }
+
+    @Override
+    public R getSalesOrder(String createOrderKey) {
+        String key=redisCache.getCacheObject("createOrderKey:"+createOrderKey);
+        List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + createOrderKey);
+        BigDecimal money=redisCache.getCacheObject("createOrderMoney:"+createOrderKey);
+        if (StringUtils.isEmpty(key)) {
+            throw new CustomException("订单已过期",501);
+        }
+        return R.ok().put("carts",carts).put("totalMoney",money);
+    }
+
+    @Override
+    @Transactional
+    public R addUserCart(long userId, String createOrderKey) {
+        String key=redisCache.getCacheObject("createOrderKey:"+createOrderKey);
+        List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + createOrderKey);
+        if (StringUtils.isEmpty(key)) {
+            throw new CustomException("订单已过期",501);
+        }
+        List<Long> ids=new ArrayList<>();
+        for(FsStoreCartQueryVO vo : carts){
+            FsStoreCart storeCart = FsStoreCart.builder()
+                    .cartNum(vo.getCartNum())
+                    .productAttrValueId(vo.getProductAttrValueId())
+                    .productId(vo.getProductId())
+                    .userId(userId)
+                    .isPay(0)
+                    .isDel(0)
+                    .isBuy(1)
+                    .build();
+            storeCart.setCreateTime(new Date());
+            cartMapper.insertFsStoreCart(storeCart);
+            ids.add(storeCart.getId());
+        }
+        //删除REDIS
+//        redisCache.deleteObject("createOrderKey:"+createOrderKey);
+//        redisCache.deleteObject("orderCarts:" + createOrderKey);
+        String[] idArr=key.split("-");
+        return R.ok().put("cartIds",ids).put("companyId",idArr[0]).put("companyUserId",idArr[1]);
+
+    }
+
+    @Override
+    public R updateSalseOrderMoney(String createOrderKey, BigDecimal money,BigDecimal payAmount) {
+        //货到付款自定义金额
+        if (payAmount==null){
+            String configJson=configService.selectConfigByKey("store.config");
+            StoreConfig config=JSONUtil.toBean(configJson,StoreConfig.class);
+            Integer amount = config.getPayAmount();
+            if (amount!=null){
+                payAmount = new BigDecimal(amount);
+            }
+        }
+
+
+        if(money==null){
+            return R.error("请输入价格");
+        }
+//        if(money.compareTo(BigDecimal.ZERO)<=0){
+//            return R.error("价格应大于0");
+//        }
+        String key=redisCache.getCacheObject("createOrderKey:"+createOrderKey);
+        if (StringUtils.isEmpty(key)) {
+            throw new CustomException("订单已过期",501);
+        }
+        List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + createOrderKey);
+        BigDecimal totalMoney= BigDecimal.ZERO;
+        for(FsStoreCartQueryVO vo:carts){
+            totalMoney=totalMoney.add(vo.getPrice().multiply(new BigDecimal(vo.getCartNum().toString())));
+        }
+        if(money.compareTo(totalMoney)==1){
+            throw new CustomException("价格不能大于商品总价",501);
+        }
+        String json=configService.selectConfigByKey("store.config");
+        StoreConfig config= JSONUtil.toBean(json,StoreConfig.class);
+        if(config.getCreateMoneyRate()!=null){
+            totalMoney=totalMoney.multiply(new BigDecimal(config.getCreateMoneyRate())).divide(new BigDecimal(100));
+            if(money.compareTo(totalMoney)==-1){
+                throw new CustomException("价格必须大于商品总价"+config.getCreateMoneyRate()+"%",501);
+            }
+        }
+        redisCache.setCacheObject("createOrderMoney:"+createOrderKey, money, 24, TimeUnit.HOURS);
+        redisCache.setCacheObject("createOrderAmount:"+createOrderKey, payAmount, 24, TimeUnit.HOURS);//物流代收自定义金额
+        return R.ok();
+    }
+
+    @Override
+    public Integer selectFsStoreOrderCountByType(Long companyId, long userId, int type) {
+        return fsStoreOrderMapper.selectFsStoreOrderCountByType(companyId,userId,type);
+    }
+
+    @Override
+    public List<FsCustomerStoreOrderListQueryVO> selectFsCustomerStoreOrderListQuery(FsCustomerStoreOrderListQueryParam param) {
+        List<FsCustomerStoreOrderListQueryVO> list= fsStoreOrderMapper.selectFsCustomerStoreOrderListQuery(param);
+        for(FsCustomerStoreOrderListQueryVO vo:list){
+            List<FsStoreOrderItemVO> items=fsStoreOrderItemMapper.selectMyFsStoreOrderItemListByOrderId(vo.getId());
+            vo.setItems(items);
+        }
+        return list;
+    }
+
+    @Override
+    public List<JSONObject> selectFsStoreOrderCounts(Map<String, Object> toMap) {
+        return fsStoreOrderMapper.selectFsStoreOrderCounts(toMap);
+    }
+
+    @Override
+    public List<FsStoreOrderStatisticsVO> selectFsStoreOrderStatisticsList(FsStoreStatisticsParam param) {
+        return fsStoreOrderMapper.selectFsStoreOrderStatisticsList(param);
+    }
+
+    @Override
+    public List<FsStoreOrderExportVO> selectFsStoreOrderListVOByExport(FsStoreOrderParam param) {
+        return fsStoreOrderMapper.selectFsStoreOrderListVOByExport(param);
+    }
+
+    @Override
+    public List<FsStoreOrderPromotionExportVO> selectFsPromotionOrderListVOByExport(FsStoreOrderParam param) {
+        List<FsStoreOrderPromotionExportVO> list = fsStoreOrderMapper.selectFsPromotionOrderListVOByExport(param);
+        for (FsStoreOrderPromotionExportVO vo : list){
+           FsStoreOrderBrokerageVO brokerageVO = fsStoreOrderMapper.selectBrokerage(vo.getId());
+           vo.setBrokerage(brokerageVO.getBrokerage());
+           vo.setBrokerageTwo(brokerageVO.getBrokerageTwo());
+           vo.setBrokerageThree(brokerageVO.getBrokerageThree());
+        }
+        return list;
+    }
+
+    @Override
+    public List<FsStorePayRemainOrderExportVO> selectFsStorePayRemainOrderListVOByExport(FsStoreOrderParam param) {
+        return fsStoreOrderMapper.selectFsStorePayRemainOrderListVOByExport(param);
+    }
+
+    @Override
+    public List<FsStoreOrder> selectFsStoreOrderListByFinish7Day() {
+        return fsStoreOrderMapper.selectFsStoreOrderListByFinish7Day();
+    }
+
+    @Override
+    public List<FsStoreOrderVO> selectFsCustomerStoreOrderListVO(FsStoreOrderParam param) {
+        return fsStoreOrderMapper.selectFsCustomerStoreOrderListVO(param);
+    }
+
+    @Override
+    @Transactional
+    @Synchronized
+    public String payRemainConfirm( String payCode, String tradeNo, String bankTransactionId, String bankSerialNo) {
+        //支付订单
+        FsStoreOrder order=null;
+        FsStorePayment storePayment=paymentService.selectFsStorePaymentByCode(payCode);
+        if(storePayment==null||!storePayment.getStatus().equals(0)){
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            return "";
+        }
+        storePayment.setStatus(1);
+        storePayment.setPayTime(new Date());
+        storePayment.setTradeNo(tradeNo);
+        storePayment.setBankSerialNo(bankSerialNo);
+        storePayment.setBankTransactionId(bankTransactionId);
+        storePayment.setIsPayRemain(1);
+        paymentService.updateFsStorePayment(storePayment);
+        order=fsStoreOrderMapper.selectFsStoreOrderById(storePayment.getOrderId());
+        //增加状态
+        orderStatusService.create(order.getId(), OrderLogEnum.PAY_REMAIN_ORDER_SUCCESS.getValue(),
+                OrderLogEnum.PAY_REMAIN_ORDER_SUCCESS.getDesc());
+
+        FsStoreOrder storeOrder = new FsStoreOrder();
+        storeOrder.setId(order.getId());
+        storeOrder.setIsPayRemain(1);
+        fsStoreOrderMapper.updateFsStoreOrder(storeOrder);
+
+        // 添加审核
+        addOrderAudit(order);
+
+        return "SUCCESS";
+    }
+
+    @Override
+    public R auditPayRemain(Long orderId) {
+        FsStoreOrder order=fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+        if(order.getIsPayRemain()==1){
+            FsStoreOrder storeOrder = new FsStoreOrder();
+            storeOrder.setId(order.getId());
+            storeOrder.setIsPayRemain(2);
+            storeOrder.setPayType("1");
+            storeOrder.setPayMoney(order.getPayPrice());
+            storeOrder.setPayDelivery(new BigDecimal(0));
+            fsStoreOrderMapper.updateFsStoreOrder(storeOrder);
+            return R.ok("操作成功");
+        }
+        else{
+            return R.error("非法操作");
+        }
+    }
+
+    @Override
+    public Integer selectFsStoreOrderCount(long userId, int status) {
+        return fsStoreOrderMapper.selectFsStoreOrderCount(userId,status);
+    }
+
+    @Override
+    public Integer selectFsStoreOrderCount(FsStoreOrderStatisticsParam param) {
+        return fsStoreOrderMapper.selectFsStoreOrderCount(param);
+    }
+
+    @Override
+    public R computedPackageOrder(long userId, FsStoreComputedPackageIdOrderParam param) {
+        FsStoreProductPackage storeProductPackage=productPackageService.selectFsStoreProductPackageById(param.getPackageId());
+        BigDecimal totalMoney=storeProductPackage.getPayMoney();
+        if(param.getCouponUserId()!=null){
+            FsStoreCouponUser couponUser=couponUserService.selectFsStoreCouponUserById(param.getCouponUserId());
+            if(couponUser!=null&&couponUser.getStatus()==0){
+                if(couponUser.getUseMinPrice().compareTo(storeProductPackage.getPayMoney())==-1){
+                    totalMoney=totalMoney.subtract(couponUser.getCouponPrice());
+                }
+            }
+        }
+        return R.ok().put("totalMoney",totalMoney);
+    }
+
+    @Override
+    public FsStoreOrder selectFsStoreOrderByDeliveryId(String logisticCode) {
+        return fsStoreOrderMapper.selectFsStoreOrderByDeliveryId(logisticCode);
+    }
+
+
+
+
+    @Synchronized
+    @Override
+    //@Async
+    public String importExpress(List<StoreOrderExpressExportDTO> list, boolean updateSupport) {
+        if (StringUtils.isNull(list) || list.size() == 0)
+        {
+            throw new CustomException("导入数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder importSuccessMsg = new StringBuilder();
+        StringBuilder importErrorMsg = new StringBuilder();
+        StringBuilder importMsg = new StringBuilder();
+        for (StoreOrderExpressExportDTO dto : list)
+        {
+            try
+            {
+//                Thread.sleep(1000);
+                FsStoreOrder order=fsStoreOrderMapper.selectFsStoreOrderByDeliveryId(dto.getDeliveryId());
+                if (StringUtils.isNull(order))
+                {
+                    String msg = "<br/>" + failureNum + "、快递单号 " + dto.getDeliveryId() + "不存在";
+                    importErrorMsg.append(msg);
+                    failureNum++;
+                }
+                else
+                {
+                    //订单状态为已签收并且未导入过
+                    if(order.getDeliveryStatus().equals(3)&& order.getDeliveryImportTime()==null&&(order.getPayType().equals("2")||order.getPayType().equals("3"))){
+                        FsStoreOrder orderMap=new FsStoreOrder();
+                        orderMap.setId(order.getId());
+                        orderMap.setDeliveryTime(dto.getDeliveryTime());
+                        orderMap.setDeliveryPayStatus(Integer.parseInt(dto.getDeliveryPayStatus()));
+                        orderMap.setDeliveryPayMoney(dto.getDeliveryPayMoney());
+                        orderMap.setDeliveryPayTime(dto.getDeliveryPayTime());
+                        orderMap.setDeliveryImportTime(new Date());
+                        this.updateFsStoreOrder(orderMap);
+                        //未分佣写入分佣
+                        if(order.getCompanyId()!=null&&order.getCompanyId()>0){
+                            companyService.addCompanyMoney(order);
+                        }
+                        successNum++;
+                        importSuccessMsg.append("<br/>" + successNum + "、快递单号 " +dto.getDeliveryId() + " 导入成功");
+
+
+                        // 同步订单完成状态到erp
+                        // 如果是物流代收 或者 货到付款
+//                        if("2".equals(order.getPayType()) || "3".equals(order.getPayType())){
+//                            // 已结算
+//                            if("1".equals(dto.getDeliveryPayStatus())){
+//                                FsErpFinishPush fsErpFinishPush = new FsErpFinishPush();
+//                                fsErpFinishPush.setOrderId(order.getId());
+//                                fsErpFinishPush.setTaskStatus(0);
+//                                fsErpFinishPush.setRetryCount(0);
+//                                fsErpFinishPush.setCreateTime(new Date());
+//                                fsErpFinishPushMapper.insert(fsErpFinishPush);
+//                            }
+//                        }
+                    }
+                    else{
+                        String msg = "<br/>" + failureNum + "、快递单号 " + dto.getDeliveryId() + " 未签收或已导入,不能导入";
+                        importErrorMsg.append(msg);
+                        failureNum++;
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                String msg = "<br/>" + failureNum + "、快递单号 " + dto.getDeliveryId() + " 导入异常:";
+                importErrorMsg.append(msg+e.getMessage());
+                failureNum++;
+            }
+        }
+        importMsg.insert(0, "导入完成!成功" + successNum + " 条,失败"+failureNum+"条。");
+        importMsg.append(importErrorMsg.toString());
+        importMsg.append(importSuccessMsg.toString());
+        return importMsg.toString();
+    }
+
+
+    /**
+     * 退回积分
+     */
+    private void refundIntegral(FsStoreOrder order) {
+
+        if (order.getPayIntegral().compareTo(BigDecimal.ZERO) > 0) {
+            order.setUseIntegral(order.getPayIntegral());
+        }
+        if (order.getUseIntegral().compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        if ( order.getBackIntegral().compareTo(BigDecimal.ZERO) > 0) {
+            return;
+        }
+        FsUser user = userService.selectFsUserById(order.getUserId());
+        //增加积分
+        BigDecimal newIntegral = NumberUtil.add(order.getUseIntegral(), user.getIntegral());
+        user.setIntegral(newIntegral);
+        userService.updateFsUser(user);
+        //增加流水
+        billService.addBill(user.getUserId(),BillDetailEnum.CATEGORY_2.getValue(),1, BillDetailEnum.TYPE_5.getDesc(),
+                order.getUseIntegral().doubleValue(),
+                newIntegral.doubleValue(),
+                "购买商品失败,回退积分" + order.getUseIntegral(), order.getId().toString(),0l);
+        //更新订单回退积分
+        FsStoreOrder storeOrder = new FsStoreOrder();
+        storeOrder.setBackIntegral(order.getUseIntegral());
+        storeOrder.setId(order.getId());
+        fsStoreOrderMapper.updateFsStoreOrder(storeOrder);
+    }
+
+
+    /**
+     * 退回库存
+     */
+    private void refundStock(FsStoreOrder order) {
+        //获取订单下的商品
+        List<FsStoreOrderItemVO> orderItemVOS=fsStoreOrderItemMapper.selectFsStoreOrderItemListByOrderId(order.getId());
+        for(FsStoreOrderItemVO vo:orderItemVOS){
+            productService.incProductStock(vo.getNum(), vo.getProductId()
+                    , vo.getProductAttrValueId());
+        }
+
+    }
+
+
+
+    /**
+     * 获取订单价格
+     */
+    private FsStoreOrderPriceDTO getOrderPriceGroup(List<FsStoreCartQueryVO> cartInfo, FsUserAddress userAddress) {
+        BigDecimal storePostage = BigDecimal.ZERO;
+        //免运费设置
+        BigDecimal storeFreePostage = BigDecimal.ZERO;
+
+        BigDecimal totalPrice = this.getOrderSumPrice(cartInfo, "truePrice");//获取订单总金额
+        BigDecimal costPrice = this.getOrderSumPrice(cartInfo, "costPrice");//获取订单成本价
+        BigDecimal payIntegral = this.getOrderSumPrice(cartInfo, "payIntegral");//获取订单需要的积分
+
+        //如果设置满包邮0 表示全局包邮,如果设置大于0表示满这价格包邮,否则走运费模板算法
+        if (storeFreePostage.compareTo(BigDecimal.ZERO) != 0 && totalPrice.compareTo(storeFreePostage) <= 0) {
+            storePostage = this.handlePostage(cartInfo, userAddress);
+        }
+
+        FsStoreOrderPriceDTO priceGroupDTO = new FsStoreOrderPriceDTO();
+        priceGroupDTO.setStorePostage(storePostage);
+//        priceGroupDTO.setStoreFreePostage(storeFreePostage);
+        priceGroupDTO.setTotalPrice(totalPrice);
+        priceGroupDTO.setCostPrice(costPrice);
+        priceGroupDTO.setPayIntegral(payIntegral);
+        return priceGroupDTO;
+    }
+
+    /**
+     * 根据运费模板算法返回邮费
+     *
+     * @param cartInfo    购物车
+     * @param userAddress 地址
+     * @return double
+     */
+    private BigDecimal handlePostage(List<FsStoreCartQueryVO> cartInfo, FsUserAddress userAddress) {
+        BigDecimal storePostage = BigDecimal.ZERO;
+        if (userAddress != null) {
+            if (userAddress.getCityId() == null) {
+                return storePostage;
+            }
+            String cityId = userAddress.getCityId();
+            List<String> citys = new ArrayList<>();
+            citys.add(cityId);
+            citys.add("0");//城市包括默认
+            List<Long> tempIds = cartInfo
+                    .stream()
+                    .map(FsStoreCartQueryVO::getTempId)
+                    .collect(Collectors.toList());
+
+            //获取商品用到的运费模板
+            List<FsShippingTemplates> shippingTemplatesList =shippingTemplatesService.selectFsShippingTemplatesByIds(StringUtils.join(tempIds,","));
+
+            //获取运费模板区域列表按照城市排序
+            List<FsShippingTemplatesRegion> shippingTemplatesRegionList = shippingTemplatesRegionService.selectFsShippingTemplatesRegionListByTempIdsAndCityIds(StringUtils.join(tempIds,","),StringUtils.join(citys,","));
+
+            //提取运费模板类型
+            Map<Long, Integer> shippingTemplatesMap = shippingTemplatesList
+                    .stream()
+                    .collect(Collectors.toMap(FsShippingTemplates::getId,
+                            FsShippingTemplates::getType));
+            //提取运费模板有相同值覆盖
+            Map<Long, FsShippingTemplatesRegion> shippingTemplatesRegionMap =
+                    shippingTemplatesRegionList.stream()
+                            .collect(Collectors.toMap(FsShippingTemplatesRegion::getTempId,
+                                    YxShippingTemplatesRegion -> YxShippingTemplatesRegion,
+                                    (key1, key2) -> key2));
+
+
+            Map<Long, TemplateDTO> templateDTOMap = new HashMap<>();
+            for (FsStoreCartQueryVO storeCartVO : cartInfo) {
+                Long tempId = storeCartVO.getTempId();
+                //根据模板类型获取相应的数量
+                double num = 0d;
+                if (ShippingTempEnum.TYPE_1.getValue().equals(shippingTemplatesMap.get(tempId))) {
+                    num = storeCartVO.getCartNum().doubleValue();
+                } else if (ShippingTempEnum.TYPE_2.getValue().equals(shippingTemplatesMap.get(tempId))) {
+                    num = NumberUtil.mul(storeCartVO.getCartNum(),
+                            storeCartVO.getWeight()).doubleValue();
+                } else if (ShippingTempEnum.TYPE_3.getValue().equals(shippingTemplatesMap.get(tempId))) {
+                    num = NumberUtil.mul(storeCartVO.getCartNum(),
+                            storeCartVO.getVolume()).doubleValue();
+                }
+
+                FsShippingTemplatesRegion shippingTemplatesRegion = shippingTemplatesRegionMap.get(tempId);
+                BigDecimal price = NumberUtil.round(NumberUtil.mul(storeCartVO.getCartNum(),
+                        storeCartVO.getPrice()), 2);
+                if (!templateDTOMap.containsKey(tempId)) {
+                    TemplateDTO templateDTO = TemplateDTO.builder()
+                            .number(num)
+                            .price(price)
+                            .first(shippingTemplatesRegion.getFirst().doubleValue())
+                            .firstPrice(shippingTemplatesRegion.getFirstPrice())
+                            .continues(shippingTemplatesRegion.getContinues().doubleValue())
+                            .continuePrice(shippingTemplatesRegion.getContinuePrice())
+                            .tempId(tempId)
+                            .cityId(cityId)
+                            .build();
+                    templateDTOMap.put(tempId, templateDTO);
+                } else {
+                    TemplateDTO templateDTO = templateDTOMap.get(tempId);
+                    templateDTO.setNumber(templateDTO.getNumber() + num);
+                    templateDTO.setPrice(NumberUtil.add(templateDTO.getPrice().doubleValue(), price));
+                }
+            }
+
+            //处理区域邮费
+            boolean isFirst = true; //用来是否多个产品的标识 false表示数量大于1
+            for (TemplateDTO templateDTO : templateDTOMap.values()) {
+                if (isFirst) {//首件
+                    //只满足首件
+                    if (Double.compare(templateDTO.getNumber(), templateDTO.getFirst()) <= 0) {
+                        storePostage = NumberUtil.round(NumberUtil.add(storePostage,
+                                templateDTO.getFirstPrice()), 2);
+                    } else {
+                        BigDecimal firstPrice = NumberUtil.add(storePostage, templateDTO.getFirstPrice());
+
+                        if (templateDTO.getContinues() <= 0) {
+                            storePostage = firstPrice;
+                        } else {
+                            //续件平均值且向上取整数
+                            double average = Math.ceil(NumberUtil.div(NumberUtil.sub(templateDTO.getNumber(),
+                                    templateDTO.getFirst()),
+                                    templateDTO.getContinues().doubleValue()));
+                            //最终邮费
+                            storePostage = NumberUtil.add(firstPrice, NumberUtil.mul(average,
+                                    templateDTO.getContinuePrice()));
+                        }
+
+                    }
+                    isFirst = false;
+                } else {
+                    //多件直接在以前的基数继续续建
+                    if (templateDTO.getContinues() > 0) {
+                        //续件平均值且向上取整数
+                        double average = Math.ceil(
+                                NumberUtil.div(
+                                        templateDTO.getNumber(),
+                                        templateDTO.getContinues()
+                                )
+                        );
+                        //最终邮费
+                        storePostage = NumberUtil.add(storePostage.doubleValue(), NumberUtil.mul(average,
+                                templateDTO.getContinuePrice()));
+                    }
+                }
+            }
+        }
+        return storePostage;
+    }
+
+    /**
+     * 获取某字段价格
+     *
+     * @param cartInfo 购物车
+     * @param key      key值
+     * @return Double
+     */
+    private BigDecimal getOrderSumPrice(List<FsStoreCartQueryVO> cartInfo, String key) {
+        BigDecimal sumPrice = BigDecimal.ZERO;
+
+        if ("truePrice".equals(key)) {
+            for (FsStoreCartQueryVO storeCart : cartInfo) {
+                sumPrice = NumberUtil.add(sumPrice, NumberUtil.mul(storeCart.getCartNum(), storeCart.getPrice()));
+            }
+        }
+        else if ("costPrice".equals(key)) {
+            for (FsStoreCartQueryVO storeCart : cartInfo) {
+                sumPrice = NumberUtil.add(sumPrice,
+                        NumberUtil.mul(storeCart.getCartNum(), storeCart.getCost()));
+            }
+        }else if ("payIntegral".equals(key)) {
+            for (FsStoreCartQueryVO storeCart : cartInfo) {
+                if (storeCart.getIntegral() != null) {
+                    sumPrice = NumberUtil.add(sumPrice,
+                            NumberUtil.mul(storeCart.getCartNum(), storeCart.getIntegral()));
+                }
+
+            }
+        }
+        return sumPrice;
+    }
+
+    @Override
+    public Boolean isEntityNull(FsStoreOrderParam param) {
+        if (param == null) {
+            return true; // 整个实体对象为null
+        }
+
+        Class<? extends FsStoreOrderParam> entityClass = param.getClass();
+        Field[] fields = entityClass.getDeclaredFields();
+        try {
+            for (Field field : fields) {
+                field.setAccessible(true);
+                Object value = field.get(param);
+                if (value != null) {
+                    return false; // 实体对象中有字段不为null
+                }
+            }
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+        return true; // 实体对象内所有字段为null
+    }
+
+    @Override
+    public int uploadCredentials(FsStoreOrder order) {
+        order.setUploadTime(new Date());
+        return fsStoreOrderMapper.uploadCredentials(order);
+    }
+
+    @Override
+    public String getCredentialsById(Long id) {
+
+        return fsStoreOrderMapper.getCredentialsById(id);
+    }
+
+    @Override
+    public List<Long> selectFsStoreOrderToPushByIds(String startTime) {
+        return fsStoreOrderMapper.selectFsStoreOrderToPushByIds(startTime);
+    }
+
+    @Override
+    public List<FsStoreOrder> selectFsStoreOrderItemJson() {
+        return fsStoreOrderMapper.selectFsStoreOrderItemJson();
+    }
+
+    @Override
+    public int uploadItemJson(FsStoreOrder order) {
+        return fsStoreOrderMapper.uploadItemJson(order);
+    }
+
+    @Override
+    public ExpressResultDTO updateDeliveryItem(ExpressNotifyDTO notifyDTO) {
+        String data= URLDecoder.decode(notifyDTO.getRequestData(), Charset.forName("UTF-8"));
+        //ExpressInfoDTO
+        logger.info("快递跟踪回调: {}",data);
+        ExpressDataDTO expressDataDTO=JSONUtil.toBean(data,ExpressDataDTO.class);
+
+        if(expressDataDTO!=null&&expressDataDTO.getData()!=null){
+            for(ExpressInfoDTO dto:expressDataDTO.getData()){
+                List<FsStoreOrder> orders=this.selectFsStoreOrderListByDeliveryId(dto.getLogisticCode());
+                if(orders!=null){
+                    for(FsStoreOrder order:orders){
+                        logger.info("订单信息:"+JSONUtil.toJsonStr(order));
+                        logger.info("运单号:"+dto.getLogisticCode());
+                        if(order!=null && (order.getDeliveryStatus()==null||order.getDeliveryStatus()!=3)){
+                            if (dto.getState()!=null&&dto.getStateEx()!=null) {
+                                FsStoreOrder map = new FsStoreOrder();
+                                map.setDeliveryStatus(Integer.parseInt(dto.getState()));
+                                map.setId(order.getId());
+                                map.setDeliveryType(dto.getStateEx());
+                                this.updateFsStoreOrder(map);
+                                //如果是正常签收,更新订单状态
+                                if (dto.getState().equals("3") && (dto.getStateEx().equals("301") || dto.getStateEx().equals("302") || dto.getStateEx().equals("304") || dto.getStateEx().equals("311"))) {
+                                    this.finishOrder(order.getId());
+                                }
+                            }
+                            if (!dto.isSuccess()){
+                                logger.info("物流状态异常:{}",dto);
+                            }
+                            //如果无轨迹重新订阅
+                            if ((!dto.isSuccess()&&dto.getReason().equals("三天无轨迹"))||(!dto.isSuccess()&&dto.getReason().equals("七天内无轨迹变化"))){
+                                //订阅物流回调
+                                String lastFourNumber = "";
+                                if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+                                    lastFourNumber = order.getUserPhone();
+                                    if (lastFourNumber.length() == 11) {
+                                        lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+                                    }
+                                }
+                                logger.info("物流重新订阅:{}",order.getDeliveryId());
+                                expressService.subscribeEspress(order.getOrderCode(),order.getDeliverySn(),order.getDeliveryId(),lastFourNumber);
+                            }
+
+                        }
+                    }
+                }
+
+            }
+            return ExpressResultDTO.success(sysConfig.getKdnId().trim());
+        }
+        return ExpressResultDTO.error(sysConfig.getKdnId().trim(),"物流详情数据为null");
+    }
+
+    @Override
+    public FsStoreOrder selectOrderByUserIdLimit1(Long userId) {
+        return fsStoreOrderMapper.selectOrderByUserIdLimit1(userId);
+    }
+
+
+    @Override
+    public List<FsStoreOrder> selectFsStoreOrderStatisticsByUserId(List<Long> fsUserIdList) {
+        return fsStoreOrderMapper.selectFsStoreOrderStatisticsByUserId(fsUserIdList);
+    }
+
+    private IErpOrderService getErpService(){
+        //判断是否开启erp
+        IErpOrderService erpOrderService = null;
+        FsErpConfig erpConfig = configUtil.getErpConfig();
+        Integer erpOpen = erpConfig.getErpOpen();
+        if (erpOpen != null && erpOpen == 1) {
+            //判断erp类型
+            Integer erpType = erpConfig.getErpType();
+            if (erpType != null) {
+                if (erpType == 1) {
+                    //管易
+                    erpOrderService = gyOrderService;
+                } else if (erpType == 2) {
+                    //旺店通
+                    erpOrderService = wdtOrderService;
+                } else if (erpType == 3) {
+                    //旺店通
+                    erpOrderService = k9OrderService;
+                }
+            }
+        }
+        return erpOrderService;
+    }
+}

+ 103 - 0
fs-service/src/main/java/com/fs/store/service/impl/FsStoreOrderStatusScrmServiceImpl.java

@@ -0,0 +1,103 @@
+package com.fs.store.service.impl;
+
+import com.fs.store.domain.FsStoreOrderStatusScrm;
+import com.fs.store.mapper.FsStoreOrderStatusScrmMapper;
+import com.fs.store.service.IFsStoreOrderStatusScrmService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 订单操作记录Service业务层处理
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+@Service
+public class FsStoreOrderStatusScrmServiceImpl implements IFsStoreOrderStatusScrmService
+{
+    @Autowired
+    private FsStoreOrderStatusScrmMapper fsStoreOrderStatusMapper;
+
+    /**
+     * 查询订单操作记录
+     * 
+     * @param id 订单操作记录ID
+     * @return 订单操作记录
+     */
+    @Override
+    public FsStoreOrderStatusScrm selectFsStoreOrderStatusById(Long id)
+    {
+        return fsStoreOrderStatusMapper.selectFsStoreOrderStatusById(id);
+    }
+
+    /**
+     * 查询订单操作记录列表
+     * 
+     * @param fsStoreOrderStatus 订单操作记录
+     * @return 订单操作记录
+     */
+    @Override
+    public List<FsStoreOrderStatusScrm> selectFsStoreOrderStatusList(FsStoreOrderStatusScrm fsStoreOrderStatus)
+    {
+        return fsStoreOrderStatusMapper.selectFsStoreOrderStatusList(fsStoreOrderStatus);
+    }
+
+    /**
+     * 新增订单操作记录
+     * 
+     * @param fsStoreOrderStatus 订单操作记录
+     * @return 结果
+     */
+    @Override
+    public int insertFsStoreOrderStatus(FsStoreOrderStatusScrm fsStoreOrderStatus)
+    {
+        return fsStoreOrderStatusMapper.insertFsStoreOrderStatus(fsStoreOrderStatus);
+    }
+
+    /**
+     * 修改订单操作记录
+     * 
+     * @param fsStoreOrderStatus 订单操作记录
+     * @return 结果
+     */
+    @Override
+    public int updateFsStoreOrderStatus(FsStoreOrderStatusScrm fsStoreOrderStatus)
+    {
+        return fsStoreOrderStatusMapper.updateFsStoreOrderStatus(fsStoreOrderStatus);
+    }
+
+    /**
+     * 批量删除订单操作记录
+     * 
+     * @param ids 需要删除的订单操作记录ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreOrderStatusByIds(Long[] ids)
+    {
+        return fsStoreOrderStatusMapper.deleteFsStoreOrderStatusByIds(ids);
+    }
+
+    /**
+     * 删除订单操作记录信息
+     * 
+     * @param id 订单操作记录ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreOrderStatusById(Long id)
+    {
+        return fsStoreOrderStatusMapper.deleteFsStoreOrderStatusById(id);
+    }
+
+    @Override
+    public int create(Long id, String changetype, String desc) {
+        FsStoreOrderStatusScrm storeOrderStatus = new FsStoreOrderStatusScrm();
+        storeOrderStatus.setOrderId(id);
+        storeOrderStatus.setChangeType(changetype);
+        storeOrderStatus.setChangeMessage(desc);
+        return fsStoreOrderStatusMapper.insertFsStoreOrderStatus(storeOrderStatus);
+    }
+}

+ 775 - 0
fs-service/src/main/java/com/fs/store/service/impl/FsStoreProductScrmServiceImpl.java

@@ -0,0 +1,775 @@
+package com.fs.store.service.impl;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fs.common.BeanCopyUtils;
+import com.fs.common.core.domain.R;
+import com.fs.common.exception.CustomException;
+import com.fs.common.utils.DateUtils;
+import com.fs.company.cache.ICompanyCacheService;
+import com.fs.statis.dto.ModifyMoreDTO;
+import com.fs.store.domain.FsStoreProductAttrScrm;
+import com.fs.store.domain.FsStoreProductAttrValueScrm;
+import com.fs.store.domain.FsStoreProductScrm;
+import com.fs.store.dto.ProductArrtScrmDTO;
+import com.fs.store.dto.ProductAttrScrmCountDto;
+import com.fs.store.mapper.FsStoreProductAttrValueScrmMapper;
+import com.fs.store.mapper.FsStoreProductScrmMapper;
+import com.fs.store.param.FsStoreProductScrmAddEditParam;
+import com.fs.store.param.FsStoreProductScrmQueryParam;
+import com.fs.store.service.IFsStoreProductScrmService;
+import com.fs.store.vo.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 商品Service业务层处理
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+@Service
+@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
+{
+    @Autowired
+    private FsStoreProductScrmMapper fsStoreProductMapper;
+    @Autowired
+    private FsStoreProductAttrValueScrmMapper fsStoreProductAttrValueMapper;
+    @Autowired
+    private FsStoreProductAttrMapper fsStoreProductAttrMapper;
+
+
+    @Autowired
+    private IFsStoreProductAttrValueService attrValueService;
+    @Autowired
+    private FsStoreProductPackageMapper fsStoreProductPackageMapper;
+    @Autowired
+    private FsStoreProductGroupMapper fsStoreProductGroupMapper;
+
+    @Autowired
+    private ICompanyCacheService companyCacheService;
+    /**
+     * 查询商品
+     *
+     * @param productId 商品ID
+     * @return 商品
+     */
+    @Override
+    public FsStoreProductScrm selectFsStoreProductById(Long productId)
+    {
+        return fsStoreProductMapper.selectFsStoreProductById(productId);
+    }
+
+    /**
+     * 查询商品列表
+     *
+     * @param fsStoreProduct 商品
+     * @return 商品
+     */
+    @Override
+    public List<FsStoreProductScrm> selectFsStoreProductList(FsStoreProductScrm fsStoreProduct)
+    {
+        return fsStoreProductMapper.selectFsStoreProductList(fsStoreProduct);
+    }
+
+    /**
+     * 新增商品
+     *
+     * @param fsStoreProduct 商品
+     * @return 结果
+     */
+    @Override
+    public int insertFsStoreProduct(FsStoreProductScrm fsStoreProduct)
+    {
+        fsStoreProduct.setCreateTime(DateUtils.getNowDate());
+        return fsStoreProductMapper.insertFsStoreProduct(fsStoreProduct);
+    }
+
+    /**
+     * 修改商品
+     *
+     * @param fsStoreProduct 商品
+     * @return 结果
+     */
+    @Override
+    public int updateFsStoreProduct(FsStoreProductScrm fsStoreProduct)
+    {
+        fsStoreProduct.setUpdateTime(DateUtils.getNowDate());
+        return fsStoreProductMapper.updateFsStoreProduct(fsStoreProduct);
+    }
+
+    /**
+     * 批量删除商品
+     *
+     * @param productIds 需要删除的商品ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreProductByIds(Long[] productIds)
+    {
+        return fsStoreProductMapper.deleteFsStoreProductByIds(productIds);
+    }
+
+    /**
+     * 删除商品信息
+     *
+     * @param productId 商品ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreProductById(Long productId)
+    {
+        return fsStoreProductMapper.deleteFsStoreProductById(productId);
+    }
+
+    @Override
+    public List<FsStoreProductScrmListVO> selectFsStoreProductListVO(FsStoreProductScrm fsStoreProduct) {
+        List<FsStoreProductScrmListVO> fsStoreProductListVOS = fsStoreProductMapper.selectFsStoreProductListVO(fsStoreProduct);
+
+        for (FsStoreProductScrmListVO item : fsStoreProductListVOS) {
+            if(StringUtils.isNotBlank(item.getCompanyIds())){
+                List<String> companyNameList = new ArrayList<>();
+                String[] split = item.getCompanyIds().split(",");
+
+                for (String companyId : split) {
+                    String companyName = companyCacheService.selectCompanyNameById(Long.valueOf(companyId));
+                    companyNameList.add(companyName);
+                }
+                item.setCompanyName(String.join(",",companyNameList));
+            }
+        }
+        return fsStoreProductListVOS;
+    }
+
+    @Override
+    public List<FsStoreProductScrmListVO> selectFsStoreProductBarCodeListVO(FsStoreProductScrm fsStoreProduct) {
+        List<FsStoreProductScrmListVO> fsStoreProductListVOS = fsStoreProductMapper.selectFsStoreProductBarCodeListVO(fsStoreProduct);
+
+        for (FsStoreProductScrmListVO item : fsStoreProductListVOS) {
+            if(StringUtils.isNotBlank(item.getCompanyIds())){
+                List<String> companyNameList = new ArrayList<>();
+                String[] split = item.getCompanyIds().split(",");
+
+                for (String companyId : split) {
+                    String companyName = companyCacheService.selectCompanyNameById(Long.valueOf(companyId));
+                    companyNameList.add(companyName);
+                }
+                item.setCompanyName(String.join(",",companyNameList));
+            }
+        }
+        return fsStoreProductListVOS;
+    }
+
+    @Override
+    public Map<String, Object> getFormatAttr(Long productId, String jsonStr) {
+        JSONObject jsonObject = JSON.parseObject(jsonStr);
+        Map<String, Object> resultMap = new LinkedHashMap<>(3);
+        if (jsonObject == null || jsonObject.get("attrs") == null || jsonObject.getJSONArray("attrs").isEmpty()) {
+            resultMap.put("attr", new ArrayList<>());
+            resultMap.put("value", new ArrayList<>());
+            resultMap.put("header", new ArrayList<>());
+            return resultMap;
+        }
+        List<ProductArrtScrmDTO> fromatDetailDTOList = JSON.parseArray(jsonObject.get("attrs").toString(),
+                ProductArrtScrmDTO.class);
+        DetailVO detailDto = this.attrFormat(fromatDetailDTOList);
+        List<Map<String, Object>> headerMapList = null;
+        List<Map<String, Object>> valueMapList = new ArrayList<>();
+        String align = "center";
+        Map<String, Object> headerMap = new LinkedHashMap<>();
+        for (Map<String, Map<String, String>> map : detailDto.getRes()) {
+            Map<String, String> detail = map.get("detail");
+            String[] detailArr = detail.values().toArray(new String[]{});
+            Arrays.sort(detailArr);
+
+            String sku = String.join(",", detailArr);
+
+            Map<String, Object> valueMap = new LinkedHashMap<>();
+
+            List<String> detailKeys =
+                    detail.entrySet()
+                            .stream()
+                            .map(Map.Entry::getKey)
+                            .collect(Collectors.toList());
+
+            int i = 0;
+            headerMapList = new ArrayList<>();
+            for (String title : detailKeys) {
+                headerMap.put("title", title);
+                headerMap.put("minWidth", "130");
+                headerMap.put("align", align);
+                headerMap.put("key", "value" + (i + 1));
+                headerMap.put("slot", "value" + (i + 1));
+                headerMapList.add(ObjectUtil.clone(headerMap));
+                i++;
+            }
+
+            String[] detailValues = detail.values().toArray(new String[]{});
+            for (int j = 0; j < detailValues.length; j++) {
+                String key = "value" + (j + 1);
+                valueMap.put(key, detailValues[j]);
+            }
+
+            valueMap.put("detail", detail);
+            valueMap.put("sku", "");
+            valueMap.put("image", "");
+            valueMap.put("price", 0);
+            valueMap.put("cost", 0);
+            valueMap.put("otPrice", 0);
+            valueMap.put("stock", 0);
+            valueMap.put("barCode", "");
+            valueMap.put("groupBarCode", "");
+            valueMap.put("agentPrice", 0);
+            valueMap.put("weight", 0);
+            valueMap.put("volume", 0);
+            valueMap.put("brokerage", 0);
+            valueMap.put("brokerageTwo", 0);
+            valueMap.put("brokerageThree", 0);
+            valueMap.put("integral", 0);
+            if (productId > 0) {
+                FsStoreProductAttrValueScrm attrValueMap=new FsStoreProductAttrValueScrm();
+                attrValueMap.setProductId(productId);
+                attrValueMap.setSku(sku);
+                List<FsStoreProductAttrValueScrm> values = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueList(attrValueMap);
+                if (values != null&&values.size()==1) {
+                    valueMap.put("id",values.get(0).getId());
+                    valueMap.put("sku",values.get(0).getSku());
+                    valueMap.put("image", values.get(0).getImage());
+                    valueMap.put("price", values.get(0).getPrice());
+                    valueMap.put("cost", values.get(0).getCost());
+                    valueMap.put("otPrice", values.get(0).getOtPrice());
+                    valueMap.put("agentPrice", values.get(0).getAgentPrice());
+                    valueMap.put("stock", values.get(0).getStock());
+                    valueMap.put("barCode", values.get(0).getBarCode());
+                    valueMap.put("groupBarCode", values.get(0).getGroupBarCode());
+                    valueMap.put("weight", values.get(0).getWeight());
+                    valueMap.put("volume", values.get(0).getVolume());
+                    valueMap.put("brokerage", values.get(0).getBrokerage());
+                    valueMap.put("brokerageTwo", values.get(0).getBrokerageTwo());
+                    valueMap.put("brokerageThree", values.get(0).getBrokerageThree());
+                    valueMap.put("integral", values.get(0).getIntegral());
+                }
+            }
+            valueMapList.add(ObjectUtil.clone(valueMap));
+        }
+        this.addHeaderMap(headerMap, headerMapList, align);
+        resultMap.put("attr", fromatDetailDTOList);
+        resultMap.put("value", valueMapList);
+        resultMap.put("header", headerMapList);
+        return resultMap;
+    }
+
+    @Override
+    @Transactional
+    public R addOrEdit(FsStoreProductScrmAddEditParam param) {
+        ProductAttrScrmCountDto countDto=computedProductCount(param.getValues());
+
+        if(param.getProductId()>0){
+            FsStoreProductScrm product=new FsStoreProductScrm();
+            BeanUtils.copyProperties(param,product);
+            product.setPrice(countDto.getMinPrice());
+            product.setOtPrice(countDto.getMinOtPrice());
+            product.setCost(countDto.getMinCost());
+            product.setIntegral(Long.parseLong(countDto.getMinIntegral().toString()));
+            product.setStock(Long.parseLong(countDto.getStock().toString()));
+            product.setCompanyIds(param.getCompanyIds());
+            product.setVideo(param.getVideo());
+            fsStoreProductMapper.updateFsStoreProduct(product);
+            if (param.getSpecType().equals(0)) {
+                ProductArrtScrmDTO fromatDetailDto = ProductArrtScrmDTO.builder()
+                        .value("规格")
+                        .detail(ListUtil.toList("默认"))
+                        .build();
+                List<ProductArrtScrmDTO> items=new ArrayList<>();
+                items.add(fromatDetailDto);
+                param.getValues().get(0).setSku("默认");
+                addProductAttr(product.getProductId(),items,param.getValues());
+            } else {
+                addProductAttr(product.getProductId(),param.getItems(),param.getValues());
+            }
+        }
+        else{
+            FsStoreProductScrm product=new FsStoreProductScrm();
+            BeanUtils.copyProperties(param,product);
+            product.setPrice(countDto.getMinPrice());
+            product.setOtPrice(countDto.getMinOtPrice());
+            product.setCost(countDto.getMinCost());
+            product.setIntegral(Long.parseLong(countDto.getMinIntegral().toString()));
+            product.setStock(Long.parseLong(countDto.getStock().toString()));
+            product.setCompanyIds(param.getCompanyIds());
+            product.setVideo(param.getVideo());
+            fsStoreProductMapper.insertFsStoreProduct(product);
+            if (param.getSpecType().equals(0)) {
+                ProductArrtScrmDTO fromatDetailDto = ProductArrtScrmDTO.builder()
+                        .value("规格")
+                        .detail(ListUtil.toList("默认"))
+                        .build();
+                List<ProductArrtScrmDTO> items=new ArrayList<>();
+                items.add(fromatDetailDto);
+                param.getValues().get(0).setSku("默认");
+                addProductAttr(product.getProductId(),items,param.getValues());
+            } else {
+                addProductAttr(product.getProductId(),param.getItems(),param.getValues());
+            }
+        }
+        return R.ok();
+    }
+
+
+    private void addProductAttr(Long productId, List<ProductArrtScrmDTO> items, List<FsStoreProductAttrValueScrm> values){
+        //清空attr
+        fsStoreProductAttrMapper.clear(productId);
+        //清空values
+        //查出商品属性所有ID;
+        List<FsStoreProductAttrValueScrm> attrValues=fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueByProductId(productId);
+        fsStoreProductAttrValueMapper.deleteFsStoreProductAttrValueByProductId(productId);
+        //写入attr
+        for(ProductArrtScrmDTO vo:items){
+            FsStoreProductAttrScrm attr=new FsStoreProductAttrScrm();
+            attr.setProductId(productId);
+            attr.setAttrName(vo.getValue());
+            attr.setAttrValues(StringUtils.join(vo.getDetail(), ","));
+            fsStoreProductAttrMapper.insertFsStoreProductAttr(attr);
+        }
+        Map<String,Object> map = new LinkedHashMap<>();
+        map.put("attr",items);
+        // map.put("value",values);
+
+        for(FsStoreProductAttrValueScrm val: values){
+            //更新套餐商品属性ID  获取套餐
+            Long id=val.getId();
+            if(val.getDetail()!=null){
+                List<String> stringList = new ArrayList<>(val.getDetail().values());
+                Collections.sort(stringList);
+                val.setSku(StrUtil.join(",",stringList));
+            }
+            val.setProductId(productId);
+            fsStoreProductAttrValueMapper.insertFsStoreProductAttrValue(val);
+            if(attrValues!=null&&attrValues.size()>0){
+                for(FsStoreProductAttrValueScrm attrValue:attrValues){
+                    if(attrValue.getId().equals(id)){
+                        fsStoreProductGroupMapper.updateProducts(attrValue.getId(),val.getId());
+                        fsStoreProductPackageMapper.updateProducts(attrValue.getId(),val.getId());
+                    }
+                }
+            }
+
+        }
+    }
+
+    private DetailVO attrFormat(List<ProductArrtScrmDTO> fromatDetailDTOList) {
+        List<String> data = new ArrayList<>();
+        List<Map<String, Map<String, String>>> res = new ArrayList<>();
+        fromatDetailDTOList.stream()
+                .map(ProductArrtScrmDTO::getDetail)
+                .forEach(i -> {
+                    if (i == null || i.isEmpty()) {
+                        throw new CustomException("请至少添加一个规格值哦");
+                    }
+                    String str = ArrayUtil.join(i.toArray(), ",");
+                    if (str.contains("-")) {
+                        throw new CustomException("规格值里包含'-',请重新添加");
+                    }
+                });
+
+        if (fromatDetailDTOList.size() > 1) {
+            for (int i = 0; i < fromatDetailDTOList.size() - 1; i++) {
+                if (i == 0) {
+                    data = fromatDetailDTOList.get(i).getDetail();
+                }
+                List<String> tmp = new LinkedList<>();
+                for (String v : data) {
+                    for (String g : fromatDetailDTOList.get(i + 1).getDetail()) {
+                        String rep2 = "";
+                        if (i == 0) {
+                            rep2 = fromatDetailDTOList.get(i).getValue() + "_" + v + "-"
+                                    + fromatDetailDTOList.get(i + 1).getValue() + "_" + g;
+                        } else {
+                            rep2 = v + "-"
+                                    + fromatDetailDTOList.get(i + 1).getValue() + "_" + g;
+                        }
+
+                        tmp.add(rep2);
+
+                        if (i == fromatDetailDTOList.size() - 2) {
+                            Map<String, Map<String, String>> rep4 = new LinkedHashMap<>();
+                            Map<String, String> reptemp = new LinkedHashMap<>();
+                            for (String h : Arrays.asList(rep2.split("-"))) {
+                                List<String> rep3 = Arrays.asList(h.split("_"));
+                                if (rep3.size() > 1) {
+                                    reptemp.put(rep3.get(0), rep3.get(1));
+                                } else {
+                                    reptemp.put(rep3.get(0), "");
+                                }
+                            }
+                            rep4.put("detail", reptemp);
+                            res.add(rep4);
+                        }
+                    }
+                }
+                if (!tmp.isEmpty()) {
+                    data = tmp;
+                }
+            }
+        } else {
+            List<String> dataArr = new ArrayList<>();
+            for (ProductArrtScrmDTO fromatDetailDTO : fromatDetailDTOList) {
+                for (String str : fromatDetailDTO.getDetail()) {
+                    Map<String, Map<String, String>> map2 = new LinkedHashMap<>();
+                    dataArr.add(fromatDetailDTO.getValue() + "_" + str);
+                    Map<String, String> map1 = new LinkedHashMap<>();
+                    map1.put(fromatDetailDTO.getValue(), str);
+                    map2.put("detail", map1);
+                    res.add(map2);
+                }
+            }
+            String s = StrUtil.join("-", dataArr);
+            data.add(s);
+        }
+        DetailVO detailDto = new DetailVO();
+        detailDto.setData(data);
+        detailDto.setRes(res);
+        return detailDto;
+    }
+
+
+    /**
+     * 增加表头
+     */
+    private void addHeaderMap(Map<String, Object> headerMap, List<Map<String, Object>> headerMapList, String align) {
+        headerMap.put("title", "图片");
+        headerMap.put("slot", "image");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 80);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "售价");
+        headerMap.put("slot", "price");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 120);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "代理价");
+        headerMap.put("slot", "agentPrice");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 120);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "成本价");
+        headerMap.put("slot", "cost");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 140);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "原价");
+        headerMap.put("slot", "otPrice");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 140);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "库存");
+        headerMap.put("slot", "stock");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 140);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "商品编号");
+        headerMap.put("slot", "barCode");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 140);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "组合编号");
+        headerMap.put("slot", "groupBarCode");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 200);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "重量(KG)");
+        headerMap.put("slot", "weight");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 140);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "体积(m³)");
+        headerMap.put("slot", "volume");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 140);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "所需积分");
+        headerMap.put("slot", "integral");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 140);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "一级返佣");
+        headerMap.put("slot", "brokerage");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 140);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "二级返佣");
+        headerMap.put("slot", "brokerageTwo");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 140);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "三级返佣");
+        headerMap.put("slot", "brokerageThree");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 140);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+
+        headerMap.put("title", "操作");
+        headerMap.put("slot", "action");
+        headerMap.put("align", align);
+        headerMap.put("minWidth", 70);
+        headerMapList.add(ObjectUtil.clone(headerMap));
+    }
+
+
+
+    private ProductAttrScrmCountDto computedProductCount(List<FsStoreProductAttrValueScrm> values) {
+        BigDecimal val=new BigDecimal(0);
+        //取最小价格
+        BigDecimal minPrice = values
+                .stream()
+                .map(FsStoreProductAttrValueScrm::getPrice)
+                .min(Comparator.naturalOrder())
+                .orElse(val);
+
+        //取最小积分
+        Integer minIntegral = values
+                .stream()
+                .map(FsStoreProductAttrValueScrm::getIntegral)
+                .min(Comparator.naturalOrder())
+                .orElse(0);
+
+        BigDecimal minOtPrice = values
+                .stream()
+                .map(FsStoreProductAttrValueScrm::getOtPrice)
+                .min(Comparator.naturalOrder())
+                .orElse(val);
+
+        BigDecimal minCost = values
+                .stream()
+                .map(FsStoreProductAttrValueScrm::getCost)
+                .min(Comparator.naturalOrder())
+                .orElse(val);
+        //计算库存
+        Integer stock = values
+                .stream()
+                .map(FsStoreProductAttrValueScrm::getStock)
+                .reduce(Integer::sum)
+                .orElse(0);
+
+//        if (stock <= 0) {
+//            throw new CustomException("库存不能低于0");
+//        }
+
+        return ProductAttrScrmCountDto.builder()
+                .minPrice(minPrice)
+                .minOtPrice(minOtPrice)
+                .minCost(minCost)
+                .stock(stock)
+                .minIntegral(minIntegral)
+                .build();
+    }
+
+    @Override
+    public List<FsStoreProductScrmListQueryVO> selectFsStoreProductTuiQuery(int count) {
+        return fsStoreProductMapper.selectFsStoreProductTuiQuery(count);
+    }
+
+
+
+    @Override
+    public List<FsStoreProductScrmListQueryVO> selectFsStoreProductListQuery(FsStoreProductScrmQueryParam param) {
+        return fsStoreProductMapper.selectFsStoreProductListQuery(param);
+    }
+
+    @Override
+    public FsStoreProductScrmQueryVO selectFsStoreProductByIdQuery(Long productId) {
+        return fsStoreProductMapper.selectFsStoreProductByIdQuery(productId);
+    }
+
+    @Override
+    public void decProductStock(Long productId, Long productAttrValueId, Integer cartNum) {
+        //处理属性sku
+        fsStoreProductAttrValueMapper.decProductAttrStock(productAttrValueId,cartNum);
+        fsStoreProductMapper.decProductAttrStock(productId,cartNum);
+
+    }
+
+    @Override
+    public void incProductStock(Long num, Long productId, Long productAttrValueId) {
+        //处理属性sku
+        if (productAttrValueId!=null) {
+            attrValueService.incProductAttrStock(num, productId, productAttrValueId);
+        }
+        //先处理商品库存
+        fsStoreProductMapper.incStockDecSales(num, productId);
+
+    }
+
+    @Override
+    public List<FsStoreProductScrmListQueryVO> selectFsStoreProductNewQuery(int count) {
+        return fsStoreProductMapper.selectFsStoreProductNewQuery(count);
+    }
+
+    @Override
+    public List<FsStoreProductScrmListQueryVO> selectFsStoreProductHotQuery(int count) {
+        return fsStoreProductMapper.selectFsStoreProductHotQuery(count);
+    }
+
+    @Override
+    public List<FsStoreProductScrmListQueryVO> selectFsStoreProductGoodQuery(int count) {
+        return fsStoreProductMapper.selectFsStoreProductGoodQuery(count);
+    }
+
+    @Override
+    public List<FsStoreProductScrmListQueryVO> selectFsStoreProductTuiListQuery() {
+        return fsStoreProductMapper.selectFsStoreProductTuiListQuery();
+    }
+
+    @Override
+    public List<FsStoreProductScrmListQueryVO> selectFsStoreProductGoodListQuery() {
+        return fsStoreProductMapper.selectFsStoreProductGoodListQuery();
+    }
+
+    @Override
+    public Long selectFsStoreProductCount(int type) {
+        return fsStoreProductMapper.selectFsStoreProductCount(type);
+    }
+
+    @Override
+    public Long selectFsStoreProductCount(int type, Long companyId) {
+        return fsStoreProductMapper.selectFsStoreProductCompanyCount(type,companyId);
+    }
+
+    @Override
+    public List<FsStoreProductActivityScrmListVO> selectFsStoreProductByIds(String productIds) {
+        return fsStoreProductMapper.selectFsStoreProductByIds(productIds);
+    }
+
+    @Override
+    public int updateStock(Long productId) {
+        return fsStoreProductMapper.updateStock(productId);
+    }
+
+    @Override
+    public List<FsStoreProductScrmExportVO> selectFsStoreProductExportList(FsStoreProductScrm fsStoreProduct) {
+        return fsStoreProductMapper.selectFsStoreProductExportList(fsStoreProduct);
+    }
+
+    @Override
+    public String importStoreProduct(List<FsStoreProductScrmExportVO> list, boolean updateSupport) {
+        if (com.fs.common.utils.StringUtils.isNull(list) || list.size() == 0)
+        {
+            throw new CustomException("导入商品数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (FsStoreProductScrmExportVO productVO : list){
+            try
+            {
+                FsStoreProductScrm product = BeanCopyUtils.copy(productVO, FsStoreProductScrm.class);
+                if (product.getBarCode()==null || product.getBarCode()==""){
+                    throw new CustomException("商品编号为空");
+                }
+                this.insertFsStoreProduct(product);
+                ProductArrtScrmDTO formatDetailDto = ProductArrtScrmDTO.builder()
+                        .value("规格")
+                        .detail(ListUtil.toList("默认"))
+                        .build();
+                List<ProductArrtScrmDTO> items=new ArrayList<>();
+                items.add(formatDetailDto);
+                FsStoreProductAttrValueScrm p = new FsStoreProductAttrValueScrm();
+                p.setProductId(product.getProductId());
+                p.setSku("默认");
+                p.setStock(product.getStock().intValue());
+                if (product.getStock()==null){
+                    p.setStock(0);
+                }
+                p.setSales(product.getSales().intValue());
+                if (product.getSales()==null){
+                    p.setStock(0);
+                }
+                p.setPrice(product.getPrice());
+                if (product.getPrice()==null){
+                    p.setPrice(new BigDecimal(0));
+                }
+                p.setImage(product.getImage());
+                p.setCost(product.getCost());
+                if (product.getCost()==null){
+                    p.setCost(new BigDecimal(0));
+                }
+                p.setBarCode(product.getBarCode());
+                p.setGroupBarCode(product.getBarCode());
+                p.setOtPrice(product.getOtPrice());
+                if (product.getOtPrice()==null){
+                    p.setOtPrice(new BigDecimal(0));
+                }
+                p.setWeight(productVO.getWeight());
+                if (productVO.getWeight()==null){
+                    p.setWeight(new BigDecimal(0));
+                }
+
+                p.setVolume(new BigDecimal(0));
+                p.setBrokerage(new BigDecimal(0));
+                p.setBrokerageTwo(new BigDecimal(0));
+                p.setBrokerageThree(new BigDecimal(0));
+                p.setAgentPrice(new BigDecimal(0));
+                fsStoreProductAttrValueMapper.insertFsStoreProductAttrValue(p);
+
+                fsStoreProductAttrMapper.clear(product.getProductId());
+                FsStoreProductAttrScrm attr = new FsStoreProductAttrScrm();
+                attr.setProductId(product.getProductId());
+                attr.setAttrName("规格");
+                attr.setAttrValues("默认");
+                fsStoreProductAttrMapper.insertFsStoreProductAttr(attr);
+                successNum++;
+                successMsg.append("<br/>" + successNum + "、商品 " + product.getProductName() + " 导入成功");
+            }
+            catch (Exception e)
+            {
+
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、商品 " + productVO.getProductName()  + " 导入失败:";
+                failureMsg.append(msg + e.getMessage());
+            }
+
+        }
+        if (failureNum > 0)
+        {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new CustomException(failureMsg.toString());
+        }
+        else
+        {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
+
+    @Override
+    public void batchModify(ModifyMoreDTO modifyMoreDTO) {
+        fsStoreProductMapper.batchModify(modifyMoreDTO);
+    }
+}

+ 1141 - 0
fs-service/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java

@@ -0,0 +1,1141 @@
+package com.fs.store.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.fs.common.constant.HttpStatus;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.ResponseResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.DictUtils;
+import com.fs.common.utils.ParseUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.cache.ICompanyTagCacheService;
+import com.fs.company.cache.ICompanyUserCacheService;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyTag;
+import com.fs.company.domain.CompanyTagUser;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyMapper;
+import com.fs.company.mapper.CompanyTagMapper;
+import com.fs.company.mapper.CompanyTagUserMapper;
+import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.company.service.ICompanyTagService;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.course.mapper.FsUserCourseVideoMapper;
+import com.fs.course.param.newfs.FsUserCourseBeMemberParam;
+import com.fs.course.param.newfs.UserCourseVideoPageParam;
+import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
+import com.fs.course.vo.newfs.FsCourseAnalysisVO;
+import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
+import com.fs.his.vo.OptionsVO;
+import com.fs.qw.cache.IQwExternalContactCacheService;
+import com.fs.qw.mapper.QwExternalContactMapper;
+import com.fs.qw.mapper.QwSessionMapper;
+import com.fs.qw.param.QwFsUserParam;
+import com.fs.qw.vo.QwFsUserVO;
+import com.fs.store.domain.FsUserCourseCount;
+import com.fs.store.dto.FsStoreCartDTO;
+import com.fs.store.dto.FsUserTransferParamDTO;
+import com.fs.store.enums.BillDetailEnum;
+import com.fs.store.mapper.FsUserCourseCountMapper;
+import com.fs.store.param.SelectCusListPageParam;
+import com.fs.store.param.h5.CourseAnalysisParam;
+import com.fs.store.param.h5.FsUserPageListParam;
+import com.fs.store.param.h5.UserStatisticsCommonParam;
+import com.fs.store.service.IFsUserBillService;
+import com.fs.store.service.IFsUserService;
+import com.fs.store.service.cache.IFsUserCourseCountCacheService;
+import com.fs.store.vo.FSUserVO;
+import com.fs.store.vo.FsCompanyUserListQueryVO;
+import com.fs.store.vo.FsUserLastCount;
+import com.fs.store.vo.FsUserTuiVO;
+import com.fs.store.vo.h5.*;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.http.util.Asserts;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static com.fs.store.enums.BillDetailEnum.CATEGORY_1;
+import static com.fs.store.enums.BillDetailEnum.CATEGORY_3;
+
+/**
+ * 用户Service业务层处理
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+@Service
+@Slf4j
+public class FsUserServiceImpl implements IFsUserService
+{
+    @Autowired
+    private FsUserMapper fsUserMapper;
+
+    @Autowired
+    private FsStoreProductAttrValueMapper storeProductAttrValueMapper;
+
+    @Autowired
+    private IFsUserBillService billService;
+    @Autowired
+    private FsStoreOrderMapper storeOrderMapper;
+
+    @Autowired
+    private ICompanyUserCacheService companyUserCacheService;
+    @Autowired
+    private ICompanyUserService companyUserService;
+    @Autowired
+    private FsUserCourseVideoMapper userCourseVideoMapper;
+
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+
+    @Autowired
+    private CompanyTagUserMapper  companyTagUserMapper;
+
+    @Autowired
+    private CompanyMapper companyMapper;
+
+    @Autowired
+    private IFsUserCourseCountCacheService fsUserCourseCountCacheService;
+
+    @Autowired
+    private ICompanyTagCacheService companyTagCacheService;
+
+    @Autowired
+    private IQwExternalContactCacheService qwExternalContactCacheService;
+
+    @Autowired
+    private FsUserCompanyUserMapper fsUserCompanyUserMapper;
+
+    @Autowired
+    private ICompanyTagService companyTagService;
+
+    @Autowired
+    CompanyTagMapper companyTagMapper;
+    @Autowired
+    private QwSessionMapper qwSessionMapper;
+    @Autowired
+    private QwExternalContactMapper qwExternalContactMapper;
+
+    @Autowired
+    private FsUserCourseCountMapper fsUserCourseCountMapper;
+
+    /**
+     * 查询用户
+     *
+     * @param userId 用户ID
+     * @return 用户
+     */
+    @Override
+    public FsUser selectFsUserById(Long userId)
+    {
+        return fsUserMapper.selectFsUserById(userId);
+    }
+
+
+    @Override
+    public FSUserVO selectFsUserByUserId(Long userId) {
+        return fsUserMapper.selectFsUserByUserId(userId);
+    }
+
+    /**
+     * 查询用户列表
+     *
+     * @param fsUser 用户
+     * @return 用户
+     */
+    @Override
+    public List<FsUser> selectFsUserList(FsUser fsUser)
+    {
+        return fsUserMapper.selectFsUserList(fsUser);
+    }
+
+
+    @Override
+    public List<FSUserVO> selectFsUserVOList(FsUser fsUser) {
+        return fsUserMapper.selectFsUserVOList(fsUser);
+    }
+
+    /**
+     * 新增用户
+     *
+     * @param fsUser 用户
+     * @return 结果
+     */
+    @Override
+    public int insertFsUser(FsUser fsUser)
+    {
+        fsUser.setCreateTime(DateUtils.getNowDate());
+        return fsUserMapper.insertFsUser(fsUser);
+    }
+
+    /**
+     * 修改用户
+     *
+     * @param fsUser 用户
+     * @return 结果
+     */
+    @Override
+    public int updateFsUser(FsUser fsUser)
+    {
+        String nickname = fsUser.getNickname();
+        if (StringUtils.isNotBlank(nickname)){
+            if (nickname.length()>100){
+                return 0;
+            }
+        }
+        fsUser.setUpdateTime(DateUtils.getNowDate());
+        return fsUserMapper.updateFsUser(fsUser);
+    }
+
+    /**
+     * 批量删除用户
+     *
+     * @param userIds 需要删除的用户ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserByIds(Long[] userIds)
+    {
+        return fsUserMapper.deleteFsUserByIds(userIds);
+    }
+
+    /**
+     * 删除用户信息
+     *
+     * @param userId 用户ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserById(Long userId)
+    {
+        return fsUserMapper.deleteFsUserById(userId);
+    }
+
+    @Override
+    public int decIntegral(Long uid, double usedIntegral) {
+        return fsUserMapper.decIntegral(uid,usedIntegral);
+    }
+
+    @Override
+    public int incPayCount(Long userId) {
+        return fsUserMapper.incPayCount(userId);
+    }
+
+    @Override
+    public FsUser selectFsUserByPhone(String phone) {
+        return fsUserMapper.selectFsUserByPhone(phone);
+    }
+
+    @Override
+    public TableDataInfo selectCusListPage(SelectCusListPageParam param) {
+        Asserts.check(ObjectUtils.isNotNull(param.getPageNum()), "页数不能为空");
+        Asserts.check(ObjectUtils.isNotNull(param.getPageSize()), "页大小不能为空");
+
+        List<FsUser> fsUsers = fsUserMapper.selectCusListPage(param);
+        for (FsUser fsUser : fsUsers) {
+            if(ObjectUtils.isNotNull(fsUser.getStatus())){
+                if(ObjectUtil.equal(0,fsUser.getStatus())){
+                    fsUser.setStatusText("禁止");
+                } else {
+                    fsUser.setStatusText("正常");
+                }
+            }
+            if(ObjectUtils.isNotNull(fsUser.getCompanyUserId())){
+                CompanyUser companyUser = companyUserCacheService.selectCompanyUserById(fsUser.getCompanyUserId());
+                if(ObjectUtils.isNotNull(companyUser)){
+                    fsUser.setCompanyUserName(String.format("%s_%d",companyUser.getUserName(),companyUser.getUserId()));
+                }
+            }
+        }
+        TableDataInfo tableDataInfo = new TableDataInfo();
+        tableDataInfo.setRows(fsUsers);
+        tableDataInfo.setTotal(fsUserMapper.selectCusListPageCount(param));
+        return tableDataInfo;
+    }
+
+
+    @Override
+    public List<FsCompanyUserListQueryVO> selectFsCompanyUserListQuery(FsUser fsUser) {
+        return fsUserMapper.selectFsCompanyUserListQuery(fsUser);
+    }
+
+    @Override
+    public List<FsUserTuiVO> selectFsUserTuiList(String userId) {
+        return fsUserMapper.selectFsUserTuiList(userId);
+    }
+
+    @Override
+    public Long selectFsUserCount(int type,Long companyId,Long companyUserId) {
+        return fsUserMapper.selectFsUserCount(type,companyId,companyUserId);
+    }
+
+    @Override
+    @Transactional
+    public void     addTuiMoney(FsStoreOrder order , List<FsStoreOrderItem> items) {
+        //更新推荐人
+//        FsUser user= fsUserMapper.selectFsUserById(order.getUserId());
+//        if(user.getSpreadUserId()==null||user.getSpreadUserId()==0){
+//            FsUser userMap=new FsUser();
+//            userMap.setUserId(user.getUserId());
+//            userMap.setSpreadUserId(order.getTuiUserId());
+//            userMap.setIsPromoter(1);
+//            fsUserMapper.updateFsUser(userMap);
+//        }
+        //获取一级二级佣金
+        BigDecimal brokerage=BigDecimal.ZERO;
+        BigDecimal brokerageTwo=BigDecimal.ZERO;
+        BigDecimal brokerageThree=BigDecimal.ZERO;
+        try {
+            for(FsStoreOrderItem item: items){
+                FsStoreCartDTO cartDTO= JSONUtil.toBean(item.getJsonInfo(),FsStoreCartDTO.class);
+                if(cartDTO.getBrokerage()!=null){
+                    brokerage=cartDTO.getBrokerage().multiply(new BigDecimal(cartDTO.getNum().toString()));
+                }
+                if(cartDTO.getBrokerageTwo()!=null){
+                    brokerageTwo=cartDTO.getBrokerageTwo().multiply(new BigDecimal(cartDTO.getNum().toString()));
+                }
+                if(cartDTO.getBrokerageThree()!=null){
+                    brokerageThree=cartDTO.getBrokerageThree().multiply(new BigDecimal(cartDTO.getNum().toString()));
+                }
+            }
+            //返佣金
+            FsUser tuiUser=null;
+            //如果推广员是自己,一级拿佣金
+            FsUser user= fsUserMapper.selectFsUserById(order.getUserId());
+            if(user.getIsPromoter().equals(1)){
+                tuiUser=user;
+            }
+            else{
+                tuiUser= fsUserMapper.selectFsUserById(order.getTuiUserId());
+            }
+            //一级
+            if(tuiUser!=null&&tuiUser.getIsPromoter()==1){
+                if(brokerage.compareTo(BigDecimal.ZERO)==1){
+                    FsUser tuiUserMap=new FsUser();
+                    tuiUserMap.setUserId(tuiUser.getUserId());
+                    tuiUserMap.setBrokeragePrice(tuiUser.getBrokeragePrice().add(brokerage));
+                    fsUserMapper.updateFsUser(tuiUserMap);
+                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_3.getValue(),1,BillDetailEnum.TYPE_5.getDesc(),brokerage.doubleValue(),tuiUserMap.getBrokeragePrice().doubleValue(),"订单返佣金",order.getId().toString(),order.getUserId());
+                }
+            }
+            //二级返
+            if(tuiUser!=null){
+                FsUser tuiUserTwo= fsUserMapper.selectFsUserById(tuiUser.getSpreadUserId());
+                if(tuiUserTwo!=null&&tuiUserTwo.getIsPromoter()==1){
+                    if(brokerageTwo.compareTo(BigDecimal.ZERO)==1){
+                        FsUser tuiUserTwoMap=new FsUser();
+                        tuiUserTwoMap.setUserId(tuiUserTwo.getUserId());
+                        tuiUserTwoMap.setBrokeragePrice(tuiUserTwo.getBrokeragePrice().add(brokerageTwo));
+                        fsUserMapper.updateFsUser(tuiUserTwoMap);
+                        billService.addBill(tuiUserTwoMap.getUserId(), CATEGORY_3.getValue(),1,BillDetailEnum.TYPE_5.getDesc(),brokerageTwo.doubleValue(),tuiUserTwoMap.getBrokeragePrice().doubleValue(),"订单返佣金",order.getId().toString(),tuiUser.getUserId());
+                    }
+                    //三级
+                    FsUser tuiUserThree= fsUserMapper.selectFsUserById(tuiUserTwo.getSpreadUserId());
+                    if(tuiUserThree!=null&&tuiUserThree.getIsPromoter()==1){
+                        if(brokerageThree.compareTo(BigDecimal.ZERO)==1){
+                            FsUser tuiUserThreeMap=new FsUser();
+                            tuiUserThreeMap.setUserId(tuiUserThree.getUserId());
+                            tuiUserThreeMap.setBrokeragePrice(tuiUserThree.getBrokeragePrice().add(brokerageThree));
+                            fsUserMapper.updateFsUser(tuiUserThreeMap);
+                            billService.addBill(tuiUserThreeMap.getUserId(), CATEGORY_3.getValue(),1,BillDetailEnum.TYPE_5.getDesc(),brokerageThree.doubleValue(),tuiUserThreeMap.getBrokeragePrice().doubleValue(),"订单返佣金",order.getId().toString(),tuiUser.getUserId());
+                        }
+
+                    }
+                }
+
+            }
+        }
+        catch (Exception e){
+
+        }
+    }
+
+    @Override
+    @Transactional
+    public void subTuiMoney(FsStoreOrder order) {
+        FsUserBill map=new FsUserBill();
+        map.setCategory(CATEGORY_3.getValue());
+        map.setBusinessId(order.getId().toString());
+        map.setBillType(1);
+        List<FsUserBill> list=billService.selectFsUserBillList(map);
+        if(list!=null&&list.size()>0){
+            for(FsUserBill bill:list){
+                FsUser tuiUser= fsUserMapper.selectFsUserByIdForUpdate(bill.getUserId());
+                if(tuiUser!=null){
+                    FsUser tuiUserMap=new FsUser();
+                    tuiUserMap.setUserId(tuiUser.getUserId());
+                    tuiUserMap.setBrokeragePrice(tuiUser.getBrokeragePrice().subtract(new BigDecimal(bill.getNumber())));
+                    fsUserMapper.updateFsUser(tuiUserMap);
+                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_3.getValue(),0,BillDetailEnum.TYPE_6.getDesc(),bill.getNumber().doubleValue(),tuiUserMap.getBrokeragePrice().doubleValue(),"订单退佣金",order.getId().toString(),bill.getTuiUserId());
+                }
+            }
+        }
+
+    }
+
+    @Override
+    @Transactional
+    public void addMoney(FsStoreOrder order) {
+        FsUserBill map=new FsUserBill();
+        map.setCategory(CATEGORY_3.getValue());
+        map.setBusinessId(order.getId().toString());
+        map.setBillType(1);
+        List<FsUserBill> list=billService.selectFsUserBillList(map);
+        if(list!=null&&list.size()>0){
+            for(FsUserBill bill:list){
+                FsUser tuiUser= fsUserMapper.selectFsUserByIdForUpdate(bill.getUserId());
+                if(tuiUser!=null){
+                    FsUser tuiUserMap=new FsUser();
+                    tuiUserMap.setUserId(tuiUser.getUserId());
+                    tuiUserMap.setNowMoney(tuiUser.getNowMoney().add(new BigDecimal(bill.getNumber())));
+                    tuiUserMap.setBrokeragePrice(tuiUser.getBrokeragePrice().subtract(new BigDecimal(bill.getNumber())));
+                    fsUserMapper.updateFsUser(tuiUserMap);
+                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_3.getValue(),0,BillDetailEnum.TYPE_6.getDesc(),bill.getNumber().doubleValue(),tuiUserMap.getBrokeragePrice().doubleValue(),"订单分佣金",order.getId().toString(),bill.getTuiUserId());
+                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_1.getValue(),1,BillDetailEnum.TYPE_5.getDesc(),bill.getNumber().doubleValue(),tuiUserMap.getNowMoney().doubleValue(),"订单分佣金",order.getId().toString(),bill.getTuiUserId());
+                }
+            }
+        }
+        FsStoreOrder orderMap=new FsStoreOrder();
+        orderMap.setId(order.getId());
+        orderMap.setTuiUserMoneyStatus(1);
+        storeOrderMapper.updateFsStoreOrder(orderMap);
+    }
+
+    @Override
+    public FsUser selectFsUserByMaOpenId(String openid) {
+        return fsUserMapper.selectFsUserByMaOpenId(openid);
+    }
+
+    @Override
+    public FsUser selectFsUserByMpOpenId(String openid) {
+        return fsUserMapper.selectFsUserByMpOpenId(openid);
+    }
+
+    @Override
+    public FsUser selectFsUserByUnionId(String unionId) {
+        return fsUserMapper.selectFsUserByUnionId(unionId);
+    }
+
+    @Override
+    public FsUser selectFsUserByCourseMaOpenId(String openId) {
+        return fsUserMapper.selectFsUserByCourseMaOpenId(openId);
+    }
+
+    @Override
+    public FsUser selectFsUserByUserCode(String userCode) {
+        return fsUserMapper.selectFsUserByUserCode(userCode);
+    }
+
+
+    //CRM客户绑定 小程序客户之 查询小程序客户
+    @Override
+    public List<QwFsUserVO> selecQwFsUserListVO(QwFsUserParam qwFsUserParam) {
+
+        return  fsUserMapper.selecQwFsUserListVO(qwFsUserParam);
+    }
+
+    @Override
+    public List<QwFsUserVO> selectQwFsUserListVO(QwFsUserParam qwFsUserParam) {
+        return fsUserMapper.selectQwFsUserListVO(qwFsUserParam);
+    }
+
+    @Override
+    public R clearUserVip(Long userId) {
+        FsUser user = new FsUser();
+        user.setUserId(userId);
+        user.setIsVip(0);
+        user.setVipStartDate(null);
+        user.setVipEndDate(null);
+        if (fsUserMapper.updateFsUser(user)>0){
+            return R.ok("清除成功");
+        }
+        return R.error("清除vip失败");
+    }
+
+    @Override
+    public FsUser selectFsUserByUnionid(String unionId) {
+        return fsUserMapper.selectFsUserByUnionid(unionId);
+    }
+
+    @Override
+    public List<FsUser> getUserListLimit(FsUser fsUser) {
+        return fsUserMapper.selectFsUserListLimit(fsUser);
+    }
+
+    @Override
+    public PageInfo<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param) {
+//        System.out.println("参数:" + Arrays.toString(param.getTagIds()));
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
+        if (companyUser!=null && companyUser.isAdmin()){
+            param.setUserId(0L);
+            param.setCompanyId(companyUser.getCompanyId());
+        }
+        //筛选问题
+        if (StringUtils.isNotBlank(param.getCompanyUserId())){
+            param.setUserId(Long.valueOf(param.getCompanyUserId()));
+        }
+
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        if (param.getTagIds() != null && param.getTagIds().length > 0) {
+            boolean containsZero = Arrays.asList(param.getTagIds()).contains("0");
+            // 如果包含 "0",则设置 isNullTag 为 true
+            System.out.println("是否包含 0:" + containsZero + ",参数:" + Arrays.toString(param.getTagIds()));
+            if (containsZero) {
+                param.setIsNullTag(true);
+            }
+        }
+        List<FsUserPageListVO> fsUserPageListVOS = fsUserMapper.selectFsUserPageList(param);
+
+        for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOS) {
+            if (StringUtils.isEmpty(fsUserPageListVO.getNickname())){
+                fsUserPageListVO.setNickname("用户暂未授权昵称");
+            }
+        }
+
+        return new PageInfo<>(fsUserPageListVOS);
+
+        // 获取当前销售所有重粉会员
+//        List<FsUserCompanyUser> fsUserCompanyUsers = fsUserCompanyUserMapper.selectRepeatUser(param.getUserId());
+
+//        if(!fsUserCompanyUsers.isEmpty()){
+//            List<Long> userIds = fsUserCompanyUsers.stream().map(FsUserCompanyUser::getUserId).collect(Collectors.toList());
+//            // 获取会员所属的重粉销售
+//            List<FsUserCompanyUser> repeatCompanyUserNames = fsUserCompanyUserMapper.selectRepeatCompanyUserName(userIds);
+//            Map<Long, String> map = repeatCompanyUserNames.stream().collect(Collectors.toMap(FsUserCompanyUser::getUserId, FsUserCompanyUser::getRepeatCompanyUserName));
+//
+//            for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOS) {
+//                fsUserPageListVO.setRepeatCompanyUserName(map.get(fsUserPageListVO.getUserId()));
+//                if ("微信用户".equals(fsUserPageListVO.getNickname()) && StringUtils.isNotEmpty(fsUserPageListVO.getPhone())) {
+//                    fsUserPageListVO.setNickname(fsUserPageListVO.getPhone());
+//                }
+//                if(StringUtils.isNotEmpty(fsUserPageListVO.getTag()) && fsUserPageListVO.getIsRepeatFans() == 0){
+//                    StringBuilder newTag = removeRepeatFansTag(fsUserPageListVO);
+//                    fsUserPageListVO.setTag(newTag.toString());
+//                }
+//            }
+//            return new PageInfo<>(fsUserPageListVOS);
+//        } else {
+//            return new PageInfo<>(fsUserPageListVOS);
+//        }
+    }
+
+    private static StringBuilder removeRepeatFansTag(FsUserPageListVO fsUserPageListVO) {
+        String tag = fsUserPageListVO.getTag();
+        String[] splitTag = tag.split(",");
+        StringBuilder newTag = new StringBuilder();
+        for (String s : splitTag) {
+            if(!"重粉".equals(s)){
+                newTag.append(s);
+            }
+        }
+        return newTag;
+    }
+
+    @Override
+    public TableDataInfo selectFsUserPageListNew(FsUserPageListParam param) {
+        // 找出下级销售
+        String companyUserId = param.getCompanyUserId();
+        if(StringUtils.isNotBlank(companyUserId)) {
+            Long companyUser = Long.parseLong(companyUserId);
+            Set<Long> userIds = companyUserCacheService.selectUserAllCompanyUserId(companyUser);
+            if (userIds != null || userIds.size() <= 1) {
+                if (param.getIsAdmin() != null && param.getIsAdmin()) {
+                    List<CompanyUser> companyUsers = companyUserMapper.selectCompanyUserByCompanyId(param.getCompanyId());
+                    userIds = companyUsers.stream().map(CompanyUser::getUserId).collect(Collectors.toSet());
+                }
+            }
+            param.setCompanyUserIds(userIds);
+        }
+
+        List<FsUserPageListVO> fsUserPageListVOS = fsUserMapper.selectFsUserPageListNew(param);
+        Map<Long, CompanyTag> tagMap = companyTagCacheService.queryAllTagMap();
+        //获取会员的最新的看课状态和最后看课时间
+        Set<Long> userIds = fsUserPageListVOS.stream().map(FsUserPageListVO::getUserId).collect(Collectors.toSet());
+        List<FsUserLastCount> fsUserCourseCounts = Collections.emptyList();
+        if(!userIds.isEmpty()){
+            fsUserCourseCounts = fsUserCourseCountMapper.selectUserLastCount(userIds);
+        }
+        Map<Long, FsUserLastCount> countMap = fsUserCourseCounts.stream().collect(Collectors.toMap(FsUserLastCount::getUserId, Function.identity()));
+
+        for (FsUserPageListVO item : fsUserPageListVOS) {
+            if(item.getCompanyUserId() != null) {
+                String companyUserName = companyUserCacheService.selectCompanyUserNameUserById(item.getCompanyUserId());
+                if(companyUserName != null) {
+                    item.setCompanyUserNickName(companyUserName);
+                }
+            }
+            if(item.getPhone() != null) {
+                item.setPhone(ParseUtils.parsePhone(item.getPhone()));
+            }
+            if(item.getStatus() != null) {
+                String userStatus = DictUtils.getDictLabel("user_status", String.valueOf(item.getStatus()));
+                if(StringUtils.isNotBlank(userStatus)){
+                    item.setStatusText(userStatus);
+                }
+            }
+            if(item.getUserId() != null) {
+                FsUserCourseCount byUserId = fsUserCourseCountCacheService.findByUserId(item.getUserId());
+                if(byUserId != null) {
+                    item.setWatchCourseCount(byUserId.getWatchCourseCount());
+                    item.setMissCourseCount(byUserId.getMissCourseCount());
+                    item.setMissCourseStatus(byUserId.getMissCourseStatus());
+                    if(StringUtils.isNotEmpty(byUserId.getPartCourseCount())){
+                        item.setPartCourseCount(new BigDecimal(byUserId.getPartCourseCount()).longValue());
+                    }
+//                    item.setCourseCountStatus(byUserId.getStatus());
+                    item.setStopWatchDays(byUserId.getStopWatchDays());
+                    item.setCompleteWatchDate(byUserId.getCompleteWatchDate());
+                    item.setLastWatchDate(byUserId.getLastWatchDate());
+                }
+                FsUserLastCount fsUserCourseCount = countMap.get(item.getUserId());
+                if(fsUserCourseCount != null){
+                    item.setCourseCountStatus(fsUserCourseCount.getStatus());
+                }
+                String userTagByUserId = companyTagCacheService
+                        .findUserTagByUserId(item.getUserId(),item.getCompanyUserId());
+                if(StringUtils.isNotEmpty(userTagByUserId)) {
+                    String[] split = userTagByUserId.split(",");
+                    Set<String> tagNames = new HashSet<>();
+                    for (String tag : split) {
+                        if(StringUtils.isNotBlank(tag)) {
+                            Long tagL = Long.parseLong(tag);
+                            CompanyTag companyTag = tagMap.get(tagL);
+                            if(companyTag != null) {
+                                tagNames.add(companyTag.getTag());
+                            }
+                        }
+                    }
+                    item.setTagIds(userTagByUserId);
+                    item.setTag(String.join(",",tagNames));
+                }
+
+                // 是否宠粉
+//                Integer isRepeat = qwExternalContactCacheService.selectQwIsRepeat(item.getUserId());
+//                if(isRepeat != null) {
+//                    item.setIsRepeat(isRepeat);
+//                }
+            }
+        }
+
+        TableDataInfo rspData = new TableDataInfo();
+        rspData.setCode(HttpStatus.SUCCESS);
+        rspData.setMsg("查询成功");
+        rspData.setRows(fsUserPageListVOS);
+
+        rspData.setTotal(this.selectFsUserCount(param));
+        return rspData;
+    }
+
+    @Override
+    public Long selectFsUserCount(FsUserPageListParam param) {
+        return fsUserMapper.selectFsUserPageListCount(param);
+    }
+
+    @Override
+    public UserListPageVO getUserNumber(Long userId) {
+        // 判断是否是管理员
+        Long companyId = null;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        if (companyUser != null && companyUser.isAdmin()){
+            userId = 0L;
+            companyId = companyUser.getCompanyId();
+        }
+        List<UserListCountVO> list = fsUserMapper.getUserNumber(userId, companyId);
+        Map<String, Integer> map = list.stream()
+                .collect(Collectors.toMap(UserListCountVO::getStatus, UserListCountVO::getNum, (v1, v2) -> v1));
+        UserListPageVO pageVO = new UserListPageVO();
+        Integer normalNum = map.getOrDefault("1", 0);
+        Integer blackNum = map.getOrDefault("0", 0);
+
+        // 黑名单人数加上重粉的数量,正常人数去掉重粉数量
+        int repeatUserNumber = fsUserMapper.getRepeatUserNumber(userId);
+        pageVO.setNumber(normalNum - repeatUserNumber);
+        pageVO.setBlackNum(blackNum + repeatUserNumber);
+
+        return pageVO;
+    }
+
+    @Override
+    public UserDetailsVO getUserDetails(Long userId, Long fsUserId, String dateTag) {
+        UserDetailsVO countWatchCourse = fsUserMapper.getCountWatchCourse(userId, fsUserId, dateTag);
+        UserDetailsVO countAnswer = fsUserMapper.getCountAnswer(userId, fsUserId, dateTag);
+        UserDetailsVO countRedPacket = fsUserMapper.getCountRedPacket(userId, fsUserId, dateTag);
+        UserDetailsVO vo = new UserDetailsVO();
+        if (countWatchCourse != null){
+            BeanUtils.copyProperties(countWatchCourse, vo);
+        }
+        if (countRedPacket != null) {
+            vo.setAnswerRedPacketTime(countRedPacket.getAnswerRedPacketTime());
+            vo.setAnswerRedPacketAmount(countRedPacket.getAnswerRedPacketAmount());
+        } else {
+            vo.setAnswerRedPacketAmount(BigDecimal.ZERO);
+        }
+        if (countAnswer != null) {
+            vo.setAnswerTime(countAnswer.getAnswerTime());
+            vo.setAnswerRightTime(countAnswer.getAnswerRightTime());
+        }
+        return vo;
+    }
+
+    @Override
+    public Integer selectFsUserByUserIds(String[] userIds, Long companyUserId) {
+        return fsUserMapper.selectFsUserByUserIds(userIds, companyUserId);
+    }
+
+    @Override
+    public Boolean disabledUser(String[] ids, boolean status) {
+        boolean result;
+        if (status) {
+            // 启用
+            result = fsUserMapper.batchUpdateFsUserByIds(ids, 1) > 0;
+        } else {
+            // 禁用
+            result = fsUserMapper.batchUpdateFsUserByIds(ids, 0) > 0;
+        }
+        return result;
+    }
+    @Override
+    @Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)
+    public void transfer(FsUserTransferParamDTO param) {
+        Asserts.check(ObjectUtils.isNotNull(param.getSourceCompanyUserId()), "来源用户不能为空!");
+        Asserts.check(ObjectUtils.isNotNull(param.getTargetCompanyUserId()), "转移用户不能为空!");
+        Asserts.check(CollectionUtils.isNotEmpty(param.getUserIds()), "要转移的客户列表不能为空!");
+
+        fsUserMapper.transferCompanyUser(param);
+    }
+
+    /**
+     * 查询销售会员总数,今日新增会员数
+     * @param companyUserId 销售ID
+     * @return map
+     */
+    @Override
+    public Map<String, Long> getUserVipCountByCompanyUserId(Long companyUserId) {
+        return fsUserMapper.getUserVipCountByCompanyUserId(companyUserId);
+    }
+
+    @Override
+    public FsUserSummaryCountVO userSummaryCount(Long userId) {
+        // 判断是否是管理员
+        Long companyId = null;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        if (companyUser != null && companyUser.isAdmin()){
+            userId = 0L;
+            companyId = companyUser.getCompanyId();
+        }
+        FsUserSummaryCountVO fsUserSummaryCountVO = fsUserMapper.countUserSummary(userId, companyId);
+        List<FsUserSummaryCountTagVO> countTagList = fsUserMapper.countTag(userId, companyId);
+        fsUserSummaryCountVO.setTagList(countTagList);
+        return fsUserSummaryCountVO;
+    }
+
+    @Override
+    public FsUserStatisticsVO userStatistics(UserStatisticsCommonParam param) {
+        return getUserStatistics(param);
+    }
+
+    private FsUserStatisticsVO getUserStatistics(UserStatisticsCommonParam param) {
+        FsUserStatisticsVO fsUserStatisticsVO = new FsUserStatisticsVO();
+
+        // 判断是否是管理员
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
+        if (companyUser != null && companyUser.isAdmin()){
+            param.setUserId(0L);
+            param.setCompanyId(companyUser.getCompanyId());
+        }
+        // 获取课程统计
+//        Map<String, Long> couserMap = fsUserMapper.countUserCourse(param);
+        Map<String, Long> couserMap = fsUserMapper.countUserCourse2(param);
+        if (couserMap != null) {
+            fsUserStatisticsVO.setCourseWatchNum(couserMap.get("courseWatchNum").intValue()).setCourseCompleteNum(couserMap.get("courseCompleteNum").intValue());
+
+            if (couserMap.get("courseCompleteNum") != null && couserMap.get("courseWatchNum") > 0) {
+                int courseCompleteRate = BigDecimal.valueOf(couserMap.get("courseCompleteNum"))
+                        .divide(BigDecimal.valueOf(couserMap.get("courseWatchNum")), 2, RoundingMode.HALF_UP)
+                        .multiply(BigDecimal.valueOf(100))
+                        .intValue();
+                fsUserStatisticsVO.setCourseCompleteRate(courseCompleteRate);
+            }
+        }
+
+        // 获取答题统计
+        Map<String, Long> answerMap = fsUserMapper.countUserAnswer(param);
+        if (answerMap != null) {
+            fsUserStatisticsVO.setAnswerNum(answerMap.get("answerNum").intValue()).setAnswerRightNum(answerMap.get("answerRightNum").intValue());
+
+            if (answerMap.get("answerRightNum") != null && answerMap.get("answerNum") > 0) {
+                int answerCompleteRate = BigDecimal.valueOf(answerMap.get("answerRightNum"))
+                        .divide(BigDecimal.valueOf(answerMap.get("answerNum")), 2, RoundingMode.HALF_UP)
+                        .multiply(BigDecimal.valueOf(100))
+                        .intValue();
+                fsUserStatisticsVO.setAnswerRightRate(answerCompleteRate);
+            }
+        }
+
+        // 获取红包统计
+        Map<String, Object> redPacketMap = fsUserMapper.countUserRedPacket(param);
+        if(redPacketMap != null && redPacketMap.get("redPacketNum") != null && redPacketMap.get("redPacketAmount") != null) {
+            fsUserStatisticsVO.setRedPacketNum(Integer.parseInt(redPacketMap.get("redPacketNum").toString()))
+                    .setRedPacketAmount(new BigDecimal(redPacketMap.get("redPacketAmount").toString()));
+        }
+        return fsUserStatisticsVO;
+    }
+
+    @Override
+    public FsUserStatisticsVO userStatisticsDetails(UserStatisticsCommonParam param) {
+        FsUserStatisticsVO userStatisticsVO = getUserStatistics(param);
+//        FsUserStatisticsVO userStatisticsVO = getUserStatistics2(param);
+
+        // 判断是否是管理员
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
+        if (companyUser != null && companyUser.isAdmin()){
+            param.setUserId(0L);
+        }
+        //统计课程数据详情,在查询统计详情的时候需要显示
+        Map<String, Long> courseDetailsMap = fsUserMapper.countCourseDetailsNew(param);
+        if(courseDetailsMap != null && courseDetailsMap.get("courseNum") != null && courseDetailsMap.get("videoNum") != null && courseDetailsMap.get("courseUserNum") != null){
+            userStatisticsVO.setCourseNum(Integer.parseInt(courseDetailsMap.get("courseNum").toString()))
+                    .setVideoNum(Integer.parseInt(courseDetailsMap.get("videoNum").toString()))
+                    .setCourseUserNum(Integer.parseInt(courseDetailsMap.get("courseUserNum").toString()));
+        }
+        return userStatisticsVO;
+    }
+
+    private FsUserStatisticsVO getUserStatistics2(UserStatisticsCommonParam param) {
+        FsUserStatisticsVO fsUserStatisticsVO = new FsUserStatisticsVO();
+
+        // 判断是否是管理员
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
+        if (companyUser != null && companyUser.isAdmin()){
+            param.setUserId(0L);
+            param.setCompanyId(companyUser.getCompanyId());
+        }
+        // 获取课程统计
+        Map<String, Long> couserMap = fsUserMapper.countUserCourse2(param);
+        if (couserMap != null) {
+            //看课人数
+            fsUserStatisticsVO.setCourseWatchNum(couserMap.get("courseWatchNum").intValue()).setCourseCompleteNum(couserMap.get("courseCompleteNum").intValue());
+
+            if (couserMap.get("courseCompleteNum") != null && couserMap.get("courseWatchNum") > 0) {
+                int courseCompleteRate = BigDecimal.valueOf(couserMap.get("courseCompleteNum"))
+                        .divide(BigDecimal.valueOf(couserMap.get("courseWatchNum")), 2, RoundingMode.HALF_UP)
+                        .multiply(BigDecimal.valueOf(100))
+                        .intValue();
+                fsUserStatisticsVO.setCourseCompleteRate(courseCompleteRate);
+            }
+        }
+
+        // 获取答题统计
+        Map<String, Long> answerMap = fsUserMapper.countUserAnswer(param);
+        if (answerMap != null) {
+            fsUserStatisticsVO.setAnswerNum(answerMap.get("answerNum").intValue()).setAnswerRightNum(answerMap.get("answerRightNum").intValue());
+
+            if (answerMap.get("answerRightNum") != null && answerMap.get("answerNum") > 0) {
+                int answerCompleteRate = BigDecimal.valueOf(answerMap.get("answerRightNum"))
+                        .divide(BigDecimal.valueOf(answerMap.get("answerNum")), 2, RoundingMode.HALF_UP)
+                        .multiply(BigDecimal.valueOf(100))
+                        .intValue();
+                fsUserStatisticsVO.setAnswerRightRate(answerCompleteRate);
+            }
+        }
+
+        // 获取红包统计
+        Map<String, Object> redPacketMap = fsUserMapper.countUserRedPacket(param);
+        if(redPacketMap != null && redPacketMap.get("redPacketNum") != null && redPacketMap.get("redPacketAmount") != null) {
+            fsUserStatisticsVO.setRedPacketNum(Integer.parseInt(redPacketMap.get("redPacketNum").toString()))
+                    .setRedPacketAmount(new BigDecimal(redPacketMap.get("redPacketAmount").toString()));
+        }
+        return fsUserStatisticsVO;
+    }
+
+    @Override
+    public List<FsUserRankingVO> userRanking(Long userId, String startTime, String endTime, String periodId, String videoId, String order, Integer type) {
+        List<FsUserRankingVO> listVO = Collections.emptyList();
+        // 判断是否是管理员
+        Long companyId = null;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        if (companyUser != null && companyUser.isAdmin()){
+            userId = 0L;
+            companyId = companyUser.getCompanyId();
+        }
+        if(type == 1){
+            //按完播率
+            listVO = fsUserMapper.countUserRankingByComplete(userId, companyId, startTime, endTime, periodId, videoId, order);
+        }
+        if(type == 2){
+            //按正确率
+            listVO = fsUserMapper.countUserRankingByRight(userId, companyId, startTime, endTime, periodId, videoId, order);
+        }
+        return listVO;
+    }
+
+    @Override
+    public List<FsCourseRankingVO> courseRanking(Long userId, String startTime, String endTime, String periodId, String videoId, String order, Integer type) {
+        // 判断是否是管理员
+        Long companyId = null;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        if (companyUser != null && companyUser.isAdmin()){
+            userId = 0L;
+            companyId = companyUser.getCompanyId();
+        }
+        List<FsCourseRankingVO> list = Collections.emptyList();
+        if(type == 1){
+            list = fsUserMapper.countCourseRankingByComplete(userId, companyId, startTime, endTime, periodId, videoId, order);
+        }
+        if(type == 2){
+            list = fsUserMapper.countCourseRankingByRight(userId, companyId, startTime, endTime, periodId, videoId, order);
+        }
+
+        return list;
+    }
+
+    @Override
+    public List<FsUserGraphicStatisticsVO> graphicStatistics(UserStatisticsCommonParam param) {
+        FsUserStatisticsVO userStatistics = getUserStatistics(param);
+        List<FsUserGraphicStatisticsVO> list = new ArrayList<>();
+        list.add(new FsUserGraphicStatisticsVO("观看人数",userStatistics.getCourseWatchNum(), userStatistics.getCourseWatchNum()));
+        list.add(new FsUserGraphicStatisticsVO("完播人数", userStatistics.getCourseCompleteNum(), userStatistics.getCourseCompleteNum()));
+        list.add(new FsUserGraphicStatisticsVO("答题人数", userStatistics.getAnswerNum(), userStatistics.getAnswerNum()));
+        list.add(new FsUserGraphicStatisticsVO("正确人数", userStatistics.getAnswerRightNum(), userStatistics.getAnswerRightNum()));
+        list.add(new FsUserGraphicStatisticsVO("答题红包数", userStatistics.getRedPacketNum(), userStatistics.getRedPacketNum()));
+        list.sort(Comparator.comparingInt(FsUserGraphicStatisticsVO::getValue).reversed());
+        return list;
+    }
+
+    @Override
+    public List<FsCourseAnalysisVO> courseAnalysis(CourseAnalysisParam param) {
+        //1、查询课程视频信息
+        UserCourseVideoPageParam userCourseVideoPageParam = new UserCourseVideoPageParam();
+        BeanUtils.copyProperties(param, userCourseVideoPageParam);
+        List<FsUserCourseVideoPageListVO> videoList = userCourseVideoMapper.selectFsUserCourseVideoPageList(userCourseVideoPageParam);
+
+        //2、查询统计
+        List<FsCourseAnalysisCountVO> courseCountList = fsUserMapper.courseAnalysisCourseCount(param);
+
+        List<FsCourseAnalysisCountVO> redPacketCountList = fsUserMapper.courseAnalysisRedPacketCount(param);
+        List<FsCourseAnalysisCountVO> answerCountList = fsUserMapper.courseAnalysisAnswerCount(param);
+
+        //3、转化为map
+        Map<Long, FsCourseAnalysisCountVO> courseMap = courseCountList.stream()
+                .collect(Collectors.toMap(
+                        FsCourseAnalysisCountVO::getVideoId,
+                        Function.identity()
+                ));
+        Map<Long, FsCourseAnalysisCountVO> redPacketMap = redPacketCountList.stream()
+                .collect(Collectors.toMap(
+                        FsCourseAnalysisCountVO::getVideoId,
+                        Function.identity()
+                ));
+        Map<Long, FsCourseAnalysisCountVO> answerMap = answerCountList.stream()
+                .collect(Collectors.toMap(
+                        FsCourseAnalysisCountVO::getVideoId,
+                        Function.identity()
+                ));
+
+        //4、处理数据
+        return videoList.stream().map(v -> {
+            FsCourseAnalysisVO allVO = new FsCourseAnalysisVO();
+            BeanUtils.copyProperties(v, allVO);
+
+            FsCourseAnalysisCountVO countVO = new FsCourseAnalysisCountVO();
+            FsCourseAnalysisCountVO courseVO = courseMap.getOrDefault(v.getVideoId(), countVO);
+            FsCourseAnalysisCountVO redPacketVO = redPacketMap.getOrDefault(v.getVideoId(), countVO);
+            FsCourseAnalysisCountVO answerVO = answerMap.getOrDefault(v.getVideoId(), countVO);
+            //单独赋值
+            countVO.setVideoId(v.getVideoId()).setCourseWatchNum(courseVO.getCourseWatchNum()).setCourseCompleteNum(courseVO.getCourseWatchNum())
+                    .setCompleteRate(courseVO.getCompleteRate() != null ? courseVO.getCompleteRate() : new BigDecimal(BigInteger.ZERO));
+            countVO.setRedPacketNum(redPacketVO.getRedPacketNum())
+                    .setRedPacketAmount(redPacketVO.getRedPacketAmount() != null ? redPacketVO.getRedPacketAmount() : new BigDecimal(BigInteger.ZERO));
+            countVO.setAnswerNum(answerVO.getAnswerNum()).setAnswerRightNum(answerVO.getAnswerRightNum())
+                    .setAnswerRightRate(answerVO.getAnswerRightRate()!=null ? answerVO.getAnswerRightRate() : new BigDecimal(BigInteger.ZERO));
+            allVO.setCountVO(countVO);
+            return allVO;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public CompanyUserSummaryCountVO companyUserSummaryCount(Long userId, String companyUserId) {
+        // 判断是否是管理员
+        Long companyId = null;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        if (companyUser != null && companyUser.isAdmin()){
+            companyUserId = String.valueOf(0);
+            companyId = companyUser.getCompanyId();
+        }
+        CompanyUserSummaryCountVO companyUserCount = fsUserMapper.companyUserCount(companyUserId, companyId);
+        CompanyUserSummaryCountVO newUserRedPacketCount = fsUserMapper.newUserRedPacketCount(companyUserId, companyId);
+        CompanyUserSummaryCountVO vo = new CompanyUserSummaryCountVO();
+        BeanUtils.copyProperties(companyUserCount, vo);
+        vo.setUserRedPacketNum(newUserRedPacketCount.getUserRedPacketNum());
+        vo.setTodayUserRedPacketAmount(newUserRedPacketCount.getTodayUserRedPacketAmount());
+        return vo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ResponseResult<Boolean> becomeMember(FsUserCourseBeMemberParam param) {
+        //查询用户
+        FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
+        if (Objects.isNull(fsUser)){
+            return ResponseResult.fail(404,"当前用户信息不存在");
+        }
+
+        // 逻辑调整:如果会员已经绑定了销售,直接提示,不添加重粉数据了-2025年6月16日14点53分
+        if (fsUser.getCompanyUserId() != null && !param.getCompanyUserId().equals(fsUser.getCompanyUserId())){
+            return ResponseResult.fail(500,"该用户("+fsUser.getUserId() + ")已成为其他销售会员");
+        }
+
+        //判断该销售是否存在
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
+        if (Objects.isNull(companyUser)){
+            return ResponseResult.fail(405,"销售不存在");
+        }
+        // 通过字段值判断该销售是否允许注册会员
+        if(companyUser.getIsAllowedAllRegister() != null && companyUser.getIsAllowedAllRegister() == 0){
+            return ResponseResult.fail(407,"不允许注册会员,请联系管理员");
+        }
+
+        //2025.7.10 解决在不知销售已经审核的情况下 多次点击
+        if (fsUser.getIsBecomeMember() == 1){
+            if(fsUser.getStatus() == 0){
+                //禁用
+                return ResponseResult.fail(402, "已成功注册,待管理审核");
+            } else {
+                return ResponseResult.ok(Boolean.TRUE); //已经成为会员
+            }
+        }
+        fsUser.setIsBecomeMember(1);
+
+        // 添加关系表数据
+        FsUserCompanyUser fsUserCompanyUser = getFsUserCompanyUser(param, fsUser);
+        QueryWrapper<FsUserCompanyUser> queryWrapper = new QueryWrapper<FsUserCompanyUser>().eq("user_id", param.getUserId()).eq("company_user_id", param.getCompanyUserId());
+        Integer i = fsUserCompanyUserMapper.selectCount(queryWrapper);
+        if(i == 0) {
+            fsUserCompanyUserMapper.insertFsUserCompanyUser(fsUserCompanyUser);
+        }
+
+        // 关联销售
+        if(fsUser.getCompanyUserId() == null) {
+            fsUser.setCompanyId(param.getCompanyId());
+            fsUser.setCompanyUserId(param.getCompanyUserId());
+        }
+        // 特殊(需求设计:需要根据公司是否开启黑名单来设置会员初始化的状态)
+        Company company = null;
+        if(param.getCompanyId() != null) {
+            company = companyMapper.selectCompanyById(param.getCompanyId());
+        }
+        // isDefaultBlack 值为1 ,表示需要加入小黑屋,否则不加
+        int isDefaultBlack = company != null ? company.getFsUserIsDefaultBlack() : 0;
+        fsUser.setStatus(isDefaultBlack == 1 ? 0 : 1);
+        fsUserMapper.updateFsUser(fsUser);
+
+        // 不为空则添加新标签
+        if (Objects.nonNull(param.getTagIds()) && param.getTagIds().length > 0) {
+            //关联会员标签,先删除再新增
+            Map<String, Object> map = new HashMap<>();
+            map.put("userId", param.getUserId());
+            map.put("companyId", fsUser.getCompanyId());
+            map.put("companyUserId", fsUser.getCompanyUserId());
+            companyTagUserMapper.deleteCompanyTagUserByMap(map);
+
+            CompanyTagUser companyTagUser = new CompanyTagUser();
+            companyTagUser.setUserId(param.getUserId());
+            companyTagUser.setCompanyId(fsUser.getCompanyId());
+            companyTagUser.setCompanyUserId(fsUser.getCompanyUserId());
+            companyTagUser.setTagIds(String.join(",", param.getTagIds()));
+            companyTagUser.setCreateTime(new Date());
+            companyTagUserMapper.insertCompanyTagUser(companyTagUser);
+        }
+
+//        // 如果是重粉,直接打上重粉的标签
+//        if(1 == fsUserCompanyUser.getIsRepeatFans()){
+//            this.setRepeatFansTag(param);
+//        }
+
+        //如果是设置了需要进入小黑屋,则需要返回提示,否则正常返回
+        if(isDefaultBlack == 1){
+            return ResponseResult.fail(402, "已成功注册,待管理审核");
+        }
+        return ResponseResult.ok(Boolean.TRUE);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void setRepeatFansTag(FsUserCourseBeMemberParam param) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("tagName", "重粉");
+        map.put("companyId", param.getCompanyId());
+        List<CompanyTag> companyTags = companyTagMapper.selectCompanyTagListByMap(map);
+        Long tagId;
+        if(companyTags == null || companyTags.isEmpty()){
+            CompanyTag companyTag = new CompanyTag();
+            companyTag.setCompanyId(param.getCompanyId());
+            companyTag.setTag("重粉");
+            companyTagService.insertCompanyTag(companyTag);
+            tagId = companyTag.getTagId();
+        } else {
+            tagId = companyTags.get(0).getTagId();
+        }
+        //  查询
+        CompanyTagUser companyTagUserParam = new CompanyTagUser();
+        companyTagUserParam.setUserId(param.getUserId());
+        companyTagUserParam.setTagIds(tagId.toString());
+        companyTagUserParam.setCompanyUserId(param.getCompanyUserId());
+        List<CompanyTagUser> companyTagUsers = companyTagUserMapper.selectCompanyTagUserList(companyTagUserParam);
+        if(companyTagUsers == null || companyTagUsers.isEmpty()){
+            CompanyTagUser companyTagUser = new CompanyTagUser();
+            companyTagUser.setUserId(param.getUserId());
+            companyTagUser.setCompanyId(param.getCompanyId());
+            companyTagUser.setCompanyUserId(param.getCompanyUserId());
+            companyTagUser.setTagIds(tagId.toString());
+            companyTagUser.setCreateTime(new Date());
+            companyTagUserMapper.insertCompanyTagUser(companyTagUser);
+        }
+    }
+
+    @Override
+    public List<FsUser> selectFsUserListByJointUserNameKey(String userNameKey) {
+        return fsUserMapper.selectFsUserListByJointUserNameKey(userNameKey);
+    }
+
+    // 添加关系表数据
+    private static FsUserCompanyUser getFsUserCompanyUser(FsUserCourseBeMemberParam param, FsUser fsUser) {
+        FsUserCompanyUser fsUserCompanyUser = new FsUserCompanyUser();
+        // 判断是否绑定了销售,如果已绑定,则需要标识为重粉,且放黑名单
+        if (fsUser.getCompanyUserId() != null && !fsUser.getCompanyUserId().equals(param.getCompanyUserId())) {
+            fsUserCompanyUser.setIsRepeatFans(1);
+        } else {
+            fsUserCompanyUser.setIsRepeatFans(0);
+        }
+        fsUserCompanyUser.setUserId(param.getUserId());
+        fsUserCompanyUser.setCompanyId(param.getCompanyId());
+        fsUserCompanyUser.setCompanyUserId(param.getCompanyUserId());
+        return fsUserCompanyUser;
+    }
+
+    /**
+     * 查询会员选项列表
+     * @param params    参数
+     * @return  list
+     */
+    @Override
+    public List<OptionsVO> selectUserListByMap(Map<String, Object> params) {
+        return fsUserMapper.selectUserListByMap(params);
+    }
+}

+ 112 - 0
fs-service/src/main/java/com/fs/store/service/impl/FsWechatTemplateServiceImpl.java

@@ -0,0 +1,112 @@
+package com.fs.store.service.impl;
+
+import com.fs.common.utils.DateUtils;
+import com.fs.store.domain.FsWechatTemplate;
+import com.fs.store.mapper.FsWechatTemplateMapper;
+import com.fs.store.service.IFsWechatTemplateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 微信模板Service业务层处理
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+@Service
+public class FsWechatTemplateServiceImpl implements IFsWechatTemplateService 
+{
+    @Autowired
+    private FsWechatTemplateMapper fsWechatTemplateMapper;
+
+    /**
+     * 查询微信模板
+     * 
+     * @param id 微信模板ID
+     * @return 微信模板
+     */
+    @Override
+    public FsWechatTemplate selectFsWechatTemplateById(Integer id)
+    {
+        return fsWechatTemplateMapper.selectFsWechatTemplateById(id);
+    }
+
+    /**
+     * 查询微信模板列表
+     * 
+     * @param fsWechatTemplate 微信模板
+     * @return 微信模板
+     */
+    @Override
+    public List<FsWechatTemplate> selectFsWechatTemplateList(FsWechatTemplate fsWechatTemplate)
+    {
+        return fsWechatTemplateMapper.selectFsWechatTemplateList(fsWechatTemplate);
+    }
+
+    /**
+     * 新增微信模板
+     * 
+     * @param fsWechatTemplate 微信模板
+     * @return 结果
+     */
+    @Override
+    public int insertFsWechatTemplate(FsWechatTemplate fsWechatTemplate)
+    {
+        fsWechatTemplate.setCreateTime(DateUtils.getNowDate());
+        return fsWechatTemplateMapper.insertFsWechatTemplate(fsWechatTemplate);
+    }
+
+    /**
+     * 修改微信模板
+     * 
+     * @param fsWechatTemplate 微信模板
+     * @return 结果
+     */
+    @Override
+    public int updateFsWechatTemplate(FsWechatTemplate fsWechatTemplate)
+    {
+        fsWechatTemplate.setUpdateTime(DateUtils.getNowDate());
+        return fsWechatTemplateMapper.updateFsWechatTemplate(fsWechatTemplate);
+    }
+
+    /**
+     * 批量删除微信模板
+     * 
+     * @param ids 需要删除的微信模板ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsWechatTemplateByIds(Integer[] ids)
+    {
+        return fsWechatTemplateMapper.deleteFsWechatTemplateByIds(ids);
+    }
+
+    /**
+     * 删除微信模板信息
+     * 
+     * @param id 微信模板ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsWechatTemplateById(Integer id)
+    {
+        return fsWechatTemplateMapper.deleteFsWechatTemplateById(id);
+    }
+
+    @Override
+    public FsWechatTemplate selectFsWechatTemplateByKey(String key) {
+        return fsWechatTemplateMapper.selectFsWechatTemplateByKey(key);
+    }
+
+    @Override
+    public List<String> selectFsWechatTemplateIds() {
+        return fsWechatTemplateMapper.selectFsWechatTemplateIds();
+    }
+
+    @Override
+    public List<String> selectFsWechatTemplateIdsByKeys(String key) {
+        return fsWechatTemplateMapper.selectFsWechatTemplateIdsByKeys(key);
+    }
+}

+ 14 - 0
fs-service/src/main/java/com/fs/store/vo/CompanyTuiMoneyStatisticsVO.java

@@ -0,0 +1,14 @@
+package com.fs.store.vo;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class CompanyTuiMoneyStatisticsVO {
+    @Excel(name = "员工姓名")
+    String nickName;
+    @Excel(name = "佣金订单数")
+    Integer tuiMoneyCount;
+    @Excel(name = "佣金总金额")
+    Integer tuiMoney;
+}

+ 12 - 0
fs-service/src/main/java/com/fs/store/vo/DetailVO.java

@@ -0,0 +1,12 @@
+package com.fs.store.vo;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class DetailVO {
+    private List<String> data;
+    private List<Map<String, Map<String,String>>> res;
+}

+ 14 - 0
fs-service/src/main/java/com/fs/store/vo/ExpressScrmVO.java

@@ -0,0 +1,14 @@
+package com.fs.store.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ExpressScrmVO implements Serializable {
+    private String location;
+    private String tracedate;
+    private String remark;
+    private String status;
+
+}

+ 43 - 0
fs-service/src/main/java/com/fs/store/vo/FsCustomerStoreOrderScrmListQueryVO.java

@@ -0,0 +1,43 @@
+package com.fs.store.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 订单对象 fs_store_order
+ * 
+ * @author fs
+ * @date 2022-03-15
+ */
+@Data
+public class FsCustomerStoreOrderScrmListQueryVO implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 订单ID */
+    private Long id;
+
+    /** 订单号 */
+    private String orderCode;
+
+    /** 实际支付金额 */
+    @Excel(name = "实际支付金额")
+    private BigDecimal payPrice;
+
+    private Integer status;
+
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date finishTime;
+
+    private List<FsStoreOrderItemScrmVO> items;
+
+
+}

+ 51 - 0
fs-service/src/main/java/com/fs/store/vo/FsMyStoreOrderScrmListQueryVO.java

@@ -0,0 +1,51 @@
+package com.fs.store.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 订单对象 fs_store_order
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+@Data
+public class FsMyStoreOrderScrmListQueryVO implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 订单ID */
+    private Long id;
+
+    /** 订单号 */
+    private String orderCode;
+
+    /** 实际支付金额 */
+    @Excel(name = "实际支付金额")
+    private BigDecimal payPrice;
+
+    private Integer status;
+
+    private Integer isPackage;
+
+    private String  packageJson;
+
+    private String  itemJson;
+
+    private String deliveryId;
+
+    private Integer isAfterSales;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date finishTime;
+
+    private List<FsStoreOrderItemScrmVO> items;
+
+
+}

+ 239 - 0
fs-service/src/main/java/com/fs/store/vo/FsPromotionOrderScrmVO.java

@@ -0,0 +1,239 @@
+package com.fs.store.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class FsPromotionOrderScrmVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /** 订单ID */
+    private Long id;
+
+    /** 订单号 */
+    @Excel(name = "订单号")
+    private String orderCode;
+    @Excel(name = "会员ID")
+    private Long userId;
+    /** 额外订单号 */
+    @Excel(name = "管易云订单号")
+    private String extendOrderId;
+
+    @Excel(name = "所属公司")
+    private String companyName;
+    @Excel(name = "所属销售")
+    private String companyUserNickName;
+    @Excel(name = "销售电话")
+    private String companyUserePhonenumber;
+
+    @Excel(name = "推线编号")
+    private String registerCode;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "推线时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date registerDate;
+
+    @Excel(name = "渠道来源")
+    private String source;
+
+    @Excel(name = "成单类型", dictType = "store_order_type")
+    private String orderType;
+
+    //推广人昵称
+    private String tuiNickName;
+
+    //发起人
+    private String initiator;
+
+
+    /** 用户姓名 */
+    @Excel(name = "收货人姓名")
+    private String realName;
+
+    /** 用户电话 */
+    @Excel(name = "收货人电话")
+    private String userPhone;
+
+    /** 详细地址 */
+    @Excel(name = "详细地址")
+    private String userAddress;
+
+    /** 购物车id */
+    private String cartId;
+
+    /** 运费金额 */
+    private BigDecimal freightPrice;
+
+    /** 订单商品总数 */
+    private Long totalNum;
+
+    /** 订单总价 */
+    @Excel(name = "商品金额",cellType= Excel.ColumnType.NUMERIC)
+    private BigDecimal totalPrice;
+
+    /** 邮费 */
+    private BigDecimal totalPostage;
+
+    /** 实际支付金额 */
+    @Excel(name = "应付金额",cellType= Excel.ColumnType.NUMERIC)
+    private BigDecimal payPrice;
+
+    @Excel(name = "实付金额",cellType= Excel.ColumnType.NUMERIC)
+    private BigDecimal payMoney;
+
+    @Excel(name = "物流代收金额",cellType= Excel.ColumnType.NUMERIC)
+    private BigDecimal payDelivery;
+
+
+    /** 支付邮费 */
+
+    private BigDecimal payPostage;
+
+    /** 抵扣金额 */
+    private BigDecimal deductionPrice;
+
+    /** 优惠券id */
+    private Long couponId;
+
+    /** 优惠券金额 */
+    @Excel(name = "优惠券金额",cellType= Excel.ColumnType.NUMERIC)
+    private BigDecimal couponPrice;
+
+    /** 支付状态 */
+    private Integer paid;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "下单时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /** 支付时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date payTime;
+
+    /** 支付方式 */
+//    @Excel(name = "支付方式")
+    private String payType;
+
+    /** 订单状态(-1 : 申请退款 -2 : 退货成功 0:待发货;1:待收货;2:已收货;3:已完成;-1:已退款) */
+    @Excel(name = "订单状态", dictType = "store_order_status")
+    private String status;
+
+    /** 0 未退款 1 申请中 2 已退款 */
+//    @Excel(name = "0 未退款 1 申请中 2 已退款")
+    private Integer refundStatus;
+
+    /** 退款图片 */
+//    @Excel(name = "退款图片")
+    private String refundReasonWapImg;
+
+    /** 退款用户说明 */
+//    @Excel(name = "退款用户说明")
+    private String refundReasonWapExplain;
+
+    /** 退款时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+//    @Excel(name = "退款时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date refundReasonTime;
+
+    /** 前台退款原因 */
+//    @Excel(name = "前台退款原因")
+    private String refundReasonWap;
+
+    /** 不退款的理由 */
+//    @Excel(name = "不退款的理由")
+    private String refundReason;
+
+    /** 退款金额 */
+//    @Excel(name = "退款金额",cellType= Excel.ColumnType.NUMERIC)
+    private BigDecimal refundPrice;
+
+    /** 快递公司编号 */
+    @Excel(name = "快递公司编号")
+    private String deliverySn;
+
+    /** 快递名称/送货人姓名 */
+    @Excel(name = "快递公司")
+    private String deliveryName;
+
+    /** 发货类型 */
+    @Excel(name = "发货类型")
+    private String deliveryType;
+
+    /** 快递单号/手机号 */
+    @Excel(name = "快递单号")
+    private String deliveryId;
+
+    /** 消费赚取积分 */
+    private BigDecimal gainIntegral;
+
+    /** 使用积分 */
+    private BigDecimal useIntegral;
+
+    /** 实际支付积分 */
+    private BigDecimal payIntegral;
+
+    /** 给用户退了多少积分 */
+    private BigDecimal backIntegral;
+
+    /** 备注 */
+    @Excel(name = "备注")
+    private String mark;
+
+    /** 是否删除 */
+    private Integer isDel;
+
+    /** 成本价 */
+    private BigDecimal cost;
+
+    /** 核销码 */
+    private String verifyCode;
+
+    /** 门店id */
+    private Long storeId;
+
+    /** 配送方式 1=快递 ,2=门店自提 */
+    private Integer shippingType;
+
+    /** 支付渠道(0微信公众号1微信小程序) */
+    private Integer isChannel;
+
+    /** 是否提醒 */
+    private Integer isRemind;
+
+    /** 是否系统删除 */
+    private Integer isSysDel;
+
+    private String nickname;
+
+    private String phone;
+
+
+    private Date finishTime;
+
+    private Integer isPackage;
+
+    private List<FsStoreOrderItemScrmVO> items;
+
+    private Integer deliveryStatus;
+
+    @Excel(name = "物流代收结算状态", dictType = "store_delivery_pay_status")
+    private Integer deliveryPayStatus;
+
+    @Excel(name = "快递帐单日期")
+    private String deliveryTime;
+
+    @Excel(name = "快递结算日期")
+    private String deliveryPayTime;
+    @Excel(name = "物流代收金额")
+    private BigDecimal deliveryPayMoney;
+
+    //订单itemjson
+    private String itemJson;
+
+}

+ 67 - 0
fs-service/src/main/java/com/fs/store/vo/FsStoreCartScrmQueryVO.java

@@ -0,0 +1,67 @@
+package com.fs.store.vo;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+ public class FsStoreCartScrmQueryVO implements Serializable
+{
+
+    /** 购物车表ID */
+    private Long id;
+
+    @Excel(name = "商品分类ID")
+    private Long cateId;
+
+    /** 商品ID */
+    @Excel(name = "商品ID")
+    private Long productId;
+
+    /** $column.columnComment */
+    @Excel(name = "商品ID")
+    private Long productAttrValueId;
+
+    /** 商品数量 */
+    @Excel(name = "商品数量")
+    private Integer cartNum;
+
+    String productImage;
+
+    String productName;
+
+    String productAttrImage;
+
+    String productAttrName;
+
+
+    BigDecimal price;
+
+    private Integer stock;
+
+    private Integer integral;
+
+    private BigDecimal cost;
+
+    private Long tempId;
+
+    private BigDecimal weight;
+
+    private BigDecimal volume;
+
+    private Integer productType;
+
+    private String barCode;
+
+    private String groupBarCode;
+
+    private BigDecimal brokerage;
+
+    private BigDecimal brokerageTwo;
+
+    private BigDecimal brokerageThree;
+
+
+}

+ 41 - 0
fs-service/src/main/java/com/fs/store/vo/FsStoreCartScrmVO.java

@@ -0,0 +1,41 @@
+package com.fs.store.vo;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+ public class FsStoreCartScrmVO implements Serializable
+{
+
+    /** 购物车表ID */
+    private Long id;
+
+    /** 商品ID */
+    @Excel(name = "商品ID")
+    private Long productId;
+
+    /** $column.columnComment */
+    @Excel(name = "商品ID")
+    private Long productAttrValueId;
+
+    /** 商品数量 */
+    @Excel(name = "商品数量")
+    private Integer cartNum;
+
+    String productImage;
+
+    String productName;
+
+    String productAttrName;
+
+    String productAttrImage;
+
+    BigDecimal price;
+
+    private Integer stock;
+
+    private Integer productType;
+}

+ 101 - 0
fs-service/src/main/java/com/fs/store/vo/FsStoreOrderItemScrmExportVO.java

@@ -0,0 +1,101 @@
+package com.fs.store.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class FsStoreOrderItemScrmExportVO implements Serializable
+{
+
+    private Long itemId;
+
+    /** 订单号 */
+    @Excel(name = "订单号")
+    private String orderCode;
+
+    @Excel(name = "订单状态", dictType = "store_order_status")
+    private String status;
+
+    @Excel(name = "会员ID")
+    private Long userId;
+
+    @Excel(name = "产品名称")
+    private String productName;
+
+    @Excel(name = "产品编码")
+    private String barCode;
+
+
+    @Excel(name = "规格")
+    private String sku;
+
+    @Excel(name = "产品数量")
+    private Integer num;
+
+
+    @Excel(name = "产品价格")
+    private BigDecimal price;
+
+
+    private String jsonInfo;
+
+    /** 用户姓名 */
+    @Excel(name = "收货人姓名")
+    private String realName;
+
+    /** 用户电话 */
+    @Excel(name = "收货人电话")
+    private String userPhone;
+
+    /** 详细地址 */
+    @Excel(name = "详细地址")
+    private String userAddress;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "下单时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /** 支付时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date payTime;
+
+    /** 快递公司编号 */
+    @Excel(name = "快递公司编号")
+    private String deliverySn;
+
+    /** 快递名称/送货人姓名 */
+    @Excel(name = "快递公司")
+    private String deliveryName;
+
+    /** 快递单号/手机号 */
+    @Excel(name = "快递单号")
+    private String deliveryId;
+
+    @Excel(name = "所属公司")
+    private String companyName;
+    @Excel(name = "所属销售")
+    private String companyUserNickName;
+
+    @Excel(name = "套餐名称")
+    private String packageName;
+
+    @Excel(name = "组合码")
+    private String groupBarCode;
+
+    @Excel(name = "是否上传凭证 0:未上传 1:已上传")
+    private Integer isUpload;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "上传时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date uploadTime;
+
+    @Excel(name = "归属档期")
+    private String scheduleName;
+
+
+}

部分文件因为文件数量过多而无法显示