소스 검색

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_scrm_java

caoliqin 1 일 전
부모
커밋
ce4428cb50
50개의 변경된 파일1444개의 추가작업 그리고 129개의 파일을 삭제
  1. 19 0
      fs-admin/src/main/java/com/fs/task/OrderTask.java
  2. 2 2
      fs-admin/src/main/resources/application.yml
  3. 20 26
      fs-admin/src/test/java/com/fs/course/controller/FsCourseDomainNameControllerTest.java
  4. 16 2
      fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  5. 1 2
      fs-company-app/src/main/resources/application.yml
  6. 10 0
      fs-company/src/main/java/com/fs/company/controller/CompanyController.java
  7. 23 0
      fs-company/src/main/java/com/fs/company/controller/CompanyRechargeController.java
  8. 28 5
      fs-company/src/main/java/com/fs/crm/controller/CrmCustomerAssistController.java
  9. 5 1
      fs-company/src/main/java/com/fs/crm/controller/CrmCustomerController.java
  10. 1 1
      fs-company/src/main/resources/application.yml
  11. 1 1
      fs-qw-task/src/main/resources/application.yml
  12. 83 0
      fs-service-system/src/main/java/com/fs/company/constant/PaymentStatus.java
  13. 11 0
      fs-service-system/src/main/java/com/fs/company/domain/Company.java
  14. 75 0
      fs-service-system/src/main/java/com/fs/company/domain/CompanyRechargeOrder.java
  15. 15 0
      fs-service-system/src/main/java/com/fs/company/dto/RechargeDTO.java
  16. 74 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyRechargeOrderMapper.java
  17. 10 0
      fs-service-system/src/main/java/com/fs/company/param/CompanyConfigParam.java
  18. 14 0
      fs-service-system/src/main/java/com/fs/company/service/CompanyRechargeOrderService.java
  19. 9 0
      fs-service-system/src/main/java/com/fs/company/service/ICompanyRechargeService.java
  20. 3 0
      fs-service-system/src/main/java/com/fs/company/service/ICompanyService.java
  21. 97 0
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyRechargeOrderServiceImpl.java
  22. 16 0
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyRechargeServiceImpl.java
  23. 15 0
      fs-service-system/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  24. 3 0
      fs-service-system/src/main/java/com/fs/config/cloud/CloudHostProper.java
  25. 6 2
      fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseLinkServiceImpl.java
  26. 24 9
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java
  27. 5 0
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  28. 2 0
      fs-service-system/src/main/java/com/fs/crm/domain/CrmCustomerAssist.java
  29. 2 0
      fs-service-system/src/main/java/com/fs/crm/mapper/CrmCustomerAssistMapper.java
  30. 10 0
      fs-service-system/src/main/java/com/fs/crm/param/CrmCustomerAssistOperationParam.java
  31. 11 0
      fs-service-system/src/main/java/com/fs/crm/service/ICrmCustomerAssistService.java
  32. 0 3
      fs-service-system/src/main/java/com/fs/crm/service/ICrmCustomerService.java
  33. 212 1
      fs-service-system/src/main/java/com/fs/crm/service/impl/CrmCustomerAssistServiceImpl.java
  34. 0 51
      fs-service-system/src/main/java/com/fs/crm/service/impl/CrmCustomerServiceImpl.java
  35. 12 0
      fs-service-system/src/main/java/com/fs/crm/vo/CrmCustomerAssistVo.java
  36. 20 7
      fs-service-system/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java
  37. 20 0
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java
  38. 8 0
      fs-service-system/src/main/java/com/fs/wx/pay/config/WxPayProperties.java
  39. 9 4
      fs-service-system/src/main/resources/application-config-fby.yml
  40. 4 2
      fs-service-system/src/main/resources/application-config-zkzh.yml
  41. 137 0
      fs-service-system/src/main/resources/application-druid-bly-test.yml
  42. 2 0
      fs-service-system/src/main/resources/application-druid-bly.yml
  43. 2 0
      fs-service-system/src/main/resources/application-druid-fby.yml
  44. 139 0
      fs-service-system/src/main/resources/application-druid-zkzh-test.yml
  45. 2 0
      fs-service-system/src/main/resources/application-druid-zkzh.yml
  46. 4 0
      fs-service-system/src/main/resources/mapper/company/CompanyMapper.xml
  47. 15 7
      fs-service-system/src/main/resources/mapper/course/FsUserCourseMapper.xml
  48. 11 2
      fs-service-system/src/main/resources/mapper/crm/CrmCustomerAssistMapper.xml
  49. 1 1
      fs-user-app/src/main/resources/application.yml
  50. 235 0
      nginx.config

+ 19 - 0
fs-admin/src/main/java/com/fs/task/OrderTask.java

@@ -0,0 +1,19 @@
+package com.fs.task;
+
+import com.fs.company.service.CompanyRechargeOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component("orderTask")
+public class OrderTask {
+    @Autowired
+    private CompanyRechargeOrderService companyRechargeOrderService;
+
+
+    /**
+     * 自动关闭超时订单
+     */
+    public void autoCloseTimeOutOrder(){
+        companyRechargeOrderService.autoClosedOrder();
+    }
+}

+ 2 - 2
fs-admin/src/main/resources/application.yml

@@ -5,7 +5,7 @@ server:
   port: 7011
 spring:
   profiles:
-    active: dev
-    include: common,config-dev
+    active: druid-bly-test
+#    include: common,config-bly
 #    active: druid-fby
 #    include: common,config-fby

+ 20 - 26
fs-admin/src/test/java/com/fs/course/controller/FsCourseDomainNameControllerTest.java

@@ -14,6 +14,7 @@ import com.github.binarywang.wxpay.constant.WxPayConstants;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import lombok.extern.slf4j.Slf4j;
+import org.bouncycastle.cert.ocsp.Req;
 import org.junit.jupiter.api.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -37,13 +38,11 @@ class FsCourseDomainNameControllerTest {
     private ISysConfigService configService;
     @Test
     public void nativePay() throws WxPayException {
-        String json = configService.selectConfigByKey("redPacket.config");
-        RedPacketConfig config = JSONUtil.toBean(json, RedPacketConfig.class);
 
         WxPayConfig payConfig = new WxPayConfig();
         payConfig.setAppId("wx961fadab9bcb792b");
         payConfig.setMchId("1716217886");
-        payConfig.setApiV3Key("BLIAwfgnGV0gwUtKOmyv1Kh1sST0z6ls");
+        payConfig.setMchKey("a7Fc5B9dE2h8J3kL4mN6pQ7rS9tU2vW1");
         payConfig.setPrivateKeyPath("C:\\cert\\1716217886_20250509_cert\\apiclient_key.pem");
         payConfig.setPrivateCertPath("C:\\cert\\1716217886_20250509_cert\\apiclient_cert.pem");
         payConfig.setCertSerialNo("4E8BD68BC2BFD37CA58244D660E5FDCCE475D82E");
@@ -52,33 +51,28 @@ class FsCourseDomainNameControllerTest {
 
         wxPayService.setConfig(payConfig);
 
-        WxPayUnifiedOrderV3Request orderV3Request = createOrderV3Request();
+        // 构建支付请求参数
+        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
 
-        WxPayUnifiedOrderResult result = wxPayService.createOrderV3(TradeTypeEnum.NATIVE,orderV3Request);
+        // 设置商品描述
+        orderRequest.setBody("测试");
+        // 设置商户订单号
+        orderRequest.setOutTradeNo("20250621170609");
+        // 设置订单金额(单位:分)
+        orderRequest.setTotalFee(1);
+        // 设置终端IP
+        orderRequest.setSpbillCreateIp("127.0.0.1");
+        // 设置通知地址
+        orderRequest.setNotifyUrl("https://userapp.fbylive.com/app/wxpay/v3TransferNotify");
+        // 设置交易类型为NATIVE
+        orderRequest.setTradeType(WxPayConstants.TradeType.NATIVE);
+        orderRequest.setProductId("1");
 
-        log.info("返回数据: {}",result);
-    }
-
-    private WxPayUnifiedOrderV3Request createOrderV3Request() {
-        WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request();
 
-        // 设置订单基本信息
-        WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
-        amount.setTotal(1); // 金额,单位:分
-        amount.setCurrency("CNY"); // 币种
+        Object order = wxPayService.createOrder(orderRequest);
 
-        request.setAmount(amount);
-        request.setAppid("wx961fadab9bcb792b");
-        request.setMchid("1716217886");
-        request.setDescription("测试"); // 商品描述
-        request.setOutTradeNo("20250621170609"); // 商户订单号
-        request.setNotifyUrl("https://userapp.fbylive.com/app/wxpay/v3TransferNotify"); // 通知地址
 
-        // Native支付需要设置场景信息
-        WxPayUnifiedOrderV3Request.SceneInfo sceneInfo = new WxPayUnifiedOrderV3Request.SceneInfo();
-        sceneInfo.setPayerClientIp("127.0.0.1");
-        request.setSceneInfo(sceneInfo);
-
-        return request;
+        log.info("请求结果: {}",order);
     }
+
 }

+ 16 - 2
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -5,6 +5,8 @@ import com.fs.app.config.ImageStorageConfig;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.param.FsCourseLinkCreateParam;
 import com.fs.course.param.newfs.FsCourseSortLinkParam;
@@ -30,7 +32,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.InputStream;
-import java.time.LocalDate;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -58,6 +59,8 @@ public class FsUserCourseVideoController extends AppBaseController {
 
     @Autowired
     private IFsUserCoursePeriodService fsUserCoursePeriodService;
+    @Autowired
+    private ICompanyUserService companyUserService;
 
     @Login
     @GetMapping("/pageList")
@@ -108,12 +111,23 @@ public class FsUserCourseVideoController extends AppBaseController {
                                                       @RequestParam(required = false) String keyword,
                                                       @RequestParam(required = false, defaultValue = "1") Integer pageNum,
                                                       @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
-        log.debug("参与记录 keyword: {}, pageNum: {}, pageSize: {}", keyword, pageNum, pageSize);
+        log.debug("参与记录 videoId:{}, type:{}, keyword: {}, pageNum: {}, pageSize: {}", videoId, type, keyword, pageNum, pageSize);
         Map<String, Object> params = new HashMap<>();
         params.put("videoId", videoId);
         params.put("type", type);
         params.put("keyword", keyword);
 
+        // type 0 答题领奖记录----答题正确并且领取红包的
+        // type 1 完播----这堂课看完的人
+        // type 2 未完播---看课中断
+        // 管理员看整个公司 否则看自己的
+        CompanyUser companyUser = companyUserService.selectCompanyUserByUserId(Long.parseLong(getUserId()));
+        if (companyUser.isAdmin()) {
+            params.put("companyId", companyUser.getCompanyId());
+        } else {
+            params.put("companyUserId", companyUser.getUserId());
+        }
+
         PageHelper.startPage(pageNum, pageSize);
         List<FsUserCourseParticipationRecordVO> record = fsUserCourseService.getParticipationRecordByMap(params);
         return ResponseResult.ok(new PageInfo<>(record));

+ 1 - 2
fs-company-app/src/main/resources/application.yml

@@ -4,7 +4,6 @@ server:
 
 spring:
   profiles:
-    active: dev
-    include: common,config-dev
+    active: druid-zkzh-test
 #    active: druid-fby
 #    include: common,config-fby

+ 10 - 0
fs-company/src/main/java/com/fs/company/controller/CompanyController.java

@@ -7,6 +7,7 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanySms;
 import com.fs.company.domain.CompanyVoice;
+import com.fs.company.param.CompanyConfigParam;
 import com.fs.company.param.CompanyParam;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanySmsService;
@@ -115,4 +116,13 @@ public class CompanyController extends BaseController
         return R.ok();
     }
 
+    @ApiOperation("其他配置")
+    @PostMapping(value = "/config")
+    public R configUserCheck(@RequestBody CompanyConfigParam param) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setCompany(loginUser.getCompany());
+        companyService.config(param);
+        return R.ok();
+    }
+
 }

+ 23 - 0
fs-company/src/main/java/com/fs/company/controller/CompanyRechargeController.java

@@ -13,6 +13,8 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyRecharge;
+import com.fs.company.domain.CompanyRechargeOrder;
+import com.fs.company.dto.RechargeDTO;
 import com.fs.company.param.CompanyRechargeParam;
 import com.fs.company.service.ICompanyRechargeService;
 import com.fs.company.service.ICompanyService;
@@ -75,6 +77,27 @@ public class CompanyRechargeController extends BaseController
     }
 
 
+    /**
+     * 充值
+     * @return AjaxResult
+     */
+    @PostMapping("/wxRecharge")
+    public AjaxResult recharge(@RequestBody RechargeDTO dto){
+        CompanyRechargeOrder companyRechargeOrder;
+        try {
+            LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+
+            dto.setCompanyId(loginUser.getCompany().getCompanyId());
+            dto.setUserId(loginUser.getUser().getUserId());
+            companyRechargeOrder = companyRechargeService.recharge(dto);
+        }catch (Exception e) {
+            logger.error("给公司充值失败",e);
+            return AjaxResult.error(e.getMessage());
+        }
+        return AjaxResult.success(companyRechargeOrder);
+    }
+
+
 
     /**
      * 新增充值

+ 28 - 5
fs-company/src/main/java/com/fs/crm/controller/CrmCustomerAssistController.java

@@ -2,7 +2,12 @@ package com.fs.crm.controller;
 
 import java.util.List;
 
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.ServletUtils;
+import com.fs.core.security.LoginUser;
+import com.fs.core.web.service.TokenService;
 import com.fs.crm.param.CrmCustomerAssistDeLParam;
+import com.fs.crm.param.CrmCustomerAssistOperationParam;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -32,6 +37,8 @@ import com.fs.common.core.page.TableDataInfo;
 @RequestMapping("/crm/assist")
 public class CrmCustomerAssistController extends BaseController
 {
+    @Autowired
+    private TokenService tokenService;
     @Autowired
     private ICrmCustomerAssistService crmCustomerAssistService;
 
@@ -71,14 +78,17 @@ public class CrmCustomerAssistController extends BaseController
     }
 
     /**
-     * 新增客户员工协作
+     * 批量新增或修改客户员工协作
      */
     @PreAuthorize("@ss.hasPermi('crm:assist:add')")
-    @Log(title = "客户员工协作", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody CrmCustomerAssist crmCustomerAssist)
+    @Log(title = "客户员工协作", businessType = BusinessType.UPDATE)
+    @PostMapping("/allOperation")
+    public AjaxResult allOperation(@RequestBody List<CrmCustomerAssistOperationParam> params)
     {
-        return toAjax(crmCustomerAssistService.insertCrmCustomerAssist(crmCustomerAssist));
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long companyId = loginUser.getCompany().getCompanyId();
+        Long companyUserId = loginUser.getUser().getUserId();
+        return toAjax(crmCustomerAssistService.allOperation(params,companyId,companyUserId));
     }
 
     /**
@@ -112,4 +122,17 @@ public class CrmCustomerAssistController extends BaseController
     {
         return toAjax(crmCustomerAssistService.deleteCrmCustomerAssistByIds(ids));
     }
+
+    /**
+     * 批量查询
+     */
+    @PostMapping("/selectByCustomerIds")
+    public R selectByCustomerIds(@RequestBody List<Long> customerIds)
+    {
+        if (customerIds!=null && customerIds.size()>10) {
+            return R.error("手动分佣每次仅支持10个客户以内的分配");
+        }
+        return R.ok().put("data",crmCustomerAssistService.selectByCustomerIds(customerIds));
+    }
+
 }

+ 5 - 1
fs-company/src/main/java/com/fs/crm/controller/CrmCustomerController.java

@@ -18,8 +18,10 @@ import com.fs.core.security.LoginUser;
 import com.fs.core.web.service.TokenService;
 import com.fs.crm.domain.CrmCustomer;
 import com.fs.crm.param.*;
+import com.fs.crm.service.ICrmCustomerAssistService;
 import com.fs.crm.service.ICrmCustomerService;
 import com.fs.crm.service.ICrmCustomerUserService;
+import com.fs.crm.service.impl.CrmCustomerAssistServiceImpl;
 import com.fs.crm.vo.*;
 import com.github.pagehelper.PageHelper;
 import io.swagger.annotations.ApiOperation;
@@ -52,6 +54,8 @@ public class CrmCustomerController extends BaseController
     private TokenService tokenService;
     @Autowired
     ICrmCustomerUserService crmCustomerUserService;
+    @Autowired
+    private ICrmCustomerAssistService crmCustomerAssistService;
 
     @ApiOperation("获取线索客户")
     @PreAuthorize("@ss.hasPermi('crm:customer:lineList')")
@@ -245,7 +249,7 @@ public class CrmCustomerController extends BaseController
         }
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId(loginUser.getCompany().getCompanyId());
-        return crmCustomerService.assistToUser(loginUser.getUsername(),loginUser.getUser().getUserId(),param);
+        return crmCustomerAssistService.assistToUser(loginUser.getUsername(),loginUser.getUser().getUserId(),param);
     }
 
 

+ 1 - 1
fs-company/src/main/resources/application.yml

@@ -5,6 +5,6 @@ server:
 spring:
   profiles:
     active: dev
-    include: common,config-dev
+#    include: common,config-dev
 #    active: druid-fby
 #    include: common,config-fby

+ 1 - 1
fs-qw-task/src/main/resources/application.yml

@@ -5,4 +5,4 @@ server:
 spring:
   profiles:
     active: dev
-    include: common,config-dev
+#    include: common,config-dev

+ 83 - 0
fs-service-system/src/main/java/com/fs/company/constant/PaymentStatus.java

@@ -0,0 +1,83 @@
+package com.fs.company.constant;
+
+import lombok.Getter;
+
+/**
+ * 支付状态枚举类
+ *
+ * 描述支付过程中可能的状态
+ */
+@Getter
+public enum PaymentStatus {
+
+    /**
+     * 支付创建,初始状态
+     */
+    CREATED(0, "创建"),
+
+    /**
+     * 支付处理中
+     */
+    PROCESSING(1, "处理中"),
+
+    /**
+     * 支付成功
+     */
+    SUCCESS(2, "支付成功"),
+
+    /**
+     * 支付失败
+     */
+    FAILED(3, "支付失败");
+
+    /**
+     * 状态码
+     * -- GETTER --
+     *  获取状态码
+     *
+     * @return 状态码
+
+     */
+    private final int code;
+
+    /**
+     * 状态描述
+     * -- GETTER --
+     *  获取状态描述
+     *
+     * @return 状态描述
+
+     */
+    private final String description;
+
+    /**
+     * 构造函数
+     *
+     * @param code 状态码
+     * @param description 状态描述
+     */
+    PaymentStatus(int code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    /**
+     * 根据状态码获取对应的枚举值
+     *
+     * @param code 状态码
+     * @return 对应的支付状态枚举,如果没找到则返回null
+     */
+    public static PaymentStatus getByCode(int code) {
+        for (PaymentStatus status : PaymentStatus.values()) {
+            if (status.getCode() == code) {
+                return status;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return code + ":" + description;
+    }
+}

+ 11 - 0
fs-service-system/src/main/java/com/fs/company/domain/Company.java

@@ -94,6 +94,9 @@ public class Company extends BaseEntity
     /** 会员是否默认黑名单,1-是;0-否(用于销售分享成为会员的操作) */
     private Integer fsUserIsDefaultBlack;
 
+    /** 后台制单是否需要付款 默认1 0-否 1-是*/
+    private Integer isPay;
+
     public String getOmsCode() {
         return omsCode;
     }
@@ -314,4 +317,12 @@ public class Company extends BaseEntity
     public void setRules(List<String> rules) {
         this.rules = rules;
     }
+
+    public Integer getIsPay() {
+        return isPay;
+    }
+
+    public void setIsPay(Integer isPay) {
+        this.isPay = isPay;
+    }
 }

+ 75 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyRechargeOrder.java

@@ -0,0 +1,75 @@
+package com.fs.company.domain;
+
+import lombok.Data;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 公司充值订单表
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CompanyRechargeOrder {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 订单号
+     */
+    private String orderNo;
+
+    /**
+     * 支付平台交易号
+     */
+    private String transactionId;
+
+    /**
+     * 支付方式:1-微信 2-支付宝 3-银行卡 4-其他
+     */
+    private Integer payType;
+
+    /**
+     * 支付金额
+     */
+    private BigDecimal payAmount;
+
+    private Long companyId;
+
+    private Long userId;
+
+    /**
+     * 支付状态:0-创建 1-处理中 2-支付成功 3-支付失败
+     */
+    private Integer payStatus;
+
+    /**
+     * 支付时间
+     */
+    private LocalDateTime paymentTime;
+
+    /**
+     * 回调内容
+     */
+    private String callbackContent;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    private String qrLink;
+}

+ 15 - 0
fs-service-system/src/main/java/com/fs/company/dto/RechargeDTO.java

@@ -0,0 +1,15 @@
+package com.fs.company.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class RechargeDTO {
+    /**
+     * 充值金额
+     */
+    private BigDecimal amount;
+    private Long companyId;
+    private Long userId;
+}

+ 74 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyRechargeOrderMapper.java

@@ -0,0 +1,74 @@
+package com.fs.company.mapper;
+
+import com.fs.company.domain.CompanyRechargeOrder;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 公司充值订单表 Mapper
+ */
+@Mapper
+public interface CompanyRechargeOrderMapper {
+
+    /**
+     * 根据ID查询订单
+     */
+    @Select("SELECT * FROM company_recharge_order WHERE id = #{id}")
+    CompanyRechargeOrder selectById(Long id);
+
+    /**
+     * 根据订单号查询订单
+     */
+    @Select("SELECT * FROM company_recharge_order WHERE order_no = #{orderNo}")
+    CompanyRechargeOrder selectByOrderNo(String orderNo);
+
+    /**
+     * 根据交易号查询订单
+     */
+    @Select("SELECT * FROM company_recharge_order WHERE transaction_id = #{transactionId}")
+    CompanyRechargeOrder selectByTransactionId(String transactionId);
+
+    /**
+     * 查询所有订单
+     */
+    @Select("SELECT * FROM company_recharge_order")
+    List<CompanyRechargeOrder> selectAll();
+
+    /**
+     * 新增订单
+     */
+    @Insert("INSERT INTO company_recharge_order (order_no, transaction_id, pay_type, pay_amount, pay_status, payment_time, callback_content,company_id,user_id) " +
+            "VALUES (#{orderNo}, #{transactionId}, #{payType}, #{payAmount}, #{payStatus}, #{paymentTime}, #{callbackContent},#{companyId},#{userId})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(CompanyRechargeOrder order);
+
+    /**
+     * 更新订单
+     */
+    @Update("UPDATE company_recharge_order SET " +
+            "transaction_id = #{transactionId}, " +
+            "pay_type = #{payType}, " +
+            "pay_amount = #{payAmount}, " +
+            "pay_status = #{payStatus}, " +
+            "payment_time = #{paymentTime}, " +
+            "callback_content = #{callbackContent} " +
+            "WHERE order_no = #{orderNo}")
+    int updateByOrderNo(CompanyRechargeOrder order);
+
+    /**
+     * 更新订单支付状态
+     */
+    @Update("UPDATE company_recharge_order SET " +
+            "pay_status = #{payStatus}, " +
+            "payment_time = #{paymentTime}, " +
+            "transaction_id = #{transactionId}, " +
+            "callback_content = #{callbackContent} " +
+            "WHERE order_no = #{orderNo}")
+    int updatePayStatus(CompanyRechargeOrder order);
+
+    @Select("SELECT * FROM company_recharge_order " +
+            "WHERE pay_status = 0 " +
+            "AND create_time <= DATE_SUB(NOW(), INTERVAL 2 HOUR)")
+    List<CompanyRechargeOrder> queryOverdueOrder();
+}

+ 10 - 0
fs-service-system/src/main/java/com/fs/company/param/CompanyConfigParam.java

@@ -0,0 +1,10 @@
+package com.fs.company.param;
+
+import com.fs.company.domain.Company;
+import lombok.Data;
+
+@Data
+public class CompanyConfigParam {
+    private Company company;
+    private Integer isPay;
+}

+ 14 - 0
fs-service-system/src/main/java/com/fs/company/service/CompanyRechargeOrderService.java

@@ -0,0 +1,14 @@
+package com.fs.company.service;
+
+import com.fs.company.domain.CompanyRechargeOrder;
+
+import java.util.List;
+
+public interface CompanyRechargeOrderService {
+
+    List<CompanyRechargeOrder> queryOverdueOrder();
+
+    void autoClosedOrder();
+
+    CompanyRechargeOrder createOrder(CompanyRechargeOrder order) throws Exception;
+}

+ 9 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyRechargeService.java

@@ -5,6 +5,8 @@ import java.util.List;
 
 import com.fs.common.core.domain.R;
 import com.fs.company.domain.CompanyRecharge;
+import com.fs.company.domain.CompanyRechargeOrder;
+import com.fs.company.dto.RechargeDTO;
 import com.fs.company.vo.CompanyRechargeExportVO;
 import com.fs.company.vo.CompanyRechargeVO;
 
@@ -80,4 +82,11 @@ public interface ICompanyRechargeService
      * @return 充值集合
      */
     List<CompanyRechargeExportVO> selectCompanyRechargeExportList(CompanyRecharge companyRecharge);
+
+    /**
+     * 充值
+     * @param dto 参数
+     * @return 地址
+     */
+    CompanyRechargeOrder recharge(RechargeDTO dto) throws Exception;
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyService.java

@@ -2,6 +2,7 @@ package com.fs.company.service;
 
 import com.fs.common.core.domain.R;
 import com.fs.company.domain.Company;
+import com.fs.company.param.CompanyConfigParam;
 import com.fs.company.param.CompanyParam;
 import com.fs.company.vo.*;
 import com.fs.his.vo.OptionsVO;
@@ -123,5 +124,7 @@ public interface ICompanyService
      */
     List<DeptDataVO> getDeptData(Long companyId);
 
+    int config(CompanyConfigParam param);
+
     void addRedPacketCompanyMoney(BigDecimal money, Long companyId);
 }

+ 97 - 0
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyRechargeOrderServiceImpl.java

@@ -0,0 +1,97 @@
+package com.fs.company.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.OrderUtils;
+import com.fs.company.constant.PaymentStatus;
+import com.fs.company.domain.CompanyRechargeOrder;
+import com.fs.company.mapper.CompanyRechargeOrderMapper;
+import com.fs.company.service.CompanyRechargeOrderService;
+import com.fs.wx.pay.config.WxPayProperties;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
+import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.service.WxPayService;
+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.time.LocalDateTime;
+import java.util.List;
+
+@Service
+public class CompanyRechargeOrderServiceImpl implements CompanyRechargeOrderService {
+    @Autowired
+    private CompanyRechargeOrderMapper companyRechargeOrderMapper;
+
+    @Autowired
+    private WxPayProperties wxPayProperties;
+
+    @Autowired
+    private WxPayService wxPayService;
+    @Override
+    public List<CompanyRechargeOrder> queryOverdueOrder() {
+        return companyRechargeOrderMapper.queryOverdueOrder();
+    }
+
+    /**
+     * 自动关闭超时订单号
+     */
+    @Override
+    public void autoClosedOrder(){
+        List<CompanyRechargeOrder> companyRechargeOrders = companyRechargeOrderMapper.queryOverdueOrder();
+        for (CompanyRechargeOrder order : companyRechargeOrders) {
+            order.setPayStatus(PaymentStatus.FAILED.getCode());
+            companyRechargeOrderMapper.updateByOrderNo(order);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
+    public CompanyRechargeOrder createOrder(CompanyRechargeOrder order) throws Exception{
+
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(wxPayProperties.getAppId());
+        payConfig.setMchId(wxPayProperties.getMchId());
+        payConfig.setMchKey(wxPayProperties.getMchKey());
+        payConfig.setPrivateKeyPath(wxPayProperties.getPrivateKeyPath());
+        payConfig.setPrivateCertPath(wxPayProperties.getPrivateCertPath());
+        payConfig.setCertSerialNo(wxPayProperties.getCertSerialNo());
+        payConfig.setUseSandboxEnv(false);
+        payConfig.setSignType(WxPayConstants.SignType.HMAC_SHA256);
+
+        wxPayService.setConfig(payConfig);
+
+        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
+
+        orderRequest.setBody("公司余额充值");
+        orderRequest.setOutTradeNo(OrderUtils.getOrderNo());
+        orderRequest.setTotalFee(order.getPayAmount().multiply(BigDecimal.valueOf(100)).intValue());
+        orderRequest.setSpbillCreateIp(IpUtil.getLocalhostIp());
+        orderRequest.setNotifyUrl(wxPayProperties.getNativeNotifyUrl());
+        orderRequest.setTradeType(WxPayConstants.TradeType.NATIVE);
+        orderRequest.setProductId(String.valueOf(order.getId()));
+
+
+        WxPayNativeOrderResult wxOrder = wxPayService.createOrder(orderRequest);
+
+
+        order.setOrderNo(OrderUtils.getOrderNo());
+        order.setPayType(1);
+        order.setPayStatus(1);
+        order.setCreateTime(LocalDateTime.now());
+        order.setCallbackContent(JSON.toJSONString(wxOrder));
+        order.setQrLink(wxOrder.getCodeUrl());
+
+        companyRechargeOrderMapper.insert(order);
+
+        return order;
+    }
+
+
+
+}

+ 16 - 0
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyRechargeServiceImpl.java

@@ -8,8 +8,11 @@ import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyMoneyLogs;
+import com.fs.company.domain.CompanyRechargeOrder;
+import com.fs.company.dto.RechargeDTO;
 import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyMoneyLogsMapper;
+import com.fs.company.service.CompanyRechargeOrderService;
 import com.fs.company.vo.CompanyRechargeExportVO;
 import com.fs.company.vo.CompanyRechargeVO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,6 +20,7 @@ import org.springframework.stereotype.Service;
 import com.fs.company.mapper.CompanyRechargeMapper;
 import com.fs.company.domain.CompanyRecharge;
 import com.fs.company.service.ICompanyRechargeService;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -34,6 +38,8 @@ public class CompanyRechargeServiceImpl implements ICompanyRechargeService
     private CompanyMoneyLogsMapper moneyLogsMapper;
     @Autowired
     private CompanyMapper companyMapper;
+    @Autowired
+    private CompanyRechargeOrderService companyRechargeOrderService;
     /**
      * 查询充值
      *
@@ -150,4 +156,14 @@ public class CompanyRechargeServiceImpl implements ICompanyRechargeService
     public List<CompanyRechargeExportVO> selectCompanyRechargeExportList(CompanyRecharge companyRecharge) {
         return companyRechargeMapper.selectCompanyRechargeExportList(companyRecharge);
     }
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Throwable.class)
+    public CompanyRechargeOrder recharge(RechargeDTO dto) throws Exception {
+        CompanyRechargeOrder order = new CompanyRechargeOrder();
+        order.setPayAmount(dto.getAmount());
+        order.setCompanyId(dto.getCompanyId());
+        order.setUserId(dto.getUserId());
+        return companyRechargeOrderService.createOrder(order);
+    }
 }

+ 15 - 0
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -5,6 +5,7 @@ import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.company.domain.*;
 import com.fs.company.mapper.*;
+import com.fs.company.param.CompanyConfigParam;
 import com.fs.company.param.CompanyParam;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.vo.CompanyCrmVO;
@@ -21,6 +22,7 @@ import com.fs.system.service.ISysConfigService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -538,6 +540,19 @@ public class CompanyServiceImpl implements ICompanyService
 
         return result.stream().filter(e -> CollectionUtils.isNotEmpty(e.getChildren())).collect(Collectors.toList());
     }
+
+    @Override
+    public int config(CompanyConfigParam param) {
+        if (param.getCompany() != null){
+            Company company = new Company();
+            company.setCompanyId(param.getCompany().getCompanyId());
+            company.setIsPay(param.getIsPay());
+            return companyMapper.updateCompany(company);
+        } else {
+            return 0;
+        }
+    }
+
     /**
      * 构建公司节点,包含其下属部门和用户
      * @param company 公司对象

+ 3 - 0
fs-service-system/src/main/java/com/fs/config/cloud/CloudHostProper.java

@@ -9,4 +9,7 @@ import org.springframework.stereotype.Component;
 public class CloudHostProper {
     @Value("${cloud_host.company_name}")
     private String companyName;
+
+    @Value("${headerImg.imgUrl}")
+    private String headerImg;
 }

+ 6 - 2
fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseLinkServiceImpl.java

@@ -8,6 +8,7 @@ import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseDomainName;
 import com.fs.course.domain.FsCourseLink;
@@ -64,6 +65,9 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
     @Autowired
     private CompanyUserMapper companyUserMapper;
 
+    @Autowired
+    CloudHostProper cloudHostProper;
+
 
     /**
      * 查询短链
@@ -258,14 +262,14 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
                         return R.error("真实链接不存在").put("realLink", sLink);
                     }
                     log.info("链接仍然有效: {}", sLink);
-                    String json = configService.selectConfigByKey("h5.course.config");
+                    String json = configService.selectConfigByKey("course.config");
                     CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
                     String domainName = companyUserMapper.selectDomainByUserId(courseLink.getCompanyUserId());
                     if (StringUtils.isEmpty(domainName)){
                         domainName = config.getRealLinkDomainName();
                     }
                     String realLink = domainName+courseLink.getRealLink();
-                    String imgUrl = "";
+                    String imgUrl = cloudHostProper.getHeaderImg();
                     return R.ok().put("realLink",realLink ).put("config",config).put("headerImg",imgUrl);
                 }
             } else {

+ 24 - 9
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -440,7 +440,7 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
 
     @Override
     public R createCourseSortLink(FsCourseLinkCreateParam param) {
-        String json = configService.selectConfigByKey("h5.course.config");
+        String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
 
         //新增链接表信息
@@ -747,16 +747,31 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
     }
 
     private static Calendar getExpireDay(FsCourseLinkCreateParam param, CourseConfig config, Date createTime) {
-        Integer expireDuration;
-        if (param.getEffectiveDuration() == null || param.getEffectiveDuration() == 0){
-            expireDuration = config.getVideoLinkExpireDate();
-        }else {
-            expireDuration = param.getEffectiveDuration();
+        if (param == null || config == null || createTime == null) {
+            throw new IllegalArgumentException("Parameters cannot be null");
         }
-        // 设置过期时间
+
         Calendar calendar = Calendar.getInstance();
-        calendar.setTime(createTime);
-        calendar.add(Calendar.MINUTE, expireDuration);
+
+        if (param.getEffectiveDuration() == null || param.getEffectiveDuration() == 0) {
+            // 未传时间分钟的走配置,当天24:00(次日0:00)过期
+            Integer expireDays = config.getVideoLinkExpireDate() != null ? config.getVideoLinkExpireDate() : 1; // 默认1天
+
+            Date baseDate = param.getSendTime() != null ? param.getSendTime() : createTime;
+            calendar.setTime(baseDate);
+            calendar.add(Calendar.DAY_OF_MONTH, expireDays);
+
+            // 设置为次日0:00(即当天的24:00)
+            calendar.set(Calendar.HOUR_OF_DAY, 0);
+            calendar.set(Calendar.MINUTE, 0);
+            calendar.set(Calendar.SECOND, 0);
+            calendar.set(Calendar.MILLISECOND, 0);
+        } else {
+            // 传入时间分钟的
+            calendar.setTime(createTime);
+            calendar.add(Calendar.MINUTE, param.getEffectiveDuration());
+        }
+
         return calendar;
     }
 

+ 5 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1030,6 +1030,11 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             fsCourseWatchLog.setLogType(1);
             fsCourseWatchLog.setProject(courseProject);
             courseWatchLogMapper.insertFsCourseWatchLog(fsCourseWatchLog);
+
+            String redisKey = "h5wxuser:watch:heartbeat:" + param.getUserId() + ":" + param.getVideoId() + ":" + param.getCompanyUserId();
+            redisCache.setCacheObject(redisKey, LocalDateTime.now().toString());
+            // 设置 Redis 记录的过期时间(例如 5 分钟)
+            redisCache.expire(redisKey, 300, TimeUnit.SECONDS);
         }
 
         // 添加会员销售关系表数据

+ 2 - 0
fs-service-system/src/main/java/com/fs/crm/domain/CrmCustomerAssist.java

@@ -33,4 +33,6 @@ public class CrmCustomerAssist extends BaseEntity
     /** 销售公司ID */
     @Excel(name = "销售公司ID")
     private Long customerId;
+
+    private Integer Rate;
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/crm/mapper/CrmCustomerAssistMapper.java

@@ -81,4 +81,6 @@ public interface CrmCustomerAssistMapper
      * @return
      */
     List<Long> selectCompanyUserIdByCustomerId(@Param("customerId") Long customerId,@Param("createTime") Date createTime);
+
+    List<CrmCustomerAssist> selectByCustomerId(Long customerId);
 }

+ 10 - 0
fs-service-system/src/main/java/com/fs/crm/param/CrmCustomerAssistOperationParam.java

@@ -0,0 +1,10 @@
+package com.fs.crm.param;
+
+import com.fs.crm.domain.CrmCustomerAssist;
+import lombok.Data;
+
+
+@Data
+public class CrmCustomerAssistOperationParam extends CrmCustomerAssist {
+    private String operation;
+}

+ 11 - 0
fs-service-system/src/main/java/com/fs/crm/service/ICrmCustomerAssistService.java

@@ -1,8 +1,13 @@
 package com.fs.crm.service;
 
 import java.util.List;
+
+import com.fs.common.core.domain.R;
 import com.fs.crm.domain.CrmCustomerAssist;
+import com.fs.crm.param.CrmCustomeAssignParam;
 import com.fs.crm.param.CrmCustomerAssistDeLParam;
+import com.fs.crm.param.CrmCustomerAssistOperationParam;
+import com.fs.crm.vo.CrmCustomerAssistVo;
 
 /**
  * 客户员工协作Service接口
@@ -61,4 +66,10 @@ public interface ICrmCustomerAssistService
     public int deleteCrmCustomerAssistById(Long id);
 
     int removeByCustomer(CrmCustomerAssistDeLParam param);
+
+    R assistToUser(String opeUserName, Long opeUserId, CrmCustomeAssignParam param);
+
+    List<CrmCustomerAssistVo> selectByCustomerIds(List<Long> customerIds);
+
+    int allOperation(List<CrmCustomerAssistOperationParam> params,Long companyId,Long companyUserId);
 }

+ 0 - 3
fs-service-system/src/main/java/com/fs/crm/service/ICrmCustomerService.java

@@ -117,9 +117,6 @@ public interface ICrmCustomerService
 
     R assignCompanys(CrmCompanyAssignParam param, String operUserName,Long operUserId);
 
-    R assistToUser(String opeUserName, Long opeUserId, CrmCustomeAssignParam param);
-
-
     int updateCrmCustomerSource(CrmCustomerEditSourceParam param);
 
     List<CrmCustomer> selectCrmCustomerListByIds(String customerIds);

+ 212 - 1
fs-service-system/src/main/java/com/fs/crm/service/impl/CrmCustomerAssistServiceImpl.java

@@ -1,13 +1,36 @@
 package com.fs.crm.service.impl;
 
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+import cn.jiguang.common.resp.APIConnectionException;
+import cn.jiguang.common.resp.APIRequestException;
+import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.crm.domain.CrmCustomer;
+import com.fs.crm.domain.CrmCustomerLogs;
+import com.fs.crm.domain.CrmCustomerUser;
+import com.fs.crm.dto.CrmCustomerAssignUserDTO;
+import com.fs.crm.enums.CustomerLogEnum;
+import com.fs.crm.mapper.CrmCustomerLogsMapper;
+import com.fs.crm.mapper.CrmCustomerMapper;
+import com.fs.crm.mapper.CrmCustomerUserMapper;
+import com.fs.crm.param.CrmCustomeAssignParam;
 import com.fs.crm.param.CrmCustomerAssistDeLParam;
+import com.fs.crm.param.CrmCustomerAssistOperationParam;
+import com.fs.crm.vo.CrmCustomerAssistVo;
+import com.fs.jpush.service.JpushService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.crm.mapper.CrmCustomerAssistMapper;
 import com.fs.crm.domain.CrmCustomerAssist;
 import com.fs.crm.service.ICrmCustomerAssistService;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 客户员工协作Service业务层处理
@@ -20,6 +43,16 @@ public class CrmCustomerAssistServiceImpl implements ICrmCustomerAssistService
 {
     @Autowired
     private CrmCustomerAssistMapper crmCustomerAssistMapper;
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+    @Autowired
+    private CrmCustomerMapper crmCustomerMapper;
+    @Autowired
+    private CrmCustomerUserMapper crmCustomerUserMapper;
+    @Autowired
+    private CrmCustomerLogsMapper logsMapper;
+    @Autowired
+    private JpushService jpushService;
 
     /**
      * 查询客户员工协作
@@ -95,10 +128,188 @@ public class CrmCustomerAssistServiceImpl implements ICrmCustomerAssistService
     }
 
     @Override
+    @Transactional
     public int removeByCustomer(CrmCustomerAssistDeLParam param) {
         if (param.getCustomerIds() == null || param.getCustomerIds().isEmpty()) {
             return 0;
         }
+        //计算分佣
+        delComputeRate(param);
         return crmCustomerAssistMapper.removeByCustomer(param);
     }
+
+    /**
+     *  删除协作人分配佣金
+     * @param param
+     */
+    private void delComputeRate(CrmCustomerAssistDeLParam param) {
+        List<Long> customerIds = param.getCustomerIds();
+        Long companyUserId = param.getCompanyUserId();
+        customerIds.forEach(customerId -> {
+            List<CrmCustomerAssist> assistList = crmCustomerAssistMapper.selectByCustomerId(customerId);
+            if (assistList != null && !assistList.isEmpty()) {
+                int i = assistList.size() - 1; //-1因为需要删除一个协作者
+                if (i>0){
+                    //+1因为还有原所属人
+                    int rate = BigDecimal.valueOf(100).divide(BigDecimal.valueOf(i+1), 2, BigDecimal.ROUND_HALF_UP).intValue();
+                    int num = 0;
+                    for (int t = 0; t < i + 1; t++) {
+                        num += rate;
+                    }
+                    int specialRate;
+                    if (num > 100) {
+                        //如果小于100 那就是原所属人分配多的佣金
+                        specialRate = rate-(num - 100);
+                    } else {
+                        specialRate = 0;
+                    }
+                    int index = 0;
+                    List<CrmCustomerAssist> newAssistList = assistList.stream().filter(temp -> !Objects.equals(temp.getCompanyUserId(), companyUserId)).collect(Collectors.toList());
+                    for (CrmCustomerAssist crmCustomerAssist : newAssistList) {
+                        //更新
+                        if (specialRate > 0 && index == newAssistList.size()-1){
+                            crmCustomerAssist.setRate(specialRate);
+                        }else {
+                            crmCustomerAssist.setRate(rate);
+                        }
+                        crmCustomerAssistMapper.updateCrmCustomerAssist(crmCustomerAssist);
+                        index++;
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     *  添加协作人分配佣金
+     * @param param
+     */
+    private Integer addComputeRate(CrmCustomerAssist param) {
+        Long customerId = param.getCustomerId();
+        List<CrmCustomerAssist> assistList = crmCustomerAssistMapper.selectByCustomerId(customerId);
+        if (assistList != null) {
+            int i = assistList.size() + 2; //+2因为还有原所属人和添加协作者
+            int rate = BigDecimal.valueOf(100).divide(BigDecimal.valueOf(i), 2, BigDecimal.ROUND_HALF_UP).intValue();
+            int num = 0;
+            for (int t = 0; t < i ; t++) {
+                num += rate;
+            }
+            int specialRate;
+            if (num > 100) {
+                specialRate = rate-(num - 100);
+            } else {
+                //如果小于100 那就是原所属人分配多的佣金
+                specialRate = 0;
+            }
+            for (CrmCustomerAssist crmCustomerAssist : assistList) {
+                //更新
+                crmCustomerAssist.setRate(rate);
+                crmCustomerAssistMapper.updateCrmCustomerAssist(crmCustomerAssist);
+            }
+            if (specialRate > 0){
+                return specialRate;
+            } else {
+                return rate;
+            }
+        }
+        return 50;
+    }
+
+    @Override
+    @Transactional
+    public R assistToUser(String opeUserName, Long opeUserId, CrmCustomeAssignParam param) {
+        Integer index = 0;
+        for (CrmCustomerAssignUserDTO userDTO : param.getUsers()) {
+            CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userDTO.getCompanyUserId());
+            for (int i = 0; i < userDTO.getCount(); i++) {
+                CrmCustomer customer = crmCustomerMapper.selectCrmCustomerById(param.getCustomerIds().get(index));
+                //不能选择客户拥有者本人
+                CrmCustomerUser crmCustomerUser = crmCustomerUserMapper.selectCrmCustomerUserById(customer.getCustomerUserId());
+                if (Objects.equals(crmCustomerUser.getCompanyUserId(), userDTO.getCompanyUserId())) {
+                    return R.error("不能选择自己来协作!");
+                }
+                //查询协作客户
+                CrmCustomerAssist customerAssist = new CrmCustomerAssist();
+                customerAssist.setCustomerId(customer.getCustomerId());
+                customerAssist.setCompanyUserId(userDTO.getCompanyUserId());
+                List<CrmCustomerAssist> tempList = crmCustomerAssistMapper.selectCrmCustomerAssistList(customerAssist);
+                if (tempList != null && !tempList.isEmpty()) {
+                    return R.error("销售:" + companyUser.getNickName() + "(" + userDTO.getCompanyUserId() + ")已拥有改该协作客户:" + customer.getCustomerName());
+                }
+                customerAssist.setCompanyId(param.getCompanyId());
+                customerAssist.setCompanyUserName(companyUser.getNickName());
+                customerAssist.setCreateTime(new Date());
+                //分配佣金
+                Integer rate = addComputeRate(customerAssist);
+                customerAssist.setRate(rate);
+                crmCustomerAssistMapper.insertCrmCustomerAssist(customerAssist);
+                //写日志
+                CrmCustomerLogs logs = new CrmCustomerLogs();
+                logs.setCustomerId(customer.getCustomerId());
+                logs.setCreateTime(new Date());
+                logs.setLogsType(CustomerLogEnum.ASSIST_USER.getValue());
+                logs.setTitle(CustomerLogEnum.ASSIST_USER.getDesc());
+                logs.setRemark(opeUserName + "为客户" + customer.getCustomerName() + "添加协作人:" + companyUser.getNickName());
+                logs.setCompanyUserId(userDTO.getCompanyUserId());
+                logsMapper.insertCrmCustomerLogs(logs);
+
+                if (StringUtils.isNotEmpty(companyUser.getJpushId())) {
+                    Map<String, String> extrasMap = new HashMap<>();
+                    extrasMap.put("customerId", customer.getCustomerId().toString());
+                    extrasMap.put("type", "1");
+                    try {
+                        jpushService.sendRegisterIdPush("客户消息", "您收到 一个客户协作邀请", extrasMap, companyUser.getJpushId());
+                    } catch (APIConnectionException e) {
+                    } catch (APIRequestException e) {
+                    }
+                }
+                index++;
+            }
+        }
+        return R.ok();
+    }
+
+    @Override
+    public List<CrmCustomerAssistVo> selectByCustomerIds(List<Long> customerIds) {
+        if (customerIds != null && !customerIds.isEmpty()) {
+            //如果超过10个建议用多线程
+            ArrayList<CrmCustomerAssistVo> vos = new ArrayList<>(customerIds.size());
+            customerIds.forEach(customerId->{
+                CrmCustomerAssistVo vo = new CrmCustomerAssistVo();
+                List<CrmCustomerAssist> assists = crmCustomerAssistMapper.selectByCustomerId(customerId);
+                vo.setCustomerId(customerId);
+                vo.setAssistList(assists);
+                vos.add(vo);
+            });
+            return vos;
+        }
+        return null;
+    }
+
+    @Override
+    public int allOperation(List<CrmCustomerAssistOperationParam> params,Long companyId,Long companyUserId) {
+        AtomicInteger count = new AtomicInteger();
+        params.forEach(param->{
+            String operation = param.getOperation();
+            switch (operation){
+                case "ADD":
+                    if (!Objects.equals(companyUserId, param.getCompanyUserId())){
+                        param.setCompanyId(companyId);
+                        crmCustomerAssistMapper.insertCrmCustomerAssist(param);
+                    }
+                    break;
+                case "DELETE":
+                    crmCustomerAssistMapper.deleteCrmCustomerAssistById(param.getId());
+                    break;
+                case "UPDATE":
+                    param.setCompanyId(companyId);
+                    crmCustomerAssistMapper.updateCrmCustomerAssist(param);
+                    break;
+                default:
+                    break;
+            }
+            count.getAndIncrement();
+        });
+        return count.get();
+    }
 }

+ 0 - 51
fs-service-system/src/main/java/com/fs/crm/service/impl/CrmCustomerServiceImpl.java

@@ -796,57 +796,6 @@ public class CrmCustomerServiceImpl extends ServiceImpl<CrmCustomerMapper, CrmCu
         return R.ok("分配成功");
     }
 
-    @Override
-    @Transactional
-    public R assistToUser(String opeUserName, Long opeUserId, CrmCustomeAssignParam param) {
-        Integer index=0;
-        for(CrmCustomerAssignUserDTO userDTO:param.getUsers()){
-            CompanyUser companyUser=companyUserMapper.selectCompanyUserById(userDTO.getCompanyUserId());
-            for(int i=0;i<userDTO.getCount();i++){
-                CrmCustomer customer=crmCustomerMapper.selectCrmCustomerById(param.getCustomerIds().get(index));
-                //不能选择客户拥有者本人
-                CrmCustomerUser crmCustomerUser = crmCustomerUserMapper.selectCrmCustomerUserById(customer.getCustomerUserId());
-                if (Objects.equals(crmCustomerUser.getCompanyUserId(), userDTO.getCompanyUserId())){
-                    return R.error("不能选择自己来协作!");
-                }
-                //查询协作客户
-                CrmCustomerAssist customerAssist=new CrmCustomerAssist();
-                customerAssist.setCustomerId(customer.getCustomerId());
-                customerAssist.setCompanyUserId(userDTO.getCompanyUserId());
-                List<CrmCustomerAssist> tempList = assistMapper.selectCrmCustomerAssistList(customerAssist);
-                if(tempList!=null && !tempList.isEmpty()){
-                    return R.error("销售:" + companyUser.getNickName() +"(" + userDTO.getCompanyUserId() + ")已拥有改该协作客户:" + customer.getCustomerName());
-                }
-                customerAssist.setCompanyId(param.getCompanyId());
-                customerAssist.setCompanyUserName(companyUser.getNickName());
-                customerAssist.setCreateTime(new Date());
-                assistMapper.insertCrmCustomerAssist(customerAssist);
-                //写日志
-                CrmCustomerLogs logs=new CrmCustomerLogs();
-                logs.setCustomerId(customer.getCustomerId());
-                logs.setCreateTime(new Date());
-                logs.setLogsType(CustomerLogEnum.ASSIST_USER.getValue());
-                logs.setTitle(CustomerLogEnum.ASSIST_USER.getDesc());
-                logs.setRemark(opeUserName+"为客户"+customer.getCustomerName()+"添加协作人:" + companyUser.getNickName());
-                logs.setCompanyUserId(userDTO.getCompanyUserId());
-                logsMapper.insertCrmCustomerLogs(logs);
-
-                if(StringUtils.isNotEmpty(companyUser.getJpushId())){
-                    Map<String, String> extrasMap=new HashMap<>();
-                    extrasMap.put("customerId",customer.getCustomerId().toString());
-                    extrasMap.put("type","1");
-                    try {
-                        jpushService.sendRegisterIdPush("客户消息","您收到 一个客户协作邀请",extrasMap,companyUser.getJpushId());
-                    } catch (APIConnectionException e) {
-                    } catch (APIRequestException e) {
-                    }
-                }
-                index++;
-            }
-        }
-        return R.ok();
-    }
-
     @Override
     public int updateCrmCustomerSource(CrmCustomerEditSourceParam param) {
         return crmCustomerMapper.updateCrmCustomerSource(param);

+ 12 - 0
fs-service-system/src/main/java/com/fs/crm/vo/CrmCustomerAssistVo.java

@@ -0,0 +1,12 @@
+package com.fs.crm.vo;
+
+import com.fs.crm.domain.CrmCustomerAssist;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CrmCustomerAssistVo {
+    private Long customerId;
+    private List<CrmCustomerAssist> assistList;
+}

+ 20 - 7
fs-service-system/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java

@@ -17,6 +17,8 @@ import com.fs.erp.dto.sdk.wangdian.api.WdtClient;
 import com.fs.erp.dto.sdk.wangdian.enums.*;
 import com.fs.erp.dto.wdt.*;
 import com.fs.erp.service.IErpOrderService;
+import com.fs.his.config.FsErpConfig;
+import com.fs.his.utils.ConfigUtil;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.domain.FsStoreProduct;
 import com.fs.store.service.IFsStoreOrderItemService;
@@ -54,12 +56,19 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
     @Autowired
     private IFsStoreProductService fsStoreProductService;
 
-    @Value("${fsConfig.erpWdShopCode}")
-    private String shopCode;
+//    @Value("${fsConfig.erpWdShopCode}")
+//    private String shopCode;
 
     @Autowired
     private WdtClient client;
 
+    @Autowired
+    private ConfigUtil configUtil;
+
+
+
+
+
     /**
      * 普通推送
      */
@@ -85,8 +94,9 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         //测试环境sid、appkey、密钥请到旺店通开放平台-自助对接-申请测试环境内查看,测试环境url=https://sandbox.wangdian.cn/openapi2/
         //调用正式环境时请将sid、appkey、appsecret切换为实际参数,参数在旺店通开放平台-自助对接-应用管理内应用状态为已上线的应用中查看,调用正式环境注意切换正式环境url=https://api.wangdian.cn/openapi2/
 
+        FsErpConfig erpconfig = configUtil.getErpConfig();
         ErpWdtBusinessRequestParams erpWdtBusinessRequestParams = new ErpWdtBusinessRequestParams();
-        erpWdtBusinessRequestParams.setShopNo(shopCode);
+        erpWdtBusinessRequestParams.setShopNo(erpconfig.getErpWdShopCode());
         erpWdtBusinessRequestParams.setSwitchMode(0);
         ErpWdtTrade erpWdtTrade = new ErpWdtTrade();
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(order.getPlatform_code());
@@ -260,7 +270,7 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
 //        //调用正式环境时请将sid、appkey、appsecret切换为实际参数,参数在旺店通开放平台-自助对接-应用管理内应用状态为已上线的应用中查看,调用正式环境注意切换正式环境url=https://api.wangdian.cn/openapi2/
 //
 //        ErpWdtBusinessRequestParams erpWdtBusinessRequestParams = new ErpWdtBusinessRequestParams();
-//        erpWdtBusinessRequestParams.setShopNo(shopCode);
+//        erpWdtBusinessRequestParams.setShopNo(erpconfig.getErpWdShopCode());
 //        erpWdtBusinessRequestParams.setSwitchMode(0);
 //        ErpWdtTrade erpWdtTrade = new ErpWdtTrade();
 //        FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(order.getPlatform_code());
@@ -436,8 +446,9 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         //测试环境sid、appkey、密钥请到旺店通开放平台-自助对接-申请测试环境内查看,测试环境url=https://sandbox.wangdian.cn/openapi2/
         //调用正式环境时请将sid、appkey、appsecret切换为实际参数,参数在旺店通开放平台-自助对接-应用管理内应用状态为已上线的应用中查看,调用正式环境注意切换正式环境url=https://api.wangdian.cn/openapi2/
 
+        FsErpConfig erpconfig = configUtil.getErpConfig();
         ErpWdtBusinessRequestParams erpWdtBusinessRequestParams = new ErpWdtBusinessRequestParams();
-        erpWdtBusinessRequestParams.setShopNo(shopCode);
+        erpWdtBusinessRequestParams.setShopNo(erpconfig.getErpWdShopCode());
         erpWdtBusinessRequestParams.setSwitchMode(0);
         ErpWdtTrade erpWdtTrade = new ErpWdtTrade();
 
@@ -608,6 +619,7 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
 
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
+        FsErpConfig erpconfig = configUtil.getErpConfig();
         log.info("退款单更新: {}", param);
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(param.getTid());
 
@@ -654,7 +666,7 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         }
         List<ErpWdtApiRefund> erpWdtApiRefunds = Collections.singletonList(ErpWdtApiRefund.builder()
                 .platformId(127)
-                .shopNo(shopCode)
+                .shopNo(erpconfig.getErpWdShopCode())
                 .tid(param.getTid())
                 .refundNo(param.getTid())
                 .type(RefundTypeEnum.REFUND_BEFORE_SHIPPING.getCode())
@@ -687,8 +699,9 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         //测试环境sid、appkey、密钥请到旺店通开放平台-自助对接-申请测试环境内查看,测试环境url=https://sandbox.wangdian.cn/openapi2/
         //调用正式环境时请将sid、appkey、appsecret切换为实际参数,参数在旺店通开放平台-自助对接-应用管理内应用状态为已上线的应用中查看,调用正式环境注意切换正式环境url=https://api.wangdian.cn/openapi2/
 
+        FsErpConfig erpconfig = configUtil.getErpConfig();
         ErpWdtBusinessRequestParams erpWdtBusinessRequestParams = new ErpWdtBusinessRequestParams();
-        erpWdtBusinessRequestParams.setShopNo(shopCode);
+        erpWdtBusinessRequestParams.setShopNo(erpconfig.getErpWdShopCode());
         erpWdtBusinessRequestParams.setSwitchMode(0);
         ErpWdtTrade erpWdtTrade = new ErpWdtTrade();
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(order.getPlatform_code());

+ 20 - 0
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java

@@ -25,6 +25,7 @@ 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;
@@ -216,6 +217,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     private IFsStoreOrderAuditService orderAuditService;
     @Autowired
     private IFsStoreOrderAuditLogService orderAuditLogService;
+    @Autowired
+    private CompanyMapper companyMapper;
 
     /**
      * 查询订单
@@ -593,6 +596,18 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
                     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){
@@ -607,6 +622,10 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             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());
@@ -1010,6 +1029,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             createParam.setPayPrice(param.getPayPrice());
             createParam.setCustomerId(param.getCustomerId());
             createParam.setAmount(param.getAmount());
+            createParam.setOrderCreateType(3); //后台制单
             return this.createOrder(param.getUserId(),createParam);
         }
         else{

+ 8 - 0
fs-service-system/src/main/java/com/fs/wx/pay/config/WxPayProperties.java

@@ -40,4 +40,12 @@ public class WxPayProperties {
 
   private String notifyUrl;
 
+  private String privateKeyPath;
+
+  private String privateCertPath;
+
+  private String certSerialNo;
+
+  private String nativeNotifyUrl;
+
 }

+ 9 - 4
fs-service-system/src/main/resources/application-config-fby.yml

@@ -84,14 +84,17 @@ wx:
         msgDataFormat: JSON
 
   pay:
-    appId: wx11a2ce7c2bbc4521 #微信公众号或者小程序等的appid
-    mchId: 1703311381 #微信支付商户号
-    mchKey: FotTIbIzn4AisMW7de712LJQIazSqqAl #微信支付商户密钥
-    v3Key: y5Eo99q93qzdQRAs6E2BDKIF7f3EnS3G
+    appId: wx961fadab9bcb792b #微信公众号或者小程序等的appid
+    mchId: 1716217886 #微信支付商户号
+    mchKey: a7Fc5B9dE2h8J3kL4mN6pQ7rS9tU2vW1 #微信支付商户密钥
     subAppId:  #服务商模式下的子商户公众账号ID
     subMchId:  #服务商模式下的子商户号
     keyPath: c:\\Tools\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
     notifyUrl:  https://userapp.bly.ylrztop.com/app/wxpay/wxPayNotify
+    privateKeyPath: 'C:\cert\1716217886_20250509_cert\apiclient_key.pem'
+    privateCertPath: 'C:\cert\1716217886_20250509_cert\apiclient_cert.pem'
+    certSerialNo: '4E8BD68BC2BFD37CA58244D660E5FDCCE475D82E'
+    nativeNotifyUrl: 'https://userapp.bly.ylrztop.com/app/wxpay/wxPayNotify'
   mp:
     useRedis: false
     redisConfig:
@@ -120,3 +123,5 @@ tencent_cloud_config:
   proxy: fby
 cloud_host:
   company_name: 福本源
+headerImg:
+  imgUrl:

+ 4 - 2
fs-service-system/src/main/resources/application-config-zkzh.yml

@@ -92,8 +92,8 @@ wx:
       port: 6379
       timeout: 2000
     configs:
-      - appId: wx93ce67750e3cfba3 # 第一个公众号的appid  //公众号名称:云联
-        secret: eddde2a1d4ca0c6c443a67e542b6864c
+      - appId: wx3de90a39feb8107a # 第一个公众号的appid  //公众号名称:中康未来健康服务
+        secret: 473a992e28d5c524b4ff3783559026cb
         token: PPKOdAlCoMO # 接口配置里的Token值
         aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
 jpush:
@@ -113,3 +113,5 @@ tencent_cloud_config:
   proxy: zkzh
 cloud_host:
   company_name: 中康
+headerImg:
+  imgUrl: https://zkzh-2025.oss-cn-beijing.aliyuncs.com/fs/20250619/e31b5e051a474a7a9b4ad02575b46196.png

+ 137 - 0
fs-service-system/src/main/resources/application-druid-bly-test.yml

@@ -0,0 +1,137 @@
+# 数据源配置
+spring:
+    # redis 配置
+    redis:
+        # 地址
+        host: 127.0.0.1
+        # 端口,默认为6379
+        port: 6379
+        # 密码
+        password:
+        # 连接超时时间
+        timeout: 30s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 8
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+        database: 0
+    datasource:
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://113.44.133.86:3306/bly_store_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: bly@2025
+                # 从库数据源
+                slave:
+                    # 从数据源开关/默认关闭
+                    enabled: false
+                    url:
+                    username:
+                    password:
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://113.44.133.86:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: bly@2025
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+    producer:
+        group: my-producer-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+    consumer:
+        group: test-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey

+ 2 - 0
fs-service-system/src/main/resources/application-druid-bly.yml

@@ -1,5 +1,7 @@
 # 数据源配置
 spring:
+    profiles:
+        include: config-bly,common
     # redis 配置
     redis:
         # 地址

+ 2 - 0
fs-service-system/src/main/resources/application-druid-fby.yml

@@ -1,5 +1,7 @@
 # 数据源配置
 spring:
+  profiles:
+    include: common,config-fby
   # redis 配置
   redis:
     # 地址

+ 139 - 0
fs-service-system/src/main/resources/application-druid-zkzh-test.yml

@@ -0,0 +1,139 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-zkzh,common
+    # redis 配置
+    redis:
+        # 地址
+        host: 127.0.0.1
+        # 端口,默认为6379
+        port: 6379
+        # 密码
+        password:
+        # 连接超时时间
+        timeout: 30s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 8
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+        database: 0
+    datasource:
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://47.111.26.148:2345/jz_store?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Zkhj951753@#
+                # 从库数据源
+                slave:
+                    # 从数据源开关/默认关闭
+                    enabled: false
+                    url:
+                    username:
+                    password:
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://47.111.26.148:2345/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Zkhj951753@#
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+    producer:
+        group: my-producer-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+    consumer:
+        group: test-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey

+ 2 - 0
fs-service-system/src/main/resources/application-druid-zkzh.yml

@@ -1,5 +1,7 @@
 # 数据源配置
 spring:
+    profiles:
+        include: config-zkzh,common
     # redis 配置
     redis:
         # 地址

+ 4 - 0
fs-service-system/src/main/resources/mapper/company/CompanyMapper.xml

@@ -27,6 +27,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="isDel"    column="is_del"    />
         <result property="voiceCallerNumber"    column="voice_caller_number"    />
         <result property="omsCode"    column="oms_code"    />
+        <result property="isPay"    column="is_pay"    />
     </resultMap>
 
     <sql id="selectCompanyVo">
@@ -90,6 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isDel != null">is_del,</if>
             <if test="omsCode != null ">oms_code,</if>
             <if test="voiceCallerNumber != null">voice_caller_number,</if>
+            <if test="isPay != null">is_pay,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyName != null">#{companyName},</if>
@@ -113,6 +115,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isDel != null">#{isDel},</if>
             <if test="omsCode != null ">#{omsCode},</if>
             <if test="voiceCallerNumber != null">#{voiceCallerNumber},</if>
+            <if test="isPay != null">#{isPay},</if>
          </trim>
     </insert>
 
@@ -141,6 +144,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="voiceCallerNumber != null">voice_caller_number = #{voiceCallerNumber},</if>
             <if test="omsCode != null ">oms_code = #{omsCode},</if>
             <if test="fsUserIsDefaultBlack != null ">fs_user_is_default_black = #{fsUserIsDefaultBlack},</if>
+            <if test="isPay != null ">is_pay = #{isPay},</if>
         </trim>
         where company_id = #{companyId}
     </update>

+ 15 - 7
fs-service-system/src/main/resources/mapper/course/FsUserCourseMapper.xml

@@ -267,6 +267,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         inner join fs_course_watch_log fcwl on fcwl.video_id = fucv.video_id
         inner join fs_user fu on fu.user_id = fcwl.user_id
         where fucv.video_id = #{params.videoId}
+        <if test="params.companyId != null">
+            and fcwl.company_id = #{params.companyId}
+        </if>
+        <if test="params.companyUserId != null">
+            and fcwl.company_user_id = #{params.companyUserId}
+        </if>
         <if test="params.keyword != null and params.keyword != ''">
             and (
                 fu.user_id = #{params.keyword}
@@ -278,20 +284,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <choose>
             <when test="params.type == 0">
                 and (
-                    select count(log_id) as count
-                    from fs_course_answer_logs
-                    where user_id = fu.user_id and fcwl.video_id = fucv.video_id and is_right = 1
+                    select count(log.log_id) as count
+                    from fs_course_answer_logs log
+                    where log.user_id = fu.user_id and log.video_id = fucv.video_id and log.is_right = 1
+                ) > 0
+                and (
+                    select count(log.log_id) as count
+                    from fs_course_red_packet_log log
+                    where log.user_id = fu.user_id and log.video_id = fucv.video_id and log.status = 1
                 ) > 0
             </when>
             <when test="params.type == 1">
                 and fcwl.log_type = 2
             </when>
             <when test="params.type == 2">
-                and fcwl.log_type in (1,4)
+                and fcwl.log_type = 4
             </when>
-            <otherwise>
-                and fcwl.log_type = 3
-            </otherwise>
         </choose>
         group by fu.user_id, fucv.video_id, fu.nickname, fu.username, fu.avatar, fu.phone, fu.create_time
     </select>

+ 11 - 2
fs-service-system/src/main/resources/mapper/crm/CrmCustomerAssistMapper.xml

@@ -11,10 +11,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="companyUserName"    column="company_user_name"    />
         <result property="customerId"    column="customer_id"    />
         <result property="createTime"    column="create_time"    />
+        <result property="rate"    column="rate"    />
     </resultMap>
 
     <sql id="selectCrmCustomerAssistVo">
-        select id, company_id, company_user_id,company_user_name, customer_id, create_time from crm_customer_assist
+        select id, company_id, company_user_id,company_user_name, customer_id, create_time,rate from crm_customer_assist
     </sql>
 
     <select id="selectCrmCustomerAssistList" parameterType="CrmCustomerAssist" resultMap="CrmCustomerAssistResult">
@@ -32,7 +33,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where id = #{id}
     </select>
     <select id="selectCompanyUserNameByCustomerId" resultType="java.lang.String">
-        select  CONCAT(company_user_name, '(', company_user_id, ')') AS assistUser
+        select  CONCAT(company_user_name, '(', company_user_id, ')','分佣:',rate,'%') AS assistUser
         from crm_customer_assist
         where customer_id = #{customerId}
     </select>
@@ -42,6 +43,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectCompanyUserIdByCustomerId" resultType="java.lang.Long">
         select company_user_id from crm_customer_assist where customer_id = #{customerId} and create_time &lt; #{createTime}
     </select>
+    <select id="selectByCustomerId" resultType="com.fs.crm.domain.CrmCustomerAssist">
+        <include refid="selectCrmCustomerAssistVo"/>
+        where  customer_id = #{customerId}
+
+    </select>
 
     <insert id="insertCrmCustomerAssist" parameterType="CrmCustomerAssist" useGeneratedKeys="true" keyProperty="id">
         insert into crm_customer_assist
@@ -51,6 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyUserName != null">company_user_name,</if>
             <if test="customerId != null">customer_id,</if>
             <if test="createTime != null">create_time,</if>
+            <if test="rate != null">rate,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyId != null">#{companyId},</if>
@@ -58,6 +65,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyUserName != null">#{companyUserName},</if>
             <if test="customerId != null">#{customerId},</if>
             <if test="createTime != null">#{createTime},</if>
+            <if test="rate != null">#{rate},</if>
          </trim>
     </insert>
 
@@ -69,6 +77,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyUserName != null">company_user_name = #{companyUserName},</if>
             <if test="customerId != null">customer_id = #{customerId},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="rate != null">rate = #{rate},</if>
         </trim>
         where id = #{id}
     </update>

+ 1 - 1
fs-user-app/src/main/resources/application.yml

@@ -7,5 +7,5 @@ server:
 spring:
   profiles:
     active: dev
-    include: common,config-dev
+#    include: common,config-dev
 

+ 235 - 0
nginx.config

@@ -0,0 +1,235 @@
+worker_processes auto;
+worker_rlimit_nofile 51200;
+events
+{
+	worker_connections 51200;
+	multi_accept on;
+}
+http {
+		include       mime.types;
+		#include luawaf.conf;
+		include proxy.conf;
+        default_type  application/octet-stream;
+
+        server_names_hash_bucket_size 512;
+        client_header_buffer_size 32k;
+        large_client_header_buffers 4 32k;
+        client_max_body_size 50m;
+
+        sendfile   on;
+        tcp_nopush on;
+
+        keepalive_timeout 60;
+
+        tcp_nodelay on;
+
+        fastcgi_connect_timeout 300;
+        fastcgi_send_timeout 300;
+        fastcgi_read_timeout 300;
+        fastcgi_buffer_size 64k;
+        fastcgi_buffers 4 64k;
+        fastcgi_busy_buffers_size 128k;
+        fastcgi_temp_file_write_size 256k;
+		fastcgi_intercept_errors on;
+
+        gzip on;
+        gzip_min_length  1k;
+        gzip_buffers     4 16k;
+        gzip_http_version 1.1;
+        gzip_comp_level 2;
+        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
+        gzip_vary on;
+        gzip_proxied   expired no-cache no-store private auth;
+        gzip_disable   "MSIE [1-6]\.";
+
+        limit_conn_zone $binary_remote_addr zone=perip:10m;
+		limit_conn_zone $server_name zone=perserver:10m;
+
+        server_tokens off;
+        access_log off;
+
+    server {
+        listen       80;
+        server_name  localhost;
+
+        #charset koi8-r;
+
+        #access_log  logs/host.access.log  main;
+
+        location / {
+            root   html;
+            index  index.html index.htm;
+        }
+		location /nginx_status {
+        	allow 127.0.0.1;
+            deny all;
+            stub_status on;
+            access_log  off;
+        }
+    }
+    server {
+    listen       80;
+    server_name  admin.fbylive.com;
+	proxy_connect_timeout 300;
+	proxy_send_timeout 300;
+	proxy_read_timeout 300;
+        location / {
+          root   C:\Tools\ui\adminUI;
+          try_files $uri $uri/ /index.html;
+          index  index.html index.htm;
+    }
+     location /prod-api/ {
+            proxy_set_header Host $http_host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header REMOTE_HOST $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+			proxy_set_header X-Forwarded-Proto $scheme;
+			proxy_set_header X-NginX-Proxy true;
+            proxy_pass http://localhost:7011/;
+    		client_body_timeout 500s;
+			client_max_body_size 200m;
+			proxy_connect_timeout 1800s;
+			proxy_send_timeout 1800s;
+			proxy_read_timeout 1800s;
+			send_timeout 1800s;
+       		 }
+    }
+     server {
+      listen       80;
+        server_name  company.fbylive.com;
+		proxy_connect_timeout 300;
+	proxy_send_timeout 300;
+	proxy_read_timeout 300;
+        location / {
+            root   C:\Tools\ui\companyUI;
+            try_files $uri $uri/ /index.html;
+            index  index.html index.htm;
+        	}
+        location /prod-api/ {
+            			proxy_set_header Host $http_host;
+            			proxy_set_header X-Real-IP $remote_addr;
+            			proxy_set_header REMOTE_HOST $remote_addr;
+            			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+			proxy_set_header X-Forwarded-Proto $scheme;
+			proxy_set_header X-NginX-Proxy true;
+            			proxy_pass http://localhost:7012/;
+    			client_body_timeout 500s;
+			client_max_body_size 200m;
+			proxy_connect_timeout 1800s;
+			proxy_send_timeout 1800s;
+			proxy_read_timeout 1800s;
+			send_timeout 1800s;
+       		 }
+       }
+		server {
+		listen 80;
+		server_name scrm.fbylive.com;
+		location / {
+			proxy_pass http://localhost:8006/;
+			proxy_set_header Host $host;
+			proxy_set_header X-Real-IP $remote_addr;
+			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+			proxy_set_header X-Forwarded-Proto $scheme;
+		}
+		location /WW_verify_CquJP69UyLfoMwTY.txt {
+			alias C:\\Tools\\ui\\WW_verify_CquJP69UyLfoMwTY.txt;
+
+        }
+		location /qwh5/ {
+
+			alias C:\\Tools\\ui\\qwh5\\;
+			try_files $uri $uri/ /qwh5/index.html;
+
+
+		}
+		location /apis/ {
+			proxy_pass http://localhost:7771/;
+			proxy_set_header Host $host;
+			proxy_set_header X-Real-IP $remote_addr;
+			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+			proxy_set_header X-Forwarded-Proto $scheme;
+		}
+	}
+    		server {
+		listen 80;
+		server_name scrm.hyljcourse.com;
+		location / {
+			proxy_pass http://localhost:8006/;
+			proxy_set_header Host $host;
+			proxy_set_header X-Real-IP $remote_addr;
+			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+			proxy_set_header X-Forwarded-Proto $scheme;
+		}
+		location /WW_verify_CquJP69UyLfoMwTY.txt {
+			alias C:\\Tools\\ui\\WW_verify_CquJP69UyLfoMwTY.txt;
+
+        }
+
+        location /qwh5 {
+        alias C:\\Tools\\ui\\qwh5UI\\;
+        try_files $uri $uri/ /qwh5/index.html;
+        }
+		location /apis/ {
+			proxy_pass http://localhost:7771/;
+			proxy_set_header Host $host;
+			proxy_set_header X-Real-IP $remote_addr;
+			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+			proxy_set_header X-Forwarded-Proto $scheme;
+		}
+	}
+    server {
+		listen 80;
+		server_name tool.fbylive.com;
+		location / {
+			proxy_pass http://localhost:7771/;
+			proxy_set_header Host $host;
+			proxy_set_header X-Real-IP $remote_addr;
+			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+			proxy_set_header X-Forwarded-Proto $scheme;
+		}
+	}
+    server {
+		listen 80;
+		server_name userapp.fbylive.com;
+		location / {
+			proxy_pass http://localhost:7005/;
+			proxy_set_header Host $host;
+			proxy_set_header X-Real-IP $remote_addr;
+			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+			proxy_set_header X-Forwarded-Proto $scheme;
+		}
+	}
+     server {
+		listen 80;
+		server_name h5.fbylive.com;
+		location / {
+
+            root   C:\Tools\ui\companyAppUI;
+            index  index.html index.htm;
+            try_files $uri $uri/ /index.html;
+        }
+        location /courseH5 {
+        alias C:\Tools\ui\courseh5UI;
+         try_files $uri $uri/ /courseH5/index.html;  # 回退到index.html
+        }
+        location /prod-api/ {
+            proxy_pass http://localhost:7015/;
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_set_header X-Forwarded-Proto $scheme;
+        }
+        location /MP_verify_W5rBtdyb9f8ytWWG.txt {
+			alias C:\\Tools\\ui\\MP_verify_W5rBtdyb9f8ytWWG.txt;
+        }
+	}
+    include vhost/*.conf;
+    #加载vhost目录下的虚拟主机配置文件
+}
+stream {
+    # TCP/UDP 代理配置
+    server {
+        listen 2345;
+        proxy_pass 192.168.0.74:3306;
+    }
+}