73 次代码提交 e667b54f24 ... dff87b794e

作者 SHA1 备注 提交日期
  chenguo dff87b794e Merge remote-tracking branch 'origin/ScrmStore' into ScrmStore 2 周之前
  chenguo ef3141e0ea 代码合并 2 周之前
  chenguo d0d5e6e135 Merge branch 'refs/heads/master' into ScrmStore 2 周之前
  Long 309fb01627 套餐包优惠卷金额计算代码同步 2 周之前
  chenguo 061dc176c8 Merge remote-tracking branch 'origin/ScrmStore' into ScrmStore 2 周之前
  chenguo 6340c1a5d1 Merge remote-tracking branch 'origin/ScrmStore' into ScrmStore 2 周之前
  三七 4a37c78da4 登录异常 的详细内容 2 周之前
  Long befe60bdbd 总后台-项目会员管理 2 周之前
  yfh e80fd764f4 Merge remote-tracking branch 'origin/master' 2 周之前
  yfh 73e43c67af 调整看课记录多条校验,迁移运费模块,快递公司 2 周之前
  Long 7e3cfac461 会员管理列表查询修改 2 周之前
  zyp fe1f0f38ea zyp 2 周之前
  ct 8e1a7c913f 宏医堂配置 2 周之前
  ct 25e588755d 宏医堂配置 2 周之前
  yfh 2802d72b1a Merge remote-tracking branch 'origin/master' 2 周之前
  ct e8ab9e25ba Merge remote-tracking branch 'origin/master' 2 周之前
  ct bac33a2cee 优惠券问题 和 会员公司筛选问题 2 周之前
  zyp 669f10501e Merge remote-tracking branch 'origin/master' 2 周之前
  zyp 3328cab23a zyp 2 周之前
  Long d9425d3f63 小程序积分列表获得与消耗查询条件修改 2 周之前
  Long aaf762bdd3 小程序积分列表获得与消耗查询条件修改 2 周之前
  yfh c8ec2a0656 校验问题处理 2 周之前
  yfh d2d8eba23c Merge remote-tracking branch 'origin/master' 2 周之前
  Long 3abf64ca2d 积分商城取消订单代码修改 2 周之前
  wjj c1dedf28c9 患者问诊信息 2 周之前
  yfh 77371dc417 Merge remote-tracking branch 'origin/master' 2 周之前
  Long 7d1b9b4d80 fs-redis mybatis配置调整 2 周之前
  zx 331bdbb640 add 2 周之前
  Long c0f546af1c 答题人数统计修改 2 周之前
  Long 7eae3f005b 支付发起用户小程序openId增加获取方式 2 周之前
  ct b199ec510b Merge remote-tracking branch 'origin/master' 2 周之前
  xdd b003ede40e fix: 套餐包分类缓存修改 2 周之前
  xdd c2ed8fb364 fix: 套餐包分类缓存修改 1 月之前
  xdd f9c8d358c6 fix: 套餐包分类缓存修改 1 月之前
  Long 5b2d8e8aa6 同步 updatePushId 和 updateHistoryApp(半成品) 接口 2 周之前
  Long b40f3d3d93 操作日志记录调整 2 周之前
  Long 64982a55c5 点播播放源配置优化 2 周之前
  ct 39578c935a 优惠券 发送 2 周之前
  zyp 8241d61863 Merge remote-tracking branch 'origin/master' 2 周之前
  zyp 0befe36c6a zyp 2 周之前
  ct fc18983a36 userapp 发送优惠券 2 周之前
  yfh 1be965caff 营期统计分页问题处理 2 周之前
  yfh 3573579aa6 Merge remote-tracking branch 'origin/ScrmStore' 2 周之前
  ct 1a837bc029 Merge remote-tracking branch 'origin/master' 2 周之前
  ct a213b044f0 超管导出 订单完整收货地址,分配手机号权限只有相关角色查看 2 周之前
  zx 6bba6eb12d add 2 周之前
  yfh aa9d2ef2a6 营期统计分页数据问题处理 2 周之前
  yfh a30c4d92df 1 2 周之前
  yfh 3ce80bb385 1 2 周之前
  yfh 5866ee3463 1 2 周之前
  yfh b4509b68a9 1 2 周之前
  yfh fcc28fccbf 1 2 周之前
  yfh fb3ba1d3ec 金博支付问题配置整合,调整erp支付配置 2 周之前
  yfh c03a9cceb4 Merge remote-tracking branch 'origin/master' 2 周之前
  ct c3b5ba4ce9 fix:缓存及按sort排序 2 周之前
  yfh 773697fba8 Merge remote-tracking branch 'origin/master' 2 周之前
  yfh c59a2cebd8 1 2 周之前
  yfh 67a3b79b85 看课流量统计 2 周之前
  zyp 0150edaa46 Merge remote-tracking branch 'origin/master' 2 周之前
  zyp ce9357d92e zyp 2 周之前
  zx 3650db42a9 Merge remote-tracking branch 'origin/master' 2 周之前
  zx 1b29f217d3 add 2 周之前
  三七 38b4bdc300 openIM 2 周之前
  三七 6688a3aa49 qdtstipad: 2 周之前
  yfh 7de6d187f1 Merge remote-tracking branch 'origin/ScrmStore' 2 周之前
  yfh b0a02fad46 Merge remote-tracking branch 'origin/ScrmStores' 2 周之前
  yfh ced61bcf45 Merge remote-tracking branch 'origin/ScrmStore' 2 周之前
  chenguo 6aa4496c7a Merge remote-tracking branch 'origin/ScrmStore' into ScrmStore 2 周之前
  chenguo 0554d10071 多店铺代码店铺、商品日志 2 周之前
  chenguo 333820f934 多店铺代码迁移1 3 周之前
  chenguo 74045f3176 Merge branch 'refs/heads/master' into ScrmStores 3 周之前
  chenguo 34d73b938d 多店铺代码迁移 3 周之前
  chenguo acfe4045e8 Merge branch 'refs/heads/master' into ScrmStore 3 周之前
共有 100 个文件被更改,包括 1479 次插入264 次删除
  1. 115 0
      fs-admin/src/main/java/com/fs/course/controller/FsCoursePlaySourceConfigController.java
  2. 2 8
      fs-admin/src/main/java/com/fs/course/controller/FsCourseTrafficLogController.java
  3. 2 1
      fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java
  4. 23 4
      fs-admin/src/main/java/com/fs/his/controller/FsArticleCateController.java
  5. 6 0
      fs-admin/src/main/java/com/fs/his/controller/FsCityController.java
  6. 52 0
      fs-admin/src/main/java/com/fs/his/controller/FsInquiryPatientInfoController.java
  7. 10 8
      fs-admin/src/main/java/com/fs/his/controller/FsPackageCateController.java
  8. 5 0
      fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java
  9. 15 2
      fs-admin/src/main/java/com/fs/his/controller/FsUserController.java
  10. 5 0
      fs-admin/src/main/java/com/fs/his/task/Task.java
  11. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsMaterialGroupScrmController.java
  12. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsMaterialScrmController.java
  13. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsMenuScrmController.java
  14. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsPrescribeDrugScrmController.java
  15. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsPrescribeScrmController.java
  16. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsShippingTemplatesFreeScrmController.java
  17. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsShippingTemplatesRegionScrmController.java
  18. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsShippingTemplatesScrmController.java
  19. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreActivityScrmController.java
  20. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesItemScrmController.java
  21. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesScrmController.java
  22. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesStatusScrmController.java
  23. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCanvasScrmController.java
  24. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCartScrmController.java
  25. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponIssueScrmController.java
  26. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponIssueUserScrmController.java
  27. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponScrmController.java
  28. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponUserScrmController.java
  29. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java
  30. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderAuditScrmController.java
  31. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderItemScrmController.java
  32. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderNoticeScrmController.java
  33. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderOfflineItemScrmController.java
  34. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderOfflineScrmController.java
  35. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderPromotionScrmController.java
  36. 24 9
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  37. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderStatisticsScrmController.java
  38. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderStatusScrmController.java
  39. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java
  40. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductAttrScrmController.java
  41. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductAttrValueScrmController.java
  42. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductCategoryScrmController.java
  43. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductDetailsScrmController.java
  44. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductGroupScrmController.java
  45. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductPackageScrmController.java
  46. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductRelationScrmController.java
  47. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductReplyScrmController.java
  48. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductRuleScrmController.java
  49. 8 5
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java
  50. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductTemplateScrmController.java
  51. 134 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreScrmController.java
  52. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreShopScrmController.java
  53. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreShopStaffScrmController.java
  54. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreStatisticsScrmController.java
  55. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreVisitScrmController.java
  56. 50 0
      fs-admin/src/main/java/com/fs/hisStore/controller/SysOperlogScrmController.java
  57. 1 1
      fs-admin/src/main/java/com/fs/hisStore/task/CrmTask.java
  58. 1 1
      fs-admin/src/main/java/com/fs/hisStore/task/ErpTask.java
  59. 92 5
      fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java
  60. 1 1
      fs-admin/src/main/java/com/fs/hisStore/task/stats/FsStatsMemberDailyTask.java
  61. 20 4
      fs-admin/src/main/java/com/fs/web/controller/system/SysLoginController.java
  62. 17 2
      fs-common/src/main/java/com/fs/common/annotation/Log.java
  63. 3 0
      fs-common/src/main/java/com/fs/common/core/redis/RedisCache.java
  64. 1 1
      fs-company-app/src/main/java/com/fs/app/controller/UserController.java
  65. 7 1
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  66. 2 1
      fs-company/src/main/java/com/fs/company/controller/course/FsUserCoursePeriodController.java
  67. 19 2
      fs-company/src/main/java/com/fs/company/controller/store/FsStoreOrderController.java
  68. 10 2
      fs-company/src/main/java/com/fs/company/controller/store/FsUserAddressController.java
  69. 7 0
      fs-company/src/main/java/com/fs/company/controller/store/FsUserController.java
  70. 3 0
      fs-company/src/main/java/com/fs/company/controller/store/FsUserCouponController.java
  71. 1 0
      fs-company/src/main/java/com/fs/framework/config/SecurityConfig.java
  72. 0 59
      fs-company/src/main/java/com/fs/hisStore/controller/FsCityScrmController.java
  73. 69 9
      fs-framework/src/main/java/com/fs/framework/aspectj/LogAspect.java
  74. 26 3
      fs-framework/src/main/java/com/fs/framework/manager/factory/AsyncFactory.java
  75. 6 5
      fs-redis/src/main/java/com/fs/framework/config/MyBatisConfig.java
  76. 2 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  77. 6 0
      fs-service/src/main/java/com/fs/company/service/ICompanyService.java
  78. 3 0
      fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java
  79. 76 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  80. 24 1
      fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  81. 62 15
      fs-service/src/main/java/com/fs/core/config/WxMaConfiguration.java
  82. 79 0
      fs-service/src/main/java/com/fs/course/domain/FsCoursePlaySourceConfig.java
  83. 17 0
      fs-service/src/main/java/com/fs/course/mapper/FsCoursePlaySourceConfigMapper.java
  84. 1 1
      fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  85. 1 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCoursePeriodDaysMapper.java
  86. 45 0
      fs-service/src/main/java/com/fs/course/param/FsCoursePlaySourceConfigCreateParam.java
  87. 42 0
      fs-service/src/main/java/com/fs/course/param/FsCoursePlaySourceConfigEditParam.java
  88. 1 1
      fs-service/src/main/java/com/fs/course/param/newfs/FsUserCourseAddCompanyUserParam.java
  89. 16 0
      fs-service/src/main/java/com/fs/course/service/IFsCoursePlaySourceConfigService.java
  90. 3 1
      fs-service/src/main/java/com/fs/course/service/IFsUserCoursePeriodDaysService.java
  91. 27 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCoursePlaySourceConfigServiceImpl.java
  92. 28 26
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java
  93. 12 3
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  94. 26 12
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseOrderServiceImpl.java
  95. 14 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java
  96. 43 15
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  97. 28 12
      fs-service/src/main/java/com/fs/course/service/impl/FsUserVipOrderServiceImpl.java
  98. 49 0
      fs-service/src/main/java/com/fs/course/vo/FsCoursePlaySourceConfigVO.java
  99. 94 0
      fs-service/src/main/java/com/fs/his/domain/FsInquiryPatientInfo.java
  100. 1 1
      fs-service/src/main/java/com/fs/his/dto/PayConfigDTO.java

+ 115 - 0
fs-admin/src/main/java/com/fs/course/controller/FsCoursePlaySourceConfigController.java

@@ -0,0 +1,115 @@
+package com.fs.course.controller;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+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.utils.bean.BeanUtils;
+import com.fs.course.domain.FsCoursePlaySourceConfig;
+import com.fs.course.param.FsCoursePlaySourceConfigCreateParam;
+import com.fs.course.param.FsCoursePlaySourceConfigEditParam;
+import com.fs.course.service.IFsCoursePlaySourceConfigService;
+import com.fs.course.vo.FsCoursePlaySourceConfigVO;
+import com.github.pagehelper.PageHelper;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.time.LocalDateTime;
+import java.util.*;
+
+@RestController
+@RequestMapping("/course/playSourceConfig")
+@AllArgsConstructor
+public class FsCoursePlaySourceConfigController extends BaseController {
+
+    private final IFsCoursePlaySourceConfigService fsCoursePlaySourceConfigService;
+
+    @PreAuthorize("@ss.hasPermi('course:playSourceConfig:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(@RequestParam(required = false) String name,
+                              @RequestParam(required = false) String appid,
+                              @RequestParam(required = false, defaultValue = "1") Integer pageNum,
+                              @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("name", name);
+        params.put("appid", appid);
+
+        PageHelper.startPage(pageNum, pageSize);
+        List<FsCoursePlaySourceConfigVO> list = fsCoursePlaySourceConfigService.selectCoursePlaySourceConfigVOListByMap(params);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('course:playSourceConfig:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable Long id) {
+        FsCoursePlaySourceConfig config = fsCoursePlaySourceConfigService.getById(id);
+        if (Objects.isNull(config)) {
+            return AjaxResult.success(null);
+        }
+
+        FsCoursePlaySourceConfigVO configVO = new FsCoursePlaySourceConfigVO();
+        BeanUtils.copyProperties(config, configVO);
+        return AjaxResult.success(configVO);
+    }
+
+    @PreAuthorize("@ss.hasPermi('course:playSourceConfig:add')")
+    @Log(title = "点播播放源配置", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Valid @RequestBody FsCoursePlaySourceConfigCreateParam param) {
+        Wrapper<FsCoursePlaySourceConfig> queryWrapper = Wrappers.<FsCoursePlaySourceConfig>lambdaQuery()
+                .eq(FsCoursePlaySourceConfig::getAppid, param.getAppid())
+                .eq(FsCoursePlaySourceConfig::getIsDel, 0);
+        if (fsCoursePlaySourceConfigService.count(queryWrapper) > 0) {
+            return AjaxResult.error("appid已存在");
+        }
+
+        FsCoursePlaySourceConfig config = new FsCoursePlaySourceConfig();
+        BeanUtils.copyProperties(param, config);
+
+        config.setIsDel(0);
+        config.setCreateTime(LocalDateTime.now());
+        config.setUpdateTime(LocalDateTime.now());
+        fsCoursePlaySourceConfigService.save(config);
+        return AjaxResult.success();
+    }
+
+    @PreAuthorize("@ss.hasPermi('course:playSourceConfig:edit')")
+    @Log(title = "点播播放源配置", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Valid @RequestBody FsCoursePlaySourceConfigEditParam param) {
+        FsCoursePlaySourceConfig config = fsCoursePlaySourceConfigService.getById(param.getId());
+        if (Objects.isNull(config)) {
+            return AjaxResult.error("点播播放源配置不存在");
+        }
+
+        Wrapper<FsCoursePlaySourceConfig> queryWrapper = Wrappers.<FsCoursePlaySourceConfig>lambdaQuery()
+                .eq(FsCoursePlaySourceConfig::getAppid, param.getAppid())
+                .eq(FsCoursePlaySourceConfig::getIsDel, 0)
+                .last("limit 1");
+        FsCoursePlaySourceConfig one = fsCoursePlaySourceConfigService.getOne(queryWrapper);
+        if (Objects.nonNull(one) && !one.getId().equals(config.getId())) {
+            return AjaxResult.error("appid已存在");
+        }
+
+        BeanUtils.copyProperties(param, config);
+        fsCoursePlaySourceConfigService.updateById(config);
+        return AjaxResult.success();
+    }
+
+    @PreAuthorize("@ss.hasPermi('course:playSourceConfig:remove')")
+    @Log(title = "点播播放源配置", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        Wrapper<FsCoursePlaySourceConfig> updateWrapper = Wrappers.<FsCoursePlaySourceConfig>lambdaUpdate()
+                .set(FsCoursePlaySourceConfig::getIsDel, 1)
+                .in(FsCoursePlaySourceConfig::getId, Arrays.asList(ids));
+        fsCoursePlaySourceConfigService.update(updateWrapper);
+        return AjaxResult.success();
+    }
+}

+ 2 - 8
fs-admin/src/main/java/com/fs/course/controller/FsCourseTrafficLogController.java

@@ -1,6 +1,7 @@
 package com.fs.course.controller;
 
 import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -50,14 +51,7 @@ public class FsCourseTrafficLogController extends BaseController
     public TableDataInfo list(FsCourseTrafficLogParam param)
     {
         startPage();
-        if (param.getTime() != null) {
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
-            String formattedDate = sdf.format(param.getTime());
-            String[] parts = formattedDate.split("-");
-            param.setYear(Integer.parseInt(parts[0]));
-            param.setMonth(Integer.parseInt(parts[1]));
-        }
-        List<FsCourseTrafficLogListVO> list = fsCourseTrafficLogService.selectTrafficByCompany(param);
+        List<FsCourseTrafficLogListVO> list = fsCourseTrafficLogService.selectTrafficNew(param);
         return getDataTable(list);
     }
 

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

@@ -220,10 +220,11 @@ public class FsUserCoursePeriodController extends BaseController {
     public R periodCourseCount(@RequestBody PeriodCountParam param) {
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
         List<FsPeriodCountVO> list = fsUserCoursePeriodDaysService.periodCourseCount(param);
+        long count = fsUserCoursePeriodDaysService.periodCourseByCount(param);
         PageInfo<FsPeriodCountVO> pageInfo = new PageInfo<>(list);
         Map<String, Object> result = new HashMap<>();
         result.put("rows", pageInfo.getList());
-        result.put("total", pageInfo.getTotal());
+        result.put("total", count);
         return R.ok(result);
     }
 

+ 23 - 4
fs-admin/src/main/java/com/fs/his/controller/FsArticleCateController.java

@@ -1,7 +1,9 @@
 package com.fs.his.controller;
 
+import java.util.Collection;
 import java.util.List;
 
+import com.fs.common.core.redis.RedisCache;
 import com.fs.his.vo.OptionsVO;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,7 +26,7 @@ import com.fs.common.core.page.TableDataInfo;
 
 /**
  * 文章分类Controller
- * 
+ *
  * @author fs
  * @date 2023-07-04
  */
@@ -34,6 +36,8 @@ public class FsArticleCateController extends BaseController
 {
     @Autowired
     private IFsArticleCateService fsArticleCateService;
+    @Autowired
+    RedisCache redisCache;
 
     /**
      * 查询文章分类列表
@@ -78,7 +82,12 @@ public class FsArticleCateController extends BaseController
     @PostMapping
     public AjaxResult add(@RequestBody FsArticleCate fsArticleCate)
     {
-        return toAjax(fsArticleCateService.insertFsArticleCate(fsArticleCate));
+        int i = fsArticleCateService.insertFsArticleCate(fsArticleCate);
+        Collection<String> keys = redisCache.keys("getArticleCateList*");
+        for (String key : keys) {
+            redisCache.deleteObject(key);
+        }
+        return toAjax(i);
     }
 
     /**
@@ -89,7 +98,12 @@ public class FsArticleCateController extends BaseController
     @PutMapping
     public AjaxResult edit(@RequestBody FsArticleCate fsArticleCate)
     {
-        return toAjax(fsArticleCateService.updateFsArticleCate(fsArticleCate));
+        int i = fsArticleCateService.updateFsArticleCate(fsArticleCate);
+        Collection<String> keys = redisCache.keys("getArticleCateList*");
+        for (String key : keys) {
+            redisCache.deleteObject(key);
+        }
+        return toAjax(i);
     }
 
     /**
@@ -100,7 +114,12 @@ public class FsArticleCateController extends BaseController
 	@DeleteMapping("/{cateIds}")
     public AjaxResult remove(@PathVariable Long[] cateIds)
     {
-        return toAjax(fsArticleCateService.deleteFsArticleCateByCateIds(cateIds));
+        int i = fsArticleCateService.deleteFsArticleCateByCateIds(cateIds);
+        Collection<String> keys = redisCache.keys("getArticleCateList*");
+        for (String key : keys) {
+            redisCache.deleteObject(key);
+        }
+        return toAjax(i);
     }
 
     /**

+ 6 - 0
fs-admin/src/main/java/com/fs/his/controller/FsCityController.java

@@ -129,4 +129,10 @@ public class FsCityController extends BaseController
         return R.ok().put("data",fsCityService.getCitysArea());
     }
 
+    @GetMapping("/getAllList")
+    public R getAllList(FsCity fsCity)
+    {
+        List<FsCity> list = fsCityService.selectFsCityList(fsCity);
+        return R.ok().put("data",list);
+    }
 }

+ 52 - 0
fs-admin/src/main/java/com/fs/his/controller/FsInquiryPatientInfoController.java

@@ -0,0 +1,52 @@
+package com.fs.his.controller;
+
+
+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.his.param.FsInquiryPatientParam;
+import com.fs.his.service.IFsInquiryPatientInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 问诊患者信息(FsInquiryPatientInfo)
+ */
+@RestController
+@RequestMapping("/his/inquiryPatientInfo")
+public class FsInquiryPatientInfoController extends BaseController {
+
+
+    @Autowired
+    private IFsInquiryPatientInfoService patientInfoService;
+
+
+
+
+    /**
+     * 新增患者问诊信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:inquiryPatientInfo:add')")
+    @Log(title = "患者问诊信息", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsInquiryPatientParam param){
+        return toAjax(patientInfoService.insertFsInquiryPatientInfo(param));
+    }
+
+    /**
+     * 修改患者问诊信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:inquiryPatientInfo:edit')")
+    @Log(title = "患者问诊信息", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsInquiryPatientParam param){
+        return toAjax(patientInfoService.updateFsInquiryPatientInfo(param));
+    }
+
+    @GetMapping("/detail/{inquiryOrderId}")
+    public AjaxResult get(@PathVariable("inquiryOrderId") Long inquiryOrderId){
+        return AjaxResult.success(patientInfoService.selectFsInquiryPatientInfo(inquiryOrderId));
+    }
+}

+ 10 - 8
fs-admin/src/main/java/com/fs/his/controller/FsPackageCateController.java

@@ -7,6 +7,8 @@ import java.util.Map;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.his.param.FsPackageCateUParam;
 import com.fs.his.vo.OptionsVO;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -84,10 +86,10 @@ public class FsPackageCateController extends BaseController
     public AjaxResult add(@RequestBody FsPackageCate fsPackageCate)
     {
         fsPackageCateService.insertFsPackageCate(fsPackageCate);
-        Collection<String> keys = redisCache.keys("getPackagCateList*");
-        for (String key : keys) {
-            redisCache.deleteObject(key);
-        }
+//        Collection<String> keys = redisCache.keys("getPackagCateList*");
+//        for (String key : keys) {
+//            redisCache.deleteObject(key);
+//        }
         return toAjax(1);
     }
 
@@ -100,10 +102,10 @@ public class FsPackageCateController extends BaseController
     public AjaxResult edit(@RequestBody FsPackageCate fsPackageCate)
     {
         fsPackageCateService.updateFsPackageCate(fsPackageCate);
-        Collection<String> keys = redisCache.keys("getPackagCateList*");
-        for (String key : keys) {
-            redisCache.deleteObject(key);
-        }
+//        Collection<String> keys = redisCache.keys("getPackagCateList*");
+//        for (String key : keys) {
+//            redisCache.deleteObject(key);
+//        }
         return toAjax(1);
     }
 

+ 5 - 0
fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java

@@ -108,6 +108,9 @@ public class FsStoreOrderController extends BaseController
     @Autowired
     @Qualifier("JSTErpOrderServiceImpl")
     private IErpOrderService jSTOrderService;
+    @Autowired
+    @Qualifier("k9OrderScrmServiceImpl")
+    private IErpOrderService k9OrderService;
 
     @Autowired
     SysConfigMapper sysConfigMapper;
@@ -475,6 +478,8 @@ public class FsStoreOrderController extends BaseController
                     erpOrderService =  dfOrderService;
                 }else if(erpType == 5){
                     erpOrderService=jSTOrderService;
+                }else if(erpType == 6){
+                    erpOrderService=k9OrderService;
                 }
                 return erpOrderService;
 

+ 15 - 2
fs-admin/src/main/java/com/fs/his/controller/FsUserController.java

@@ -140,8 +140,21 @@ public class FsUserController extends BaseController
     {
         startPage();
         List<FsUserVO> list = fsUserService.selectFsUserVOListByProject(fsUser);
-        for (FsUserVO vo : list){
-            vo.setPhone(ParseUtils.parsePhone(vo.getPhone()));
+        boolean checkPhone = isCheckPhone();
+        for (FsUserVO fsUserVO : list) {
+            if(fsUserVO.getPhone() != null&&fsUserVO.getPhone()!=""){
+                if (!checkPhone){
+                    if (fsUserVO.getPhone().length()>11){
+                        fsUserVO.setPhone(decryptPhoneMk(fsUserVO.getPhone()));
+                    }else {
+                        fsUserVO.setPhone(fsUserVO.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
+                    }
+                } else {
+                    if (fsUserVO.getPhone().length()>11) {
+                        fsUserVO.setPhone(decryptPhone(fsUserVO.getPhone()));
+                    }
+                }
+            }
         }
         return getDataTable(list);
     }

+ 5 - 0
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -1058,6 +1058,9 @@ public class Task {
     @Autowired
     @Qualifier("JSTErpOrderServiceImpl")
     private IErpOrderService jSTOrderService;
+    @Autowired
+    @Qualifier("k9OrderScrmServiceImpl")
+    private IErpOrderService k9OrderService;
 
     private IErpOrderService getErpService() {
         FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -1081,6 +1084,8 @@ public class Task {
                     erpOrderService =  dfOrderService;
                 }else if(erpType == 5){
                     erpOrderService=jSTOrderService;
+                }else if(erpType == 6){
+                    erpOrderService=k9OrderService;
                 }
                 return erpOrderService;
 

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsMaterialGroupScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsMaterialGroupScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsMaterialScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsMaterialScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsMenuScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsMenuScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsPrescribeDrugScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsPrescribeDrugScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsPrescribeScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsPrescribeScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsShippingTemplatesFreeScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsShippingTemplatesFreeScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsShippingTemplatesRegionScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsShippingTemplatesRegionScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsShippingTemplatesScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsShippingTemplatesScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreActivityScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreActivityScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreAfterSalesItemScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesItemScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreAfterSalesScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreAfterSalesStatusScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesStatusScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreCanvasScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCanvasScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreCartScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCartScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreCouponIssueScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponIssueScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreCouponIssueUserScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponIssueUserScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreCouponScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreCouponUserScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreCouponUserScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

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

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 
 import cn.hutool.core.bean.BeanUtil;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreOrderAuditScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderAuditScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreOrderItemScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderItemScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreOrderNoticeScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderNoticeScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreOrderOfflineItemScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderOfflineItemScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreOrderOfflineScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderOfflineScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreOrderPromotionScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderPromotionScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 
 import cn.hutool.core.bean.BeanUtil;

+ 24 - 9
fs-admin/src/main/java/com/fs/hisStore/FsStoreOrderScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
@@ -87,11 +87,19 @@ public class FsStoreOrderScrmController extends BaseController {
     @Autowired
     @Qualifier("wdtErpOrderServiceImpl")
     private IErpOrderService wdtOrderService;
-
+    @Autowired
+    @Qualifier("hzOMSErpOrderServiceImpl")
+    private IErpOrderService hzOMSErpOrderService;
+    @Autowired
+    @Qualifier("dfOrderServiceImpl")
+    private IErpOrderService dfOrderService;
     @Autowired
     @Qualifier("k9OrderScrmServiceImpl")
     private IErpOrderService k9OrderService;
     @Autowired
+    @Qualifier("JSTErpOrderServiceImpl")
+    private IErpOrderService jSTOrderService;
+    @Autowired
     private ConfigUtil configUtil;
     @Autowired
     private IFsStoreOrderAuditLogScrmService orderAuditLogService;
@@ -108,15 +116,22 @@ public class FsStoreOrderScrmController extends BaseController {
             //判断erp类型
             Integer erpType = erpConfig.getErpType();
             if (erpType != null) {
-                if (erpType == 1) {
+                if (erpType == 1){
                     //管易
-                    erpOrderService = gyOrderService;
-                } else if (erpType == 2) {
-                    //旺店通
-                    erpOrderService = wdtOrderService;
-                } else if (erpType == 3) {
+                    erpOrderService =  gyOrderService;
+                } else if (erpType == 2){
                     //旺店通
-                    erpOrderService = k9OrderService;
+                    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;
                 }
             }
         }

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreOrderStatisticsScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderStatisticsScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.baomidou.mybatisplus.extension.api.R;
 import com.fs.hisStore.param.FsStoreOrderStatisticsParam;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreOrderStatusScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderStatusScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

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

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import cn.hutool.json.JSONUtil;
 import com.alipay.api.AlipayApiException;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreProductAttrScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductAttrScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreProductAttrValueScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductAttrValueScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreProductCategoryScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductCategoryScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreProductDetailsScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductDetailsScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreProductGroupScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductGroupScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreProductPackageScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductPackageScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreProductRelationScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductRelationScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreProductReplyScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductReplyScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import cn.hutool.core.date.DateTime;
 import com.fs.common.annotation.Log;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreProductRuleScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductRuleScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import cn.hutool.json.JSONUtil;
 import com.fs.common.annotation.Log;

+ 8 - 5
fs-admin/src/main/java/com/fs/hisStore/FsStoreProductScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
@@ -60,6 +60,7 @@ public class FsStoreProductScrmController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('store:storeProduct:list')")
     @PostMapping("/batchModify")
+    @Log(title = "商品管理", businessType = BusinessType.UPDATE,isStoreLog = true,logParam = {"商品","批量修改商品信息"})
     public R batchModify(@RequestBody ModifyMoreDTO modifyMoreDTO){
         fsStoreProductService.batchModify(modifyMoreDTO);
         return R.ok();
@@ -86,7 +87,7 @@ public class FsStoreProductScrmController extends BaseController
      * 导出商品列表
      */
     @PreAuthorize("@ss.hasPermi('store:storeProduct:export')")
-    @Log(title = "商品", businessType = BusinessType.EXPORT)
+    @Log(title = "商品管理", businessType = BusinessType.EXPORT, isStoreLog = true,logParam = {"商品","导出商品信息"})
     @GetMapping("/export")
     public AjaxResult export(FsStoreProductScrm fsStoreProduct)
     {
@@ -96,7 +97,7 @@ public class FsStoreProductScrmController extends BaseController
     }
 
 
-    @Log(title = "商品导入", businessType = BusinessType.IMPORT)
+    @Log(title = "商品管理", businessType = BusinessType.IMPORT,isStoreLog = true,logParam = {"商品","商品导入"})
     @PreAuthorize("@ss.hasPermi('store:storeProduct:import')")
     @PostMapping("/importData")
     public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
@@ -128,7 +129,8 @@ public class FsStoreProductScrmController extends BaseController
     }
 
     @PreAuthorize("@ss.hasPermi('store:storeProduct:add')")
-    @Log(title = "商品", businessType = BusinessType.INSERT)
+    @Log(title = "商品管理", businessType = BusinessType.INSERT, businessTypeExpression = "#p0.getProductId()>0? T(com.fs.common.enums.BusinessType).UPDATE: T(com.fs.common.enums.BusinessType).INSERT"
+            , isStoreLog = true, logParamExpression = "#p0.getProductId()>0? new String[]{'商品','修改商品'}: new String[]{'商品','新增商品'}")
     @PostMapping(value = "/addOrEdit")
     public R addOrEdit(@RequestBody FsStoreProductAddEditParam fsStoreProduct)
     {
@@ -149,7 +151,8 @@ public class FsStoreProductScrmController extends BaseController
      * 删除商品
      */
     @PreAuthorize("@ss.hasPermi('store:storeProduct:remove')")
-    @Log(title = "商品", businessType = BusinessType.DELETE)
+    @Log(title = "商品管理", businessType = BusinessType.DELETE,isStoreLog = true,
+            logParamExpression ="#p0.length>1?new String[]{'商品','批量删除商品信息'}: new String[]{'商品','删除商品信息'}" )
 	@DeleteMapping("/{productIds}")
     public AjaxResult remove(@PathVariable Long[] productIds)
     {

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreProductTemplateScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductTemplateScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 134 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreScrmController.java

@@ -0,0 +1,134 @@
+package com.fs.hisStore.controller;
+
+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.utils.ParseUtils;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.hisStore.domain.FsStoreScrm;
+import com.fs.his.param.FsStoreAuditParam;
+import com.fs.hisStore.service.IFsStoreScrmService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 店铺管理Controller
+ *
+ * @author fs
+ * @date 2023-06-15
+ */
+@RestController
+@RequestMapping("/store/his/store")
+public class FsStoreScrmController extends BaseController
+{
+    @Autowired
+    private IFsStoreScrmService fsStoreService;
+
+    /**
+     * 查询店铺管理列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:store:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsStoreScrm fsStore)
+    {
+        startPage();
+        List<FsStoreScrm> list = fsStoreService.selectFsStoreList(fsStore);
+        for (FsStoreScrm store : list) {
+            store.setPhone(ParseUtils.parsePhone(store.getPhone()));
+        }
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出店铺管理列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:store:export')")
+    @Log(title = "店铺管理", businessType = BusinessType.EXPORT,logParam = {"店铺","导出店铺信息"},isStoreLog = true)
+    @GetMapping("/export")
+    public AjaxResult export(FsStoreScrm fsStore)
+    {
+        List<FsStoreScrm> list = fsStoreService.selectFsStoreList(fsStore);
+        for (FsStoreScrm store : list) {
+            store.setPhone(ParseUtils.parsePhone(store.getPhone()));
+        }
+        ExcelUtil<FsStoreScrm> util = new ExcelUtil<FsStoreScrm>(FsStoreScrm.class);
+        return util.exportExcel(list, "店铺管理数据");
+    }
+
+    /**
+     * 获取店铺管理详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:store:query')")
+    @GetMapping(value = "/{storeId}")
+    public AjaxResult getInfo(@PathVariable("storeId") Long storeId)
+    {
+        FsStoreScrm fsStore = fsStoreService.selectFsStoreByStoreId(storeId);
+        fsStore.setPhone(ParseUtils.parsePhone(fsStore.getPhone()));
+        return AjaxResult.success(fsStore);
+    }
+
+    /**
+     * 新增店铺管理
+     */
+    @PreAuthorize("@ss.hasPermi('his:store:add')")
+    @Log(title = "店铺管理", businessType = BusinessType.INSERT,logParam = {"店铺","新增店铺信息"},isStoreLog = true)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsStoreScrm fsStore)
+    {
+        return toAjax(fsStoreService.insertFsStore(fsStore));
+    }
+
+    /**
+     * 修改店铺管理
+     */
+    @PreAuthorize("@ss.hasPermi('his:store:edit')")
+    @Log(title = "店铺管理", businessType = BusinessType.UPDATE,logParam = {"店铺","修改店铺信息"},isStoreLog = true)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsStoreScrm fsStore)
+    {
+
+        if (fsStore.getPhone()!=null&&fsStore.getPhone().contains("*")){
+            fsStore.setPhone(null);
+        }
+        return toAjax(fsStoreService.updateFsStore(fsStore));
+    }
+
+    /**
+     * 删除店铺管理
+     */
+    @PreAuthorize("@ss.hasPermi('his:store:remove')")
+    @Log(title = "店铺管理", businessType = BusinessType.DELETE,logParam = {"店铺","删除店铺信息"},isStoreLog = true)
+	@DeleteMapping("/{storeIds}")
+    public AjaxResult remove(@PathVariable Long[] storeIds)
+    {
+        return toAjax(fsStoreService.deleteFsStoreByStoreIds(storeIds));
+    }
+
+    /**
+     * 店铺审核
+     */
+    @PreAuthorize("@ss.hasPermi('his:store:audit')")
+    @Log(title = "店铺审核", businessType = BusinessType.UPDATE,logParam = {"店铺","店铺审核"},isStoreLog = true)
+    @PutMapping("/audit")
+    public AjaxResult audit(@RequestBody FsStoreAuditParam fsStore)
+    {
+        return toAjax(fsStoreService.updateFsStoreAudit(fsStore));
+    }
+
+    /**
+     * 重置店铺密码
+     * */
+    @PreAuthorize("@ss.hasPermi('his:store:refresh')")
+    @Log(title = "店铺管理", businessType = BusinessType.UPDATE,logParam = {"店铺","重置店铺密码"},isStoreLog = true)
+    @PutMapping("/refresh/{storeId}")
+    public AjaxResult refresh(Long storeId)
+    {
+        return toAjax(fsStoreService.refreshFsStore(storeId));
+    }
+
+}

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreShopScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreShopScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreShopStaffScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreShopStaffScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreStatisticsScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreStatisticsScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.core.controller.BaseController;

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/FsStoreVisitScrmController.java → fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreVisitScrmController.java

@@ -1,4 +1,4 @@
-package com.fs.hisStore;
+package com.fs.hisStore.controller;
 
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;

+ 50 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/SysOperlogScrmController.java

@@ -0,0 +1,50 @@
+package com.fs.hisStore.controller;
+
+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.utils.poi.ExcelUtil;
+import com.fs.hisStore.service.ISysOperLogScrmService;
+import com.fs.hisStore.domain.SysOperLogScrm;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 操作日志记录
+ *
+
+ */
+@RestController
+@RequestMapping("/store/operlogScrm")
+public class SysOperlogScrmController extends BaseController
+{
+    private final ISysOperLogScrmService operLogService;
+
+    public SysOperlogScrmController(ISysOperLogScrmService operLogService) {
+        this.operLogService = operLogService;
+    }
+
+    @PreAuthorize("@ss.hasPermi('his:storeLog:export')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysOperLogScrm operLog)
+    {
+        startPage();
+        List<SysOperLogScrm> list = operLogService.selectOperLogList(operLog);
+        return getDataTable(list);
+    }
+
+    @Log(title = "操作日志", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('his:storeLog:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysOperLogScrm operLog)
+    {
+        List<SysOperLogScrm> list = operLogService.selectOperLogList(operLog);
+        ExcelUtil<SysOperLogScrm> util = new ExcelUtil<>(SysOperLogScrm.class);
+        return util.exportExcel(list, "操作日志");
+    }
+
+}

+ 1 - 1
fs-service/src/main/java/com/fs/task/CrmTask.java → fs-admin/src/main/java/com/fs/hisStore/task/CrmTask.java

@@ -1,4 +1,4 @@
-package com.fs.task;
+package com.fs.hisStore.task;
 
 import com.fs.crm.service.ICrmCustomerService;
 import lombok.extern.slf4j.Slf4j;

+ 1 - 1
fs-service/src/main/java/com/fs/task/ErpTask.java → fs-admin/src/main/java/com/fs/hisStore/task/ErpTask.java

@@ -1,4 +1,4 @@
-package com.fs.task;
+package com.fs.hisStore.task;
 
 import com.fs.erp.domain.ErpOrder;
 import com.fs.erp.domain.FsErpFinishPush;

+ 92 - 5
fs-service/src/main/java/com/fs/task/StoreTask.java → fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java

@@ -1,4 +1,4 @@
-package com.fs.task;
+package com.fs.hisStore.task;
 
 
 import cn.hutool.core.util.StrUtil;
@@ -21,8 +21,8 @@ import com.fs.his.dto.ExpressInfoDTO;
 import com.fs.his.service.IFsExpressService;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.utils.ConfigUtil;
-import com.fs.hisStore.config.FsErpConfig;
 import com.fs.hisStore.domain.*;
+import com.fs.hisStore.dto.DateComparisonConfigDTO;
 import com.fs.hisStore.enums.ShipperCodeEnum;
 import com.fs.hisStore.mapper.FsStoreOrderItemScrmMapper;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
@@ -35,16 +35,20 @@ import com.fs.pay.service.IPayService;
 import com.fs.store.config.StoreConfig;
 import com.fs.system.service.ISysConfigService;
 import com.fs.ybPay.domain.OrderResult;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
 import java.text.ParseException;
+import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import static com.fs.hisStore.constants.StoreConstants.DELIVERY;
 
@@ -53,8 +57,9 @@ import static com.fs.hisStore.constants.StoreConstants.DELIVERY;
  *
  * @author fs
  */
+@Slf4j
 @Component("mallStoreTask")
-public class StoreTask
+public class MallStoreTask
 {
     @Autowired
     private RedisTemplate redisTemplate;
@@ -68,8 +73,6 @@ public class StoreTask
     private IFsStoreAfterSalesScrmService afterSalesService;
     @Autowired
     private IFsUserService userService;
-
-
     @Autowired
     private IPayService ybPayService;
     @Autowired
@@ -128,6 +131,10 @@ public class StoreTask
     @Qualifier("JSTErpOrderServiceImpl")
     private IErpOrderService jSTOrderService;
 
+    @Autowired
+    @Qualifier("k9OrderScrmServiceImpl")
+    private IErpOrderService k9OrderService;
+
     @Autowired
     private ConfigUtil configUtil;
 
@@ -473,6 +480,8 @@ public class StoreTask
                     erpOrderService = dfOrderService;
                 } else if (erpType == 5) {
                     erpOrderService = jSTOrderService;
+                }else if (erpType == 6) {
+                    erpOrderService = k9OrderService;
                 }
             }
         }
@@ -504,4 +513,82 @@ public class StoreTask
         fsUserOnlineStateService.insertUserNotOnline();
     }*/
 
+    /**
+     * 提醒证件到期任务
+     * */
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+    public void remindCertValidation() {
+        log.info("提醒店铺证件到期任务执行... 当前时间: {}", LocalTime.now());
+
+        // 从配置表获取需要比较的表和字段
+        List<DateComparisonConfigDTO> tablesToCheck = jdbcTemplate.query(
+                "SELECT table_name, date_column,in_advance,user_column,phone_column,remind_words,platform,cert_type" +
+                        " FROM date_comparison_config",(rs, rowNum)->{
+                    return DateComparisonConfigDTO.builder()
+                            .tableName(rs.getString("table_name"))//表名
+                            .certType(rs.getString("cert_type"))//证件类型
+                            .dateColumn(rs.getString("date_column"))//日期字段
+                            .userColumn(rs.getString("user_column"))//用户字段
+                            .remindWords(rs.getString("remindWords"))//提醒内容
+                            .phoneColumn(rs.getString("phone_column"))//提醒手机
+                            .inAdvance(rs.getInt("inAdvance"))//提前天数
+                            .platform(rs.getString("platform")).build();//平台
+                });
+
+        tablesToCheck.forEach(dto -> {
+            //获取证件失效日期字段小于当前时间加提前天数的用户和电话号码
+            String sql = String.format("SELECT %s , %s " +
+                            "FROM %s " +
+                            "WHERE %s >= DATE_SUB(CURDATE(), INTERVAL %d DAY)",
+                            dto.getUserColumn(),
+                            dto.getPhoneColumn(),
+                            dto.getTableName(),
+                            dto.getDateColumn(),
+                            dto.getInAdvance()
+                            );
+            List<Map<String, Object>> users = jdbcTemplate.queryForList(sql);
+            users.forEach(user -> {
+                String userName = (String) user.get(dto.getUserColumn());
+                String phone = (String) user.get(dto.getPhoneColumn());
+                String remindWords = String.format("【%s平台提示】尊敬的%s用户,店铺%s证件即将到期,请及时处理!",
+                        dto.getPlatform(),
+                        userName,
+                        dto.getCertType());
+                // 使用phone发送remindWords短信
+                // TODO 发送通知
+            });
+        });
+
+    }
+
+    /**
+     * 禁用店铺
+     * */
+    public void disable() {
+        log.info("禁用店铺任务执行... 当前时间: {}", LocalTime.now());
+        // 从配置表获取需要禁用的表和字段
+        List<DateComparisonConfigDTO> toDisable = jdbcTemplate.query(
+                "SELECT table_name, date_column,invalid_expression,status_column" +
+                        " FROM date_comparison_config " +
+                        " WHERE is_do_invalid = '1'",(rs, rowNum)-> DateComparisonConfigDTO.builder()
+                                .tableName(rs.getString("table_name"))//表名
+                                .dateColumn(rs.getString("date_column"))//日期字段
+                                .invalidExpression(rs.getString("invalid_expression"))//失效表达式
+                                .statusColumn(rs.getString("status_column"))//状态字段
+                                .build());
+
+        toDisable.forEach(dto -> {
+            //更新证件失效日期字段小于当前时间的数据
+            String sql = String.format("UPDATE %s " +
+                    "SET %s = %s " +
+                    "WHERE %s < CURDATE()",
+                    dto.getTableName(),
+                    dto.getStatusColumn(),
+                    dto.getInvalidExpression(),
+                    dto.getDateColumn());
+            jdbcTemplate.update(sql);
+        });
+    }
+
 }

+ 1 - 1
fs-service/src/main/java/com/fs/task/stats/FsStatsMemberDailyTask.java → fs-admin/src/main/java/com/fs/hisStore/task/stats/FsStatsMemberDailyTask.java

@@ -1,4 +1,4 @@
-package com.fs.task.stats;
+package com.fs.hisStore.task.stats;
 
 import com.fs.statis.service.IFsStatsMemberDailyService;
 import lombok.extern.slf4j.Slf4j;

+ 20 - 4
fs-admin/src/main/java/com/fs/web/controller/system/SysLoginController.java

@@ -4,7 +4,9 @@ import java.util.List;
 import java.util.Set;
 
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.entity.SysRole;
 import com.fs.common.utils.PatternUtils;
+import com.fs.system.service.ISysRoleService;
 import lombok.Synchronized;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
@@ -24,7 +26,7 @@ import com.fs.system.service.ISysMenuService;
 
 /**
  * 登录验证
- * 
+ *
 
  */
 @RestController
@@ -40,9 +42,12 @@ public class SysLoginController
     @Autowired
     private SysPermissionService permissionService;
 
+    @Autowired
+    private ISysRoleService roleService;
+
     /**
      * 登录方法
-     * 
+     *
      * @param loginBody 登录信息
      * @return 结果
      */
@@ -62,7 +67,7 @@ public class SysLoginController
 
     /**
      * 获取用户信息
-     * 
+     *
      * @return 用户信息
      */
     @GetMapping("getInfo")
@@ -75,14 +80,25 @@ public class SysLoginController
         Set<String> permissions = permissionService.getMenuPermission(user);
         AjaxResult ajax = AjaxResult.success();
         ajax.put("user", user);
+        Integer isAdmin = 0;
+        if (permissions.contains("*:*:*")){
+            isAdmin = 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;
+            }
+        }
         ajax.put("roles", roles);
         ajax.put("permissions", permissions);
+        ajax.put("isAdmin", isAdmin);
         return ajax;
     }
 
     /**
      * 获取路由信息
-     * 
+     *
      * @return 路由信息
      */
     @GetMapping("getRouters")

+ 17 - 2
fs-common/src/main/java/com/fs/common/annotation/Log.java

@@ -7,10 +7,11 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.enums.OperatorType;
+import com.fs.common.utils.StringUtils;
 
 /**
  * 自定义操作日志记录注解
- * 
+ *
 
  *
  */
@@ -20,7 +21,7 @@ import com.fs.common.enums.OperatorType;
 public @interface Log
 {
     /**
-     * 模块 
+     * 模块
      */
     public String title() default "";
 
@@ -38,4 +39,18 @@ public @interface Log
      * 是否保存请求的参数
      */
     public boolean isSaveRequestData() default true;
+
+    /**
+     * 是否商城日志
+     */
+    public boolean isStoreLog() default false;
+
+    /**
+     * 商城日志传参
+     * */
+    public String[] logParam() default {};
+
+    String businessTypeExpression() default "";
+
+    String logParamExpression() default "";
 }

+ 3 - 0
fs-common/src/main/java/com/fs/common/core/redis/RedisCache.java

@@ -233,4 +233,7 @@ public class RedisCache
     }
 
 
+    public Boolean setIfAbsent(String key, String value, long timeout, TimeUnit unit) {
+        return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, unit);
+    }
 }

+ 1 - 1
fs-company-app/src/main/java/com/fs/app/controller/UserController.java

@@ -216,7 +216,7 @@ public class UserController extends AppBaseController {
             result.put("perms", perms);
             return R.ok("登录成功").put("data", result);
         } catch (Exception e) {
-            return R.error("登录异常");
+            return R.error("登录异常:"+e.getMessage());
         }
     }
 

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

@@ -37,6 +37,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -427,5 +428,10 @@ public class CompanyUserController extends BaseController
             return AjaxResult.error("操作失败");
         }
     }
-
+    @PostMapping("/common/uploadOSS")
+    public R uploadOSS(@RequestParam("file") MultipartFile file,
+                       @RequestParam("userId") String userId) throws Exception {
+        String url = companyUserService.uploadQrCode(file, userId);
+        return R.ok().put("url", url);
+    }
 }

+ 2 - 1
fs-company/src/main/java/com/fs/company/controller/course/FsUserCoursePeriodController.java

@@ -220,10 +220,11 @@ public class FsUserCoursePeriodController extends BaseController {
         FsUserCoursePeriod period = fsUserCoursePeriodService.selectFsUserCoursePeriodById(param.getPeriodId());
         param.setMaxDate(LocalDate.now().plusDays(period.getMaxViewNum()));
         List<FsPeriodCountVO> list = fsUserCoursePeriodDaysService.periodCourseCount(param);
+        long count = fsUserCoursePeriodDaysService.periodCourseByCount(param);
         PageInfo<FsPeriodCountVO> pageInfo = new PageInfo<>(list);
         Map<String, Object> result = new HashMap<>();
         result.put("rows", pageInfo.getList());
-        result.put("total", pageInfo.getTotal());
+        result.put("total", count);
         return R.ok(result);
     }
 

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

@@ -539,10 +539,19 @@ public class FsStoreOrderController extends BaseController
     @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;
     private IErpOrderService getErpService() {
         FsSysConfig sysConfig = configUtil.getSysConfig();
         Integer erpOpen = sysConfig.getErpOpen();
@@ -557,8 +566,16 @@ public class FsStoreOrderController extends BaseController
                 } else if (erpType == 2){
                     //旺店通
                     erpOrderService =  wdtOrderService;
+                } else if (erpType == 3){
+                    //
+                    erpOrderService =  hzOMSErpOrderService;
+                } else if (erpType == 4){
+                    //代服
+                    erpOrderService =  dfOrderService;
                 }else if(erpType == 5){
-                    erpOrderService = jSTOrderService;
+                    erpOrderService=jSTOrderService;
+                }else if(erpType == 6){
+                    erpOrderService=k9OrderService;
                 }
                 return erpOrderService;
 

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

@@ -1,9 +1,11 @@
 package com.fs.company.controller.store;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 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.domain.model.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
@@ -73,7 +75,13 @@ public class FsUserAddressController extends BaseController
         ExcelUtil<FsUserAddress> util = new ExcelUtil<FsUserAddress>(FsUserAddress.class);
         return util.exportExcel(list, "用户地址数据");
     }
-
+    @GetMapping("/getAddressList")
+    public R getAddressList(FsUserAddress fsUserAddress)
+    {
+        fsUserAddress.setIsDel(0);
+        List<FsUserAddress> list = fsUserAddressService.selectFsUserAddressList(fsUserAddress);
+        return R.ok().put("data", list);
+    }
     /**
      * 获取用户地址详细信息
      */
@@ -100,7 +108,7 @@ public class FsUserAddressController extends BaseController
     @PostMapping
     public AjaxResult add(@RequestBody FsUserAddress fsUserAddress)
     {
-        if(fsUserAddress.getIsDefault()==1){
+        if(ObjectUtil.isNotEmpty(fsUserAddress.getIsDefault())&&fsUserAddress.getIsDefault()==1){
             //处理默认地址
             fsUserAddressService.clearIsDefalut(fsUserAddress.getUserId());
         }

+ 7 - 0
fs-company/src/main/java/com/fs/company/controller/store/FsUserController.java

@@ -77,6 +77,13 @@ public class FsUserController extends BaseController
         }
         return getDataTable(list);
     }
+    @GetMapping("/getUserList")
+    public R getUserList( FsUser fsUser)
+    {
+        fsUser.setIsDel(0);
+        List<FsUser> list=fsUserService.selectFsUserList(fsUser);
+        return R.ok().put("data", list);
+    }
 
     @PreAuthorize("@ss.hasPermi('his:user:list')")
     @GetMapping("/userList")

+ 3 - 0
fs-company/src/main/java/com/fs/company/controller/store/FsUserCouponController.java

@@ -105,6 +105,9 @@ public class FsUserCouponController extends BaseController
     @PostMapping("/sendCoupon")
     public AjaxResult sendCoupon(@RequestBody FsUserCouponSendParam fsUserCoupon)
     {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        fsUserCoupon.setCompanyId(loginUser.getCompany().getCompanyId());
+        fsUserCoupon.setCompanyUserId(loginUser.getUser().getUserId());
         return toAjax(fsUserCouponService.sendFsUserCoupon(fsUserCoupon));
     }
 

+ 1 - 0
fs-company/src/main/java/com/fs/framework/config/SecurityConfig.java

@@ -119,6 +119,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/msg").anonymous()
                 .antMatchers("/common/getId**").anonymous()
                 .antMatchers("/common/uploadOSS**").anonymous()
+                .antMatchers("/company/user/common/uploadOSS").anonymous()
                 .antMatchers("/pay/wxPay/payNotify**").anonymous()
                 .antMatchers("/common/uploadWang**").anonymous()
                 .antMatchers("/common/download**").anonymous()

+ 0 - 59
fs-company/src/main/java/com/fs/hisStore/controller/FsCityScrmController.java

@@ -1,59 +0,0 @@
-package com.fs.hisStore.controller;
-
-import com.fs.common.core.controller.BaseController;
-import com.fs.common.core.domain.R;
-import com.fs.hisStore.domain.FsCityScrm;
-import com.fs.hisStore.service.IFsCityScrmService;
-import com.fs.store.utils.CityTreeUtil;
-import com.fs.store.vo.CityVO;
-import com.google.common.collect.Lists;
-import io.swagger.annotations.ApiOperation;
-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.RestController;
-import springfox.documentation.annotations.Cacheable;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
-
-/**
- * 城市Controller
- *
- * @author fs
- * @date 2022-03-15
- */
-@RestController
-@RequestMapping("/store/store/city")
-public class FsCityScrmController extends BaseController
-{
-    @Autowired
-    private IFsCityScrmService fsCityService;
-
-//
-//    @GetMapping("/getAllList")
-//    @Cacheable("citys")
-//    public R getAllList(FsCityScrm fsCity)
-//    {
-//        List<FsCityScrm> list = fsCityService.selectFsCityList(fsCity);
-//        return R.ok().put("data",list);
-//    }
-
-
-    @ApiOperation("获取城市数据")
-    @GetMapping("/getCitys")
-    @Cacheable("citys")
-    public R getCitys(HttpServletRequest request){
-        List<FsCityScrm> list=fsCityService.selectFsCitys();
-        List<CityVO> cityVOS = Lists.newArrayList();
-        for (FsCityScrm city : list){
-            CityVO cityVO = new CityVO();
-            cityVO.setValue(Long.parseLong(city.getCityId()));
-            cityVO.setLabel(city.getCityName());
-            cityVO.setPid(Long.parseLong(city.getParentId()));
-            cityVOS.add(cityVO);
-        }
-        return R.ok().put("data", CityTreeUtil.list2TreeConverter(cityVOS, 0));
-
-    }
-}

+ 69 - 9
fs-framework/src/main/java/com/fs/framework/aspectj/LogAspect.java

@@ -6,15 +6,22 @@ import java.util.Iterator;
 import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.bean.BeanUtils;
+import com.fs.framework.web.domain.server.Sys;
+import com.fs.hisStore.domain.SysOperLogScrm;
 import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.Signature;
-import org.aspectj.lang.annotation.AfterReturning;
-import org.aspectj.lang.annotation.AfterThrowing;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.annotation.*;
 import org.aspectj.lang.reflect.MethodSignature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.expression.EvaluationContext;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
 import org.springframework.stereotype.Component;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.multipart.MultipartFile;
@@ -34,7 +41,7 @@ import com.fs.system.domain.SysOperLog;
 
 /**
  * 操作日志记录处理
- * 
+ *
 
  */
 @Aspect
@@ -62,7 +69,7 @@ public class LogAspect
 
     /**
      * 拦截异常操作
-     * 
+     *
      * @param joinPoint 切点
      * @param e 异常
      */
@@ -116,6 +123,12 @@ public class LogAspect
             getControllerMethodDescription(joinPoint, controllerLog, operLog);
             // 保存数据库
             AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
+            if(controllerLog.isStoreLog()){
+                SysOperLogScrm operLogScrm = new SysOperLogScrm();
+                BeanUtils.copyProperties(operLog, operLogScrm);
+                resolveParam((ProceedingJoinPoint)joinPoint,operLogScrm);
+                AsyncManager.me().execute(AsyncFactory.recordOperScrm(operLogScrm));
+            }
         }
         catch (Exception exp)
         {
@@ -123,12 +136,14 @@ public class LogAspect
             log.error("==前置通知异常==");
             log.error("异常信息:{}", exp.getMessage());
             exp.printStackTrace();
+        } catch (Throwable ex) {
+            throw new RuntimeException(ex);
         }
     }
 
     /**
      * 获取注解中对方法的描述信息 用于Controller层注解
-     * 
+     *
      * @param log 日志
      * @param operLog 操作日志
      * @throws Exception
@@ -151,7 +166,7 @@ public class LogAspect
 
     /**
      * 获取请求的参数,放到log中
-     * 
+     *
      * @param operLog 操作日志
      * @throws Exception 异常
      */
@@ -208,7 +223,7 @@ public class LogAspect
 
     /**
      * 判断是否需要过滤的对象。
-     * 
+     *
      * @param o 对象信息。
      * @return 如果是需要过滤的对象,则返回true;否则返回false。
      */
@@ -240,4 +255,49 @@ public class LogAspect
         return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
                 || o instanceof BindingResult;
     }
+
+    private final ExpressionParser parser = new SpelExpressionParser();
+
+    public void resolveParam(ProceedingJoinPoint joinPoint, SysOperLogScrm operLog) throws Throwable {
+        // 1. 获取注解实例
+        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
+        Log annotation = method.getAnnotation(Log.class);
+
+        // 2. 准备简单上下文
+        StandardEvaluationContext context = new StandardEvaluationContext();
+        Object[] args = joinPoint.getArgs();
+        String[] paramNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames();
+
+        // 设置参数名称和值到上下文
+        for (int i = 0; i < args.length; i++) {
+            context.setVariable("p" + i, args[i]); // 支持 #p0,#p1...
+            if (paramNames != null && i < paramNames.length) {
+                context.setVariable(paramNames[i], args[i]); // 支持参数名引用
+            }
+        }
+
+        // 3. 处理动态 businessType
+        BusinessType businessType = annotation.businessType();
+        if (!annotation.businessTypeExpression().isEmpty()) {
+            try {
+                businessType = parser.parseExpression(annotation.businessTypeExpression())
+                        .getValue(context, BusinessType.class);
+            } catch (Exception e) {
+                log.warn("解析 businessType 表达式失败,使用默认值: {}", e.getMessage());
+            }
+        }
+        // 4. 处理动态 logParam
+        String[] logParam = annotation.logParam();
+        if (!annotation.logParamExpression().isEmpty()) {
+            try {
+                logParam = parser.parseExpression(annotation.logParamExpression())
+                        .getValue(context, String[].class);
+            }catch (Exception e){
+                log.warn("解析 logParam 表达式失败,使用默认值: {}", e.getMessage());
+            }
+        }
+        operLog.setBusinessType(businessType.ordinal());
+        operLog.setMainType(logParam[0]);
+        operLog.setDes(logParam[1]);
+    }
 }

+ 26 - 3
fs-framework/src/main/java/com/fs/framework/manager/factory/AsyncFactory.java

@@ -1,6 +1,9 @@
 package com.fs.framework.manager.factory;
 
 import java.util.TimerTask;
+
+import com.fs.hisStore.domain.SysOperLogScrm;
+import com.fs.hisStore.service.ISysOperLogScrmService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import com.fs.common.constant.Constants;
@@ -18,7 +21,7 @@ import eu.bitwalker.useragentutils.UserAgent;
 
 /**
  * 异步工厂(产生任务用)
- * 
+ *
 
  */
 public class AsyncFactory
@@ -27,7 +30,7 @@ public class AsyncFactory
 
     /**
      * 记录登录信息
-     * 
+     *
      * @param username 用户名
      * @param status 状态
      * @param message 消息
@@ -82,7 +85,7 @@ public class AsyncFactory
 
     /**
      * 操作日志记录
-     * 
+     *
      * @param operLog 操作日志信息
      * @return 任务task
      */
@@ -99,4 +102,24 @@ public class AsyncFactory
             }
         };
     }
+
+    /**
+     * 操作日志记录
+     *
+     * @param operLog 操作日志信息
+     * @return 任务task
+     */
+    public static TimerTask recordOperScrm(final SysOperLogScrm operLog)
+    {
+        return new TimerTask()
+        {
+            @Override
+            public void run()
+            {
+                // 远程查询操作地点
+                operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
+                SpringUtils.getBean(ISysOperLogScrmService.class).insertOperlog(operLog);
+            }
+        };
+    }
 }

+ 6 - 5
fs-redis/src/main/java/com/fs/framework/config/MyBatisConfig.java

@@ -1,5 +1,6 @@
 package com.fs.framework.config;
 
+import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
 import com.fs.common.utils.StringUtils;
 import org.apache.ibatis.io.VFS;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -117,16 +118,16 @@ public class MyBatisConfig
     @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");
+        String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage");
+        String mapperLocations = env.getProperty("mybatis-plus.mapperLocations");
+        String configLocation = env.getProperty("mybatis-plus.configLocation");
         typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
         VFS.addImplClass(SpringBootVFS.class);
 
-        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+        final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
         sessionFactory.setDataSource(dataSource);
         sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
-        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
+        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
         sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
         return sessionFactory.getObject();
     }

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

@@ -310,4 +310,6 @@ public interface CompanyUserMapper
     List<QwIpadTotalVo> selectCompanyByIpadStatusCount();
 
     int insertQwIpadTotal(List<QwIpadTotalVo> qwIpadTotalVos);
+
+    void uploadQrCode(@Param("userId") String userId, @Param("url") String url);
 }

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

@@ -124,9 +124,15 @@ public interface ICompanyService
 
     void subtractCompanyMoney(FsStoreOrder order);
 
+    @Transactional
+    void subtractCompanyMoneyScrm(FsStoreOrderScrm order);
+
     void inquirySubtractCompanyMoney(FsInquiryOrder order);
     void refundCompanyMoney(FsStoreOrder order);
 
+    @Transactional
+    void refundCompanyMoneyScrm(FsStoreOrderScrm order);
+
     Company selectCompanyByIdForUpdate(Long companyId);
 
     public void subtractCompanyMoney(BigDecimal money, Long companyId);

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

@@ -12,7 +12,9 @@ import com.fs.qw.vo.CompanyUserQwVO;
 import com.fs.qw.vo.QwOptionsVO;
 import com.fs.qw.vo.QwUserVO;
 import com.fs.wxUser.domain.CompanyWxUser;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -223,4 +225,5 @@ public interface ICompanyUserService {
 
     int insertQwIpadTotal(List<QwIpadTotalVo> qwIpadTotalVos);
 
+    String uploadQrCode(MultipartFile file,String userId) throws IOException;
 }

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

@@ -681,6 +681,36 @@ public class CompanyServiceImpl implements ICompanyService
         }
     }
 
+    @Override
+    @Transactional
+    public void subtractCompanyMoneyScrm(FsStoreOrderScrm order) {
+
+        if(order.getCompanyId()!=null&&order.getCompanyId()>0){
+            Company company=companyMapper.selectCompanyByIdForUpdate(order.getCompanyId());
+            if(company!=null){
+                SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.store");
+                StoreConfig fsPayConfig = new Gson().fromJson(sysConfig.getConfigValue(), StoreConfig.class);
+                Integer DeductMoneyRate = fsPayConfig.getDeductMoneyRate();
+                BigDecimal money = BigDecimal.ZERO;
+                if (DeductMoneyRate != null && DeductMoneyRate > 0) {
+                    money = order.getPrescribePrice().multiply(new BigDecimal(DeductMoneyRate).multiply(new BigDecimal("0.01")));
+                }
+                logger.info("扣除成本:"+order.getOrderCode()+":"+money);
+                company.setMoney(company.getMoney().subtract(money));
+                companyMapper.updateCompany(company);
+                CompanyMoneyLogs log=new CompanyMoneyLogs();
+                log.setCompanyId(company.getCompanyId());
+                log.setRemark("发货扣除成本");
+                log.setMoney(money.multiply(new BigDecimal(-1)));
+                log.setLogsType(5);
+                log.setBalance(company.getMoney());
+                log.setCreateTime(new Date());
+                log.setBusinessId(order.getId().toString());
+                moneyLogsMapper.insertCompanyMoneyLogs(log);
+            }
+        }
+    }
+
     @Override
     @Transactional
     public void inquirySubtractCompanyMoney(FsInquiryOrder order) {
@@ -1207,6 +1237,52 @@ public class CompanyServiceImpl implements ICompanyService
         }
     }
 
+    @Override
+    @Transactional
+    public void refundCompanyMoneyScrm(FsStoreOrderScrm order) {
+        if(order.getCompanyId()!=null&&order.getCompanyId()>0){
+            Company company=companyMapper.selectCompanyByIdForUpdate(order.getCompanyId());
+            if(company!=null){
+                List<CompanyMoneyLogs> companyMoneyLogs = moneyLogsMapper.selectCompanyMoneyByOrderId(order.getId());
+                for (CompanyMoneyLogs logs : companyMoneyLogs) {
+                    if (logs.getLogsType()==3){
+                        if (order.getTuiMoneyStatus()!=null&&order.getTuiMoneyStatus()==0){
+                            continue;
+                        }
+                        BigDecimal money = logs.getMoney().multiply(new BigDecimal(-1));
+                        logger.info("退款佣金扣除:"+company.getCompanyId()+":"+money);
+                        company.setMoney(company.getMoney().subtract(logs.getMoney()));
+                        companyMapper.updateCompany(company);
+                        CompanyMoneyLogs log=new CompanyMoneyLogs();
+                        log.setCompanyId(company.getCompanyId());
+                        log.setRemark("退款佣金扣除");
+                        log.setMoney(money);
+                        log.setLogsType(4);
+                        log.setBalance(company.getMoney());
+                        log.setCreateTime(new Date());
+                        log.setBusinessId(order.getId().toString());
+                        moneyLogsMapper.insertCompanyMoneyLogs(log);
+                    }else if(logs.getLogsType()==5){
+                        BigDecimal money = logs.getMoney().multiply(new BigDecimal(-1));
+                        logger.info("退款成本返还:"+company.getCompanyId()+":"+money);
+                        company.setMoney(company.getMoney().add(money));
+                        companyMapper.updateCompany(company);
+                        CompanyMoneyLogs log=new CompanyMoneyLogs();
+                        log.setCompanyId(company.getCompanyId());
+                        log.setRemark("退款成本返还");
+                        log.setMoney(money);
+                        log.setLogsType(6);
+                        log.setBalance(company.getMoney());
+                        log.setCreateTime(new Date());
+                        log.setBusinessId(order.getId().toString());
+                        moneyLogsMapper.insertCompanyMoneyLogs(log);
+                    }
+                }
+
+            }
+        }
+    }
+
     @Override
     public Company selectCompanyByIdForUpdate(Long companyId) {
         return companyMapper.selectCompanyByIdForUpdate(companyId);

+ 24 - 1
fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -5,7 +5,9 @@ import com.alibaba.fastjson.JSON;
 import com.fs.common.annotation.DataScope;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.exception.CustomException;
 import com.fs.common.exception.ServiceException;
+import com.fs.common.exception.file.OssException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.*;
@@ -24,6 +26,8 @@ import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.vo.CompanyUserQwVO;
 import com.fs.qw.vo.QwOptionsVO;
 import com.fs.qw.vo.QwUserVO;
+import com.fs.system.oss.CloudStorageService;
+import com.fs.system.oss.OSSFactory;
 import com.fs.voice.utils.StringUtil;
 import com.fs.wxUser.domain.CompanyWxUser;
 import org.slf4j.Logger;
@@ -31,7 +35,9 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -636,5 +642,22 @@ public class CompanyUserServiceImpl implements ICompanyUserService
     public int insertQwIpadTotal(List<QwIpadTotalVo> qwIpadTotalVos) {
         return companyUserMapper.insertQwIpadTotal(qwIpadTotalVos);
     }
-
+    @Override
+    public String uploadQrCode(MultipartFile file, String userId) throws IOException {
+        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);
+
+        if(userId == null) {
+            throw new CustomException("上传二维码失败!userId 为空!");
+        }
+        companyUserMapper.uploadQrCode(userId,url);
+        return url;
+    }
 }

+ 62 - 15
fs-service/src/main/java/com/fs/core/config/WxMaConfiguration.java

@@ -8,7 +8,12 @@ import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
 import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;
 import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fs.common.utils.spring.SpringUtils;
 import com.fs.course.config.CourseMaConfig;
+import com.fs.course.domain.FsCoursePlaySourceConfig;
+import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.google.common.collect.Lists;
@@ -18,6 +23,7 @@ import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.error.WxRuntimeException;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.ComponentScan;
@@ -41,7 +47,7 @@ public class WxMaConfiguration {
     private static Map<String, WxMaService> maServices;
 
     @Autowired
-    public WxMaConfiguration(SysConfigMapper sysConfigMapper) {
+    public WxMaConfiguration(SysConfigMapper sysConfigMapper, FsCoursePlaySourceConfigMapper configMapper) {
         SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.config");
         String configValue = sysConfig.getConfigValue();
         //下单小程序加载
@@ -73,18 +79,69 @@ public class WxMaConfiguration {
                 }
             }
         }
+
+        //  加载点播配置表配置
+        Wrapper<FsCoursePlaySourceConfig> queryWrapper = Wrappers.<FsCoursePlaySourceConfig>lambdaQuery().eq(FsCoursePlaySourceConfig::getIsDel, 0);
+        for (FsCoursePlaySourceConfig playConfig : configMapper.selectList(queryWrapper)) {
+            boolean isExist = c.stream().anyMatch(item -> item.getAppid().equals(playConfig.getAppid()));
+            if (!isExist){
+                WxMaConfig.Config wxMaConfig = new WxMaConfig.Config();
+                BeanUtils.copyProperties(playConfig, wxMaConfig);
+                c.add(wxMaConfig);
+            }
+        }
+
         wx.setConfigs(c);
         this.properties = wx;
         log.info("配置加载完毕! 配置文件: {}",JSON.toJSONString(this.properties));
     }
 
     public static WxMaService getMaService(String appid) {
+        // 从缓存获取
         WxMaService wxService = maServices.get(appid);
-        if (wxService == null) {
-            throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
+        if (wxService != null) {
+            return wxService;
         }
 
-        return wxService;
+        // 缓存未命中,查询数据库
+        synchronized (WxMaConfiguration.class) {
+            // 双重检查
+            wxService = maServices.get(appid);
+            if (wxService != null) {
+                return wxService;
+            }
+
+            // 查询数据库
+            FsCoursePlaySourceConfigMapper configMapper = SpringUtils.getBean(FsCoursePlaySourceConfigMapper.class);
+            Wrapper<FsCoursePlaySourceConfig> queryWrapper = Wrappers.<FsCoursePlaySourceConfig>lambdaQuery()
+                    .eq(FsCoursePlaySourceConfig::getAppid, appid)
+                    .eq(FsCoursePlaySourceConfig::getIsDel, 0);
+            FsCoursePlaySourceConfig config = configMapper.selectOne(queryWrapper);
+            if (config == null) {
+                throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
+            }
+
+            WxMaService service = getWxMaService(config.getAppid(), config.getSecret(), config.getToken(), config.getAesKey(), config.getMsgDataFormat());
+            maServices.put(appid, service);
+            log.info("Initialized WxMaService for appid: {}", appid);
+            return service;
+        }
+    }
+
+    /**
+     * 初始化WxMaService
+     */
+    private static WxMaService getWxMaService(String appid, String secret, String token, String aesKey, String msgDataFormat) {
+        WxMaDefaultConfigImpl maConfig = new WxMaDefaultConfigImpl();
+        maConfig.setAppid(appid);
+        maConfig.setSecret(secret);
+        maConfig.setToken(token);
+        maConfig.setAesKey(aesKey);
+        maConfig.setMsgDataFormat(msgDataFormat);
+
+        WxMaService service = new WxMaServiceImpl();
+        service.setWxMaConfig(maConfig);
+        return service;
     }
 
     public static WxMaMessageRouter getRouter(String appid) {
@@ -100,17 +157,7 @@ public class WxMaConfiguration {
 
         maServices = configs.stream()
             .map(a -> {
-                WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
-//                WxMaDefaultConfigImpl config = new WxMaRedisConfigImpl(new JedisPool());
-                // 使用上面的配置时,需要同时引入jedis-lock的依赖,否则会报类无法找到的异常
-                config.setAppid(a.getAppid());
-                config.setSecret(a.getSecret());
-                config.setToken(a.getToken());
-                config.setAesKey(a.getAesKey());
-                config.setMsgDataFormat(a.getMsgDataFormat());
-
-                WxMaService service = new WxMaServiceImpl();
-                service.setWxMaConfig(config);
+                WxMaService service = getWxMaService(a.getAppid(), a.getSecret(), a.getToken(), a.getAesKey(), a.getMsgDataFormat());
                 routers.put(a.getAppid(), this.newRouter(service));
                 return service;
             }).collect(Collectors.toMap(s -> s.getWxMaConfig().getAppid(), a -> a));

+ 79 - 0
fs-service/src/main/java/com/fs/course/domain/FsCoursePlaySourceConfig.java

@@ -0,0 +1,79 @@
+package com.fs.course.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@TableName("fs_course_play_source_config")
+public class FsCoursePlaySourceConfig {
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 小程序/公众号名称
+     */
+    private String name;
+
+    /**
+     * 小程序/公众号appid
+     */
+    private String appid;
+
+    /**
+     * 小程序/公众号secret
+     */
+    private String secret;
+
+    /**
+     * 小程序/公众号icon图标
+     */
+    private String img;
+
+    /**
+     * 小程序/公众号原始id
+     */
+    private String originalId;
+
+    /**
+     * token
+     */
+    private String token;
+
+    /**
+     * aesKey
+     */
+    private String aesKey;
+
+    /**
+     * msgDataFormat
+     */
+    private String msgDataFormat;
+
+    /**
+     * 类型 1小程序 2公众号
+     */
+    private Integer type;
+
+    /**
+     * 是否删除 0正常 1删除
+     */
+    private Integer isDel;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 修改时间
+     */
+    private LocalDateTime updateTime;
+}

+ 17 - 0
fs-service/src/main/java/com/fs/course/mapper/FsCoursePlaySourceConfigMapper.java

@@ -0,0 +1,17 @@
+package com.fs.course.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.course.domain.FsCoursePlaySourceConfig;
+import com.fs.course.vo.FsCoursePlaySourceConfigVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface FsCoursePlaySourceConfigMapper extends BaseMapper<FsCoursePlaySourceConfig> {
+
+    /**
+     * 查询点播配置列表
+     */
+    List<FsCoursePlaySourceConfigVO> selectCoursePlaySourceConfigVOListByMap(@Param("params") Map<String, Object> params);
+}

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

@@ -301,7 +301,7 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
     @Select("select * from fs_course_watch_log " +
             "where video_id = #{videoId} " +
             "and company_user_id = #{companyUserId} " +
-            "and user_id = #{userId} and send_type = 1 ")
+            "and user_id = #{userId} and send_type = 1  order by create_time desc limit 1")
     FsCourseWatchLog getWatchCourseVideoByFsUser(@Param("userId") Long userId, @Param("videoId") Long videoId, @Param("companyUserId") Long companyUserId);
 
     FsCourseWatchLog getWatchLogByFsUser(@Param("videoId") Long videoId, @Param("fsUserId") Long fsUserId, @Param("companyUserId") Long companyUserId);

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

@@ -117,4 +117,5 @@ public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePer
             "</script>")
     int updateBatchDelFlag(@Param("ids") Long [] ids, @Param("delFlag") Integer delFlag);
 
+    Long selectFsUserCoursePeriodDaysCount(FsUserCoursePeriodDays fsUserCoursePeriodDays);
 }

+ 45 - 0
fs-service/src/main/java/com/fs/course/param/FsCoursePlaySourceConfigCreateParam.java

@@ -0,0 +1,45 @@
+package com.fs.course.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class FsCoursePlaySourceConfigCreateParam {
+
+    @NotBlank(message = "名称不能为空")
+    @ApiModelProperty("小程序/公众号名称")
+    private String name;
+
+    @NotBlank(message = "appid不能为空")
+    @ApiModelProperty("小程序/公众号appid")
+    private String appid;
+
+    @NotBlank(message = "secret不能为空")
+    @ApiModelProperty("小程序/公众号secret")
+    private String secret;
+
+    @ApiModelProperty("小程序/公众号icon图标")
+    private String img;
+
+    @ApiModelProperty("小程序/公众号原始id")
+    private String originalId;
+
+    @NotBlank(message = "token不能为空")
+    @ApiModelProperty("token")
+    private String token;
+
+    @NotBlank(message = "aesKey不能为空")
+    @ApiModelProperty("aesKey")
+    private String aesKey;
+
+    @NotBlank(message = "msgDataFormat不能为空")
+    @ApiModelProperty("msgDataFormat")
+    private String msgDataFormat;
+
+    @NotNull(message = "类型不能为空")
+    @ApiModelProperty("类型 1小程序 2公众号")
+    private Integer type;
+}

+ 42 - 0
fs-service/src/main/java/com/fs/course/param/FsCoursePlaySourceConfigEditParam.java

@@ -0,0 +1,42 @@
+package com.fs.course.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class FsCoursePlaySourceConfigEditParam {
+
+    @NotNull(message = "主键ID不能为空")
+    @ApiModelProperty("主键ID")
+    private Long id;
+
+    @ApiModelProperty("小程序/公众号名称")
+    private String name;
+
+    @ApiModelProperty("小程序/公众号appid")
+    private String appid;
+
+    @ApiModelProperty("小程序/公众号secret")
+    private String secret;
+
+    @ApiModelProperty("小程序/公众号icon图标")
+    private String img;
+
+    @ApiModelProperty("小程序/公众号原始id")
+    private String originalId;
+
+    @ApiModelProperty("token")
+    private String token;
+
+    @ApiModelProperty("aesKey")
+    private String aesKey;
+
+    @ApiModelProperty("msgDataFormat")
+    private String msgDataFormat;
+
+    @ApiModelProperty("类型 1小程序 2公众号")
+    private Integer type;
+}

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

@@ -33,7 +33,7 @@ public class FsUserCourseAddCompanyUserParam implements Serializable {
     @ApiModelProperty(value = "营期id")
     private Long periodId;
 
-//    @NotNull(message = "项目id不能为空")
+    @NotNull(message = "项目id不能为空")
     @ApiModelProperty(value = "项目ID")
     private Long projectId;
     private Integer isOpenCourse;

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

@@ -0,0 +1,16 @@
+package com.fs.course.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.course.domain.FsCoursePlaySourceConfig;
+import com.fs.course.vo.FsCoursePlaySourceConfigVO;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IFsCoursePlaySourceConfigService extends IService<FsCoursePlaySourceConfig> {
+
+    /**
+     * 查询点播配置列表
+     */
+    List<FsCoursePlaySourceConfigVO> selectCoursePlaySourceConfigVOListByMap(Map<String, Object> params);
+}

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

@@ -117,4 +117,6 @@ public interface IFsUserCoursePeriodDaysService extends IService<FsUserCoursePer
      * 更新营期课程状态
      */
     void changePeriodCourseStatus();
-}
+
+        long periodCourseByCount(PeriodCountParam param);
+    }

+ 27 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsCoursePlaySourceConfigServiceImpl.java

@@ -0,0 +1,27 @@
+package com.fs.course.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.course.domain.FsCoursePlaySourceConfig;
+import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
+import com.fs.course.service.IFsCoursePlaySourceConfigService;
+import com.fs.course.vo.FsCoursePlaySourceConfigVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class FsCoursePlaySourceConfigServiceImpl extends ServiceImpl<FsCoursePlaySourceConfigMapper, FsCoursePlaySourceConfig>
+        implements IFsCoursePlaySourceConfigService {
+
+    /**
+     * 查询点播配置列表
+     */
+    @Override
+    public List<FsCoursePlaySourceConfigVO> selectCoursePlaySourceConfigVOListByMap(Map<String, Object> params) {
+        return baseMapper.selectCoursePlaySourceConfigVOListByMap(params);
+    }
+}

+ 28 - 26
fs-service/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java

@@ -187,35 +187,37 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
         int remainCount = config.getAnswerErrorCount()-errorCount-1;
 
         // 一次性获取所有问题的正确答案
-        Map<Long, FsCourseQuestionBank> correctAnswersMap = fsCourseQuestionBankMapper.selectFsCourseQuestionBankByIds(
-                param.getQuestions().stream().map(FsCourseQuestionBank::getId).collect(Collectors.toList())
-        ).stream().collect(Collectors.toMap(FsCourseQuestionBank::getId, question -> question));
-
-        for (FsCourseQuestionBank questionBank : param.getQuestions()) {
-            FsCourseQuestionBank correctAnswer = correctAnswersMap.get(questionBank.getId());
-            if (correctAnswer.getType() == 1) {
-                if (questionBank.getAnswer().equals(correctAnswer.getAnswer())) {
-                    thisRightCount++;
-                } else {
-                    correctAnswer.setAnswer(null);
-                    incorrectQuestions.add(correctAnswer);
-                }
-            } else if (correctAnswer.getType() == 2) {
-                String[] userAnswers = convertStringToArray(questionBank.getAnswer());
-                String[] correctAnswers = convertStringToArray(correctAnswer.getAnswer());
+        List<FsCourseQuestionBank> questions = param.getQuestions();
+        if (questions != null && !questions.isEmpty()) {
+            Map<Long, FsCourseQuestionBank> correctAnswersMap = fsCourseQuestionBankMapper.selectFsCourseQuestionBankByIds(
+                    questions.stream().map(FsCourseQuestionBank::getId).collect(Collectors.toList())
+            ).stream().collect(Collectors.toMap(FsCourseQuestionBank::getId, question -> question));
+
+            for (FsCourseQuestionBank questionBank : questions) {
+                FsCourseQuestionBank correctAnswer = correctAnswersMap.get(questionBank.getId());
+                if (correctAnswer.getType() == 1) {
+                    if (questionBank.getAnswer().equals(correctAnswer.getAnswer())) {
+                        thisRightCount++;
+                    } else {
+                        correctAnswer.setAnswer(null);
+                        incorrectQuestions.add(correctAnswer);
+                    }
+                } else if (correctAnswer.getType() == 2) {
+                    String[] userAnswers = convertStringToArray(questionBank.getAnswer());
+                    String[] correctAnswers = convertStringToArray(correctAnswer.getAnswer());
 
-                Arrays.sort(userAnswers);
-                Arrays.sort(correctAnswers);
+                    Arrays.sort(userAnswers);
+                    Arrays.sort(correctAnswers);
 
-                if (Arrays.equals(userAnswers, correctAnswers)) {
-                    thisRightCount++;
-                } else {
-                    correctAnswer.setAnswer(null);
-                    incorrectQuestions.add(correctAnswer);
+                    if (Arrays.equals(userAnswers, correctAnswers)) {
+                        thisRightCount++;
+                    } else {
+                        correctAnswer.setAnswer(null);
+                        incorrectQuestions.add(correctAnswer);
+                    }
                 }
             }
         }
-
         FsCourseAnswerLogs logs = new FsCourseAnswerLogs();
         logs.setWatchLogId(logId);
         logs.setUserId(param.getUserId());
@@ -224,11 +226,11 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
         logs.setCompanyId(param.getCompanyId());
         logs.setCompanyUserId(param.getCompanyUserId());
         logs.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null );
-        logs.setQuestionJson(JSONObject.toJSONString(param.getQuestions()));
+        logs.setQuestionJson(JSONObject.toJSONString(questions));
         logs.setCreateTime(new Date());
         logs.setPeriodId(param.getPeriodId());
 
-        if (thisRightCount == param.getQuestions().size()) {
+        if (thisRightCount == questions.size()) {
             logs.setIsRight(1);
             courseAnswerLogsMapper.insertFsCourseAnswerLogs(logs);
             return R.ok("答题成功");

+ 12 - 3
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -405,7 +405,16 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
     public Long getFsUserVideoDuration(Long videoId){
         //将视频时长也存到redis
         String videoRedisKey = "h5wxuser:video:duration:" + videoId;
-        Long videoDuration = redisCache.getCacheObject(videoRedisKey);
+        Long videoDuration=0L;
+        try {
+            videoDuration = redisCache.getCacheObject(videoRedisKey);
+        }catch (Exception e){
+            String string = redisCache.getCacheObject(videoRedisKey);
+            videoDuration=Long.parseLong(string);
+            log.error("key中id为S:{}", videoDuration);
+        }
+
+        
         if (videoDuration==null){
             FsUserCourseVideo video = courseVideoMapper.selectFsUserCourseVideoByVideoId(videoId);
             videoDuration=video.getDuration();
@@ -1022,8 +1031,8 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
             if(ObjectUtils.isNotNull(item.getUserId())) {
                 FsUser fsUser = fsUserCacheService.selectFsUserById(item.getUserId());
                 if(ObjectUtils.isNotNull(fsUser)){
-                    item.setExternalUserName(String.format("%s_%d",fsUser.getNickname(),fsUser.getUserId()));
-                    item.setFsNickName(fsUser.getNickname());
+                    item.setExternalUserName(String.format("%s_%d",fsUser.getNickName(),fsUser.getUserId()));
+                    item.setFsNickName(fsUser.getNickName());
                     item.setFsAvatar(fsUser.getAvatar());
                 }
             }

+ 26 - 12
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseOrderServiceImpl.java

@@ -6,6 +6,8 @@ import java.util.*;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
@@ -24,10 +26,7 @@ import com.fs.his.domain.*;
 import com.fs.his.dto.PayConfigDTO;
 import com.fs.his.enums.FsPackageOrderStatusEnum;
 import com.fs.his.enums.FsUserIntegralLogTypeEnum;
-import com.fs.his.mapper.FsStorePaymentErrorMapper;
-import com.fs.his.mapper.FsStorePaymentMapper;
-import com.fs.his.mapper.FsUserIntegralLogsMapper;
-import com.fs.his.mapper.FsUserMapper;
+import com.fs.his.mapper.*;
 import com.fs.his.param.FsPackageOrderDoPayParam;
 import com.fs.his.param.FsUserAddIntegralTemplateParam;
 import com.fs.his.service.IFsCouponService;
@@ -128,6 +127,8 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
     private TzBankService tzBankService;
     @Autowired
     private IFsUserIntegralLogsService userIntegralLogsService;
+    @Autowired
+    private FsUserWxMapper fsUserWxMapper;
 
 
 
@@ -372,13 +373,26 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
             return R.error("非法操作");
         }
         FsUser user=fsUserMapper.selectFsUserByUserId(param.getUserId());
-        if(user!=null&& StringUtils.isNotEmpty(user.getMaOpenId())) {
+
+        String json = configService.selectConfigByKey("his.pay");
+        PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
+
+        String openId = Objects.isNull(user) ? "" : user.getMaOpenId();
+        if (StringUtils.isBlank(openId)){
+            Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+                    .eq(FsUserWx::getFsUserId, param.getUserId())
+                    .eq(FsUserWx::getAppId, payConfigDTO.getAppId());
+            FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+            if (Objects.nonNull(fsUserWx)){
+                openId = fsUserWx.getOpenId();
+            }
+        }
+
+        if(user!=null&& StringUtils.isNotEmpty(openId)) {
             if (order.getPayMoney().compareTo(new BigDecimal(0)) == 0) {
                 this.payConfirm(order.getOrderCode(), "", "", "", 2);
                 return R.ok().put("isPay", 1);
             } else {
-                String json = configService.selectConfigByKey("his.pay");
-                PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
                 String payCode =  OrderCodeUtils.getOrderSn();
                 if(StringUtils.isEmpty(payCode)){
                     return R.error("订单生成失败,请重试");
@@ -393,7 +407,7 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
                 storePayment.setPayTypeCode("weixin");
                 storePayment.setBusinessType(4);
                 storePayment.setRemark("课程订单支付");
-                storePayment.setOpenId(user.getMaOpenId());
+                storePayment.setOpenId(openId);
                 storePayment.setUserId(user.getUserId());
                 storePayment.setBusinessId(order.getOrderId().toString());
                 if (storePaymentService.insertFsStorePayment(storePayment) > 0) {
@@ -411,7 +425,7 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
                         payConfig.setNotifyUrl(wxPayProperties.getNotifyUrl());
                         wxPayService.setConfig(payConfig);
                         WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
-                        orderRequest.setOpenid(user.getMaOpenId());//公众号支付提供用户openid
+                        orderRequest.setOpenid(openId);//公众号支付提供用户openid
                         orderRequest.setBody("课程订单支付");
                         orderRequest.setOutTradeNo("course-" + storePayment.getPayCode());
                         orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
@@ -433,7 +447,7 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
                         p.setLowOrderId("course-" + storePayment.getPayCode());
                         p.setBody("课程订单支付");
                         p.setIsMinipg("1");
-                        p.setOpenId(user.getMaOpenId());
+                        p.setOpenId(openId);
                         p.setAttach("");
                         p.setStoreid("0");
                         CreateWxOrderResult wxOrder = payService.createWxOrder(p);
@@ -457,7 +471,7 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
                         }
                         o.setPayerName("微信用户" + phone);
                         o.setGoodsInfo("课程订单支付"); // 订单信息
-                        o.setOpenId(user.getMaOpenId());
+                        o.setOpenId(openId);
                         o.setOrderType(4);
                         o.setOrderId(order.getOrderId().toString());
                         TzBankResult<PayCreateOrderResult> result = tzBankService.createOrder(o);
@@ -469,7 +483,7 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
                     } else if (payConfigDTO.getType().equals("hf")) {
                         HuiFuCreateOrder o = new HuiFuCreateOrder();
                         o.setTradeType("T_MINIAPP");
-                        o.setOpenid(user.getMaOpenId());
+                        o.setOpenid(openId);
                         o.setReqSeqId("course-" + storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
                         o.setGoodsDesc("课程订单支付");

+ 14 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.course.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -8,6 +9,7 @@ import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.PubFun;
 import com.fs.common.utils.date.DateUtil;
 import com.fs.common.utils.date.TimeTypeEnum;
+import com.fs.company.domain.CompanyDomain;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.domain.FsUserCoursePeriodDays;
 import com.fs.course.domain.FsUserCourseVideo;
@@ -25,6 +27,7 @@ import com.fs.course.vo.UpdateCourseTimeVo;
 import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.vo.OptionsVO;
+import com.fs.sop.domain.QwSopTempRules;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import lombok.AllArgsConstructor;
@@ -405,6 +408,17 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
         fsUserCoursePeriodDaysMapper.endPeriodCourse(LocalDateTime.now());
     }
 
+    @Override
+    public long periodCourseByCount(PeriodCountParam param) {
+        //1、查询课程视频信息
+        FsUserCoursePeriodDays fsUserCoursePeriodDays = new FsUserCoursePeriodDays();
+        fsUserCoursePeriodDays.setPeriodId(param.getPeriodId());
+        fsUserCoursePeriodDays.setVideoIds(param.getVideoIdList());
+        fsUserCoursePeriodDays.setMaxDate(param.getMaxDate());
+
+        return baseMapper.selectFsUserCoursePeriodDaysCount(fsUserCoursePeriodDays);
+    }
+
     private static FsCourseAnalysisCountVO getCourseAnalysisCountVO(FsUserCoursePeriodDays v, Map<Long, FsCourseAnalysisCountVO> courseMap, Map<Long, FsCourseAnalysisCountVO> redPacketMap, Map<Long, FsCourseAnalysisCountVO> answerMap) {
         FsCourseAnalysisCountVO countVO = new FsCourseAnalysisCountVO();
         FsCourseAnalysisCountVO courseVO = courseMap.getOrDefault(v.getVideoId(), countVO);

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

@@ -926,7 +926,6 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     }
 
     @Override
-    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
     public R sendRewardByFsUser(FsCourseSendRewardUParam param) {
         FsUser user = fsUserMapper.selectFsUserByUserId(param.getUserId());
         if (user == null){
@@ -943,22 +942,28 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             logger.error("未答题:{}",param.getUserId());
             return R.error("未答题");
         }
-        if (log.getRewardType() != null) {
-            FsCourseRedPacketLog fsCourseRedPacketLog = redPacketLogMapper.selectUserFsCourseRedPacketLog(param.getVideoId(), param.getUserId(),param.getPeriodId());
-            if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 1) {
-                return R.error("已领取该课程奖励,不可重复领取!");
-            }
-            if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 0) {
-                if(StringUtils.isNotEmpty(fsCourseRedPacketLog.getResult())){
-                    R r = JSON.parseObject(fsCourseRedPacketLog.getResult(), R.class);
-                    return r;
-                } else {
-                    return R.error("操作频繁,请稍后再试!");
+        if (log.getRewardType() != null ) {
+            if (log.getRewardType() == 1){
+                FsCourseRedPacketLog fsCourseRedPacketLog = redPacketLogMapper.selectUserFsCourseRedPacketLog(param.getVideoId(), param.getUserId(),param.getPeriodId());
+                if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 1) {
+                    return R.error("已领取该课程奖励,不可重复领取!");
                 }
+                if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 0) {
+                    if(StringUtils.isNotEmpty(fsCourseRedPacketLog.getResult())){
+                        R r = JSON.parseObject(fsCourseRedPacketLog.getResult(), R.class);
+                        return r;
+                    } else {
+                        return R.error("操作频繁,请稍后再试!");
+                    }
+                }
+            }else if (log.getRewardType() == 2){
+                return R.error("已领取该课程奖励,不可重复领取!");
             }
+
         }
 
 
+
         // 获取视频信息
         FsUserCourseVideo video = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoId(param.getVideoId());
 
@@ -1201,11 +1206,16 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 packetParam.setOpenId(fsUserWx.getOpenId());
             }
         }
+        //判断服务号配置是否存在
+        if (StringUtils.isNotEmpty(config.getMpAppId())){
+            packetParam.setMpAppId(config.getMpAppId());
+        }
         packetParam.setAmount(amount);
         packetParam.setSource(param.getSource());
         packetParam.setRedPacketMode(config.getRedPacketMode());
         packetParam.setCompanyId(param.getCompanyId());
         packetParam.setAppId(param.getAppId());
+        packetParam.setUser(user);
 
         System.out.println("红包金额"+amount);
         System.out.println("红包商户号"+packetParam);
@@ -1505,9 +1515,18 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Transactional
     public ResponseResult<FsUser> isAddCompanyUser(FsUserCourseAddCompanyUserParam param) {
         logger.info("\n 【进入个微-判断是否添加客服】,入参:{}",param);
+
+        // 生成锁的key,使用用户ID和视频ID组合
+        String lockKey = "submit:lock:" + param.getUserId() + ":" + param.getVideoId();
+        // 尝试获取锁,3秒过期
+        boolean locked = redisCache.setIfAbsent(lockKey, "1", 1, TimeUnit.SECONDS);
+
+        if (!locked) {
+            return ResponseResult.fail(504, "请勿重复提交,请等待3秒后重试");
+        }
         //查询用户
-        FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
-        if (fsUser == null){
+       FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
+         if (fsUser == null){
             return ResponseResult.fail(404,"当前用户信息不存在");
         }
         //公开课
@@ -1798,7 +1817,16 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
         //将视频时长也存到redis
         String videoRedisKey = "h5wxuser:video:duration:" + param.getVideoId();
-        Long videoDuration = redisCache.getCacheObject(videoRedisKey);
+
+        Long videoDuration=0L;
+        try {
+            videoDuration = redisCache.getCacheObject(videoRedisKey);
+        }catch (Exception e){
+            String string = redisCache.getCacheObject(videoRedisKey);
+            videoDuration=Long.parseLong(string);
+            log.error("key中id为String:{}", videoDuration);
+        }
+
         if (videoDuration == null) {
             redisCache.setCacheObject(videoRedisKey, courseVideoDetails != null ? courseVideoDetails.getDuration() != null ? courseVideoDetails.getDuration() : 0 : 0);
         }

+ 28 - 12
fs-service/src/main/java/com/fs/course/service/impl/FsUserVipOrderServiceImpl.java

@@ -6,9 +6,12 @@ import java.time.ZoneId;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
@@ -24,14 +27,12 @@ import com.fs.course.param.FsUserVipOrderCreateUParam;
 import com.fs.course.param.FsUserVipOrderParam;
 import com.fs.course.param.FsUserVipOrderPayUParam;
 import com.fs.course.vo.FsUserVipOrderListPVO;
-import com.fs.his.domain.FsPayConfig;
-import com.fs.his.domain.FsStorePayment;
-import com.fs.his.domain.FsStorePaymentError;
-import com.fs.his.domain.FsUser;
+import com.fs.his.domain.*;
 import com.fs.his.dto.PayConfigDTO;
 import com.fs.his.mapper.FsStorePaymentErrorMapper;
 import com.fs.his.mapper.FsStorePaymentMapper;
 import com.fs.his.mapper.FsUserMapper;
+import com.fs.his.mapper.FsUserWxMapper;
 import com.fs.his.service.IFsStorePaymentService;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
@@ -111,6 +112,8 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
 
     @Autowired
     private IPayService payService;
+    @Autowired
+    private FsUserWxMapper fsUserWxMapper;
 
 
     /**
@@ -229,13 +232,26 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
             return R.error("非法操作");
         }
         FsUser user = userMapper.selectFsUserByUserId(param.getUserId());
-        if(user!=null&& StringUtils.isNotEmpty(user.getMaOpenId())) {
+
+        String json = configService.selectConfigByKey("his.pay");
+        PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
+
+        String openId = Objects.isNull(user) ? "" : user.getMaOpenId();
+        if (StringUtils.isBlank(openId)){
+            Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+                    .eq(FsUserWx::getFsUserId, param.getUserId())
+                    .eq(FsUserWx::getAppId, payConfigDTO.getAppId());
+            FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+            if (Objects.nonNull(fsUserWx)){
+                openId = fsUserWx.getOpenId();
+            }
+        }
+
+        if(user!=null&& StringUtils.isNotEmpty(openId)) {
             if (order.getPayMoney().compareTo(new BigDecimal(0)) == 0) {
                 this.payConfirm(order.getOrderCode(), "", "", "", 2);
                 return R.ok().put("isPay", 1);
             } else {
-                String json = configService.selectConfigByKey("his.pay");
-                PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
                 String payCode =  OrderCodeUtils.getOrderSn();
                 if(StringUtils.isEmpty(payCode)){
                     return R.error("订单生成失败,请重试");
@@ -250,7 +266,7 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
                 storePayment.setPayTypeCode("weixin");
                 storePayment.setBusinessType(5);
                 storePayment.setRemark("会员开通订单支付");
-                storePayment.setOpenId(user.getMaOpenId());
+                storePayment.setOpenId(openId);
                 storePayment.setUserId(user.getUserId());
                 storePayment.setBusinessId(order.getOrderId().toString());
                 if (storePaymentService.insertFsStorePayment(storePayment) > 0) {
@@ -268,7 +284,7 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
                         payConfig.setNotifyUrl(wxPayProperties.getNotifyUrl());
                         wxPayService.setConfig(payConfig);
                         WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
-                        orderRequest.setOpenid(user.getMaOpenId());//公众号支付提供用户openid
+                        orderRequest.setOpenid(openId);//公众号支付提供用户openid
                         orderRequest.setBody("会员开通订单支付");
                         orderRequest.setOutTradeNo("appvip-" + storePayment.getPayCode());
                         orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));//测试
@@ -290,7 +306,7 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
                         p.setLowOrderId("appvip-" + storePayment.getPayCode());
                         p.setBody("会员开通订单支付");
                         p.setIsMinipg("1");
-                        p.setOpenId(user.getMaOpenId());
+                        p.setOpenId(openId);
                         p.setAttach("");
                         p.setStoreid("0");
                         CreateWxOrderResult wxOrder = payService.createWxOrder(p);
@@ -314,7 +330,7 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
                         }
                         o.setPayerName("微信用户" + phone);
                         o.setGoodsInfo("会员开通订单支付"); // 订单信息
-                        o.setOpenId(user.getMaOpenId());
+                        o.setOpenId(openId);
                         o.setOrderType(5);
                         o.setOrderId(order.getOrderId().toString());
                         TzBankResult<PayCreateOrderResult> result = tzBankService.createOrder(o);
@@ -326,7 +342,7 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
                     } else if (payConfigDTO.getType().equals("hf")) {
                         HuiFuCreateOrder o = new HuiFuCreateOrder();
                         o.setTradeType("T_MINIAPP");
-                        o.setOpenid(user.getMaOpenId());
+                        o.setOpenid(openId);
                         o.setReqSeqId("appvip-" + storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
                         o.setGoodsDesc("会员开通订单支付");

+ 49 - 0
fs-service/src/main/java/com/fs/course/vo/FsCoursePlaySourceConfigVO.java

@@ -0,0 +1,49 @@
+package com.fs.course.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class FsCoursePlaySourceConfigVO {
+
+    @ApiModelProperty("主键ID")
+    private Long id;
+
+    @ApiModelProperty("小程序/公众号名称")
+    private String name;
+
+    @ApiModelProperty("小程序/公众号appid")
+    private String appid;
+
+    @ApiModelProperty("小程序/公众号secret")
+    private String secret;
+
+    @ApiModelProperty("小程序/公众号icon图标")
+    private String img;
+
+    @ApiModelProperty("小程序/公众号原始id")
+    private String originalId;
+
+    @ApiModelProperty("token")
+    private String token;
+
+    @ApiModelProperty("aesKey")
+    private String aesKey;
+
+    @ApiModelProperty("msgDataFormat")
+    private String msgDataFormat;
+
+    @ApiModelProperty("类型 1小程序 2公众号")
+    private Integer type;
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("修改时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+}

+ 94 - 0
fs-service/src/main/java/com/fs/his/domain/FsInquiryPatientInfo.java

@@ -0,0 +1,94 @@
+package com.fs.his.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FsInquiryPatientInfo extends BaseEntity {
+
+    /** ID */
+    private Long id;
+
+    /**
+     * 患者id
+     */
+    private Long patientId;
+
+    /**
+     * 销售id
+     */
+    private Long companyUserId;
+    /**
+     * 患者会员id
+     */
+    private Long userId;
+    /**
+     * 问诊订单id
+     */
+    private Long inquiryOrderId;
+    /**
+     * 课程id
+     */
+    private Long courseId;
+
+    /**
+     * 就诊状态 1-初诊 2-复诊
+     */
+    private Integer diagnosisStatus;
+
+    /**
+     * 客户标签
+     */
+    private String tag;
+
+    /**
+     * 课程/档期
+     */
+    private String courseName;
+
+    /**
+     * 患者病情主诉
+     */
+    private String patientCondition;
+
+    /**
+     * 部门负责人
+     */
+    private String deptManager;
+
+    /**
+     * 医生建议及处置
+     */
+    private String doctorAdviceJson;
+
+    /**
+     * 禁忌
+     */
+    private String taboo;
+    /**
+     * 客户需求
+     */
+    private String customerRequire;
+
+    /**
+     * 职业医生
+     */
+    private String professionalDoctor;
+
+    /**
+     * 助理医生
+     */
+    private String assistantDoctor;
+
+    /**
+     * 预约时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date subTime;
+
+    private Long subDoctorId;
+
+}

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

@@ -15,7 +15,7 @@ public class PayConfigDTO implements Serializable {
     private String tzAppKey;
     private String tzPlatformPublicKey;
     private String tzPrivateKey;
-
+    private String appId;
 
 
 }

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