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

Merge remote-tracking branch 'origin/bjcz_his_scrm' into bjcz_his_scrm

# Conflicts:
#	fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
xw преди 1 ден
родител
ревизия
4c4eaf7f01
променени са 100 файла, в които са добавени 2932 реда и са изтрити 233 реда
  1. 8 1
      fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java
  2. 62 4
      fs-admin/src/main/java/com/fs/course/controller/FsUserCourseTrainingCampController.java
  3. 59 0
      fs-admin/src/main/java/com/fs/course/task/CompanyBalanceTask.java
  4. 15 13
      fs-admin/src/main/java/com/fs/crm/controller/CrmCustomerController.java
  5. 28 26
      fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java
  6. 19 17
      fs-admin/src/main/java/com/fs/his/controller/FsUserController.java
  7. 38 9
      fs-admin/src/main/java/com/fs/his/task/Task.java
  8. 3 3
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java
  9. 7 4
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  10. 29 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java
  11. 37 4
      fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java
  12. 5 2
      fs-admin/src/main/java/com/fs/qw/controller/QwExternalContactTransferCompanyAuditController.java
  13. 103 0
      fs-admin/src/main/java/com/fs/qw/controller/QwUserComplainRecordController.java
  14. 7 2
      fs-admin/src/main/java/com/fs/qw/controller/QwUserController.java
  15. 27 0
      fs-admin/src/main/java/com/fs/task/SgTestController.java
  16. 25 0
      fs-admin/src/main/java/com/fs/task/SyncTuLinStudentInfoTask.java
  17. 26 7
      fs-admin/src/main/java/com/fs/web/controller/system/SysLoginController.java
  18. 1 1
      fs-admin/src/main/resources/application.yml
  19. 2 2
      fs-common-api/src/main/resources/application.yml
  20. 5 0
      fs-common/src/main/java/com/fs/common/constant/FsConstants.java
  21. 7 0
      fs-common/src/main/java/com/fs/common/enums/ImTypeEnum.java
  22. 8 7
      fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  23. 2 2
      fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  24. 39 0
      fs-company/src/main/java/com/fs/company/controller/common/CommonController.java
  25. 222 9
      fs-company/src/main/java/com/fs/company/controller/common/Test.java
  26. 9 0
      fs-company/src/main/java/com/fs/company/controller/company/CompanyProfileController.java
  27. 15 6
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  28. 5 2
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactTransferCompanyAuditController.java
  29. 10 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopLogsController.java
  30. 71 0
      fs-company/src/main/java/com/fs/company/controller/store/FsPrescribeController.java
  31. 2 2
      fs-company/src/main/java/com/fs/company/controller/store/FsStoreOrderController.java
  32. 2 2
      fs-company/src/main/resources/application.yml
  33. 4 3
      fs-doctor-app/src/main/java/com/fs/app/controller/DoctorController.java
  34. 16 10
      fs-doctor-app/src/main/java/com/fs/app/controller/DrugReportController.java
  35. 40 25
      fs-doctor-app/src/main/java/com/fs/app/controller/InquiryOrderController.java
  36. 41 1
      fs-doctor-app/src/main/java/com/fs/app/controller/PrescribeController.java
  37. 18 2
      fs-doctor-app/src/main/java/com/fs/framework/config/MyBatisConfig.java
  38. 2 2
      fs-doctor-app/src/main/resources/mybatis/mybatis-config.xml
  39. 1 1
      fs-ipad-task/src/main/resources/application.yml
  40. 35 2
      fs-qw-api/src/main/java/com/fs/app/controller/CommonController.java
  41. 46 0
      fs-qw-api/src/main/java/com/fs/app/controller/QwUserComplainRecordController.java
  42. 1 1
      fs-qwhook-sop/src/main/resources/application.yml
  43. 2 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyMapper.java
  44. 3 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  45. 267 0
      fs-service/src/main/java/com/fs/course/domain/BalanceRollbackError.java
  46. 59 0
      fs-service/src/main/java/com/fs/course/domain/FsUserCompanyUserQw.java
  47. 18 0
      fs-service/src/main/java/com/fs/course/mapper/BalanceRollbackErrorMapper.java
  48. 61 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserQwMapper.java
  49. 3 3
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java
  50. 1 1
      fs-service/src/main/java/com/fs/course/param/FsUserCourseOrderDoPayParam.java
  51. 16 0
      fs-service/src/main/java/com/fs/course/service/BalanceRollbackErrorService.java
  52. 61 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCompanyUserQwService.java
  53. 0 1
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseComplaintRecordService.java
  54. 1 1
      fs-service/src/main/java/com/fs/course/service/IFsUserCoursePeriodService.java
  55. 175 0
      fs-service/src/main/java/com/fs/course/service/impl/BalanceRollbackErrorServiceImpl.java
  56. 94 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCompanyUserQwServiceImpl.java
  57. 1 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseComplaintRecordServiceImpl.java
  58. 35 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodServiceImpl.java
  59. 167 15
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  60. 3 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogListVO.java
  61. 1 0
      fs-service/src/main/java/com/fs/erp/dto/ErpRefundUpdateRequest.java
  62. 10 0
      fs-service/src/main/java/com/fs/erp/dto/OrderItemDTO.java
  63. 110 0
      fs-service/src/main/java/com/fs/erp/mapper/FsJstAftersalePushScrmMapper.java
  64. 77 0
      fs-service/src/main/java/com/fs/erp/mapper/FsJstCodPushScrmMapper.java
  65. 5 0
      fs-service/src/main/java/com/fs/erp/service/FsJstAftersalePushScrmService.java
  66. 5 0
      fs-service/src/main/java/com/fs/erp/service/FsJstCodPushScrmService.java
  67. 3 0
      fs-service/src/main/java/com/fs/erp/service/IErpGoodsService.java
  68. 1 1
      fs-service/src/main/java/com/fs/erp/service/IErpOrderService.java
  69. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  70. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/ErpGoodsServiceImpl.java
  71. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/ErpOrderServiceImpl.java
  72. 176 0
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushScrmServiceImpl.java
  73. 12 8
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushServiceImpl.java
  74. 55 0
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstCodPushScrmServiceImpl.java
  75. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpGoodsServiceImpl.java
  76. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpOrderServiceImpl.java
  77. 93 0
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java
  78. 144 20
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java
  79. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/K9OrderScrmServiceImpl.java
  80. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/K9StockScrmServiceImpl.java
  81. 15 0
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpGoodsServiceImpl.java
  82. 5 0
      fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java
  83. 1 0
      fs-service/src/main/java/com/fs/his/dto/InquiryConfigDTO.java
  84. 4 0
      fs-service/src/main/java/com/fs/his/dto/PayloadDTO.java
  85. 1 0
      fs-service/src/main/java/com/fs/his/enums/FsStoreOrderLogEnum.java
  86. 10 7
      fs-service/src/main/java/com/fs/his/mapper/FsDfAccountMapper.java
  87. 1 0
      fs-service/src/main/java/com/fs/his/mapper/FsInquiryOrderMapper.java
  88. 21 0
      fs-service/src/main/java/com/fs/his/mapper/FsPrescribeMapper.java
  89. 9 1
      fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java
  90. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderComputeParam.java
  91. 2 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderCreateParam.java
  92. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderDoPayParam.java
  93. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderPayParam.java
  94. 27 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeListDCompanyParam.java
  95. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeListDParam.java
  96. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeListUParam.java
  97. 1 0
      fs-service/src/main/java/com/fs/his/param/FsPrescribeParam.java
  98. 2 0
      fs-service/src/main/java/com/fs/his/service/IFsDfAccountService.java
  99. 1 1
      fs-service/src/main/java/com/fs/his/service/IFsExportTaskService.java
  100. 1 0
      fs-service/src/main/java/com/fs/his/service/IFsInquiryOrderService.java

+ 8 - 1
fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java

@@ -164,7 +164,7 @@ public class FsUserCoursePeriodController extends BaseController {
     @ApiOperation("一键批量添加课程小节")
     public R batchAddCourseSections(@Validated @RequestBody BatchAddCourseSectionParam param) {
         try {
-            logger.info("开始批量添加课程小节,营期ID:{},课程ID:{},视频数量:{},视频ID列表:{}", 
+            logger.info("开始批量添加课程小节,营期ID:{},课程ID:{},视频数量:{},视频ID列表:{}",
                 param.getPeriodId(), param.getCourseId(), param.getVideoIds().size(), param.getVideoIds());
             return fsUserCoursePeriodDaysService.batchAddCourseSections(param);
         } catch (Exception e) {
@@ -308,4 +308,11 @@ public class FsUserCoursePeriodController extends BaseController {
         return R.ok();
     }
 
+    @ApiOperation("复制创建成功的营期和对应营期中的看课")
+    @PostMapping("/copyExistCampPeriod")
+    public R copyExistCampPeriod(@RequestBody PeriodStatisticCountParam param){
+        R result = fsUserCoursePeriodService.copyFsUserCoursePeriodAndCourse(param);
+        return result;
+    }
+
 }

+ 62 - 4
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseTrainingCampController.java

@@ -9,11 +9,15 @@ import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.SortUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.course.config.CourseConfig;
+import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.domain.FsUserCourseTrainingCamp;
 import com.fs.course.dto.FsUserCourseTrainingCampDTO;
 import com.fs.course.dto.FsUserCourseTrainingCampUpdateDTO;
+import com.fs.course.service.IFsUserCoursePeriodService;
 import com.fs.course.service.IFsUserCourseTrainingCampService;
+import com.fs.course.vo.FsUserCoursePeriodVO;
 import com.fs.course.vo.FsUserCourseTrainingCampVO;
 import com.fs.framework.web.service.TokenService;
 import com.fs.his.vo.OptionsVO;
@@ -25,10 +29,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 @RestController
 @RequestMapping("/course/trainingCamp")
@@ -39,6 +40,8 @@ public class FsUserCourseTrainingCampController {
     private final TokenService tokenService;
 
     private final ISysConfigService configService;
+    private final IFsUserCoursePeriodService fsUserCoursePeriodService;
+
     /**
      * 查询训练营列表
      */
@@ -147,4 +150,59 @@ public class FsUserCourseTrainingCampController {
         return R.ok().put("data", new PageInfo<>(campList));
     }
 
+
+    /**
+     * 通过训练营来筛选营期-展示创建成功的营期
+     *
+     * @return
+     */
+    @GetMapping("/getScreeningCampPeriod")
+    public R getScreeningCampPeriod(@RequestParam String campPeriodType,
+                                    @RequestParam(required = false) Long periodId,
+                                    @RequestParam(required = false) String campPeriodName) {
+        try {
+            // 获取用户和配置信息
+            LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+            Long userId = loginUser.getUser().getUserId();
+            CourseConfig config = getCourseConfig();
+            boolean needBindUser = config != null && config.getIsBound();
+            if ("2".equals(campPeriodType)) {
+                // 查询其他训练营
+                List<FsUserCoursePeriodVO> resultList = new ArrayList<>();
+                Map<String, Object> params = new HashMap<>();
+                params.put("scs", SortUtils.parseSort("order_number(desc),training_camp_id(desc)"));
+                if (needBindUser) params.put("userIds", userId);
+                List<FsUserCourseTrainingCampVO> fsUserCourseTrainingCampList= fsUserCourseTrainingCampService.selectFsUserCourseTrainingCampVOListByMap(params);
+                fsUserCourseTrainingCampList.stream().filter(camp -> !Objects.equals(camp.getTrainingCampId(), periodId))
+                        .forEach(camp -> {
+                            FsUserCoursePeriod query = new FsUserCoursePeriod();
+                            query.setTrainingCampId(camp.getTrainingCampId());
+                            List<FsUserCoursePeriodVO> periods = fsUserCoursePeriodService.selectFsUserCoursePeriodPage(query);
+                            if (periods != null && !periods.isEmpty()) {
+                                resultList.addAll(periods);
+                            }
+                        });
+                return R.ok().put("resultList", resultList);
+            } else if ("3".equals(campPeriodType)) {
+                // 新建训练营
+                if (StringUtils.isEmpty(campPeriodName)) {
+                    return R.error("训练营名称不能为空");
+                }
+                FsUserCourseTrainingCampDTO campDTO = new FsUserCourseTrainingCampDTO();
+                campDTO.setTrainingCampName(campPeriodName.trim());
+                return R.ok("训练营创建成功");
+            }
+            return R.error("不支持的训练营类型");
+        } catch (Exception e) {
+            return R.error("系统处理异常");
+        }
+    }
+    private CourseConfig getCourseConfig() {
+        try {
+            String json = configService.selectConfigByKey("course.config");
+            return JSONUtil.toBean(json, CourseConfig.class);
+        } catch (Exception e) {
+            return null;
+        }
+    }
 }

+ 59 - 0
fs-admin/src/main/java/com/fs/course/task/CompanyBalanceTask.java

@@ -0,0 +1,59 @@
+package com.fs.course.task;
+
+import com.fs.course.service.BalanceRollbackErrorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: 公司余额同步定时任务
+ * @author: Xgb
+ * @createDate: 2025/10/22
+ * @version: 1.0
+ */
+@Component("companyBalanceTask")
+public class CompanyBalanceTask {
+
+
+    @Autowired
+    private BalanceRollbackErrorService balanceRollbackErrorService;
+
+
+    /**
+     * @Description: 每 ? 秒从缓存获取余额同步到公司账户中 todo 待完善
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/22 10:56
+     */
+    public void syncCompanyBalance() {
+
+    }
+
+    /**
+     * @Description: 定时回滚公司余额数据
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/22 11:48
+     */
+    public void processBatchRollbackByCompanyId() {
+        balanceRollbackErrorService.processBatchRollbackByCompanyId();
+    }
+
+    /**
+     * @Description: spring启动执行 查询余额报存到缓存中 当缓存没数据时
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/22 11:52
+     */
+    public void initCompanyBalance() {
+        balanceRollbackErrorService.initCompanyBalance();
+
+    }
+
+
+
+}

+ 15 - 13
fs-admin/src/main/java/com/fs/crm/controller/CrmCustomerController.java

@@ -151,14 +151,14 @@ public class CrmCustomerController extends BaseController
         crmCustomer.setIsLine(0);
         List<CrmCustomerListVO> list = crmCustomerService.selectCrmCustomerListVO(crmCustomer);
         List<CrmCustomerExportVO> exportList=new ArrayList<>();
-        boolean checkPhone = isCheckPhone();
+        SysRole sysRole = isCheckPermission();
         for(CrmCustomerListVO customer:list){
             CrmCustomerExportVO vo=new CrmCustomerExportVO();
             if(customer.getSource()!=null){
                 vo.setSource(customer.getSource().toString());
             }
             BeanUtils.copyProperties(customer,vo);
-            if(customer.getMobile()!=null && !checkPhone){
+            if(customer.getMobile()!=null && !(sysRole.getIsCheckPhone()==1)){
                 vo.setMobile(customer.getMobile().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
             }
             exportList.add(vo);
@@ -197,9 +197,9 @@ public class CrmCustomerController extends BaseController
         }
         List<CrmCustomerListVO> list = crmCustomerService.selectCrmCustomerListQueryParam(crmCustomer);
         if (list != null) {
-            boolean checkPhone = isCheckPhone();
+            SysRole sysRole = isCheckPermission();
             for (CrmCustomerListVO vo : list) {
-                if(vo.getMobile()!=null && !checkPhone){
+                if(vo.getMobile()!=null && !(sysRole.getIsCheckPhone()==1)){
                     vo.setMobile(vo.getMobile().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
                 }
 
@@ -211,19 +211,21 @@ public class CrmCustomerController extends BaseController
 
     @Autowired
     private ISysRoleService sysRoleService;
-    private boolean isCheckPhone() {
+    private SysRole isCheckPermission() {
+        SysRole sysRole = new SysRole();
         SysUser user = getLoginUser().getUser();
         boolean flag = user.isAdmin();
         if (flag) {
-            return true;
-        }
-        List<SysRole> roles = user.getRoles();
-        if (roles != null && !roles.isEmpty()) {
-            Long[] roleIds = roles.stream().map(SysRole::getRoleId).toArray(Long[]::new);
-            return sysRoleService.getIsCheckPhone(roleIds);
+            sysRole.setIsCheckPhone(1);
+            sysRole.setIsCheckAddress(1);
+        } else {
+            List<SysRole> roles = user.getRoles();
+            if (roles != null && !roles.isEmpty()) {
+                Long[] roleIds = roles.stream().map(SysRole::getRoleId).toArray(Long[]::new);
+                return sysRoleService.getIsCheckPermission(roleIds);
+            }
         }
-
-        return false;
+        return sysRole;
     }
 
 

+ 28 - 26
fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java

@@ -122,6 +122,9 @@ public class FsStoreOrderController extends BaseController
 
     @Autowired
     private IFsStoreOrderLogsService fsStoreOrderLogsService;
+
+    @Autowired
+    private IFsDfAccountService fsDfAccountService;
     /**
      * 查询订单列表
      */
@@ -257,8 +260,9 @@ public class FsStoreOrderController extends BaseController
         task.setUserId(SecurityUtils.getUserId());
         exportTaskService.insertFsExportTask(task);
         param.setTaskId(task.getTaskId());
-        boolean checkPhone = isCheckPhone();
-        exportTaskService.exportStore1Data(param,checkPhone, filterList);
+
+        SysRole sysRole = isCheckPermission();
+        exportTaskService.exportStore1Data(param,sysRole.getIsCheckPhone() == 1,sysRole.getIsCheckAddress() == 1, filterList);
 
         return new AjaxResult(200,"后台正在导出,请等待...任务ID:"+task.getTaskId(),task.getTaskId());
 
@@ -267,19 +271,21 @@ public class FsStoreOrderController extends BaseController
 
     @Autowired
     private ISysRoleService sysRoleService;
-    private boolean isCheckPhone() {
+    private SysRole isCheckPermission() {
+        SysRole sysRole = new SysRole();
         SysUser user = getLoginUser().getUser();
         boolean flag = user.isAdmin();
         if (flag) {
-            return true;
-        }
-        List<SysRole> roles = user.getRoles();
-        if (roles != null && !roles.isEmpty()) {
-            Long[] roleIds = roles.stream().map(SysRole::getRoleId).toArray(Long[]::new);
-            return sysRoleService.getIsCheckPhone(roleIds);
+            sysRole.setIsCheckPhone(1);
+            sysRole.setIsCheckAddress(1);
+        } else {
+            List<SysRole> roles = user.getRoles();
+            if (roles != null && !roles.isEmpty()) {
+                Long[] roleIds = roles.stream().map(SysRole::getRoleId).toArray(Long[]::new);
+                return sysRoleService.getIsCheckPermission(roleIds);
+            }
         }
-
-        return false;
+        return sysRole;
     }
 
     @GetMapping("/importTemplate")
@@ -764,19 +770,16 @@ public class FsStoreOrderController extends BaseController
 
     private FsStoreOrderDf getDFInfo(String loginAccount) {
         //查询订单账户 判断是否存在该订单账户
-        List<DFConfigVo> erpAccounts = fsStoreOrderService.getErpAccount();
+        FsDfAccount erpAccount = fsDfAccountService.selectFsDfAccountByAccount(loginAccount);
         FsStoreOrderDf df = new FsStoreOrderDf();
-        for (DFConfigVo erpAccount : erpAccounts) {
-            if (loginAccount.equals(erpAccount.getLoginAccount())){
-                //添加df记录
-                df.setAppKey(erpAccount.getDfAppKey());
-                df.setAppSecret(erpAccount.getDfAppsecret());
-                df.setLoginAccount(loginAccount);
-                df.setMonthlyCard(erpAccount.getMonthlyCard());
-                df.setExpressProductCode(erpAccount.getExpressProductCode());
-                df.setStatus(0);
-                break;
-            }
+        if (erpAccount != null){
+            //添加df记录
+            df.setAppKey(erpAccount.getDfAppKey());
+            df.setAppSecret(erpAccount.getDfAppsecret());
+            df.setLoginAccount(loginAccount);
+            df.setMonthlyCard(erpAccount.getMonthlyCard());
+            df.setExpressProductCode(erpAccount.getExpressProductCode());
+            df.setStatus(0);
         }
         return df;
     }
@@ -956,10 +959,9 @@ public class FsStoreOrderController extends BaseController
     {
         List<String> list = new ArrayList<>();
         if (CloudHostUtils.hasCloudHostName("金牛明医","康年堂")){
-            List<DFConfigVo> erpAccounts = fsStoreOrderService.getErpAccount();
-            list = erpAccounts.stream().map(DFConfigVo::getLoginAccount).collect(Collectors.toList());
+                List<FsDfAccount> erpAccounts = fsDfAccountService.selectFsDfAccountList(null);
+                list = erpAccounts.stream().map(FsDfAccount::getLoginAccount).collect(Collectors.toList());
         }
-
         return R.ok().put("data", list);
     }
 }

+ 19 - 17
fs-admin/src/main/java/com/fs/his/controller/FsUserController.java

@@ -101,10 +101,10 @@ public class FsUserController extends BaseController
             fsUser.setPhone(encryptPhone(fsUser.getPhone()));
         }
         List<FsUserVO> list = fsUserService.selectFsUserListVO(fsUser);
-        boolean checkPhone = isCheckPhone();
+        SysRole sysRole = isCheckPermission();
         for (FsUserVO fsUserVO : list) {
             if(fsUserVO.getPhone() != null&&fsUserVO.getPhone()!=""){
-                if (!checkPhone){
+                if (!(sysRole.getIsCheckPhone()==1)){
                     if (fsUserVO.getPhone().length()>11){
                         fsUserVO.setPhone(decryptPhoneMk(fsUserVO.getPhone()));
                     }else {
@@ -123,19 +123,21 @@ public class FsUserController extends BaseController
 
     @Autowired
     private ISysRoleService sysRoleService;
-    private boolean isCheckPhone() {
+    private SysRole isCheckPermission() {
+        SysRole sysRole = new SysRole();
         SysUser user = getLoginUser().getUser();
         boolean flag = user.isAdmin();
         if (flag) {
-            return true;
-        }
-        List<SysRole> roles = user.getRoles();
-        if (roles != null && !roles.isEmpty()) {
-            Long[] roleIds = roles.stream().map(SysRole::getRoleId).toArray(Long[]::new);
-            return sysRoleService.getIsCheckPhone(roleIds);
+            sysRole.setIsCheckPhone(1);
+            sysRole.setIsCheckAddress(1);
+        } else {
+            List<SysRole> roles = user.getRoles();
+            if (roles != null && !roles.isEmpty()) {
+                Long[] roleIds = roles.stream().map(SysRole::getRoleId).toArray(Long[]::new);
+                return sysRoleService.getIsCheckPermission(roleIds);
+            }
         }
-
-        return false;
+        return sysRole;
     }
 
     @PreAuthorize("@ss.hasPermi('his:user:list')")
@@ -147,10 +149,10 @@ public class FsUserController extends BaseController
             fsUser.setPhone(encryptPhone(fsUser.getPhone()));
         }
         List<FsUserVO> list = fsUserService.selectFsUserVOListByProject(fsUser);
-        boolean checkPhone = isCheckPhone();
+        SysRole sysRole = isCheckPermission();
         for (FsUserVO fsUserVO : list) {
             if(fsUserVO.getPhone() != null&&fsUserVO.getPhone()!=""){
-                if (!checkPhone){
+                if (!(sysRole.getIsCheckPhone()==1)){
                     if (fsUserVO.getPhone().length()>11){
                         fsUserVO.setPhone(decryptPhoneMk(fsUserVO.getPhone()));
                     }else {
@@ -174,10 +176,10 @@ public class FsUserController extends BaseController
             fsUser.setPhone(encryptPhone(fsUser.getPhone()));
         }
         List<FsUserVO> list = fsUserService.selectFsUserVOListByProject(fsUser);
-        boolean checkPhone = isCheckPhone();
+        SysRole sysRole = isCheckPermission();
         for (FsUserVO fsUserVO : list) {
             if(fsUserVO.getPhone() != null&&fsUserVO.getPhone()!=""){
-                if (!checkPhone){
+                if (!(sysRole.getIsCheckPhone()==1)){
                     if (fsUserVO.getPhone().length()>11){
                         fsUserVO.setPhone(decryptPhoneMk(fsUserVO.getPhone()));
                     }else {
@@ -211,9 +213,9 @@ public class FsUserController extends BaseController
             return AjaxResult.error("导出数据不可超过1w条");
         }
         List<FsUserExportListVO> list = fsUserService.selectFsUserExportListVO(fsUser);
-        boolean checkPhone = isCheckPhone();
+        SysRole sysRole = isCheckPermission();
         for (FsUserExportListVO vo : list) {
-            if (vo.getMobile()!=null && !checkPhone){
+            if (vo.getMobile()!=null && !(sysRole.getIsCheckPhone()==1)){
                 vo.setMobile(vo.getMobile().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
             } else {
                 if (vo.getMobile().length()>11){

+ 38 - 9
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -53,6 +53,7 @@ import com.fs.his.service.*;
 import com.fs.his.service.impl.FsPackageOrderServiceImpl;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.FsSubOrderResultVO;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
@@ -631,12 +632,8 @@ public class Task {
         } else if (erpOrderService == wdtOrderService || erpOrderService == dfOrderService || erpOrderService == jSTOrderService) {
             orders = fsStoreOrderMapper.selectWdtOmsOrderdeliveryOp();
         }
-
-
-        for (FsStoreOrder order : orders) {
-
-            ErpOrderQueryRequert request = new ErpOrderQueryRequert();
-
+        for(FsStoreOrder order:orders){
+            ErpOrderQueryRequert request=new ErpOrderQueryRequert();
             request.setCode(order.getExtendOrderId());
             if (erpOrderService != null) {
                 ErpOrderQueryResponse response = erpOrderService.getOrder(request);
@@ -651,20 +648,52 @@ public class Task {
                                         redisCache.deleteObject("delivery" + ":" + order.getExtendOrderId());
                                     }
                                 }
-
                             }
                         }
                     }
                 }
             }
+        }
+    }
 
+    public void deliveryOpScrm()
+    {
+        IErpOrderService erpOrderService = getErpService();
+        List<FsStoreOrderScrm> orders = null;
+        if (erpOrderService == gyOrderService){
+            orders = fsStoreOrderMapper.selectOmsOrderdeliveryOpScrm();
+        } else if (erpOrderService == wdtOrderService || erpOrderService == dfOrderService || erpOrderService == jSTOrderService){
+            orders = fsStoreOrderMapper.selectWdtOmsOrderdeliveryOpScrm();
+        }
+        for(FsStoreOrderScrm order:orders){
+            ErpOrderQueryRequert request=new ErpOrderQueryRequert();
+            request.setCode(order.getExtendOrderId());
+            if (erpOrderService != null){
+                ErpOrderQueryResponse response=erpOrderService.getScrmOrder(request);
+                if (erpOrderService != dfOrderService){
+                    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())){
+                                        //更新商订单状态 删除REDIS
+                                        fsStoreOrderService.deliveryOrderScrm(order.getOrderCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
+                                        redisCache.deleteObject("delivery"+":"+order.getExtendOrderId());
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
         }
 
 
     }
 
 
-    public void getOrderDeliveryStatus() {
+    public void getOrderDeliveryStatus()
+    {
         IErpOrderService erpOrderService = getErpService();
         List<FsStoreOrder> orders = null;
         if (erpOrderService != null && erpOrderService == dfOrderService) {
@@ -788,6 +817,7 @@ public class Task {
     }
 
 
+
     @Autowired
     private ICompanyService companyService;
 
@@ -1460,7 +1490,6 @@ public class Task {
 
     }
 
-
     /**
      * 定时任务-im 会员催课,每一分钟执行一次
      */

+ 3 - 3
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java

@@ -78,9 +78,9 @@ public class FsStoreHealthOrderScrmController extends BaseController {
     /**
      * 查询健康商城订单列表
      */
-    @PreAuthorize("@ss.hasPermi('store:healthStoreOrder:list')")
-    @PostMapping("/healthList")
-    public TableDataInfo healthStoreList(@RequestBody FsStoreOrderParam param) {
+//    @PreAuthorize("@ss.hasPermi('store:healthStoreOrder:list')")
+      @PostMapping("/healthList")
+      public TableDataInfo healthStoreList(@RequestBody FsStoreOrderParam param) {
         startPage();
         if(!StringUtils.isEmpty(param.getCreateTimeRange())){
             param.setCreateTimeList(param.getCreateTimeRange().split("--"));

+ 7 - 4
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -641,7 +641,7 @@ public class FsStoreOrderScrmController extends BaseController {
         IErpOrderService erpOrderService = getErpService();
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
         request.setCode(order.getExtendOrderId());
-        ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+        ErpOrderQueryResponse response = erpOrderService.getScrmOrder(request);
         if(response.getOrders()!=null&&response.getOrders().size()>0){
             for(ErpOrderQuery orderQuery : response.getOrders()){
                 if(orderQuery.getDeliverys()!=null&&orderQuery.getDeliverys().size()>0){
@@ -732,7 +732,7 @@ public class FsStoreOrderScrmController extends BaseController {
         IErpOrderService erpOrderService = getErpService();
         ErpOrderQueryRequert request = new ErpOrderQueryRequert();
         request.setCode(extendOrderId);
-        ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+        ErpOrderQueryResponse response = erpOrderService.getScrmOrder(request);
         return R.ok().put("data",response);
     }
 
@@ -932,8 +932,11 @@ public class FsStoreOrderScrmController extends BaseController {
     @GetMapping("/getErpAccount")
     public R getErpAccount()
     {
-        List<FsDfAccount> erpAccounts = fsDfAccountService.selectFsDfAccountList(null);
-        List<String> list = erpAccounts.stream().map(FsDfAccount::getLoginAccount).collect(Collectors.toList());
+        List<String> list = new ArrayList<>();
+        if (CloudHostUtils.hasCloudHostName("金牛明医","康年堂")) {
+            List<FsDfAccount> erpAccounts = fsDfAccountService.selectFsDfAccountList(null);
+            list = erpAccounts.stream().map(FsDfAccount::getLoginAccount).collect(Collectors.toList());
+        }
         return R.ok().put("data", list);
     }
 

+ 29 - 1
fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java

@@ -1,6 +1,7 @@
 package com.fs.hisStore.controller;
 
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.domain.AlipayTradeRefundModel;
 import com.fs.bean.AliPayBean;
@@ -13,7 +14,12 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.service.ICompanyService;
+import com.fs.config.cloud.CloudHostProper;
+import com.fs.his.domain.FsHfpayConfig;
+import com.fs.his.mapper.FsHfpayConfigMapper;
+import com.fs.hisStore.domain.FsPayConfigScrm;
 import com.fs.huifuPay.domain.HuiFuQueryOrderResult;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayQueryRequest;
@@ -24,6 +30,7 @@ import com.fs.hisStore.param.FsStorePaymentParam;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.service.IFsStorePaymentScrmService;
 import com.fs.hisStore.vo.FsStorePaymentVO;
+import com.fs.system.service.ISysConfigService;
 import com.ijpay.alipay.AliPayApi;
 import com.ijpay.alipay.AliPayApiConfig;
 import com.ijpay.alipay.AliPayApiConfigKit;
@@ -63,6 +70,10 @@ public class FsStorePaymentScrmController extends BaseController
     private IFsStoreOrderScrmService orderService;
     @Autowired
     HuiFuService huiFuService;
+    @Autowired
+    private CloudHostProper cloudHostProper;
+    @Autowired
+    private ISysConfigService configService;
     /**
      * 查询支付明细列表
      */
@@ -185,10 +196,27 @@ public class FsStorePaymentScrmController extends BaseController
         if(payment.getPayMoney().compareTo(fsStorePayment.getRefundMoney())==-1){
             return R.error("退款金额必须小于等于付款金额");
         }
-        if(payment.getPayTypeCode().equals("weixin")){
 
+        if(payment.getPayTypeCode().equals("weixin")){
+            String json = configService.selectConfigByKey("store.pay");
+            FsPayConfigScrm fsPayConfig = JSON.parseObject(json, FsPayConfigScrm.class);
             if (payment.getPayMode()!=null&&payment.getPayMode().equals("hf")){
+                String huifuId="";
+                FsHfpayConfigMapper fsHfpayConfigMapper = SpringUtils.getBean(FsHfpayConfigMapper.class);
+                if (payment.getAppId() != null) {
+                    FsHfpayConfig fsHfpayConfig = fsHfpayConfigMapper.selectByAppId(payment.getAppId());
+                    huifuId = fsHfpayConfig.getHuifuId();
+                } else {
+                    if (("益善缘".equals(cloudHostProper.getCompanyName()))) {
+
+                        FsHfpayConfig fsPayConfig2 = fsHfpayConfigMapper.selectByAppId("wx0d1a3dd485268521");
+                        huifuId = fsPayConfig2.getHuifuId();
+                    }else {
+                        huifuId=fsPayConfig.getHuifuId();
+                    }
+                }
                 V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
+                request.setHuifuId(huifuId);
                 request.setOrdAmt(payment.getPayMoney().toString());
                 request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
                 request.setReqSeqId("refund-"+payment.getPayCode());

+ 37 - 4
fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java

@@ -17,7 +17,9 @@ import com.fs.erp.dto.ErpOrderQueryResponse;
 import com.fs.erp.service.IErpGoodsService;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.config.FsSysConfig;
+import com.fs.his.domain.FsStoreProductAttrValue;
 import com.fs.his.dto.ExpressInfoDTO;
+import com.fs.his.mapper.FsStoreProductAttrValueMapper;
 import com.fs.his.service.IFsExpressService;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.utils.ConfigUtil;
@@ -93,7 +95,7 @@ public class MallStoreTask
     @Autowired
     private ISysConfigService configService;
     @Autowired
-    private FsStoreProductAttrValueScrmMapper fsStoreProductAttrValueMapper;
+    private FsStoreProductAttrValueMapper fsStoreProductAttrValueMapper;
     @Autowired
     private FsStorePaymentScrmMapper paymentMapper;
     @Autowired
@@ -232,8 +234,8 @@ public class MallStoreTask
         String json=configService.selectConfigByKey("store.config");
         StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
 
-        List<FsStoreProductAttrValueScrm> values = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueList(new FsStoreProductAttrValueScrm());
-        for (FsStoreProductAttrValueScrm value : values) {
+        List<FsStoreProductAttrValue> values = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueList(new FsStoreProductAttrValue());
+        for (FsStoreProductAttrValue value : values) {
             ErpGoodsQueryRequert query = new ErpGoodsQueryRequert();
             query.setCode(value.getBarCode());
             ErpGoodsQueryResponse goods = erpGoodsService.getGoods(query);
@@ -246,7 +248,7 @@ public class MallStoreTask
                     BigDecimal divide = salesPrice.multiply(new BigDecimal(config.getSalesPriceRate())).divide(new BigDecimal("100"));
                     System.out.println("代理价格"+divide);
                     System.out.println("成本价"+salesPrice);
-                    FsStoreProductAttrValueScrm va = new FsStoreProductAttrValueScrm();
+                    FsStoreProductAttrValue va = new FsStoreProductAttrValue();
                     va.setCost(salesPrice);
                     va.setAgentPrice(divide);
                     va.setId(value.getId());
@@ -255,9 +257,40 @@ public class MallStoreTask
             }
             System.out.println(goods);
         }
+    }
+
 
+    @Autowired
+    private FsStoreProductAttrValueScrmMapper fsStoreProductAttrValueScrmMapper;
+
+    public void storeProdUpdateCostPriceScrm()
+    {
+        String json=configService.selectConfigByKey("store.config");
+        StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
 
+        List<FsStoreProductAttrValueScrm> values = fsStoreProductAttrValueScrmMapper.selectFsStoreProductAttrValueList(new FsStoreProductAttrValueScrm());
+        for (FsStoreProductAttrValueScrm value : values) {
+            ErpGoodsQueryRequert query = new ErpGoodsQueryRequert();
+            query.setCode(value.getBarCode());
+            ErpGoodsQueryResponse goods = erpGoodsService.getGoodsScrm(query);
+            List<ErpGoods> items = goods.getItems();
 
+            if (items!=null&&items.size()>0){
+                ErpGoods erpGoods = items.get(0);
+                BigDecimal salesPrice = erpGoods.getSales_price();
+                if (salesPrice!=null&&salesPrice.compareTo(BigDecimal.ZERO) != 0){
+                    BigDecimal divide = salesPrice.multiply(new BigDecimal(config.getSalesPriceRate())).divide(new BigDecimal("100"));
+                    System.out.println("代理价格"+divide);
+                    System.out.println("成本价"+salesPrice);
+                    FsStoreProductAttrValueScrm va = new FsStoreProductAttrValueScrm();
+                    va.setCost(salesPrice);
+                    va.setAgentPrice(divide);
+                    va.setId(value.getId());
+                    fsStoreProductAttrValueScrmMapper.updateFsStoreProductAttrValue(va);
+                }
+            }
+            System.out.println(goods);
+        }
     }
     public void couponOp()
     {

+ 5 - 2
fs-admin/src/main/java/com/fs/qw/controller/QwExternalContactTransferCompanyAuditController.java

@@ -6,6 +6,7 @@ import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.qw.domain.QwExternalContactTransferCompanyAudit;
+import com.fs.qw.domain.QwExternalContactTransferCompanyAuditUser;
 import com.fs.qw.dto.CompanyTransferAuditDTO;
 import com.fs.qw.service.IQwExternalContactTransferCompanyAuditService;
 import com.fs.qw.service.IQwExternalContactTransferCompanyAuditUserService;
@@ -35,8 +36,10 @@ public class QwExternalContactTransferCompanyAuditController extends BaseControl
 
     @PreAuthorize("@ss.hasPermi('qw:externalContactTransferCompanyAudit:detail')")
     @GetMapping("/detail/{auditId}")
-    public AjaxResult detail(@PathVariable Long auditId) {
-        return AjaxResult.success(auditUserService.getListByAuditId(auditId));
+    public TableDataInfo detail(@PathVariable Long auditId) {
+        startPage();
+        List<QwExternalContactTransferCompanyAuditUser> listByAuditId = auditUserService.getListByAuditId(auditId);
+        return getDataTable(listByAuditId);
     }
 
     @PreAuthorize("@ss.hasPermi('qw:externalContactTransferCompanyAudit:audit')")

+ 103 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwUserComplainRecordController.java

@@ -0,0 +1,103 @@
+package com.fs.qw.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.qw.domain.QwUserComplainRecord;
+import com.fs.qw.service.IQwUserComplainRecordService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 企微员工投诉记录Controller
+ *
+ * @author fs
+ * @date 2025-10-22
+ */
+@RestController
+@RequestMapping("/qw/record")
+public class QwUserComplainRecordController extends BaseController
+{
+    @Autowired
+    private IQwUserComplainRecordService qwUserComplainRecordService;
+
+    /**
+     * 查询企微员工投诉记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(QwUserComplainRecord qwUserComplainRecord)
+    {
+        startPage();
+        List<QwUserComplainRecord> list = qwUserComplainRecordService.selectQwUserComplainRecordList(qwUserComplainRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出企微员工投诉记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:export')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(QwUserComplainRecord qwUserComplainRecord)
+    {
+        List<QwUserComplainRecord> list = qwUserComplainRecordService.selectQwUserComplainRecordList(qwUserComplainRecord);
+        ExcelUtil<QwUserComplainRecord> util = new ExcelUtil<QwUserComplainRecord>(QwUserComplainRecord.class);
+        return util.exportExcel(list, "企微员工投诉记录数据");
+    }
+
+    /**
+     * 获取企微员工投诉记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:query')")
+    @GetMapping(value = "/{recordId}")
+    public AjaxResult getInfo(@PathVariable("recordId") Long recordId)
+    {
+        return AjaxResult.success(qwUserComplainRecordService.selectQwUserComplainRecordByRecordId(recordId));
+    }
+
+    /**
+     * 新增企微员工投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:add')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody QwUserComplainRecord qwUserComplainRecord)
+    {
+        return toAjax(qwUserComplainRecordService.insertQwUserComplainRecord(qwUserComplainRecord));
+    }
+
+    /**
+     * 修改企微员工投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:edit')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody QwUserComplainRecord qwUserComplainRecord)
+    {
+        return toAjax(qwUserComplainRecordService.updateQwUserComplainRecord(qwUserComplainRecord));
+    }
+
+    /**
+     * 删除企微员工投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('qw:record:remove')")
+    @Log(title = "企微员工投诉记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{recordIds}")
+    public AjaxResult remove(@PathVariable Long[] recordIds)
+    {
+        return toAjax(qwUserComplainRecordService.deleteQwUserComplainRecordByRecordIds(recordIds));
+    }
+}

+ 7 - 2
fs-admin/src/main/java/com/fs/qw/controller/QwUserController.java

@@ -3,12 +3,17 @@ package com.fs.qw.controller;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.model.LoginUser;
+import com.fs.common.utils.ServletUtils;
+import com.fs.qw.domain.QwExternalContactTransferCompanyAudit;
 import com.fs.qw.param.QwFsUserParam;
+import com.fs.qw.service.IQwExternalContactTransferCompanyAuditService;
 import com.fs.qw.service.IQwUserService;
 import com.fs.qw.vo.QwOptionsVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
@@ -24,7 +29,8 @@ import java.util.List;
 public class QwUserController extends BaseController {
     @Autowired
     private IQwUserService qwUserService;
-
+    @Autowired
+    private IQwExternalContactTransferCompanyAuditService auditService;
     @GetMapping("/getQwUserAll")
     public AjaxResult getQwUserAll(){
         return AjaxResult.success(qwUserService.getQwUserAll());
@@ -38,7 +44,6 @@ public class QwUserController extends BaseController {
         return R.ok().put("data",qwUserService.getQwUserInfo(param));
     }
 
-
    @GetMapping("/getMyQwCompanyList")
     public R getMyQwCompanyList()
     {

+ 27 - 0
fs-admin/src/main/java/com/fs/task/SgTestController.java

@@ -0,0 +1,27 @@
+//package com.fs.task;
+//
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//import javax.annotation.Resource;
+//
+///**
+// * @description:
+// * @author: Guos
+// * @time: 2025/10/23 下午2:18
+// */
+//@RestController
+//@RequestMapping("/sg/test")
+//public class SgTestController {
+//
+//    @Resource
+//    private SyncTuLinStudentInfoTask syncTuLinStudentInfoTask;
+//
+//
+//    @RequestMapping("/execute")
+//    public void execute(){
+//        syncTuLinStudentInfoTask.execute();
+//    }
+//
+//
+//}

+ 25 - 0
fs-admin/src/main/java/com/fs/task/SyncTuLinStudentInfoTask.java

@@ -0,0 +1,25 @@
+package com.fs.task;
+
+import com.fs.tulin.service.ITulinInfoSyncLogService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+import javax.annotation.Resource;
+
+/**
+ * @description: 同步TuLin学生信息定时任务
+ * @author: Guos
+ * @time: 2025/10/23 上午10:26
+ */
+@AllArgsConstructor
+@Component("syncTuLinStudentInfoTask")
+public class SyncTuLinStudentInfoTask {
+
+
+    @Resource
+    private final ITulinInfoSyncLogService tulinInfoSyncLogService;
+
+    public void execute() {
+        tulinInfoSyncLogService.syncInfo();
+    }
+
+}

+ 26 - 7
fs-admin/src/main/java/com/fs/web/controller/system/SysLoginController.java

@@ -94,20 +94,39 @@ public class SysLoginController
             ajax.put("medicalMallConfig", medicalMallConfig);
         }
         ajax.put("user", user);
-        Integer isAdmin = 0;
+        SysRole isAdmin = new SysRole();
+        getIsAdmin(isAdmin, permissions, user);
+        ajax.put("isAdmin", isAdmin);
+        ajax.put("roles", roles);
+        ajax.put("permissions", permissions);
+
+        return ajax;
+    }
+
+    /**
+     * 获取电话地址权限
+     * @param isAdmin
+     * @param permissions
+     * @param user
+     */
+    private void getIsAdmin(SysRole isAdmin, Set<String> permissions, SysUser user) {
+        isAdmin.setIsCheckAddress(0);
+        isAdmin.setIsCheckPhone(0);
         if (permissions.contains("*:*:*")){
-            isAdmin = 1;
+            isAdmin.setIsCheckAddress(1);
+            isAdmin.setIsCheckPhone(1);
         }else {
             List<SysRole> roleList = user.getRoles();
             if (roleList != null && !roleList.isEmpty()) {
                 Long[] roleIds = roleList.stream().map(SysRole::getRoleId).toArray(Long[]::new);
-                isAdmin = roleService.getIsCheckPhone(roleIds)?1:0;
+//                isAdmin = roleService.getIsCheckPhone(roleIds)?1:0;
+                SysRole isCheckPermission = roleService.getIsCheckPermission(roleIds);
+                if (isCheckPermission != null) {
+                    isAdmin.setIsCheckPhone(isCheckPermission.getIsCheckPhone());
+                    isAdmin.setIsCheckAddress(isCheckPermission.getIsCheckAddress());
+                }
             }
         }
-        ajax.put("roles", roles);
-        ajax.put("permissions", permissions);
-        ajax.put("isAdmin", isAdmin);
-        return ajax;
     }
 
     /**

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

@@ -7,7 +7,7 @@ spring:
 #    active: dev
 #    active: druid-hdt
 #    active: druid-yzt
-    active: druid-sxjz-test
+    active: dev-jnlzjk
 #    active: druid-sft
 #    active: druid-fby
 #    active: dev

+ 2 - 2
fs-common-api/src/main/resources/application.yml

@@ -4,5 +4,5 @@ server:
 # Spring配置
 spring:
   profiles:
-    active: dev-yjb
-#    active: druid-jnmy
+#    active: dev
+    active: druid-myhk-test

+ 5 - 0
fs-common/src/main/java/com/fs/common/constant/FsConstants.java

@@ -11,4 +11,9 @@ public interface FsConstants {
 
     String FRIEND_WELCOME_VIDEO_KEY = "friend:welcome:";
     String REDIS_INTEGRAL_ORDER_UNPAY = "integral:order:unpay:";
+
+    // 公司余额redis key "company:money:" + company.getCompanyId()
+    String COMPANY_MONEY_KEY = "company:money:";
+    // 公司余额redis 锁
+    String COMPANY_MONEY_LOCK = "company_money_lock:";
 }

+ 7 - 0
fs-common/src/main/java/com/fs/common/enums/ImTypeEnum.java

@@ -0,0 +1,7 @@
+package com.fs.common.enums;
+
+public enum ImTypeEnum {
+    NONE,
+    TENCENT,
+    OPENIM;
+}

+ 8 - 7
fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -420,6 +420,14 @@ public class CompanyUserController extends AppBaseController {
                 .collect(Collectors.toList());
         return R.ok().put("data",filteredDictVOS);
     }
+
+    @ApiOperation("查询所有项目")
+    @GetMapping("/getDictProject")
+    public R getDictProject(){
+        List<DictVO> dictVOS = dictDataService.selectDictDataListByType("sys_course_project");
+        return R.ok().put("data",dictVOS);
+    }
+
     /**
      * 当只有模板文字text时,生成表中对应条的voice_url和user_voice_url
      * @param id            qw_sop_temp_voice的id
@@ -602,11 +610,4 @@ public class CompanyUserController extends AppBaseController {
         }
         return null;
     }
-
-    @ApiOperation("查询所有项目")
-    @GetMapping("/getDictProject")
-    public R getDictProject(){
-        List<DictVO> dictVOS = dictDataService.selectDictDataListByType("sys_course_project");
-        return R.ok().put("data",dictVOS);
-    }
 }

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

@@ -309,8 +309,8 @@ public class FsUserCourseVideoController extends AppBaseController {
         BeanUtils.copyProperties(fsCourseWatchAppParam, param);
         param.setCompanyUserId(Long.parseLong(getUserId()));
         param.setCompanyId(getCompanyId());
-        param.setSTime(DateUtil.beginOfDay(new Date()));
-        param.setETime(DateUtil.endOfDay(new Date()));
+        param.setSTime(DateUtil.formatDate(DateUtil.beginOfDay(new Date())));
+        param.setETime(DateUtil.formatDate(DateUtil.endOfDay(new Date())));
 //        startPage();
         PageHelper.startPage(fsCourseWatchAppParam.getPageNum (), fsCourseWatchAppParam.getPageSize());
         List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVO(param);

+ 39 - 0
fs-company/src/main/java/com/fs/company/controller/common/CommonController.java

@@ -1,22 +1,30 @@
 package com.fs.company.controller.common;
 
+import cn.hutool.json.JSONUtil;
 import com.fs.common.config.FSConfig;
 import com.fs.common.constant.Constants;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.file.OssException;
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.file.FileUploadUtils;
 import com.fs.common.utils.file.FileUtils;
 import com.fs.company.utils.AudioUtils;
 import com.fs.company.vo.WangUploadVO;
 import com.fs.framework.config.ServerConfig;
+import com.fs.framework.security.LoginUser;
+import com.fs.framework.service.TokenService;
 import com.fs.his.domain.FsExportTask;
+import com.fs.his.dto.InquiryConfigDTO;
 import com.fs.his.service.IFsExportTaskService;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
 import com.fs.qw.service.IQwWorkTaskService;
 import com.fs.qwApi.service.QwApiService;
 import com.fs.system.oss.CloudStorageService;
 import com.fs.system.oss.OSSFactory;
+import com.fs.system.service.ISysConfigService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +40,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 通用请求处理
@@ -53,7 +62,14 @@ public class CommonController
     private QwApiService qwApiService;
 
 
+    @Autowired
+    private ISysConfigService configService;
+
+    @Autowired
+    private OpenIMService openIMService;
 
+    @Autowired
+    private TokenService tokenService;
 //    @Autowired
 //    private TestTwoService testService2;
 ////
@@ -276,6 +292,29 @@ public class CommonController
         }
     }
 
+    @GetMapping(value = "/common/getInquiryConfig")
+    public AjaxResult getInquiryConfig()
+    {
+        String json=configService.selectConfigByKey("his.inquiryConfig");
+        InquiryConfigDTO configDTO= JSONUtil.toBean(json, InquiryConfigDTO.class);
+        String inquirySubType = configDTO.getInquirySubType();
+        return AjaxResult.success(inquirySubType);
+    }
+
+    //分享会诊
+    @PostMapping(value = "/common/sendInquiry")
+    public AjaxResult sendInquiry(@RequestBody Map<String,String> map){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long companyUserId = loginUser.getUser().getUserId();
+        Long companyId = loginUser.getCompany().getCompanyId();
+        String inquiryName = map.get("inquiryName");
+        String type = map.get("type");
+        String sendID = map.get("sendID");
+        String recvID = map.get("recvID");
+        String doctorId = map.get("doctorId");
+        OpenImResponseDTO inquirySelect = openIMService.sendInquiryUtil(sendID, recvID, 110, "inquirySelect", inquiryName, type,companyId,companyUserId,doctorId);
+        return AjaxResult.success(inquirySelect);
+    }
 
 
 }

+ 222 - 9
fs-company/src/main/java/com/fs/company/controller/common/Test.java

@@ -4,19 +4,56 @@ import com.alibaba.fastjson.JSON;
 import com.fs.ad.enums.AdUploadType;
 import com.fs.common.annotation.DataSource;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.DataSourceType;
+import com.fs.common.service.impl.SmsServiceImpl;
+import com.fs.company.mapper.*;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.company.vo.RedPacketMoneyVO;
+import com.fs.course.mapper.FsCourseRedPacketLogMapper;
+import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.course.service.ITencentCloudCosService;
+import com.fs.erp.domain.ErpDeliverys;
+import com.fs.erp.domain.ErpOrderQuery;
+import com.fs.erp.dto.ErpOrderQueryRequert;
+import com.fs.erp.dto.ErpOrderQueryResponse;
+import com.fs.erp.service.IErpOrderService;
+import com.fs.fastGpt.mapper.FastGptChatSessionMapper;
+import com.fs.fastGpt.service.IFastgptEventLogTotalService;
+import com.fs.his.config.FsSysConfig;
+import com.fs.his.mapper.*;
+import com.fs.his.service.*;
+import com.fs.his.service.impl.FsPackageOrderServiceImpl;
+import com.fs.his.utils.ConfigUtil;
 import com.fs.his.utils.qrcode.QRCodeUtils;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
+import com.fs.qw.service.IQwAppContactWayService;
+import com.fs.qw.service.IQwCompanyService;
+import com.fs.qw.service.IQwExternalContactTransferLogService;
+import com.fs.qw.service.IQwUserService;
 import com.fs.qw.vo.AdUploadVo;
+import com.fs.qwApi.service.QwApiService;
 import com.fs.sop.service.IQwSopTempContentService;
 import com.fs.sop.service.IQwSopTempDayService;
 import com.fs.sop.service.IQwSopTempRulesService;
 import com.fs.sop.service.IQwSopTempService;
+import com.fs.system.mapper.SysConfigMapper;
 import com.google.zxing.WriterException;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
@@ -24,18 +61,194 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
 @RestController
-@AllArgsConstructor
 public class Test {
+    @Autowired
+    private ConfigUtil configUtil;
+
+    @Autowired
+    private FsCourseRedPacketLogMapper fsCourseRedPacketLogMapper;
+    @Autowired
+    private ICompanyService companyService;
+    @Autowired
+    @Qualifier("erpOrderServiceImpl")
+    private IErpOrderService gyOrderService;
+    @Autowired
+    private FsUserCouponMapper fsUserCouponMapper;
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+    @Autowired
+    private IFsPrescribeService fsPrescribeService;
+    @Autowired
+    IFsStoreOrderService fsStoreOrderService;
+    @Autowired
+    FsStoreOrderMapper fsStoreOrderMapper;
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private FsPackageOrderMapper fsPackageOrderMapper;
+    @Autowired
+    private IFsFollowService fsFollowService;
+    @Autowired
+    private IFsStoreAfterSalesService fsStoreAfterSalesService;
+    //    @Autowired
+//    IErpOrderService erpOrderService;
+    @Autowired
+    FsIntegralOrderMapper integralOrderMapper;
+    @Autowired
+    IFsInquiryOrderService iFsInquiryOrderService;
+    @Autowired
+    FsPackageMapper fsPackageMapper;
+    @Autowired
+    FsStoreProductMapper fsStoreProductMapper;
+    @Autowired
+    CompanyMapper companyMapper;
+    @Autowired
+    private CompanyMoneyLogsMapper moneyLogsMapper;
+    @Autowired
+    FsUserMapper fsUserMapper;
+    @Autowired
+    IFsUserIntegralLogsService fsUserIntegralLogsService;
+    @Autowired
+    SmsServiceImpl smsService;
+    @Autowired
+    FsStoreOrderItemMapper fsStoreOrderItemMapper;
+
+    @Autowired
+    FsPatientMapper fsPatientMapper;
+    @Autowired
+    FsPrescribeDrugMapper fsPrescribeDrugMapper;
+    @Autowired
+    FsFollowMapper fsFollowMapper;
+    @Autowired
+    private IImService imService;
+    @Autowired
+    private FsInquiryOrderMapper inquiryOrderMapper;
+    @Autowired
+    private CompanyVoiceCallerMapper companyVoiceCallerMapper;
+    @Autowired
+    private CompanyVoiceLogsMapper companyVoiceLogsMapper;
+    @Autowired
+    FsPackageOrderServiceImpl packageOrderService;
+    @Autowired
+    private IFsStoreOrderLogsService fsStoreOrderLogsService;
+    org.slf4j.Logger logger= LoggerFactory.getLogger(getClass());
+    @Autowired
+    IFsDoctorService doctorService;
+    @Autowired
+    CompanyUserMapper companyUserMapper;
+    @Autowired
+    FsInquiryOrderMapper fsInquiryOrderMapper;
+    @Autowired
+    QwApiService qwApiService;
+    //每天执行一次
+    @Autowired
+    IQwAppContactWayService qwAppContactWayService;
+
+    @Autowired
+    FastGptChatSessionMapper fastGptChatSessionMapper;
+
+    @Autowired
+    IQwExternalContactTransferLogService qwExternalContactTransferLogService;
+
+
+
+    @Autowired
+    ITencentCloudCosService tencentCloudCosService;
+
 
-    private final IQwSopTempService qwSopTempService;
-    private final IQwSopTempRulesService qwSopTempRulesService;
-    private final IQwSopTempDayService qwSopTempDayService;
-    private final IQwSopTempContentService qwSopTempContentService;
-    private final RocketMQTemplate rocketMQTemplate;
+    @Autowired
+    public RedisTemplate redisTemplate;
+
+    @Autowired
+    @Qualifier("wdtErpOrderServiceImpl")
+    private IErpOrderService wdtOrderService;
+    @Autowired
+    @Qualifier("hzOMSErpOrderServiceImpl")
+    private IErpOrderService hzOMSErpOrderService;
+    @Autowired
+    @Qualifier("dfOrderServiceImpl")
+    private IErpOrderService dfOrderService;
+
+    @Autowired
+    @Qualifier("JSTErpOrderServiceImpl")
+    private IErpOrderService jSTOrderService;
+    @Autowired
+    @Qualifier("k9OrderScrmServiceImpl")
+    private IErpOrderService k9OrderService;
+    @Autowired
+    IErpOrderService erpOrderService;
     @GetMapping("test")
-    @DataSource(DataSourceType.SOP)
-    public void fileDownload(){
-        rocketMQTemplate.syncSend("ad-upload", JSON.toJSONString(AdUploadVo.builder().state("测试").type(AdUploadType.ADD_WX).build()));
+    public void fileDownload() {
+        deliveryOpScrm();
+    }
+    private IErpOrderService getErpService() {
+
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        Integer erpOpen = sysConfig.getErpOpen();
+        if (erpOpen != null && erpOpen == 1){
+            //判断erp类型
+            Integer erpType = sysConfig.getErpType();
+            if (erpType != null){
+                IErpOrderService erpOrderService = null;
+                if (erpType == 1){
+                    //管易
+                    erpOrderService =  gyOrderService;
+                } else if (erpType == 2){
+                    //旺店通
+                    erpOrderService =  wdtOrderService;
+                } else if (erpType == 3){
+                    //
+                    erpOrderService =  hzOMSErpOrderService;
+                } else if (erpType == 4){
+                    //代服
+                    erpOrderService =  dfOrderService;
+                }else if(erpType == 5){
+                    erpOrderService=jSTOrderService;
+                }else if(erpType == 6){
+                    erpOrderService=k9OrderService;
+                }
+                return erpOrderService;
+
+
+            }
+        }
+        return null;
+    }
+    public void deliveryOpScrm()
+    {
+        System.out.println("deliveryOpScrm");
+        IErpOrderService erpOrderService = getErpService();
+        List<FsStoreOrderScrm> orders = null;
+        if (erpOrderService == gyOrderService){
+            orders = fsStoreOrderMapper.selectOmsOrderdeliveryOpScrm();
+        } else if (erpOrderService == wdtOrderService || erpOrderService == dfOrderService || erpOrderService == jSTOrderService){
+            orders = fsStoreOrderMapper.selectWdtOmsOrderdeliveryOpScrm();
+        }
+        logger.info("查询到的"+orders.size());
+        for(FsStoreOrderScrm order:orders){
+            ErpOrderQueryRequert request=new ErpOrderQueryRequert();
+            request.setCode(order.getExtendOrderId());
+            if (erpOrderService != null){
+                ErpOrderQueryResponse response=erpOrderService.getOrder(request);
+                if (erpOrderService != dfOrderService){
+                    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())){
+                                        //更新商订单状态 删除REDIS
+                                        logger.info("查询到的"+delivery);
+
+                                        fsStoreOrderService.deliveryOrderScrm(order.getOrderCode(),delivery.getMail_no(),delivery.getExpress_code(),delivery.getExpress_name());
+                                        redisCache.deleteObject("delivery"+":"+order.getExtendOrderId());
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
     }
 
 }

+ 9 - 0
fs-company/src/main/java/com/fs/company/controller/company/CompanyProfileController.java

@@ -6,6 +6,7 @@ import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.utils.PatternUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.file.FileUploadUtils;
@@ -15,6 +16,8 @@ import com.fs.company.service.ICompanyUserService;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.security.SecurityUtils;
 import com.fs.framework.service.TokenService;
+import com.fs.im.config.ImTypeConfig;
+import com.fs.im.service.OpenIMService;
 import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +42,8 @@ public class CompanyProfileController extends BaseController
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    private OpenIMService openIMService;
     /**
      * 个人信息
      */
@@ -67,6 +72,10 @@ public class CompanyProfileController extends BaseController
 
         if (userService.updateUserProfile(user) > 0)
         {
+            //修改im用户信息
+            if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                openIMService.updateUserInfo(user);
+            }
             LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
             // 更新缓存用户信息
             loginUser.getUser().setNickName(user.getNickName());

+ 15 - 6
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -34,6 +34,8 @@ import com.fs.framework.service.TokenService;
 import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.his.vo.OptionsVO;
 import com.fs.hisStore.vo.FsStoreProductExportVO;
+import com.fs.im.config.IMConfig;
+import com.fs.im.dto.OpenImResponseDTO;
 import com.fs.im.service.OpenIMService;
 import com.fs.qw.domain.QwCompany;
 import com.fs.qw.service.IQwCompanyService;
@@ -621,7 +623,7 @@ public class CompanyUserController extends BaseController {
             requestBody = new JSONObject();
             userIds.add(userId);
             requestBody.put("checkUserIDs", userIds);
-            String body = HttpRequest.post("https://web.im.ysya.top/api/user/account_check")
+            String body = HttpRequest.post(IMConfig.URL+"/user/account_check")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString())
@@ -642,13 +644,13 @@ public class CompanyUserController extends BaseController {
                     ArrayList<Object> users = new ArrayList<>();
                     HashMap<String, String> map = new HashMap<>();
                     map.put("userID",userId);
-                    map.put("nickname",companyUser.getImNickName());
+                    map.put("nickname",companyUser.getNickName());
                     map.put("faceURL",companyUser.getAvatar());
                     users.add(map);
                     requestBody = new JSONObject();
-                    userIds.add(userId);
+                    //userIds.add(userId);
                     requestBody.put("users", users);
-                    HttpRequest.post("https://web.im.ysya.top/api/user/user_register")
+                    String registerBody = HttpRequest.post(IMConfig.URL+"/user/user_register")
                             .header("operationID", String.valueOf(System.currentTimeMillis()))
                             .header("token", adminToken).body(requestBody.toString()).execute().body();
                 }
@@ -661,7 +663,7 @@ public class CompanyUserController extends BaseController {
             requestBody = new JSONObject();
             requestBody.put("platformID",5);
             requestBody.put("userID",userId);
-            String body1 = HttpRequest.post("https://web.im.ysya.top/api/auth/get_user_token")
+            String body1 = HttpRequest.post(IMConfig.URL+"/auth/get_user_token")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString()).execute().body();
@@ -673,5 +675,12 @@ public class CompanyUserController extends BaseController {
             return R.error("获取管理员token失败");
         }
     }
-
+    @ApiOperation("添加好友")
+    @PostMapping("/importFriend")
+    public R importFriend(@RequestBody HashMap<String,Object> map){
+        String ownerUserID = (String) map.get("ownerUserID");
+        List<String> friendUserIDs = (List<String>)map.get("friendUserIDs");
+        OpenImResponseDTO openImResponseDTO = openIMService.importFriend(ownerUserID, friendUserIDs);
+        return R.ok().put("data",openImResponseDTO);
+    }
 }

+ 5 - 2
fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactTransferCompanyAuditController.java

@@ -10,6 +10,7 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.qw.domain.QwExternalContactTransferCompanyAudit;
+import com.fs.qw.domain.QwExternalContactTransferCompanyAuditUser;
 import com.fs.qw.service.IQwExternalContactTransferCompanyAuditService;
 import com.fs.qw.service.IQwExternalContactTransferCompanyAuditUserService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -50,7 +51,9 @@ public class QwExternalContactTransferCompanyAuditController extends BaseControl
 
     @PreAuthorize("@ss.hasPermi('qw:externalContactTransferCompanyAudit:detail')")
     @GetMapping("/detail/{auditId}")
-    public AjaxResult detail(@PathVariable Long auditId) {
-        return AjaxResult.success(auditUserService.getListByAuditId(auditId));
+    public TableDataInfo detail(@PathVariable Long auditId) {
+        startPage();
+        List<QwExternalContactTransferCompanyAuditUser> list = auditUserService.getListByAuditId(auditId);
+        return getDataTable(list);
     }
 }

+ 10 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwSopLogsController.java

@@ -1,10 +1,12 @@
 package com.fs.company.controller.qw;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
@@ -60,7 +62,8 @@ public class QwSopLogsController extends BaseController
 
     @Autowired
     private ICompanyUserService iCompanyUserService;
-
+    @Autowired
+    private RedisCache redisCache;
     @Autowired
     private CompanyDeptServiceImpl companyDeptService;
 
@@ -266,6 +269,12 @@ public class QwSopLogsController extends BaseController
     @PutMapping("/editCourseQwSopLogs/{ids}")
     public AjaxResult editCourseQwSopLogs(@PathVariable String[] ids)
     {
+       if (ObjectUtil.isNotEmpty(ids)){
+           for (String id : ids) {
+               String key = "qw:logs:pad:send:id:" + id;
+               redisCache.deleteObject(key);
+           }
+       }
         return toAjax(iQwSopLogsService.editCourseQwSopLogs(ids));
     }
 

+ 71 - 0
fs-company/src/main/java/com/fs/company/controller/store/FsPrescribeController.java

@@ -1,15 +1,20 @@
 package com.fs.company.controller.store;
 
+import cn.hutool.json.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.security.SecurityUtils;
 import com.fs.his.domain.FsExportTask;
 import com.fs.his.domain.FsPrescribe;
+import com.fs.his.dto.PayloadDTO;
 import com.fs.his.param.FsPrescribeParam;
 import com.fs.his.service.IFsExportTaskService;
 import com.fs.his.service.IFsPrescribeService;
@@ -17,6 +22,11 @@ import com.fs.his.vo.FsMessageFeedbackExportListVO;
 import com.fs.his.vo.FsPrescribeExcelListVO;
 import com.fs.his.vo.FsPrescribeListVO;
 import com.fs.his.vo.FsPrescribeVO;
+import com.fs.im.config.ImTypeConfig;
+import com.fs.im.dto.OpenImMsgDTO;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
@@ -31,6 +41,7 @@ import java.util.List;
  * @author fs
  * @date 2023-06-13
  */
+@Slf4j
 @RestController
 @RequestMapping("/store/prescribe")
 public class FsPrescribeController extends BaseController
@@ -39,6 +50,8 @@ public class FsPrescribeController extends BaseController
     private IFsPrescribeService fsPrescribeService;
     @Autowired
     private IFsExportTaskService exportTaskService;
+    @Autowired
+    private OpenIMService openIMService;
     /**
      * 查询处方列表
      */
@@ -72,6 +85,64 @@ public class FsPrescribeController extends BaseController
         return getDataTable(list);
     }
 
+    @GetMapping("/myImList")
+    public TableDataInfo myImList(FsPrescribeParam fsPrescribe)
+    {
+        startPage();
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        //fsPrescribe.setCompanyUserId(loginUser.getUser().getUserId());
+        List<FsPrescribeListVO> list = fsPrescribeService.selectFsPrescribeListVO(fsPrescribe);
+        for (FsPrescribeListVO vo : list) {
+            if (vo.getPatientTel()!=null){
+                vo.setPatientTel(vo.getPatientTel().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+            }
+        }
+        return getDataTable(list);
+    }
+
+    @PostMapping("/sendPrescribe")
+    public AjaxResult sendPrescribe(@RequestBody FsPrescribeParam fsPrescribe) throws JsonProcessingException {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if(ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            log.info("拼接消息体");
+            //部署到正式环境以后下面这段代码要注释,使用定时任务执行auditPrescribe审核处方以后发送消息
+            ObjectMapper objectMapper = new ObjectMapper();
+            OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+            openImMsgDTO.setSendID("C"+loginUser.getUser().getUserId());
+            openImMsgDTO.setRecvID("U"+fsPrescribe.getUserId());
+            openImMsgDTO.setContentType(110);
+            openImMsgDTO.setSenderPlatformID(5);
+            openImMsgDTO.setSessionType(1);
+            OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+            //content.setContent(ext);
+            PayloadDTO payload = new PayloadDTO();
+            payload.setData("prescribe");
+            PayloadDTO.Extension extension = new PayloadDTO.Extension();
+            extension.setDiagnose(fsPrescribe.getDiagnose());
+            extension.setPrescribeId(fsPrescribe.getPrescribeId().toString());
+            payload.setExtension(extension);
+            extension.setStatus(fsPrescribe.getStatus());
+            OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+
+            imData.setPayload(payload);
+
+            String imJson = objectMapper.writeValueAsString(imData);
+            content.setData(imJson);
+            openImMsgDTO.setContent(content);
+
+            JSONObject jsonObject = new JSONObject(openImMsgDTO);
+            log.info("开始发送消息");
+//            OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+//            offlinePushInfo.setDesc("处方单");
+//            offlinePushInfo.setTitle(doctor.getDoctorName());
+//            offlinePushInfo.setIOSBadgeCount(true);
+//            offlinePushInfo.setIOSPushSound("");
+//            openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
+            OpenImResponseDTO openImResponseDTO = openIMService.openIMSendMsg(openImMsgDTO);
+            return AjaxResult.success(openImResponseDTO);
+        }
+        return AjaxResult.success(null);
+    }
 
     /**
      * 导出处方列表

+ 2 - 2
fs-company/src/main/java/com/fs/company/controller/store/FsStoreOrderController.java

@@ -130,7 +130,7 @@ public class FsStoreOrderController extends BaseController
         task.setCompanyUserId(userId);
         exportTaskService.insertFsExportTask(task);
         param.setTaskId(task.getTaskId());
-        exportTaskService.exportStore1Data(param,false, null);
+        exportTaskService.exportStore1Data(param,false, false,null);
         return new AjaxResult(200,"后台正在导出,请等待...任务ID:"+task.getTaskId(),task.getTaskId());
 
 
@@ -172,7 +172,7 @@ public class FsStoreOrderController extends BaseController
         task.setCompanyUserId(userId);
         exportTaskService.insertFsExportTask(task);
         param.setTaskId(task.getTaskId());
-        exportTaskService.exportStore1Data(param,false, null);
+        exportTaskService.exportStore1Data(param,false,false, null);
         return new AjaxResult(200,"后台正在导出,请等待...任务ID:"+task.getTaskId(),task.getTaskId());
     }
     /**

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

@@ -3,7 +3,7 @@ server:
 # Spring配置
 spring:
   profiles:
-#    active: druid-fcky-test
+    active: druid-jnsyj-test
 #    active: druid-jnmy-test
 #    active: druid-jzzx-test
 #    active: druid-hdt
@@ -11,5 +11,5 @@ spring:
 #    active: druid-yzt
 #    active: druid-myhk
 #    active: druid-sft
-    active: dev-jnlzjk
+#    active: dev-jnlzjk
 #    active: dev-yjb

+ 4 - 3
fs-doctor-app/src/main/java/com/fs/app/controller/DoctorController.java

@@ -121,7 +121,7 @@ public class DoctorController extends  AppBaseController {
             requestBody = new JSONObject();
             userIds.add(userId);
             requestBody.put("checkUserIDs", userIds);
-            String body = HttpRequest.post("https://web.im.ysya.top/api/user/account_check")
+            String body = HttpRequest.post(IMConfig.URL+"/user/account_check")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString())
@@ -148,9 +148,10 @@ public class DoctorController extends  AppBaseController {
                     requestBody = new JSONObject();
                     userIds.add(userId);
                     requestBody.put("users", users);
-                    HttpRequest.post("https://web.im.ysya.top/api/user/user_register")
+                    String body1 = HttpRequest.post(IMConfig.URL+"/user/user_register")
                             .header("operationID", String.valueOf(System.currentTimeMillis()))
                             .header("token", adminToken).body(requestBody.toString()).execute().body();
+                    log.info("注册结果:"+body1);
                 }
             } else {
                 return R.error("返回结果为空");
@@ -161,7 +162,7 @@ public class DoctorController extends  AppBaseController {
             requestBody = new JSONObject();
             requestBody.put("platformID",5);
             requestBody.put("userID",userId);
-            String body1 = HttpRequest.post("https://web.im.ysya.top/api/auth/get_user_token")
+            String body1 = HttpRequest.post(IMConfig.URL+"/auth/get_user_token")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString()).execute().body();

+ 16 - 10
fs-doctor-app/src/main/java/com/fs/app/controller/DrugReportController.java

@@ -8,6 +8,7 @@ import com.fs.app.param.DrugReportAddParam;
 import com.fs.app.param.DrugReportFinishParam;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
+import com.fs.common.enums.ImTypeEnum;
 import com.fs.his.domain.FsDoctor;
 import com.fs.his.domain.FsDrugReport;
 import com.fs.his.domain.FsFollow;
@@ -22,6 +23,7 @@ import com.fs.his.vo.FsDrugReportDVO;
 import com.fs.his.vo.FsDrugReportListDVO;
 import com.fs.his.vo.FsFollowListDVO;
 import com.fs.im.config.IMConfig;
+import com.fs.im.config.ImTypeConfig;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
 import com.fs.im.service.OpenIMService;
@@ -109,11 +111,13 @@ public class DrugReportController extends AppBaseController {
             msg.setMsgContent(new MsgDataFormatDTO("drugReport",ext,report.getReportId().toString()));
             msgs.add(msg);
             msgDTO.setMsgBody(msgs);
-            //imService.sendMsg(msgDTO);
-            ObjectMapper objectMapper = new ObjectMapper();
-            String ex = objectMapper.writeValueAsString(customDTO);
-            openIMService.sendUtil("D"+follow.getDoctorId(),"U"+follow.getUserId(),110,"drugReport","","","",report.getReportId().toString(),ex);
-
+            if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                ObjectMapper objectMapper = new ObjectMapper();
+                String ex = objectMapper.writeValueAsString(customDTO);
+                openIMService.sendUtil("D"+follow.getDoctorId(),"U"+follow.getUserId(),110,"drugReport","","","",report.getReportId().toString(),ex);
+            }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+                imService.sendMsg(msgDTO);
+            }
             fsDrugReportCountService.addReportCountByUserIdAndDoctorId(follow.getUserId(),follow.getDoctorId());
 
             return R.ok();
@@ -144,11 +148,13 @@ public class DrugReportController extends AppBaseController {
         msg.setMsgContent(new MsgDataFormatDTO("您的用药咨询报告已出具,本次咨询结束"));
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        //imService.sendMsg(msgDTO);
-        ObjectMapper objectMapper = new ObjectMapper();
-        String ex = objectMapper.writeValueAsString(customDTO);
-        openIMService.sendUtil("D"+follow.getDoctorId(),"U"+follow.getUserId(),110,"finishDrugReport","","您的用药咨询报告已出具,本次咨询结束","","",ex);
-
+        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            ObjectMapper objectMapper = new ObjectMapper();
+            String ex = objectMapper.writeValueAsString(customDTO);
+            openIMService.sendUtil("D"+follow.getDoctorId(),"U"+follow.getUserId(),110,"finishDrugReport","","您的用药咨询报告已出具,本次咨询结束","","",ex);
+        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+            imService.sendMsg(msgDTO);
+        }
         redisTemplate.delete("DrugReport:doctorId:" + follow.getDoctorId() + ":userId:" + follow.getUserId());
         return R.ok();
 

+ 40 - 25
fs-doctor-app/src/main/java/com/fs/app/controller/InquiryOrderController.java

@@ -10,6 +10,8 @@ import com.fs.common.BeanCopyUtils;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.domain.R;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.enums.ImTypeEnum;
+import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.service.ICompanyService;
 import com.fs.core.config.WxPayProperties;
@@ -19,6 +21,7 @@ import com.fs.his.dto.FsInquiryOrderPatientDTO;
 import com.fs.his.param.*;
 import com.fs.his.service.*;
 import com.fs.his.vo.*;
+import com.fs.im.config.ImTypeConfig;
 import com.fs.im.dto.MsgCustomDTO;
 import com.fs.im.dto.MsgDTO;
 import com.fs.im.dto.MsgDataDTO;
@@ -32,11 +35,13 @@ import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import io.reactivex.internal.operators.parallel.ParallelRunOn;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -286,15 +291,15 @@ public class InquiryOrderController extends  AppBaseController {
 
         }
         FsInquiryOrder inquiryOrder=inquiryOrderService.selectFsInquiryOrderByOrderId(report.getOrderId());
-        /*MsgDTO msgDTO=new MsgDTO();
+        MsgDTO msgDTO=new MsgDTO();
         msgDTO.setFrom_Account("D-"+report.getDoctorId().toString());
-        msgDTO.setTo_Account("U-"+report.getUserId().toString());*/
+        msgDTO.setTo_Account("U-"+report.getUserId().toString());
         MsgCustomDTO customDTO=new MsgCustomDTO();
         customDTO.setType("startInquiry");
         customDTO.setImType(1);
         customDTO.setOrderType(inquiryOrder.getOrderType());
         customDTO.setOrderId(report.getOrderId().toString());
-        /*msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
+        msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
         List<MsgDataDTO> msgs=new ArrayList<>();
         MsgDataDTO msg=new MsgDataDTO();
         String ext= JSONUtil.toJsonStr(report);
@@ -302,28 +307,31 @@ public class InquiryOrderController extends  AppBaseController {
         msg.setMsgContent(new MsgDataFormatDTO("report",ext,orderId));
         msg.setMsgType("TIMCustomElem");//TIMCustomElem
         msgs.add(msg);
-        msgDTO.setMsgBody(msgs);*/
-        //imService.sendMsg(msgDTO);
-        ObjectMapper objectMapper = new ObjectMapper();
-        String ex = objectMapper.writeValueAsString(customDTO);
-        openIMService.sendUtil("D"+report.getDoctorId(),"U"+report.getUserId(),110,"report","","","",report.getOrderId().toString(),ex);
-        /*JSONObject jsonObject = new JSONObject();
-        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
-        openImMsgDTO.setSendID("D"+report.getDoctorId().toString());
-        openImMsgDTO.setRecvID("U"+report.getUserId().toString());
-        openImMsgDTO.setContentType(110);
-        openImMsgDTO.setSenderPlatformID(5);
-        openImMsgDTO.setSessionType(1);
-
-        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
-        PayloadDTO payloadDTO = new PayloadDTO();
-        payloadDTO.setData("startInquiry");
-        PayloadDTO.Extension extension = new PayloadDTO.Extension();
-        extension.setTitle();
-        //content.setContent(ext);
-        openImMsgDTO.setContent(content);
-        openImMsgDTO.setEx(customDTO);
-        openIMService.openIMSendMsg(openImMsgDTO);*/
+        msgDTO.setMsgBody(msgs);
+        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            ObjectMapper objectMapper = new ObjectMapper();
+            String ex = objectMapper.writeValueAsString(customDTO);
+            openIMService.sendUtil("D"+report.getDoctorId(),"U"+report.getUserId(),110,"report","","","",report.getOrderId().toString(),ex);
+        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+            imService.sendMsg(msgDTO);
+        }
+//        JSONObject jsonObject = new JSONObject();
+//        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+//        openImMsgDTO.setSendID("D"+report.getDoctorId().toString());
+//        openImMsgDTO.setRecvID("U"+report.getUserId().toString());
+//        openImMsgDTO.setContentType(110);
+//        openImMsgDTO.setSenderPlatformID(5);
+//        openImMsgDTO.setSessionType(1);
+//
+//        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+//        PayloadDTO payloadDTO = new PayloadDTO();
+//        payloadDTO.setData("startInquiry");
+//        PayloadDTO.Extension extension = new PayloadDTO.Extension();
+//        extension.setTitle();
+//        //content.setContent(ext);
+//        openImMsgDTO.setContent(content);
+//        openImMsgDTO.setEx(customDTO);
+//        openIMService.openIMSendMsg(openImMsgDTO);
         return R.ok("操作成功");
     }
 
@@ -354,4 +362,11 @@ public class InquiryOrderController extends  AppBaseController {
         }
         return R.ok().put("data","");
     }
+
+    @PostMapping("/closeOrder")
+    public R closeOrder(@RequestBody Long orderId){
+        inquiryOrderService.closeOrder(orderId);
+        logger.info("closeOrder: {}", orderId);
+        return R.ok();
+    }
 }

+ 41 - 1
fs-doctor-app/src/main/java/com/fs/app/controller/PrescribeController.java

@@ -8,6 +8,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.app.annotation.Login;
 import com.fs.common.core.domain.R;
+import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.core.utils.OrderCodeUtils;
@@ -19,6 +20,7 @@ import com.fs.his.service.*;
 import com.fs.his.vo.FsDoctorPrescribeListDVO;
 import com.fs.his.vo.FsPrescribeListDVO;
 import com.fs.im.config.IMConfig;
+import com.fs.im.config.ImTypeConfig;
 import com.fs.im.dto.MsgCustomDTO;
 import com.fs.im.dto.OpenImMsgDTO;
 import com.fs.im.dto.OpenImResponseDTO;
@@ -197,7 +199,7 @@ public class PrescribeController extends  AppBaseController {
     @ApiOperation("创建处方")
     @Transactional
     @PostMapping("/createPrescribe")
-    public R createPrescribe(@Validated @RequestBody FsPrescribeCreateParam param, HttpServletRequest request){
+    public R createPrescribe(@Validated @RequestBody FsPrescribeCreateParam param, HttpServletRequest request) throws JsonProcessingException {
 
         //获取问诊单
         FsInquiryOrder inquiryOrder=inquiryOrderService.selectFsInquiryOrderByOrderId(param.getOrderId());
@@ -264,6 +266,44 @@ public class PrescribeController extends  AppBaseController {
                     prescribeDrug.setPrescribeId(prescribe.getPrescribeId());
                     prescribeDrugService.insertFsPrescribeDrug(prescribeDrug);
                 }
+                if(ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+                    log.info("拼接消息体");
+                    //部署到正式环境以后下面这段代码要注释,使用定时任务执行auditPrescribe审核处方以后发送消息
+                    ObjectMapper objectMapper = new ObjectMapper();
+                    OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+                    openImMsgDTO.setSendID("D"+inquiryOrder.getDoctorId());
+                    openImMsgDTO.setRecvID("U"+inquiryOrder.getUserId());
+                    openImMsgDTO.setContentType(110);
+                    openImMsgDTO.setSenderPlatformID(5);
+                    openImMsgDTO.setSessionType(1);
+                    OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+                    //content.setContent(ext);
+                    PayloadDTO payload = new PayloadDTO();
+                    payload.setData("prescribe");
+                    PayloadDTO.Extension extension = new PayloadDTO.Extension();
+                    extension.setDiagnose(inquiryOrder.getTitle());
+                    extension.setPrescribeId(prescribe.getPrescribeId().toString());
+                    payload.setExtension(extension);
+                    extension.setStatus(prescribe.getStatus());
+                    OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+
+                    imData.setPayload(payload);
+
+                    String imJson = objectMapper.writeValueAsString(imData);
+                    content.setData(imJson);
+                    openImMsgDTO.setContent(content);
+
+                    JSONObject jsonObject = new JSONObject(openImMsgDTO);
+                    log.info("开始发送消息");
+                    OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+                    offlinePushInfo.setDesc("处方单");
+                    offlinePushInfo.setTitle(doctor.getDoctorName());
+                    offlinePushInfo.setIOSBadgeCount(true);
+                    offlinePushInfo.setIOSPushSound("");
+                    openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
+                    OpenImResponseDTO openImResponseDTO = openIMService.openIMSendMsg(openImMsgDTO);
+                }
+
 
                 return R.ok("操作成功").put("prescribe",prescribe);
             }

+ 18 - 2
fs-doctor-app/src/main/java/com/fs/framework/config/MyBatisConfig.java

@@ -28,7 +28,7 @@ import java.util.List;
 
 /**
  * Mybatis支持*匹配扫描包
- * 
+ *
 
  */
 @Configuration
@@ -115,6 +115,22 @@ public class MyBatisConfig
         return resources.toArray(new Resource[resources.size()]);
     }
 
+    //    @Bean
+//    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
+//    {
+//        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
+//        String mapperLocations = env.getProperty("mybatis.mapperLocations");
+//        String configLocation = env.getProperty("mybatis.configLocation");
+//        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
+//        VFS.addImplClass(SpringBootVFS.class);
+//
+//        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+//        sessionFactory.setDataSource(dataSource);
+//        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
+//        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
+//        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
+//        return sessionFactory.getObject();
+//    }
     @Bean
     public SqlSessionFactory sqlSessionFactorys(DataSource dataSource) throws Exception
     {
@@ -131,4 +147,4 @@ public class MyBatisConfig
         sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
         return sessionFactory.getObject();
     }
-}
+}

+ 2 - 2
fs-doctor-app/src/main/resources/mybatis/mybatis-config.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
-	
+
 	<settings>
 		<setting name="cacheEnabled"             value="true" />  <!-- 全局映射器启用缓存 -->
 		<setting name="useGeneratedKeys"         value="true" />  <!-- 允许 JDBC 支持自动生成主键 -->
@@ -11,5 +11,5 @@ PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 		<setting name="logImpl"                  value="SLF4J" /> <!-- 指定 MyBatis 所用日志的具体实现 -->
 		 <setting name="mapUnderscoreToCamelCase" value="true"/>
 	</settings>
-	
+
 </configuration>

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

@@ -9,4 +9,4 @@ spring:
 #    active: druid-yzt
 #    active: druid-sxjz
 #    active: druid-sft
-group-no: 1
+group-no: 2

+ 35 - 2
fs-qw-api/src/main/java/com/fs/app/controller/CommonController.java

@@ -1,8 +1,21 @@
 package com.fs.app.controller;
 
+import com.fs.common.core.domain.R;
+import com.fs.common.exception.file.OssException;
+import com.fs.course.param.UserCourseComplaintRecordParam;
+import com.fs.course.service.IFsUserCourseComplaintTypeService;
+import com.fs.course.vo.FsUserCourseComplaintTypeListVO;
+import com.fs.qw.param.QwUserComplaintRecordParam;
+import com.fs.qw.service.IQwUserComplainRecordService;
+import com.fs.system.oss.CloudStorageService;
+import com.fs.system.oss.OSSFactory;
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
 
 
 @Api("公共接口")
@@ -10,6 +23,26 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping(value="/app/common")
 public class CommonController {
 
+    @Autowired
+    private IQwUserComplainRecordService qwUserComplainRecordService;
+
+    @Autowired
+    private IFsUserCourseComplaintTypeService fsUserCourseComplaintTypeService;
+
+    @PostMapping("uploadOSS")
+    public R uploadOSS(@RequestParam("file") MultipartFile file) throws Exception
+    {
 
+        if (file.isEmpty())
+        {
+            throw new OssException("上传文件不能为空");
+        }
+        // 上传文件
+        String fileName = file.getOriginalFilename();
+        String suffix = fileName.substring(fileName.lastIndexOf("."));
+        CloudStorageService storage = OSSFactory.build();
+        String url = storage.uploadSuffix(file.getBytes(), suffix);
+        return R.ok().put("url",url);
+    }
 
 }

+ 46 - 0
fs-qw-api/src/main/java/com/fs/app/controller/QwUserComplainRecordController.java

@@ -0,0 +1,46 @@
+package com.fs.app.controller;
+
+import com.fs.common.core.domain.R;
+import com.fs.course.service.IFsUserCourseComplaintTypeService;
+import com.fs.course.vo.FsUserCourseComplaintTypeListVO;
+import com.fs.qw.param.QwUserComplaintRecordParam;
+import com.fs.qw.service.IQwUserComplainRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Api("企微员工投诉接口")
+@RestController
+@RequestMapping(value="/app/record")
+public class QwUserComplainRecordController {
+
+
+    @Autowired
+    private IQwUserComplainRecordService qwUserComplainRecordService;
+
+    @Autowired
+    private IFsUserCourseComplaintTypeService fsUserCourseComplaintTypeService;
+
+
+    @ApiOperation("获取投诉类型")
+    @GetMapping("/getTypeTree")
+    public R getTypeTree() {
+        List<FsUserCourseComplaintTypeListVO> allComplaintTypeTree = fsUserCourseComplaintTypeService.getAllComplaintTypeTree();
+        return R.ok().put("data", allComplaintTypeTree);
+    }
+
+
+    @ApiOperation("提交企微员工反馈记录")
+    @PostMapping("/recordByQwUser")
+    public R submitByQwUser(@RequestBody QwUserComplaintRecordParam param) {
+        int i = qwUserComplainRecordService.submitRecordByQwUser(param);
+        if (i > 0) {
+            return R.ok("提交成功");
+        } else {
+            return R.error("提交失败");
+        }
+    }
+}

+ 1 - 1
fs-qwhook-sop/src/main/resources/application.yml

@@ -10,4 +10,4 @@ spring:
 #    active: druid-yzt
 #    active: druid-hdt
 #    active: druid-sxjz
-    active: druid-myhk-test
+    active: dev

+ 2 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyMapper.java

@@ -203,4 +203,6 @@ public interface CompanyMapper
      * 查询企微主体管理公司列表
      */
     List<OptionsVO> getCompanyListByCorpId(@Param("corpId") String corpId);
+
+    List<Company> selectCompanyMoneyAllList();
 }

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

@@ -694,6 +694,9 @@ public class CompanyServiceImpl implements ICompanyService
         }
     }
 
+
+
+
     @Override
     @Transactional
     public void subtractCompanyMoneyScrm(FsStoreOrderScrm order) {

+ 267 - 0
fs-service/src/main/java/com/fs/course/domain/BalanceRollbackError.java

@@ -0,0 +1,267 @@
+package com.fs.course.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Redis余额数据回滚异常登记表
+ * @TableName balance_rollback_error
+ */
+@TableName(value ="balance_rollback_error")
+public class BalanceRollbackError {
+    /**
+     * 自增主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 公司ID
+     */
+    private Long companyId;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 看客记录ID
+     */
+    private Long logId;
+
+    /**
+     * 视频ID
+     */
+    private Long videoId;
+
+    /**
+     * 状态:0-回滚异常登记,1-已重新回滚
+     */
+    private Integer status;
+
+    /**
+     * 异常金额
+     */
+    private BigDecimal money;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 备注信息
+     */
+    private String remark;
+
+    /**
+     * 自增主键ID
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * 自增主键ID
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * 公司ID
+     */
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    /**
+     * 公司ID
+     */
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    /**
+     * 用户ID
+     */
+    public Long getUserId() {
+        return userId;
+    }
+
+    /**
+     * 用户ID
+     */
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    /**
+     * 看客记录ID
+     */
+    public Long getLogId() {
+        return logId;
+    }
+
+    /**
+     * 看客记录ID
+     */
+    public void setLogId(Long logId) {
+        this.logId = logId;
+    }
+
+    /**
+     * 视频ID
+     */
+    public Long getVideoId() {
+        return videoId;
+    }
+
+    /**
+     * 视频ID
+     */
+    public void setVideoId(Long videoId) {
+        this.videoId = videoId;
+    }
+
+    /**
+     * 状态:0-回滚异常登记,1-已重新回滚
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * 状态:0-回滚异常登记,1-已重新回滚
+     */
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    /**
+     * 异常金额
+     */
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    /**
+     * 异常金额
+     */
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    /**
+     * 创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * 创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 更新时间
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * 更新时间
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * 备注信息
+     */
+    public String getRemark() {
+        return remark;
+    }
+
+    /**
+     * 备注信息
+     */
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        BalanceRollbackError other = (BalanceRollbackError) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getCompanyId() == null ? other.getCompanyId() == null : this.getCompanyId().equals(other.getCompanyId()))
+            && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId()))
+            && (this.getLogId() == null ? other.getLogId() == null : this.getLogId().equals(other.getLogId()))
+            && (this.getVideoId() == null ? other.getVideoId() == null : this.getVideoId().equals(other.getVideoId()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getMoney() == null ? other.getMoney() == null : this.getMoney().equals(other.getMoney()))
+            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))
+            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()))
+            && (this.getRemark() == null ? other.getRemark() == null : this.getRemark().equals(other.getRemark()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getCompanyId() == null) ? 0 : getCompanyId().hashCode());
+        result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode());
+        result = prime * result + ((getLogId() == null) ? 0 : getLogId().hashCode());
+        result = prime * result + ((getVideoId() == null) ? 0 : getVideoId().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getMoney() == null) ? 0 : getMoney().hashCode());
+        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
+        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());
+        result = prime * result + ((getRemark() == null) ? 0 : getRemark().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", companyId=").append(companyId);
+        sb.append(", userId=").append(userId);
+        sb.append(", logId=").append(logId);
+        sb.append(", videoId=").append(videoId);
+        sb.append(", status=").append(status);
+        sb.append(", money=").append(money);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append(", remark=").append(remark);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 59 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCompanyUserQw.java

@@ -0,0 +1,59 @@
+package com.fs.course.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 微信用户和销售关系-企业微信自动的对象 fs_user_company_user_qw
+ *
+ * @author fs
+ * @date 2025-10-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserCompanyUserQw extends BaseEntity{
+
+    /** id */
+    private Long id;
+
+    /** 用户id(关联fs_user表user_id) */
+    @Excel(name = "用户id", readConverterExp = "关=联fs_user表user_id")
+    private Long userId;
+
+    /** 销售id */
+    @Excel(name = "销售id")
+    private Long companyUserId;
+
+    /** 公司ID */
+    @Excel(name = "公司ID")
+    private Long companyId;
+
+    /** 是否重粉,1-是;0-否 */
+    @Excel(name = "是否重粉,1-是;0-否")
+    private Long isRepeatFans;
+
+    /** 课程项目ID */
+    @Excel(name = "课程项目ID")
+    private Long projectId;
+
+    /** 企微用户ID */
+    @Excel(name = "企微用户ID")
+    private Long qwUserId;
+
+    /** 企微外部联系人ID */
+    @Excel(name = "企微外部联系人ID")
+    private Long qwExternalContactId;
+
+    /** 企微主体ID */
+    @Excel(name = "企微主体ID")
+    private Long qwCompanyId;
+
+    /** 状态 0小黑屋 1正常 2拉黑 */
+    @Excel(name = "状态 0小黑屋 1正常 2拉黑")
+    private Long status;
+
+
+}

+ 18 - 0
fs-service/src/main/java/com/fs/course/mapper/BalanceRollbackErrorMapper.java

@@ -0,0 +1,18 @@
+package com.fs.course.mapper;
+
+import com.fs.course.domain.BalanceRollbackError;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Administrator
+* @description 针对表【balance_rollback_error(Redis余额数据回滚异常登记表)】的数据库操作Mapper
+* @createDate 2025-10-22 10:29:23
+* @Entity com.fs.course.domain.BalanceRollbackError
+*/
+public interface BalanceRollbackErrorMapper extends BaseMapper<BalanceRollbackError> {
+
+}
+
+
+
+

+ 61 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserQwMapper.java

@@ -0,0 +1,61 @@
+package com.fs.course.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.course.domain.FsUserCompanyUserQw;
+
+/**
+ * 微信用户和销售关系-企业微信自动的Mapper接口
+ * 
+ * @author fs
+ * @date 2025-10-23
+ */
+public interface FsUserCompanyUserQwMapper extends BaseMapper<FsUserCompanyUserQw>{
+    /**
+     * 查询微信用户和销售关系-企业微信自动的
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 微信用户和销售关系-企业微信自动的
+     */
+    FsUserCompanyUserQw selectFsUserCompanyUserQwById(Long id);
+
+    /**
+     * 查询微信用户和销售关系-企业微信自动的列表
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 微信用户和销售关系-企业微信自动的集合
+     */
+    List<FsUserCompanyUserQw> selectFsUserCompanyUserQwList(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 新增微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    int insertFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 修改微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    int updateFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 删除微信用户和销售关系-企业微信自动的
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserQwById(Long id);
+
+    /**
+     * 批量删除微信用户和销售关系-企业微信自动的
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserQwByIds(Long[] ids);
+}

+ 3 - 3
fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java

@@ -34,10 +34,10 @@ public class FsCourseWatchLogListParam implements Serializable {
     private Integer sendType;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date eTime;
+    private String eTime;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date sTime;
+    private String sTime;
 
     @JsonFormat(pattern = "yyyy-MM-dd")
     private String upSTime;
@@ -65,7 +65,7 @@ public class FsCourseWatchLogListParam implements Serializable {
 
 
     private Long taskId;//任务ID
-    private Long project;//任务ID
+    //private Long project;//任务ID
 
     private List<Long> periodIds;//训练营期ID
 

+ 1 - 1
fs-service/src/main/java/com/fs/course/param/FsUserCourseOrderDoPayParam.java

@@ -10,5 +10,5 @@ public class FsUserCourseOrderDoPayParam implements Serializable {
     @NotNull(message = "订单号不能为空")
     Long orderId;
     Long userId;
-    String appId;
+    private String appId;
 }

+ 16 - 0
fs-service/src/main/java/com/fs/course/service/BalanceRollbackErrorService.java

@@ -0,0 +1,16 @@
+package com.fs.course.service;
+
+import com.fs.course.domain.BalanceRollbackError;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Administrator
+* @description 针对表【balance_rollback_error(Redis余额数据回滚异常登记表)】的数据库操作Service
+* @createDate 2025-10-22 10:29:23
+*/
+public interface BalanceRollbackErrorService extends IService<BalanceRollbackError> {
+
+    public void processBatchRollbackByCompanyId();
+
+    void initCompanyBalance();
+}

+ 61 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCompanyUserQwService.java

@@ -0,0 +1,61 @@
+package com.fs.course.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.course.domain.FsUserCompanyUserQw;
+
+/**
+ * 微信用户和销售关系-企业微信自动的Service接口
+ * 
+ * @author fs
+ * @date 2025-10-23
+ */
+public interface IFsUserCompanyUserQwService extends IService<FsUserCompanyUserQw>{
+    /**
+     * 查询微信用户和销售关系-企业微信自动的
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 微信用户和销售关系-企业微信自动的
+     */
+    FsUserCompanyUserQw selectFsUserCompanyUserQwById(Long id);
+
+    /**
+     * 查询微信用户和销售关系-企业微信自动的列表
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 微信用户和销售关系-企业微信自动的集合
+     */
+    List<FsUserCompanyUserQw> selectFsUserCompanyUserQwList(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 新增微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    int insertFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 修改微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    int updateFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw);
+
+    /**
+     * 批量删除微信用户和销售关系-企业微信自动的
+     * 
+     * @param ids 需要删除的微信用户和销售关系-企业微信自动的主键集合
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserQwByIds(Long[] ids);
+
+    /**
+     * 删除微信用户和销售关系-企业微信自动的信息
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 结果
+     */
+    int deleteFsUserCompanyUserQwById(Long id);
+}

+ 0 - 1
fs-service/src/main/java/com/fs/course/service/IFsUserCourseComplaintRecordService.java

@@ -70,5 +70,4 @@ public interface IFsUserCourseComplaintRecordService extends IService<FsUserCour
      * @return int
      */
     int submitRecord(UserCourseComplaintRecordParam userCourseComplaintRecordParam);
-
 }

+ 1 - 1
fs-service/src/main/java/com/fs/course/service/IFsUserCoursePeriodService.java

@@ -103,5 +103,5 @@ public interface IFsUserCoursePeriodService
     List<Long> selectFsUserCoursePeriodListByPeriodId(List<Long> periodIds,Long companyId);
 
     R insertFsUserCoursePeriodAndCourse(FsUserCoursePeriod fsUserCoursePeriod);
-
+    R copyFsUserCoursePeriodAndCourse(PeriodStatisticCountParam param);
 }

+ 175 - 0
fs-service/src/main/java/com/fs/course/service/impl/BalanceRollbackErrorServiceImpl.java

@@ -0,0 +1,175 @@
+package com.fs.course.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.constant.FsConstants;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.Company;
+import com.fs.company.mapper.CompanyMapper;
+import com.fs.course.domain.BalanceRollbackError;
+import com.fs.course.mapper.BalanceRollbackErrorMapper;
+import com.fs.course.service.BalanceRollbackErrorService;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+* @author Administrator
+* @description 针对表【balance_rollback_error(Redis余额数据回滚异常登记表)】的数据库操作Service实现
+* @createDate 2025-10-22 10:29:23
+*/
+@Service
+public class BalanceRollbackErrorServiceImpl extends ServiceImpl<BalanceRollbackErrorMapper, BalanceRollbackError>
+    implements BalanceRollbackErrorService{
+
+
+    private static final Logger logger = LoggerFactory.getLogger(BalanceRollbackErrorServiceImpl.class);
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Autowired
+    private CompanyMapper companyMapper;
+
+    @Override
+    public void processBatchRollbackByCompanyId() {
+        // 按companyId分组查询 余额异常表 中的companyId数据
+        List<Long> companyIds = this.list(
+                        new QueryWrapper<BalanceRollbackError>()
+                                .select("DISTINCT company_id")
+                                .eq("status", 0)
+                ).stream()
+                .map(BalanceRollbackError::getCompanyId) // 假设 getCompanyId 返回 Long 类型
+                .distinct()
+                .collect(Collectors.toList());
+
+
+        for(Long companyId : companyIds){
+            // 按公司查询余额异常表数据 状态为0 缓存回滚 每次查询1000条一次处理
+            int pageSize = 1000;
+            int offset = 0;
+            List<BalanceRollbackError> errorList;
+
+            do {
+                // 分页查询,每次只处理1000条记录
+                errorList = this.list(
+                        new QueryWrapper<BalanceRollbackError>()
+                                .eq("status", 0).eq("company_id", companyId)
+                                .last("LIMIT " + pageSize + " OFFSET " + offset)
+                );
+
+                // 每一千条回滚一次
+                if (!errorList.isEmpty()) {
+                    // 计算 预扣减总金额
+                    BigDecimal totalAmount = errorList.stream()
+                            .map(BalanceRollbackError::getMoney)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                    // 执行回滚操作
+                    processBatchRollback(companyId,errorList, totalAmount);
+                }
+
+                offset += pageSize;
+            } while (errorList.size() == pageSize);
+        }
+    }
+
+    @Override
+    @EventListener(ApplicationReadyEvent.class)
+    public void initCompanyBalance() {
+
+        // 查询公司表 Company
+        List<Company> companyList = companyMapper.selectCompanyMoneyAllList();
+        if (companyList.isEmpty()) {
+            return;
+        }
+        for (Company company : companyList) {
+            String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + company.getCompanyId();
+            // 判断缓存为空初始化
+            String moneyStr = redisCache.getCacheObject(companyMoneyKey);
+            if (StringUtils.isEmpty(moneyStr)) {
+                // 初始化余额
+                redisCache.setCacheObject(companyMoneyKey, company.getMoney().toString());
+            }
+        }
+    }
+
+    /**
+     * @Description: 按公司批量回滚
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/22 11:39
+     */
+    private void processBatchRollback(Long companyId,List<BalanceRollbackError> errorList, BigDecimal totalAmount) {
+        String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + companyId;
+
+        // 加锁:扣减余额
+        RLock lock1 = redissonClient.getLock(FsConstants.COMPANY_MONEY_LOCK + companyId);
+        boolean lockAcquired=false;
+        try {
+            if (lock1.tryLock(3, 10, TimeUnit.SECONDS)) {
+                lockAcquired=true;
+                BigDecimal originalMoney;
+                // 获取当前余额
+                String moneyStr = redisCache.getCacheObject(companyMoneyKey);
+                if (StringUtils.isNotEmpty(moneyStr)) {
+                    originalMoney = new BigDecimal(moneyStr);
+                }else {
+                    logger.error("获取公司余额缓存异常公司id{},",companyId);
+                    logger.error("获取公司余额缓存异常数据{},",errorList);
+                    throw new RuntimeException("获取公司余额缓存异常");
+                }
+
+                // 扣减金额
+                BigDecimal newMoney = originalMoney.subtract(totalAmount);
+                redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
+
+                // 批量更新余额异常数据 状态改为1
+                for (BalanceRollbackError error : errorList) {
+                    error.setStatus(1);
+                }
+                boolean b = this.updateBatchById(errorList);
+                if (!b) {
+                    logger.error("批量更新余额异常表状态异常公司id{},",companyId);
+                    logger.error("批量更新余额异常表状态异常数据{},",errorList);
+                    throw new RuntimeException("批量更新余额异常表状态异常");
+                }
+
+            } else {
+                logger.error("获取锁异常公司id{},",companyId);
+                logger.error("获取锁异常数据{},",errorList);
+                throw new RuntimeException("获取锁失败");
+            }
+        } catch (InterruptedException e) {
+            logger.error("InterruptedException异常公司id{},",companyId);
+            logger.error("InterruptedException异常数据{},",errorList);
+            throw new RuntimeException(e);
+        }if (lockAcquired && lock1.isHeldByCurrentThread()) {
+            try {
+                lock1.unlock();
+            } catch (IllegalMonitorStateException e) {
+                logger.warn("尝试释放非当前线程持有的锁: balanceRollbackError={}",errorList);
+            }
+        }
+
+    }
+}
+
+
+
+

+ 94 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCompanyUserQwServiceImpl.java

@@ -0,0 +1,94 @@
+package com.fs.course.service.impl;
+
+import java.util.List;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.course.mapper.FsUserCompanyUserQwMapper;
+import com.fs.course.domain.FsUserCompanyUserQw;
+import com.fs.course.service.IFsUserCompanyUserQwService;
+
+/**
+ * 微信用户和销售关系-企业微信自动的Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-10-23
+ */
+@Service
+public class FsUserCompanyUserQwServiceImpl extends ServiceImpl<FsUserCompanyUserQwMapper, FsUserCompanyUserQw> implements IFsUserCompanyUserQwService {
+
+    /**
+     * 查询微信用户和销售关系-企业微信自动的
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 微信用户和销售关系-企业微信自动的
+     */
+    @Override
+    public FsUserCompanyUserQw selectFsUserCompanyUserQwById(Long id)
+    {
+        return baseMapper.selectFsUserCompanyUserQwById(id);
+    }
+
+    /**
+     * 查询微信用户和销售关系-企业微信自动的列表
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 微信用户和销售关系-企业微信自动的
+     */
+    @Override
+    public List<FsUserCompanyUserQw> selectFsUserCompanyUserQwList(FsUserCompanyUserQw fsUserCompanyUserQw)
+    {
+        return baseMapper.selectFsUserCompanyUserQwList(fsUserCompanyUserQw);
+    }
+
+    /**
+     * 新增微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    @Override
+    public int insertFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw)
+    {
+        fsUserCompanyUserQw.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsUserCompanyUserQw(fsUserCompanyUserQw);
+    }
+
+    /**
+     * 修改微信用户和销售关系-企业微信自动的
+     * 
+     * @param fsUserCompanyUserQw 微信用户和销售关系-企业微信自动的
+     * @return 结果
+     */
+    @Override
+    public int updateFsUserCompanyUserQw(FsUserCompanyUserQw fsUserCompanyUserQw)
+    {
+        fsUserCompanyUserQw.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsUserCompanyUserQw(fsUserCompanyUserQw);
+    }
+
+    /**
+     * 批量删除微信用户和销售关系-企业微信自动的
+     * 
+     * @param ids 需要删除的微信用户和销售关系-企业微信自动的主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCompanyUserQwByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsUserCompanyUserQwByIds(ids);
+    }
+
+    /**
+     * 删除微信用户和销售关系-企业微信自动的信息
+     * 
+     * @param id 微信用户和销售关系-企业微信自动的主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCompanyUserQwById(Long id)
+    {
+        return baseMapper.deleteFsUserCompanyUserQwById(id);
+    }
+}

+ 1 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseComplaintRecordServiceImpl.java

@@ -135,4 +135,5 @@ public class FsUserCourseComplaintRecordServiceImpl extends ServiceImpl<FsUserCo
         fsUserCourseComplaintRecord.setCreateTime(DateUtils.getNowDate());
         return baseMapper.insertFsUserCourseComplaintRecord(fsUserCourseComplaintRecord);
     }
+
 }

+ 35 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodServiceImpl.java

@@ -373,4 +373,39 @@ public class FsUserCoursePeriodServiceImpl implements IFsUserCoursePeriodService
     public List<Long> selectFsUserCoursePeriodListByPeriodId(List<Long> periodIds, Long companyId) {
         return fsUserCoursePeriodMapper.selectFsUserCoursePeriodListByPeriodId(periodIds,companyId);
     }
+
+    @Override
+    public R copyFsUserCoursePeriodAndCourse(PeriodStatisticCountParam param) {
+        if (param == null || param.getPeriodId() == null || param.getTrainingCampId() == null) {
+            return R.error("营期信息不完整");
+        }
+        //通过现有的营期Id查询,并查询到对应的营期看课
+        FsUserCoursePeriod fsUserCoursePeriod = selectFsUserCoursePeriodById(param.getPeriodId());
+        if (fsUserCoursePeriod == null) {
+            return R.error("未查询到当前营期");
+        }
+        //查询并复制当前营期所有的视频
+        FsUserCoursePeriodDays fsUserCoursePeriodDays = new FsUserCoursePeriodDays();
+        fsUserCoursePeriodDays.setPeriodId(param.getPeriodId());
+        List<FsUserCoursePeriodDays> fsUserCoursePeriodDayslist = fsUserCoursePeriodDaysService.selectFsUserCoursePeriodDaysList(fsUserCoursePeriodDays);
+        fsUserCoursePeriod.setTrainingCampId(param.getTrainingCampId());
+        fsUserCoursePeriod.setPeriodId(null);
+        if (insertFsUserCoursePeriod(fsUserCoursePeriod) <= 0) {
+            return R.error("营期创建失败");
+        }
+        // 定义重复使用的时间常量
+        LocalTime startTime = LocalTime.MIDNIGHT;
+        LocalTime endTime = LocalTime.of(23, 59, 59);
+        fsUserCoursePeriodDayslist.forEach(userCoursePeriodDays -> {
+            userCoursePeriodDays.setPeriodId(fsUserCoursePeriod.getPeriodId());
+            userCoursePeriodDays.setId(null);
+            userCoursePeriodDays.setStartTime(startTime);
+            userCoursePeriodDays.setEndTime1(endTime);
+            userCoursePeriodDays.setJoinTime(endTime);
+            userCoursePeriodDays.setVideoIds(Collections.singletonList(userCoursePeriodDays.getVideoId()));
+            fsUserCoursePeriodDaysService.addCourse(userCoursePeriodDays);
+        });
+        return R.ok();
+
+    }
 }

+ 167 - 15
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.BeanCopyUtils;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.domain.entity.SysDictData;
@@ -32,10 +34,7 @@ import com.fs.course.dto.CoursePackageDTO;
 import com.fs.course.mapper.*;
 import com.fs.course.param.*;
 import com.fs.course.param.newfs.*;
-import com.fs.course.service.IFsUserCompanyBindService;
-import com.fs.course.service.IFsUserCompanyUserService;
-import com.fs.course.service.IFsUserCourseVideoService;
-import com.fs.course.service.IFsVideoResourceService;
+import com.fs.course.service.*;
 import com.fs.course.vo.*;
 import com.fs.course.vo.newfs.*;
 import com.fs.his.domain.FsUser;
@@ -248,7 +247,14 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Autowired
     private IFsUserCompanyBindService fsUserCompanyBindService;
 
+    @Autowired
+    private IFsUserCoursePeriodService fsUserCoursePeriodService;
+    @Autowired
+    private BalanceRollbackErrorMapper balanceRollbackErrorMapper;
+
 
+    @Autowired
+    private IFsUserCoursePeriodDaysService fsUserCoursePeriodDaysService;
 
     /**
      * 查询课堂视频
@@ -1530,14 +1536,82 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         //2025.6.19 红包金额为0的时候
         if (amount.compareTo(BigDecimal.ZERO)>0){
 
-            Company company = companyMapper.selectCompanyById(param.getCompanyId());
-            BigDecimal money = company.getMoney();
-            if (money.compareTo(BigDecimal.ZERO)<=0) {
-                return R.error("服务商余额不足,请联系群主服务商充值!");
+            // ===================== 20251022 xgb 修改 本次修改目的为了实时扣减公司余额=====================
+            // 1 使用redis缓存加锁 预扣减余额 红包发送失败 恢复redis缓存余额,如果回滚失败登记异常记录表 定时任务重新回滚余额
+            // 2 另起定时任务 同步缓存余额到redis中
+            // 3 启动系统时查询公司账户余额(这个时候要保证余额正确)保存到redis缓存中
+
+            // 预设值异常对象
+            BalanceRollbackError balanceRollbackError = new BalanceRollbackError();
+            balanceRollbackError.setCompanyId(packetParam.getCompanyId());
+            balanceRollbackError.setUserId(user.getUserId());
+            balanceRollbackError.setLogId(log.getLogId());
+            balanceRollbackError.setVideoId(log.getVideoId());
+            balanceRollbackError.setStatus(0);
+            balanceRollbackError.setMoney(amount);
+
+            if(packetParam.getCompanyId()== null){
+                logger.error("发送红包参数错误,公司不能为空,异常请求参数{}",packetParam);
+                return R.error("发送红包失败,请联系管理员");
+            }
+            String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + packetParam.getCompanyId();
+
+            // 第一次加锁:预扣减余额
+            RLock lock1 = redissonClient.getLock(FsConstants.COMPANY_MONEY_LOCK + packetParam.getCompanyId());
+            boolean lockAcquired = false;
+            try {
+                if (lock1.tryLock(3, 10, TimeUnit.SECONDS)) {
+                    lockAcquired = true;
+                    BigDecimal originalMoney;
+                    // 获取当前余额
+                    String moneyStr = redisCache.getCacheObject(companyMoneyKey);
+                    if (StringUtils.isNotEmpty(moneyStr)) {
+                        originalMoney = new BigDecimal(moneyStr);
+                    }else {
+                        // 缓存没有值,重启系统恢复redis数据 保证数据正确性
+                        logger.error("发送红包获取redis余额缓存异常,异常请求参数{}",packetParam);
+                        return R.error("系统异常,请稍后重试");
+                    }
+
+                    if (originalMoney.compareTo(BigDecimal.ZERO) < 0) {
+                        logger.error("服务商余额不足,异常请求参数{}",packetParam);
+                        return R.error("服务商余额不足,请联系群主服务器充值!");
+                    }
+
+                    // 预扣减金额
+                    BigDecimal newMoney = originalMoney.subtract(amount);
+                    redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
+                } else {
+                    logger.error("获取redis锁失败,异常请求参数{}",packetParam);
+                    return R.error("系统繁忙,请稍后重试");
+                }
+            } catch (Exception e) {
+                logger.error("预扣减余额失败: 异常请求参数{},异常信息{}", packetParam, e.getMessage(), e);
+                return R.error("系统异常,请稍后重试");
+            }finally {
+                // 只有在成功获取锁的情况下才释放锁
+                if (lockAcquired && lock1.isHeldByCurrentThread()) {
+                    try {
+                        lock1.unlock();
+                    } catch (IllegalMonitorStateException e) {
+                        logger.warn("尝试释放非当前线程持有的锁: companyId={}", packetParam.getCompanyId());
+                    }
+                }
             }
 
-            // 发送红包
-            R sendRedPacket = paymentService.sendRedPacket(packetParam);
+            // 调用第三方接口(锁外操作)
+            R sendRedPacket;
+            try {
+                sendRedPacket= paymentService.sendRedPacket(packetParam);
+            } catch (Exception e) {
+                logger.error("红包发送异常: 异常请求参数{}",packetParam, e);
+                // 异常时回滚余额
+
+                rollbackBalance(balanceRollbackError);
+                return R.error("奖励发送失败,请联系客服");
+            }
+
+            // 红包发送成功处理
             if (sendRedPacket.get("code").equals(200)) {
                 FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
                 TransferBillsResult transferBillsResult;
@@ -1569,11 +1643,15 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 // 更新观看记录的奖励类型
                 log.setRewardType(config.getRewardType());
                 courseWatchLogMapper.updateFsCourseWatchLog(log);
-
+                // 发送成功,记录日志等操作
                 return sendRedPacket;
             } else {
+                // 发送失败,回滚余额
+                rollbackBalance(balanceRollbackError);
                 return R.error("奖励发送失败,请联系客服");
             }
+
+            // ===================== 本次修改目的为了实时扣减公司余额=====================
         } else {
             FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
             // 添加红包记录
@@ -1600,6 +1678,57 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
     }
 
+    /**
+     * @Description: 回滚redis缓存中的余额 异常登记回滚异常表,定时重新回滚
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/22 10:37
+     */
+    private void rollbackBalance(BalanceRollbackError balanceRollbackError) {
+        String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + balanceRollbackError.getCompanyId();
+        RLock lock2 = redissonClient.getLock(FsConstants.COMPANY_MONEY_LOCK + balanceRollbackError.getCompanyId());
+        boolean lockAcquired = false;
+        boolean backError=true;
+        try {
+            if (lock2.tryLock(3, 10, TimeUnit.SECONDS)) {
+                lockAcquired=true;
+                // 获取当前余额
+                String currentMoneyStr = redisCache.getCacheObject(companyMoneyKey);
+                if (StringUtils.isEmpty(currentMoneyStr)) {
+                    throw new RuntimeException("回滚余额异常");
+                }
+
+                // 回滚金额(加回之前扣减的金额)
+                BigDecimal rollbackMoney = new BigDecimal(currentMoneyStr).add(balanceRollbackError.getMoney());
+                redisCache.setCacheObject(companyMoneyKey, rollbackMoney.toString());
+                backError=false;
+                logger.info("余额回滚成功: companyId={}, amount={}", balanceRollbackError.getCompanyId(), balanceRollbackError.getMoney());
+
+            } else {
+                logger.warn("回滚余额时获取锁失败: companyId={}", balanceRollbackError.getCompanyId());
+                // 登记回滚余额异常表
+                balanceRollbackErrorMapper.insert(balanceRollbackError);
+            }
+        } catch (Exception e) {
+            logger.error("回滚余额时发生异常: companyId={}", balanceRollbackError.getCompanyId(), e);
+            // 登记回滚余额异常表
+            if(backError){
+                balanceRollbackErrorMapper.insert(balanceRollbackError);
+            }
+        }finally {
+            // 只有在成功获取锁的情况下才释放锁
+            if (lockAcquired && lock2.isHeldByCurrentThread()) {
+                try {
+                    lock2.unlock();
+                } catch (IllegalMonitorStateException e) {
+                    logger.warn("尝试释放非当前线程持有的锁: balanceRollbackError={}",balanceRollbackError);
+                }
+            }
+        }
+    }
+
+
     /**
      * 直接发送奖励
      *
@@ -2221,11 +2350,11 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             }
             vo.setStartDateTime(companyUserStartDateTime != null ? companyUserStartDateTime : days.getStartDateTime());
             vo.setEndDateTime(companyUserEndDateTime != null ? companyUserEndDateTime : days.getEndDateTime());
-            
+
             // 检查是否开启自由模式
             FsUserCoursePeriod period = fsUserCoursePeriodMapper.selectFsUserCoursePeriodById(param.getPeriodId());
             boolean canWatch;
-            
+
             if (period != null && period.getFreeMode() != null && period.getFreeMode() == 1) {
                 // 自由模式:不检查时间和状态,直接允许观看
                 canWatch = true;
@@ -2236,7 +2365,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                         companyUserEndDateTime != null ? companyUserEndDateTime : days.getEndDateTime())
                         && days.getStatus() == 1;
             }
-            
+
             vo.setRang(canWatch);
         }
         return ResponseResult.ok(vo);
@@ -2321,8 +2450,31 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             return entity;
         }).collect(Collectors.toList());
         fsUserCourseVideoMapper.insertBatchFsUserCourseVideo(collect);
-    }
 
+        //通过课程ID:查询使用课程id创建的营期来进进行关联(批量新增视频时关联到对应通过课程ID创建的营期)
+        FsUserCoursePeriod coursePeriod = new FsUserCoursePeriod();
+        coursePeriod.setCourseId(vo.getCourseId());
+        List<FsUserCoursePeriod> coursePeriodsList = fsUserCoursePeriodService.selectFsUserCoursePeriodList(coursePeriod);//获取当前课程创建的会员营期
+        //  处理对应课程安排
+        if (!coursePeriodsList.isEmpty()) {
+            LocalTime startTime = LocalTime.MIDNIGHT;
+            LocalTime endTime = LocalTime.of(23, 59, 59);
+            //获取营期数据
+            coursePeriodsList.stream().filter(e -> e.getPeriodStatus() != 3).forEach(video -> {
+                 //循环新增到对应营期中
+                collect.forEach(userCourseVideo->{
+                    FsUserCoursePeriodDays periodDaysEntity = new FsUserCoursePeriodDays();
+                    periodDaysEntity.setPeriodId(video.getPeriodId());//营期ID
+                    periodDaysEntity.setCourseId(video.getCourseId());//课程ID
+                    periodDaysEntity.setStartTime(startTime);
+                    periodDaysEntity.setVideoIds(Collections.singletonList(userCourseVideo.getVideoId()));
+                    periodDaysEntity.setEndTime1(endTime);
+                    periodDaysEntity.setJoinTime(endTime);
+                    fsUserCoursePeriodDaysService.addCourse(periodDaysEntity);
+                });
+            });
+        }
+    }
     @Override
     public void batchUpdateRed(List<BatchRedUpdate> list) {
         list.forEach(e -> {

+ 3 - 0
fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogListVO.java

@@ -63,6 +63,9 @@ public class FsCourseWatchLogListVO extends BaseEntity
     @Excel(name = "记录类型" ,dictType = "sys_course_watch_log_type")
     private Integer logType;
 
+    @Excel(name = "奖励类型 1红包 2积分")
+    private Integer rewardType;
+
 //    @Excel(name = "企微外部联系人id")
     private String qwExternalContactId;
 

+ 1 - 0
fs-service/src/main/java/com/fs/erp/dto/ErpRefundUpdateRequest.java

@@ -10,5 +10,6 @@ public class ErpRefundUpdateRequest implements Serializable {
     String oid;//子订单号
     Integer refund_state;//0:未退款 1:退款完成 2:退款中
     Long storeAfterSalesId;//售后id
+    Integer orderStatus;//售后id
 
 }

+ 10 - 0
fs-service/src/main/java/com/fs/erp/dto/OrderItemDTO.java

@@ -65,4 +65,14 @@ public class OrderItemDTO implements Serializable {
      * 款式编码
      * **/
     private String shopIId;
+
+    /**
+     * 商品图片
+     */
+    private String  pic;
+
+    /**
+     * 商品单价
+     */
+    private BigDecimal price;
 }

+ 110 - 0
fs-service/src/main/java/com/fs/erp/mapper/FsJstAftersalePushScrmMapper.java

@@ -0,0 +1,110 @@
+package com.fs.erp.mapper;
+
+import com.fs.erp.domain.FsJstAftersalePush;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 订阅物流Mapper
+ */
+@Mapper
+public interface FsJstAftersalePushScrmMapper {
+
+    /**
+     * 根据ID查询
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push_scrm WHERE id = #{id}")
+    FsJstAftersalePush selectById(Long id);
+
+    /**
+     * 根据订单ID查询
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push_scrm WHERE order_id = #{orderId}")
+    FsJstAftersalePush selectByOrderId(String orderId);
+
+    /**
+     * 查询待处理的任务
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push_scrm WHERE task_status = #{status} AND retry_count < #{maxRetry} LIMIT #{limit}")
+    List<FsJstAftersalePush> selectByStatusAndRetry(Byte status, Integer maxRetry, Integer limit);
+
+    /**
+     * 插入记录
+     */
+    @Insert("INSERT INTO fs_jst_aftersale_push_scrm(order_id,after_sale_id, type, task_status, retry_count, last_execute_time, params) " +
+            "VALUES(#{orderId},#{afterSaleId}, #{type}, #{taskStatus}, #{retryCount}, #{lastExecuteTime}, #{params})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(FsJstAftersalePush push);
+
+    /**
+     * 更新记录
+     */
+    @Update("UPDATE fs_jst_aftersale_push_scrm SET params=#{params},task_status = #{taskStatus}, retry_count = #{retryCount}, " +
+            "last_execute_time = #{lastExecuteTime}, result = #{result}, error_message = #{errorMessage} " +
+            "WHERE id = #{id}")
+    int update(FsJstAftersalePush push);
+
+    /**
+     * 更新任务状态
+     */
+    @Update("UPDATE fs_jst_aftersale_push_scrm SET task_status = #{taskStatus}, " +
+            "last_execute_time = now() WHERE id = #{id}")
+    int updateStatus(@Param("id") Long id, @Param("taskStatus") Byte taskStatus);
+
+    @Select("WITH OrderWithNextTaskType AS (\n" +
+            "    SELECT \n" +
+            "        id,\n" +
+            "        order_id,\n" +
+            "        after_sale_id,\n" +
+            "        type,\n" +
+            "        task_status,\n" +
+            "        retry_count,\n" +
+            "        ROW_NUMBER() OVER(PARTITION BY order_id ORDER BY CAST(type AS UNSIGNED)) AS task_seq\n" +
+            "    FROM \n" +
+            "        fs_jst_aftersale_push_scrm\n" +
+            "),\n" +
+            "PendingTasks AS (\n" +
+            "    SELECT \n" +
+            "        o.id,\n" +
+            "        o.order_id,\n" +
+            "        o.after_sale_id,\n" +
+            "        o.type,\n" +
+            "        o.task_status,\n" +
+            "        o.retry_count,\n" +
+            "        o.task_seq,\n" +
+            "        (\n" +
+            "            SELECT MAX(p.task_status)  \n" +
+            "            FROM OrderWithNextTaskType p\n" +
+            "            WHERE p.order_id = o.order_id\n" +
+            "              AND p.task_seq = o.task_seq - 1\n" +
+            "        ) AS prev_task_status,\n" +
+            "        EXISTS (\n" +
+            "            SELECT 1\n" +
+            "            FROM OrderWithNextTaskType p\n" +
+            "            WHERE p.order_id = o.order_id\n" +
+            "              AND p.task_seq < o.task_seq\n" +
+            "              AND p.task_status != 1\n" +
+            "        ) AS has_pending_prev_task\n" +
+            "    FROM \n" +
+            "        OrderWithNextTaskType o\n" +
+            "    WHERE \n" +
+            "        o.task_status = 0 OR (o.task_status = 2 AND o.retry_count < 3)\n" +
+            ")\n" +
+            "SELECT \n" +
+            "    id,\n" +
+            "    order_id,\n" +
+            "    after_sale_id,\n" +
+            "    type,\n" +
+            "    task_status,\n" +
+            "    retry_count\n" +
+            "FROM \n" +
+            "    PendingTasks\n" +
+            "WHERE \n" +
+            "    (task_seq = 1 OR prev_task_status = 1)\n" +
+            "    AND has_pending_prev_task = 0\n" +
+            "ORDER BY\n" +
+            "    order_id,\n" +
+            "    task_seq;\n")
+    List<FsJstAftersalePush> queryPenddingData();
+}

+ 77 - 0
fs-service/src/main/java/com/fs/erp/mapper/FsJstCodPushScrmMapper.java

@@ -0,0 +1,77 @@
+package com.fs.erp.mapper;
+
+import com.fs.erp.domain.FsJstCodPush;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface FsJstCodPushScrmMapper {
+
+    /**
+     * 根据ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm WHERE id = #{id}")
+    FsJstCodPush selectById(@Param("id") Long id);
+
+    /**
+     * 根据订单ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm WHERE order_id = #{orderId}")
+    List<FsJstCodPush> selectByOrderId(@Param("orderId") String orderId);
+
+    /**
+     * 根据售后ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm WHERE after_sale_id = #{afterSaleId}")
+    List<FsJstCodPush> selectByAfterSaleId(@Param("afterSaleId") String afterSaleId);
+
+    /**
+     * 查询待处理的任务
+     */
+    @Select("SELECT * FROM fs_jst_cod_push_scrm WHERE task_status = 0 ORDER BY id ASC LIMIT #{limit}")
+    List<FsJstCodPush> selectPendingTasks(@Param("limit") int limit);
+
+
+    /**
+     * 查询待处理的数据
+     * @return List<FsJstCodPush>
+     */
+    @Select("SELECT * from fs_jst_cod_push_scrm where task_status = 0 OR (task_status = 2 AND retry_count < 3) ")
+    List<FsJstCodPush> queryPenddingData();
+    /**
+     * 插入新记录
+     */
+    @Insert("INSERT INTO fs_jst_cod_push_scrm(order_id, after_sale_id, type, task_status, params) " +
+            "VALUES(#{orderId}, #{afterSaleId}, #{type}, #{taskStatus}, #{params})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(FsJstCodPush record);
+
+    /**
+     * 更新任务状态
+     */
+    @Update("UPDATE fs_jst_cod_push_scrm SET task_status = #{taskStatus}, retry_count = #{retryCount}, " +
+            "last_execute_time = NOW(), result = #{result}, error_message = #{errorMessage} " +
+            "WHERE id = #{id}")
+    int updateTaskStatus(FsJstCodPush record);
+
+    /**
+     * 根据ID更新记录
+     */
+    @Update("<script>" +
+            "UPDATE fs_jst_cod_push_scrm " +
+            "<set>" +
+            "  <if test='orderId != null'>order_id = #{orderId},</if>" +
+            "  <if test='afterSaleId != null'>after_sale_id = #{afterSaleId},</if>" +
+            "  <if test='type != null'>type = #{type},</if>" +
+            "  <if test='taskStatus != null'>task_status = #{taskStatus},</if>" +
+            "  <if test='retryCount != null'>retry_count = #{retryCount},</if>" +
+            "  <if test='lastExecuteTime != null'>last_execute_time = #{lastExecuteTime},</if>" +
+            "  <if test='params != null'>params = #{params},</if>" +
+            "  <if test='result != null'>result = #{result},</if>" +
+            "  <if test='errorMessage != null'>error_message = #{errorMessage},</if>" +
+            "</set>" +
+            "WHERE id = #{id}" +
+            "</script>")
+    int updateById(FsJstCodPush record);
+}

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/FsJstAftersalePushScrmService.java

@@ -0,0 +1,5 @@
+package com.fs.erp.service;
+
+public interface FsJstAftersalePushScrmService {
+    void pushJst();
+}

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/FsJstCodPushScrmService.java

@@ -0,0 +1,5 @@
+package com.fs.erp.service;
+
+public interface FsJstCodPushScrmService {
+    public void jstCodPush();
+}

+ 3 - 0
fs-service/src/main/java/com/fs/erp/service/IErpGoodsService.java

@@ -7,7 +7,10 @@ public interface IErpGoodsService
 {
 
     BaseResponse addGoods(ErpGoods goods);
+    BaseResponse addGoodsScrm(ErpGoods goods);
     ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param);
+    ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param);
     ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param);
+    ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param);
 }
 

+ 1 - 1
fs-service/src/main/java/com/fs/erp/service/IErpOrderService.java

@@ -16,7 +16,7 @@ public interface IErpOrderService
     ErpOrderResponse refundOrder(ErpRefundOrder order);
     ErpDeliverysResponse getDeliver(ErpDeliverysRequest param);
     ErpOrderQueryResponse getOrder(ErpOrderQueryRequert param);
-
+    ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param);
     BaseResponse refundUpdate(ErpRefundUpdateRequest param);
     BaseResponse refundUpdateScrm(ErpRefundUpdateRequest param);
 

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java

@@ -259,6 +259,11 @@ public class DfOrderServiceImpl implements IErpOrderService
         return response;
     }
 
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest request) {
         ErpRefundOrder erpRefundOrder = new ErpRefundOrder();

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/ErpGoodsServiceImpl.java

@@ -43,6 +43,11 @@ public class ErpGoodsServiceImpl implements IErpGoodsService
         return response;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert requert) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -60,6 +65,11 @@ public class ErpGoodsServiceImpl implements IErpGoodsService
         return response;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert requert) {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -76,4 +86,9 @@ public class ErpGoodsServiceImpl implements IErpGoodsService
         ErpGoodsStockQueryResponse response=JSONUtil.toBean(result, ErpGoodsStockQueryResponse.class);
         return response;
     }
+
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
 }

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/impl/ErpOrderServiceImpl.java

@@ -118,6 +118,11 @@ public class ErpOrderServiceImpl implements IErpOrderService
         return response;
     }
 
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest request) {
         FsSysConfig sysConfig = configUtil.getSysConfig();

+ 176 - 0
fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushScrmServiceImpl.java

@@ -0,0 +1,176 @@
+package com.fs.erp.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.fs.common.utils.ExceptionUtil;
+import com.fs.common.utils.StringUtils;
+import com.fs.erp.constant.AfterSalesOrderStatusEnum;
+import com.fs.erp.constant.TaskStatusEnum;
+import com.fs.erp.domain.FsJstAftersalePush;
+import com.fs.erp.dto.*;
+import com.fs.erp.http.JstErpHttpService;
+import com.fs.erp.mapper.FsJstAftersalePushMapper;
+import com.fs.erp.mapper.FsJstAftersalePushScrmMapper;
+import com.fs.erp.service.FsJstAftersalePushScrmService;
+import com.fs.erp.service.FsJstAftersalePushService;
+import com.fs.his.domain.FsStoreAfterSales;
+import com.fs.his.dto.FsStoreCartDTO;
+import com.fs.his.mapper.FsStoreAfterSalesMapper;
+import com.fs.hisStore.domain.FsStoreAfterSalesScrm;
+import com.fs.hisStore.domain.FsStoreOrderItemScrm;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.mapper.FsStoreAfterSalesScrmMapper;
+import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
+import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
+import com.fs.ybPay.dto.RefundOrderDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.Asserts;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Slf4j
+@Service
+public class FsJstAftersalePushScrmServiceImpl implements FsJstAftersalePushScrmService {
+
+    @Autowired
+    private FsJstAftersalePushScrmMapper fsJstAftersalePushMapper;
+
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+
+    @Autowired
+    private FsStoreOrderScrmMapper fsStoreOrderMapper;
+
+    @Autowired
+    private IFsStoreOrderItemScrmService storeOrderItemService;
+
+    @Autowired
+    private FsStoreAfterSalesScrmMapper fsStoreAfterSalesMapper;
+
+    @Value("${jst.shop_code:''}")
+    private String shopId;
+    @Override
+    public void pushJst() {
+        List<FsJstAftersalePush> fsJstAftersalePushes = fsJstAftersalePushMapper.queryPenddingData();
+
+        for (FsJstAftersalePush item : fsJstAftersalePushes) {
+            item.setTaskStatus(TaskStatusEnum.PROCESSING.getCode());
+            int update = fsJstAftersalePushMapper.update(item);
+            if(update <= 0){
+                log.info("获取记录{} 锁失败!",item.getId());
+                continue;
+            }
+
+            FsStoreOrderScrm fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(item.getOrderId());
+
+            item.setRetryCount(item.getRetryCount()+1);
+
+            if(fsStoreOrder == null){
+                item.setErrorMessage("该订单未找到!");
+                item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                log.info("该订单未找到!");
+                fsJstAftersalePushMapper.update(item);
+                continue;
+            }
+            Asserts.notNull(fsStoreOrder,"该订单未找到!");
+            RefundOrderDTO dto;
+            dto = getAfterSaleDTO(item, fsStoreOrder);
+            // 买家已经申请,等待卖家同意
+            if(StringUtils.equals(AfterSalesOrderStatusEnum.WAIT_SELLER_AGREE.getIndex().toString()
+                    ,item.getType())){
+
+            // 买家已经退货,等待卖家确认收货
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.WAIT_SELLER_CONFIRM_GOODS.getIndex().toString(),
+                    item.getType())){
+                // 查询售后单 同步快递单号过去
+                FsStoreAfterSalesScrm fsStoreAfterSales = fsStoreAfterSalesMapper.selectFsStoreAfterSalesById(item.getId());
+//                dto.setLogisticsCompany(fsStoreAfterSales.getDeliverySn());
+                dto.setLogisticsCompany(fsStoreAfterSales.getDeliveryName());
+//                dto.setLId(fsStoreAfterSales.getDeliveryId());
+                dto.setLId(fsStoreAfterSales.getDeliverySn());
+
+            // 售后关闭
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.CLOSED.getIndex().toString(),item.getType())) {
+
+            // 退款成功
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.SUCCESS.getIndex().toString(),item.getType())) {
+
+            // 确认
+            }
+
+
+            if(!StringUtils.equals(AfterSalesOrderStatusEnum.CONFIRM.getIndex().toString(),item.getType())) {
+                try{
+                    CommonResponse<AfterSaleResponseDTO> response = jstErpHttpService.aftersaleUpload(dto);
+                    item.setParams(JSON.toJSONString(dto));
+                    item.setResult(JSON.toJSONString(response));
+                    item.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+                }catch (Exception e) {
+                    item.setErrorMessage(ExceptionUtil.getExceptionMessage(e));
+                    item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                }
+
+            // 如果是确认类型
+            } else{
+                AfterSaleConfirmRequestDTO requestDTO = new AfterSaleConfirmRequestDTO();
+
+                requestDTO.setAsIds(Collections.singletonList(Long.valueOf(item.getAfterSaleId())));
+                requestDTO.setExchangeForce(true);
+                requestDTO.setConfirmRefund(true);
+
+                try{
+                    CommonResponse<AssetProcessResultDTO> response = jstErpHttpService.aftersaleConfirm(requestDTO);
+                    item.setParams(JSON.toJSONString(dto));
+                    item.setResult(JSON.toJSONString(response));
+                    item.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+                }catch (Exception e){
+                    item.setErrorMessage(ExceptionUtil.getExceptionMessage(e));
+                    item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                }
+            }
+
+            fsJstAftersalePushMapper.update(item);
+        }
+    }
+
+    private RefundOrderDTO getAfterSaleDTO(FsJstAftersalePush item, FsStoreOrderScrm fsStoreOrder) {
+        RefundOrderDTO dto = new RefundOrderDTO();
+        AfterSalesOrderStatusEnum statusEnum = AfterSalesOrderStatusEnum.getByIndex(Integer.valueOf(item.getType()));
+
+        dto.setShopStatus(statusEnum.getCode());
+        dto.setQuestionType("可更新");
+        dto.setOuterAsId(item.getAfterSaleId());
+        dto.setRemark("用户退款");
+        dto.setType("仅退款");
+
+        dto.setShopId(Long.parseLong(shopId));
+        dto.setTotalAmount(fsStoreOrder.getTotalPrice());
+        dto.setSoId(item.getOrderId());
+        dto.setRefund(fsStoreOrder.getPayMoney());
+
+
+        FsStoreOrderItemScrm itemMap=new FsStoreOrderItemScrm();
+//        itemMap.setOrderId(fsStoreOrder.getId());
+        itemMap.setOrderId(fsStoreOrder.getId());
+        List<FsStoreOrderItemScrm> orderItems=storeOrderItemService.selectFsStoreOrderItemList(itemMap);
+        List<RefundItemDTO> refundItemDTOS=new ArrayList<>();
+
+        for(FsStoreOrderItemScrm orderItem: orderItems) {
+            FsStoreCartDTO cartDTO = JSONUtil.toBean(orderItem.getJsonInfo(), FsStoreCartDTO.class);
+
+            RefundItemDTO itemDTO = new RefundItemDTO();
+            itemDTO.setSkuId(cartDTO.getBarCode());
+            itemDTO.setQty(cartDTO.getNum());
+            itemDTO.setAmount(cartDTO.getPrice());
+            itemDTO.setType("退货");
+            refundItemDTOS.add(itemDTO);
+        }
+        dto.setItems(refundItemDTOS);
+        return dto;
+    }
+}

+ 12 - 8
fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushServiceImpl.java

@@ -18,6 +18,10 @@ import com.fs.his.dto.FsStoreCartDTO;
 import com.fs.his.mapper.FsStoreAfterSalesMapper;
 import com.fs.his.mapper.FsStoreOrderMapper;
 import com.fs.his.service.IFsStoreOrderItemService;
+import com.fs.hisStore.domain.FsStoreOrderItemScrm;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
+import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
 import com.fs.ybPay.dto.RefundOrderDTO;
 import lombok.extern.slf4j.Slf4j;
 //import org.apache.commons.lang3.StringUtils;
@@ -41,10 +45,10 @@ public class FsJstAftersalePushServiceImpl implements FsJstAftersalePushService
     private JstErpHttpService jstErpHttpService;
 
     @Autowired
-    private FsStoreOrderMapper fsStoreOrderMapper;
+    private FsStoreOrderScrmMapper fsStoreOrderMapper;
 
     @Autowired
-    private IFsStoreOrderItemService storeOrderItemService;
+    private IFsStoreOrderItemScrmService storeOrderItemService;
 
     @Autowired
     private FsStoreAfterSalesMapper fsStoreAfterSalesMapper;
@@ -63,7 +67,7 @@ public class FsJstAftersalePushServiceImpl implements FsJstAftersalePushService
                 continue;
             }
 
-            FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(item.getOrderId());
+            FsStoreOrderScrm fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(item.getOrderId());
 
             item.setRetryCount(item.getRetryCount()+1);
 
@@ -135,7 +139,7 @@ public class FsJstAftersalePushServiceImpl implements FsJstAftersalePushService
         }
     }
 
-    private RefundOrderDTO getAfterSaleDTO(FsJstAftersalePush item, FsStoreOrder fsStoreOrder) {
+    private RefundOrderDTO getAfterSaleDTO(FsJstAftersalePush item, FsStoreOrderScrm fsStoreOrder) {
         RefundOrderDTO dto = new RefundOrderDTO();
         AfterSalesOrderStatusEnum statusEnum = AfterSalesOrderStatusEnum.getByIndex(Integer.valueOf(item.getType()));
 
@@ -151,13 +155,13 @@ public class FsJstAftersalePushServiceImpl implements FsJstAftersalePushService
         dto.setRefund(fsStoreOrder.getPayMoney());
 
 
-        FsStoreOrderItem itemMap=new FsStoreOrderItem();
+        FsStoreOrderItemScrm itemMap=new FsStoreOrderItemScrm();
 //        itemMap.setOrderId(fsStoreOrder.getId());
-        itemMap.setOrderId(fsStoreOrder.getOrderId());
-        List<FsStoreOrderItem> orderItems=storeOrderItemService.selectFsStoreOrderItemList(itemMap);
+        itemMap.setOrderId(fsStoreOrder.getId());
+        List<FsStoreOrderItemScrm> orderItems=storeOrderItemService.selectFsStoreOrderItemList(itemMap);
         List<RefundItemDTO> refundItemDTOS=new ArrayList<>();
 
-        for(FsStoreOrderItem orderItem: orderItems) {
+        for(FsStoreOrderItemScrm orderItem: orderItems) {
             FsStoreCartDTO cartDTO = JSONUtil.toBean(orderItem.getJsonInfo(), FsStoreCartDTO.class);
 
             RefundItemDTO itemDTO = new RefundItemDTO();

+ 55 - 0
fs-service/src/main/java/com/fs/erp/service/impl/FsJstCodPushScrmServiceImpl.java

@@ -0,0 +1,55 @@
+package com.fs.erp.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fs.erp.constant.TaskStatusEnum;
+import com.fs.erp.domain.FsJstCodPush;
+import com.fs.erp.dto.ErpOrderResponseDTO;
+import com.fs.erp.dto.ShopOrderDTO;
+import com.fs.erp.http.JstErpHttpService;
+import com.fs.erp.mapper.FsJstCodPushMapper;
+import com.fs.erp.mapper.FsJstCodPushScrmMapper;
+import com.fs.erp.service.FsJstCodPushScrmService;
+import com.fs.erp.service.FsJstCodPushService;
+import com.hc.openapi.tool.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+public class FsJstCodPushScrmServiceImpl implements FsJstCodPushScrmService {
+    @Autowired
+    private FsJstCodPushScrmMapper fsJstCodPushMapper;
+
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+
+    @Override
+    public void jstCodPush() {
+        List<FsJstCodPush> fsJstCodPushes = fsJstCodPushMapper.queryPenddingData();
+        for (FsJstCodPush fsJstCodPush : fsJstCodPushes) {
+            fsJstCodPush.setTaskStatus(TaskStatusEnum.PROCESSING.getCode());
+            int lock = fsJstCodPushMapper.updateById(fsJstCodPush);
+            if(lock <= 0) {
+                log.info("获取当前记录锁失败! 已跳过");
+                continue;
+            }
+
+            try{
+                String params = fsJstCodPush.getParams();
+                ShopOrderDTO shopOrderDTO = JSONObject.parseObject(params, ShopOrderDTO.class);
+                ErpOrderResponseDTO upload = jstErpHttpService.upload(shopOrderDTO);
+                fsJstCodPush.setResult(JSON.toJSONString(upload));
+                fsJstCodPush.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+
+            }catch (Exception e) {
+                fsJstCodPush.setErrorMessage(JSON.toJSONString(e));
+                fsJstCodPush.setRetryCount(fsJstCodPush.getRetryCount()+1);
+            }
+
+            fsJstCodPushMapper.updateById(fsJstCodPush);
+        }
+    }
+}

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpGoodsServiceImpl.java

@@ -48,16 +48,31 @@ public class HzOMSErpGoodsServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
+
     /**
      * 构建店铺商品上传的参数
      *

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpOrderServiceImpl.java

@@ -87,6 +87,11 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
 

+ 93 - 0
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java

@@ -11,6 +11,10 @@ import com.fs.his.domain.FsStoreProduct;
 import com.fs.his.domain.FsStoreProductAttrValue;
 import com.fs.his.service.IFsStoreProductAttrValueService;
 import com.fs.his.service.IFsStoreProductService;
+import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
+import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hisStore.service.IFsStoreProductAttrValueScrmService;
+import com.fs.hisStore.service.IFsStoreProductScrmService;
 import com.fs.voice.utils.StringUtil;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,9 +33,13 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
 
     @Autowired
     private IFsStoreProductService fsStoreProductService;
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductScrmService;
 
     @Autowired
     private IFsStoreProductAttrValueService fsStoreProductAttrValueService;
+    @Autowired
+    private IFsStoreProductAttrValueScrmService fsStoreProductAttrValueScrmService;
 
     // 每次最大处理数量
     private static final int BATCH_SIZE = 190;
@@ -52,6 +60,21 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        List<Long> storeProductIds = goods.getProductIdList();
+        JSONArray bulidJSONArray = buildGoodsScrm(storeProductIds);
+
+        //调用接口
+        for (int i = 0; i < bulidJSONArray.size(); i += BATCH_SIZE) {
+            JSONObject request=new JSONObject();
+            int end = Math.min(i + BATCH_SIZE, bulidJSONArray.size());
+            request.put("items",bulidJSONArray.subList(i, end));
+            jstErpHttpService.uploadGoods(request);
+        }
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         ProductQueryRequestDTO requestDTO = new ProductQueryRequestDTO();
@@ -77,11 +100,81 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
         return erpGoodsQueryResponse;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        ProductQueryRequestDTO requestDTO = new ProductQueryRequestDTO();
+        requestDTO.setSkuIds(param.getCode());
+        ProductResponseDTO productResponseDTO = jstErpHttpService.queryGoods(requestDTO);
+        List<ProductResponseDTO.ProductInfo> datas = productResponseDTO.getDatas();
+        ErpGoodsQueryResponse erpGoodsQueryResponse = new ErpGoodsQueryResponse();
+        if (CollectionUtils.isNotEmpty(datas)) {
+            List<ErpGoods> erpGoodsList = new ArrayList<>();
+            for (ProductResponseDTO.ProductInfo data : datas) {
+                ErpGoods erpGoods = new ErpGoods();
+                erpGoods.setCode(data.getSkuCode());
+                erpGoods.setName(data.getName());
+                erpGoods.setSimple_name(data.getShortName());
+                erpGoods.setCategory_code(data.getCategory());
+                erpGoods.setCost_price(data.getCostPrice());
+                erpGoods.setSales_price(data.getSalePrice());
+                erpGoods.setPurchase_price(data.getMarketPrice());
+                erpGoodsList.add(erpGoods);
+            }
+            erpGoodsQueryResponse.setItems(erpGoodsList);
+        }
+        return erpGoodsQueryResponse;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
+    /**
+     * 构建店铺商品上传的参数
+     *
+     * @param storeProductIds
+     * @return
+     */
+    public JSONArray buildGoodsScrm(List<Long> storeProductIds) {
+        JSONArray res = new JSONArray();
+        //商品
+        List<FsStoreProductScrm> fsStoreProductList = fsStoreProductScrmService.getStoreProductInProductIds(storeProductIds);
+        if (!fsStoreProductList.isEmpty()) {
+
+            Map<Long, FsStoreProductScrm> productMap = fsStoreProductList.stream().collect(Collectors.toMap(FsStoreProductScrm::getProductId, p -> p));
+            //商品规格List
+            List<FsStoreProductAttrValueScrm> fsStoreProductAttrValues = fsStoreProductAttrValueScrmService.getFsStoreProductAttrValueListInProductId(storeProductIds);
+
+            //按规格构建商品数据
+            fsStoreProductAttrValues.forEach(v -> {
+                JSONObject productJson = new JSONObject();
+                FsStoreProductScrm product = productMap.get(v.getProductId());
+                productJson.put("sku_id", v.getBarCode());//商品编码
+                productJson.put("i_id", v.getBarCode());//如果没有款式默认商品编码一致
+                productJson.put("name", v.getSku());//名称
+                productJson.put("short_name", product.getKeyword());//简称
+                if(StringUtils.isNotEmpty(product.getBrand())){
+                    productJson.put("brand", product.getBrand());//品牌
+                }
+                productJson.put("weight", v.getWeight());//重量
+                productJson.put("s_price",v.getPrice());//基本售价
+                productJson.put("c_price", v.getCost());//成本
+                productJson.put("market_price", v.getOtPrice());//市场|吊牌价
+                productJson.put("unit", product.getUnitName());//单位
+                productJson.put("sku_pic", v.getImage());//商品图片
+                productJson.put("pic", v.getImage());//图片地址(款图片)
+                productJson.put("pic_big", v.getImage());//大图地址
+                res.add(productJson);
+            });
+        }
+
+        return res;
+    }
     /**
      * 构建店铺商品上传的参数
      *

+ 144 - 20
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -12,7 +12,9 @@ import com.fs.erp.domain.*;
 import com.fs.erp.dto.*;
 import com.fs.erp.http.JstErpHttpService;
 import com.fs.erp.mapper.FsJstAftersalePushMapper;
+import com.fs.erp.mapper.FsJstAftersalePushScrmMapper;
 import com.fs.erp.mapper.FsJstCodPushMapper;
+import com.fs.erp.mapper.FsJstCodPushScrmMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.domain.FsStoreOrderItem;
@@ -27,6 +29,7 @@ import com.fs.hisStore.domain.FsStoreProductScrm;
 import com.fs.hisStore.service.IFsStoreOrderItemScrmService;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.service.IFsStoreProductScrmService;
+import com.fs.hisStore.service.impl.FsStoreProductScrmServiceImpl;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.ObjectUtils;
@@ -35,6 +38,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -58,15 +62,20 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     private IFsStoreOrderItemService fsStoreOrderItemService;
     @Autowired
     private IFsStoreOrderItemScrmService fsStoreOrderItemScrmService;
-
     @Autowired
     private IFsStoreProductService fsStoreProductService;
-    @Autowired
-    private IFsStoreProductScrmService fsStoreProductScrmService;
 
     @Autowired
     private FsJstCodPushMapper fsJstCodPushMapper;
 
+    @Autowired
+    private FsJstAftersalePushScrmMapper fsJstAftersalePushScrmMapper;
+    @Autowired
+    private FsJstCodPushScrmMapper fsJstCodPushScrmMapper;
+
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductScrmService;
+
     @Override
     public ErpOrderResponse addOrder(ErpOrder order) {
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(order.getPlatform_code());
@@ -129,8 +138,9 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
 
             FsStoreProduct fsStoreProduct = fsStoreProductService.selectFsStoreProductById(item.getProductId());
 
-            orderItemDTO.setAmount(fsStoreProduct.getPrice());
-
+            orderItemDTO.setAmount(fsStoreProduct.getPrice().multiply(new BigDecimal(item.getNum())));
+            orderItemDTO.setPic(fsStoreProduct.getImgUrl());
+            orderItemDTO.setPrice(fsStoreProduct.getPrice());
             orderItemDTO.setQty(item.getNum().intValue());
             orderItemDTO.setOuterOiId(String.format("%s%s",fsStoreOrder.getOrderCode(),item.getItemId()));
             itemDTOList.add(orderItemDTO);
@@ -253,8 +263,9 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
 
             FsStoreProductScrm fsStoreProduct = fsStoreProductScrmService.selectFsStoreProductById(item.getProductId());
 
-            orderItemDTO.setAmount(fsStoreProduct.getPrice());
-
+            orderItemDTO.setAmount(fsStoreProduct.getPrice().multiply(new BigDecimal(item.getNum())));
+            orderItemDTO.setPic(fsStoreProduct.getImage());
+            orderItemDTO.setPrice(fsStoreProduct.getPrice());
             orderItemDTO.setQty(item.getNum().intValue());
             orderItemDTO.setOuterOiId(String.format("%s%s",fsStoreOrder.getOrderCode(),item.getItemId()));
             itemDTOList.add(orderItemDTO);
@@ -275,13 +286,15 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         if("2".equals(fsStoreOrder.getPayType()) || "3".equals(fsStoreOrder.getPayType())){
             shopOrderDTO.setIsCod(true);
             // 货到付款金额 = 物流代收金额-优惠金额
-            shopOrderDTO.setBuyerPaidAmount(fsStoreOrder.getPayDelivery());
-            shopOrderDTO.setPayAmount(fsStoreOrder.getPayPrice().doubleValue());
+            //注释掉总买家实付
+            //shopOrderDTO.setBuyerPaidAmount(fsStoreOrder.getPayDelivery());
+            //应付金额(货到付款= 订单总金额 - 已付金额)
+            shopOrderDTO.setPayAmount(fsStoreOrder.getTotalPrice().subtract(fsStoreOrder.getPayPrice()).doubleValue());
 
             // 货到付款要推两次
             PaymentDTO paymentDTO2 = new PaymentDTO();
             // 物流代收金额
-            paymentDTO2.setAmount(fsStoreOrder.getPayDelivery().doubleValue());
+            paymentDTO2.setAmount(fsStoreOrder.getTotalPrice().subtract(fsStoreOrder.getPayPrice()).doubleValue());
             paymentDTO2.setOuterPayId(String.format("%s%d",order.getPlatform_code(),1));
             paymentDTO2.setPayDate(order.getDeal_datetime());
             paymentDTO2.setPayment("货到付款");
@@ -295,7 +308,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
             fsJstCodPush.setParams(JSON.toJSONString(shopOrderDTO));
             fsJstCodPush.setRetryCount(0);
             fsJstCodPush.setTaskStatus(TaskStatusEnum.PENDING.getCode());
-            fsJstCodPushMapper.insert(fsJstCodPush);
+            fsJstCodPushScrmMapper.insert(fsJstCodPush);
 
             //shopOrderDTO.setPay(paymentDTO);
         }
@@ -355,6 +368,35 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         return response;
     }
 
+
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        // 1. 构建查询请求DTO
+        OrderQueryRequestDTO requestDTO = new OrderQueryRequestDTO();
+        requestDTO.setOIds(Collections.singletonList(Long.valueOf(param.getCode())));
+
+
+        // 2. 调用ERP服务查询订单
+        OrderQueryResponseDTO query = jstErpHttpService.query(requestDTO);
+
+        // 3. 构建响应对象
+        ErpOrderQueryResponse response = new ErpOrderQueryResponse();
+
+        // 4. 设置基本响应信息
+
+        // 5. 转换订单数据
+        if (query.getOrders() != null && !query.getOrders().isEmpty()) {
+            List<ErpOrderQuery> erpOrders = query.getOrders().stream()
+                    .map(this::convertToErpOrderQueryScrm)
+                    .collect(Collectors.toList());
+
+            response.setOrders(erpOrders);
+        } else {
+            response.setOrders(Collections.emptyList());
+        }
+
+        return response;
+    }
     /**
      * 将OrderQueryResponseDTO.Order转换为ErpOrderQuery
      *
@@ -438,17 +480,99 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     }
 
 
+
+    private ErpOrderQuery convertToErpOrderQueryScrm(OrderQueryResponseDTO.Order order) {
+        ErpOrderQuery erpOrder = new ErpOrderQuery();
+
+        FsStoreOrderScrm fsStoreOrder = fsStoreOrderService.selectFsStoreOrderScrmByOrderCode(order.getSoId());
+        Asserts.notNull(fsStoreOrder,"该订单号没有找到!");
+
+        // 设置基本订单信息
+        erpOrder.setCode(order.getSoId());
+
+        // 计算订单总数量
+        if (order.getItems() != null && !order.getItems().isEmpty()) {
+            int totalQty = order.getItems().stream()
+                    .mapToInt(OrderQueryResponseDTO.OrderItem::getQty)
+                    .sum();
+            erpOrder.setQty(totalQty);
+        }
+
+        // 设置金额相关信息
+        erpOrder.setAmount(order.getAmount() != null ? order.getAmount().doubleValue() : null);
+        erpOrder.setPayment(order.getPaidAmount() != null ? order.getPaidAmount().doubleValue() : null);
+
+        // 设置其他订单属性
+        erpOrder.setCod(order.getIsCod());
+        erpOrder.setPlatform_code(order.getOrderFrom());
+
+        // 尝试解析创建时间
+        try {
+            if (order.getCreated() != null) {
+                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                erpOrder.setCreatetime(formatter.parse(order.getCreated()));
+            }
+        } catch (Exception e) {
+            // 日期解析异常处理
+            // 可以记录日志或保持为null
+        }
+
+        // 设置店铺信息
+        erpOrder.setShop_name(order.getShopName());
+        erpOrder.setShop_code(String.valueOf(order.getShopId()));
+
+        // 设置物流信息
+        erpOrder.setExpress_name(order.getLogisticsCompany());
+        erpOrder.setExpress_code(order.getLId());
+
+        // 设置收件人信息
+//        erpOrder.setReceiver_name(fsStoreOrder.getRealName());
+        erpOrder.setReceiver_name(fsStoreOrder.getRealName());
+        erpOrder.setReceiver_phone(fsStoreOrder.getUserPhone());
+        erpOrder.setReceiver_mobile(fsStoreOrder.getUserPhone());
+
+        // 构建完整地址
+        erpOrder.setReceiver_address(fsStoreOrder.getUserAddress());
+
+        // 如果是已发货
+        if(ObjectUtil.equal(order.getStatus(), ErpQueryOrderStatusEnum.SENT.getCode())){
+            List<ErpDeliverys> deliverysList = new ArrayList<>();
+
+            ErpDeliverys delivery = new ErpDeliverys();
+            delivery.setMail_no(order.getLId());
+            delivery.setExpress_code(order.getLcId());
+            delivery.setExpress_name(order.getLogisticsCompany());
+            delivery.setDelivery(true);
+            delivery.setCode(order.getSoId());
+
+            deliverysList.add(delivery);
+            erpOrder.setDeliverys(deliverysList);
+
+            // 设置发货状态,假设有物流单号就是已发货状态
+            erpOrder.setDelivery_state(1);
+        } else {
+            erpOrder.setDelivery_state(0);
+        }
+
+        return erpOrder;
+    }
+
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
 
         FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(param.getTid());
-        //todo 待合并
-//        FsStoreDelivers byOrderCode = fsStoreDeliversMapper.findByOrderCode(fsStoreOrder.getOrderCode());
-        //todo
         // 发货后退款
-//        if(ObjectUtil.isNotNull(byOrderCode)){
+        if(ObjectUtils.equals(param.getOrderStatus(),2)){
+            FsJstAftersalePush fsJstAftersalePush = new FsJstAftersalePush();
+            fsJstAftersalePush.setOrderId(fsStoreOrder.getOrderCode());
+            fsJstAftersalePush.setTaskStatus(com.fs.hisStore.enums.TaskStatusEnum.PENDING.getCode());
+            fsJstAftersalePush.setType(String.valueOf(AfterSalesOrderStatusEnum.WAIT_SELLER_AGREE.getIndex()));
+            fsJstAftersalePush.setRetryCount(0);
+            fsJstAftersalePush.setAfterSaleId(String.valueOf(param.getStoreAfterSalesId()));
+            fsJstAftersalePushMapper.insert(fsJstAftersalePush);
 
-//        } else {
+        } else {
             // 如果是发货前退款,直接走取消订单流程
             // 如果是发货后退款,走售后流程
             OrderCancelRequestDTO requestDTO = new OrderCancelRequestDTO();
@@ -457,7 +581,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
             requestDTO.setRemark("用户退款");
 
             jstErpHttpService.cancel(requestDTO);
-//        }
+        }
 
 
         BaseResponse baseResponse = new BaseResponse();
@@ -467,7 +591,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     }
 
     @Autowired
-    private FsJstAftersalePushMapper fsJstAftersalePushMapper;
+    private FsJstAftersalePushScrmMapper fsJstAftersalePushMapper;
 
     @Override
     public BaseResponse refundUpdateScrm(ErpRefundUpdateRequest param) {
@@ -475,7 +599,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
         log.info("订单号: {},发货状态: {},是否发货后: {}",fsStoreOrder.getOrderCode(),fsStoreOrder.getStatus(),ObjectUtils.equals(fsStoreOrder.getStatus(),2));
 
         // 发货后退款
-        if(ObjectUtils.equals(fsStoreOrder.getStatus(),2)){
+        if(ObjectUtils.equals(param.getOrderStatus(),2)){
 
             FsJstAftersalePush fsJstAftersalePush = new FsJstAftersalePush();
             fsJstAftersalePush.setOrderId(fsStoreOrder.getOrderCode());
@@ -483,7 +607,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
             fsJstAftersalePush.setType(String.valueOf(AfterSalesOrderStatusEnum.WAIT_SELLER_AGREE.getIndex()));
             fsJstAftersalePush.setRetryCount(0);
             fsJstAftersalePush.setAfterSaleId(String.valueOf(param.getStoreAfterSalesId()));
-            fsJstAftersalePushMapper.insert(fsJstAftersalePush);
+            fsJstAftersalePushScrmMapper.insert(fsJstAftersalePush);
 
         } else {
             // 如果是发货前退款,直接走取消订单流程

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/impl/K9OrderScrmServiceImpl.java

@@ -128,6 +128,11 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
         return null;
     }
 
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
         return null;

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/K9StockScrmServiceImpl.java

@@ -36,11 +36,21 @@ public class K9StockScrmServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         return null;
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         String barcode = param.getBarcode();
@@ -63,6 +73,11 @@ public class K9StockScrmServiceImpl implements IErpGoodsService {
         return response;
     }
 
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
+
     /**
      * 查看库存
      * @param request 参数

+ 15 - 0
fs-service/src/main/java/com/fs/erp/service/impl/WdtErpGoodsServiceImpl.java

@@ -35,6 +35,11 @@ public class WdtErpGoodsServiceImpl implements IErpGoodsService {
         return null;
     }
 
+    @Override
+    public BaseResponse addGoodsScrm(ErpGoods goods) {
+        return null;
+    }
+
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
         Map<String,String> map = new HashMap<>();
@@ -81,6 +86,11 @@ public class WdtErpGoodsServiceImpl implements IErpGoodsService {
 
     }
 
+    @Override
+    public ErpGoodsQueryResponse getGoodsScrm(ErpGoodsQueryRequert param) {
+        return null;
+    }
+
     @Override
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         String barcode = param.getBarcode();
@@ -115,5 +125,10 @@ public class WdtErpGoodsServiceImpl implements IErpGoodsService {
             throw new RuntimeException(e);
         }
     }
+
+    @Override
+    public ErpGoodsStockQueryResponse getGoodsStockScrm(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
 }
 

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java

@@ -827,6 +827,11 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
         }
     }
 
+    @Override
+    public ErpOrderQueryResponse getScrmOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
     @Override
     public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
         FsSysConfig sysConfig = configUtil.getSysConfig();

+ 1 - 0
fs-service/src/main/java/com/fs/his/dto/InquiryConfigDTO.java

@@ -19,4 +19,5 @@ public class InquiryConfigDTO implements Serializable {
     private Integer unReceiveCancelTime;
     private BigDecimal companyPrice;
     private BigDecimal companyPrescribePrice;
+    private String inquirySubType;
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/dto/PayloadDTO.java

@@ -29,6 +29,10 @@ public class PayloadDTO implements Serializable {
         private String appRealLink;
         private String writeStatus;
         private String packageId;
+        private String type;
+        private Long companyId;
+        private Long companyUserId;
+        private Long doctorId;
 
     }
 

+ 1 - 0
fs-service/src/main/java/com/fs/his/enums/FsStoreOrderLogEnum.java

@@ -18,6 +18,7 @@ public enum FsStoreOrderLogEnum {
     UPDATE_ORDER_DF("update_order_df","代服取消订单,需要重新发货"),
     TAKE_ORDER_DELIVERY("user_take_delivery","用户已收货"),
     PAY_ORDER_SUCCESS("pay_success","用户付款成功"),
+    UN_PAY_ORDER("un_pay","用户待付款付款"),
     PAY_REMAIN_ORDER_SUCCESS("pay_remain_success","用户付款尾款成功"),
 
     CREATE_ORDER("create_order","订单生成"),

+ 10 - 7
fs-service/src/main/java/com/fs/his/mapper/FsDfAccountMapper.java

@@ -3,17 +3,18 @@ package com.fs.his.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsDfAccount;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 代服账户Mapper接口
- * 
+ *
  * @author fs
  * @date 2025-10-13
  */
 public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
     /**
      * 查询代服账户
-     * 
+     *
      * @param id 代服账户主键
      * @return 代服账户
      */
@@ -21,7 +22,7 @@ public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
 
     /**
      * 查询代服账户列表
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @return 代服账户集合
      */
@@ -29,7 +30,7 @@ public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
 
     /**
      * 新增代服账户
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @return 结果
      */
@@ -37,7 +38,7 @@ public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
 
     /**
      * 修改代服账户
-     * 
+     *
      * @param fsDfAccount 代服账户
      * @return 结果
      */
@@ -45,7 +46,7 @@ public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
 
     /**
      * 删除代服账户
-     * 
+     *
      * @param id 代服账户主键
      * @return 结果
      */
@@ -53,9 +54,11 @@ public interface FsDfAccountMapper extends BaseMapper<FsDfAccount>{
 
     /**
      * 批量删除代服账户
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @return 结果
      */
     int deleteFsDfAccountByIds(Long[] ids);
+
+    FsDfAccount selectFsDfAccountByAccount(@Param("loginAccount") String loginAccount);
 }

+ 1 - 0
fs-service/src/main/java/com/fs/his/mapper/FsInquiryOrderMapper.java

@@ -385,4 +385,5 @@ public interface FsInquiryOrderMapper
             "</script>"})
     Long selectFsInquiryFeedbackExportListVOCount(@Param("maps") FsInquiryOrderParam fsInquiryOrder);
 
+    void closeOrder(Long orderId);
 }

+ 21 - 0
fs-service/src/main/java/com/fs/his/mapper/FsPrescribeMapper.java

@@ -2,6 +2,7 @@ package com.fs.his.mapper;
 
 import java.util.List;
 import com.fs.his.domain.FsPrescribe;
+import com.fs.his.param.FsPrescribeListDCompanyParam;
 import com.fs.his.param.FsPrescribeListDParam;
 import com.fs.his.param.FsPrescribeListUParam;
 import com.fs.his.param.FsPrescribeParam;
@@ -134,6 +135,26 @@ public interface FsPrescribeMapper
             "</script>"})
     List<FsPrescribeListUVO> selectFsPrescribeListUVO(@Param("maps")FsPrescribeListUParam param);
 
+    @Select({"<script> " +
+            "select p.*  from fs_prescribe p LEFT JOIN company_user_user c ON p.user_id = c.user_id " +
+            "where 1=1  " +
+            "<if test = 'maps.status != null '> " +
+            "and p.status = #{maps.status} " +
+            "</if>" +
+            "<if test = ' maps.patientName!=null and maps.patientName != \"\"  '> " +
+            "and p.patient_name like concat('%', #{maps.patientName}, '%') " +
+            "</if>" +
+            "<if test = ' maps.prescribeType!=null and maps.prescribeType != \"\"  '> " +
+            "and p.prescribe_type = #{maps.prescribeType} " +
+            "</if>" +
+            "<if test = ' maps.companyUserId!=null and maps.companyUserId != \"\"  '> " +
+            "and c.company_user_id = #{maps.companyUserId} " +
+            "</if>" +
+            " order by p.create_time desc "+
+            "</script>"})
+    List<FsPrescribeListDVO> selectFsPrescribeListUVOByCompanyUser(@Param("maps") FsPrescribeListDCompanyParam param);
+
+
 
     @Select("select so.*,ffff.doctor_name prescribeDoctorName, us.nick_name ,dc.doctor_name,dp.doctor_name doctor_drug_name,fso.order_code,fso.`status` order_status,fse.store_name FROM fs_prescribe so  LEFT JOIN fs_user us ON us.user_id=so.user_id LEFT JOIN fs_doctor dc ON dc.doctor_id = so.doctor_id LEFT JOIN fs_doctor dp ON dp.doctor_id =so.drug_doctor_id LEFT JOIN fs_store_order fso ON fso.order_id = so.store_order_id LEFT JOIN fs_store fse ON fse.store_id = so.store_id  LEFT JOIN fs_doctor ffff ON ffff.doctor_id=so.prescribe_doctor_id  where so.prescribe_id=#{prescribeId}")
     FsPrescribeVO selectFsPrescribeByPrescribeIdVO(Long prescribeId);

+ 9 - 1
fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java

@@ -17,6 +17,7 @@ import com.fs.his.domain.FsStoreOrderLogs;
 import com.fs.his.dto.FsStoreOrderAmountStatsQueryDto;
 import com.fs.his.param.*;
 import com.fs.his.vo.*;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
@@ -355,6 +356,9 @@ public interface FsStoreOrderMapper
     @Select("SELECT * FROM fs_store_order WHERE order_code =#{orderCode}")
     FsStoreOrder selectFsStoreOrderByOrderCode(String orderCode);
 
+    @Select("SELECT * FROM fs_store_order_scrm WHERE order_code =#{orderCode}")
+    FsStoreOrderScrm selectFsStoreOrderScrmByOrderCode(String orderCode);
+
     @Select("select so.*,st.store_name,us.nick_name,us.phone,p.patient_age,p.patient_gender,p.patient_descs,p.patient_name," +
             "d.doctor_name,fp.prescribe_code,fd.doctor_name follow_doctor_name,c.company_name,cu.user_name company_user_name,pat.relation  " +
             "FROM fs_store_order so LEFT JOIN fs_store st ON so.store_id =st.store_id " +
@@ -1131,7 +1135,8 @@ public interface FsStoreOrderMapper
     @Select("select * from fs_store_order where extend_order_id  like 'SO%' and `status`=2 ")
     List<FsStoreOrder> selectOmsOrderdeliveryOp();
 
-
+    @Select("select * from fs_store_order_scrm where extend_order_id  is not null and `status`=1 ")
+    List<FsStoreOrderScrm> selectOmsOrderdeliveryOpScrm();
     List<FsStoreOrder> selectFsStoreOrderByOrderIdIn(@Param("ids") List<Long> ids);
 
     List<FsStoreOrder> selectFsStoreOrderStatisticsByUserId(@Param("ids") List<Long> ids);
@@ -1151,6 +1156,9 @@ public interface FsStoreOrderMapper
     @Select("select * from fs_store_order where  `status`=2 and extend_order_id is not null and extend_order_id != '' ")
     List<FsStoreOrder> selectWdtOmsOrderdeliveryOp();
 
+    @Select("select * from fs_store_order_scrm where  `status`=1 and extend_order_id is not null and extend_order_id != '' ")
+    List<FsStoreOrderScrm> selectWdtOmsOrderdeliveryOpScrm();
+
     int batchUpdateErpByOrderIds(@Param("maps") List<Map<String, String>> maps);
 
     @Select(" select * from fs_store_order where order_code=#{orderCode} and store_id=#{storeId}")

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPackageOrderComputeParam.java

@@ -14,6 +14,7 @@ public class FsPackageOrderComputeParam implements Serializable {
     Integer type=1;
     Long companyId;
     Long companyUserId;
+    private String createPackageOrderKey;
 
 
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/param/FsPackageOrderCreateParam.java

@@ -19,6 +19,8 @@ public class FsPackageOrderCreateParam implements Serializable {
     private String formJson;
     private String patientJson;
     private Integer source;//订单来源 1:小程序 2:app  3:H5
+    private String createPackageOrderKey;
+    private Integer payType;
 
 
 

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPackageOrderDoPayParam.java

@@ -12,4 +12,5 @@ public class FsPackageOrderDoPayParam implements Serializable {
     Long userId;
 
     private String appId;//小程序id
+    private String createPackageOrderKey;
 }

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPackageOrderPayParam.java

@@ -16,4 +16,5 @@ public class FsPackageOrderPayParam implements Serializable {
     Integer payType;
 
     Long userId;
+    private String createPackageOrderKey;
 }

+ 27 - 0
fs-service/src/main/java/com/fs/his/param/FsPrescribeListDCompanyParam.java

@@ -0,0 +1,27 @@
+package com.fs.his.param;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import java.io.Serializable;
+@Data
+public class FsPrescribeListDCompanyParam  extends BaseParam implements Serializable {
+
+    Long doctorId;
+    Long doctorDrugId;
+    Integer status;//1待审核 2历史订单
+    Integer type;//1医生 2药师
+    String patientName;
+    String prescribeCode;
+    Integer prescribeType;
+    Long companyUserId;
+
+    /** 开始时间 */
+    @JsonIgnore
+    private String beginTime;
+    /** 结束时间 */
+    @JsonIgnore
+    private String endTime;
+
+
+}

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPrescribeListDParam.java

@@ -17,6 +17,7 @@ public class FsPrescribeListDParam extends BaseParam implements Serializable {
     String patientName;
     String prescribeCode;
     Integer prescribeType;
+    Long companyUserId;
 
     /** 开始时间 */
     @JsonIgnore

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPrescribeListUParam.java

@@ -8,4 +8,5 @@ import java.io.Serializable;
 public class FsPrescribeListUParam extends BaseParam implements Serializable {
     Long userId;
     Integer status;
+    String patientName;
 }

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsPrescribeParam.java

@@ -134,6 +134,7 @@ public class FsPrescribeParam {
     private Long companyUserId;
 
     private Long taskId;//任务ID
+    private boolean isImOpen;
 
 
 

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/IFsDfAccountService.java

@@ -58,4 +58,6 @@ public interface IFsDfAccountService extends IService<FsDfAccount>{
      * @return 结果
      */
     int deleteFsDfAccountById(Long id);
+
+    FsDfAccount selectFsDfAccountByAccount(String loginAccount);
 }

+ 1 - 1
fs-service/src/main/java/com/fs/his/service/IFsExportTaskService.java

@@ -64,7 +64,7 @@ public interface IFsExportTaskService
 
     Integer isExportType1( Long userId);
 
-    public void exportStore1Data(FsStoreOrderParam param, boolean isAdmin, ArrayList<String>filter);
+    public void exportStore1Data(FsStoreOrderParam param, boolean isCheckPhone, boolean isCheckAddress,ArrayList<String>filter);
 
 
     public void exportStoreData(FsStoreOrderParam fsStoreOrder);

+ 1 - 0
fs-service/src/main/java/com/fs/his/service/IFsInquiryOrderService.java

@@ -132,4 +132,5 @@ public interface IFsInquiryOrderService
 
     R getWxaCodeInquiryOrderUnLimitR(Long orderId);
 
+    void closeOrder(Long orderId);
 }

Някои файлове не бяха показани, защото твърде много файлове са промени