Pārlūkot izejas kodu

Merge branch 'openIm' of http://1.14.104.71:10880/root/ylrz_his_scrm_java into openIm

# Conflicts:
#	fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
#	fs-doctor-app/src/main/java/com/fs/app/controller/DoctorController.java
#	fs-doctor-app/src/main/java/com/fs/framework/config/MyBatisConfig.java
#	fs-service/src/main/java/com/fs/his/service/impl/FsFollowReportServiceImpl.java
#	fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
15376779826 1 mēnesi atpakaļ
vecāks
revīzija
6c0b135dec
100 mainītis faili ar 3402 papildinājumiem un 713 dzēšanām
  1. 6 0
      fs-admin/src/main/java/com/fs/course/controller/FsCoursePlaySourceConfigController.java
  2. 54 0
      fs-admin/src/main/java/com/fs/crm/controller/ReportController.java
  3. 126 0
      fs-admin/src/main/java/com/fs/fastGpt/FastgptExtUserTagController.java
  4. 99 0
      fs-admin/src/main/java/com/fs/his/controller/FsHomeArticleCategoryController.java
  5. 94 0
      fs-admin/src/main/java/com/fs/his/controller/FsHomeArticleController.java
  6. 93 0
      fs-admin/src/main/java/com/fs/his/controller/FsHomeArticleViewController.java
  7. 2 0
      fs-admin/src/main/java/com/fs/his/controller/FsPackageOrderController.java
  8. 4 2
      fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java
  9. 4 0
      fs-admin/src/main/java/com/fs/his/controller/FsUserAddressController.java
  10. 12 0
      fs-admin/src/main/java/com/fs/qw/controller/QwTagGroupController.java
  11. 62 0
      fs-admin/src/main/java/com/fs/stats/FsStatsMemberController.java
  12. 7 6
      fs-common/src/main/java/com/fs/common/utils/CloudHostUtils.java
  13. 13 0
      fs-company-app/src/main/java/com/fs/app/exception/FSExceptionHandler.java
  14. 23 1
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  15. 41 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwUserVoiceLogController.java
  16. 4 2
      fs-company/src/main/java/com/fs/company/controller/store/FsStoreOrderController.java
  17. 6 3
      fs-doctor-app/src/main/java/com/fs/app/controller/DoctorController.java
  18. 7 8
      fs-doctor-app/src/main/java/com/fs/framework/config/MyBatisConfig.java
  19. 2 0
      fs-service/src/main/java/com/fs/aiTongueApi/config/AiTongueConfig.java
  20. 58 0
      fs-service/src/main/java/com/fs/aiTongueApi/domain/enums/TongueTypeEnums.java
  21. 14 0
      fs-service/src/main/java/com/fs/aiTongueApi/domain/inner/ConfidenceDataNew.java
  22. 14 0
      fs-service/src/main/java/com/fs/aiTongueApi/domain/inner/TongueInfo.java
  23. 3 0
      fs-service/src/main/java/com/fs/aiTongueApi/service/AiTongueService.java
  24. 187 2
      fs-service/src/main/java/com/fs/aiTongueApi/service/impl/AiTongueServiceImpl.java
  25. 2 2
      fs-service/src/main/java/com/fs/company/domain/CompanyUser.java
  26. 2 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyDeptMapper.java
  27. 1 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyRoleMapper.java
  28. 3 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  29. 4 0
      fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java
  30. 6 1
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  31. 166 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  32. 18 351
      fs-service/src/main/java/com/fs/company/vo/CompanyUserImportVO.java
  33. 3 0
      fs-service/src/main/java/com/fs/company/vo/CompanyUserQwListVO.java
  34. 2 0
      fs-service/src/main/java/com/fs/company/vo/CompanyVO.java
  35. 5 0
      fs-service/src/main/java/com/fs/course/config/CourseConfig.java
  36. 1 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoRedPackageMapper.java
  37. 1 0
      fs-service/src/main/java/com/fs/course/param/FsUserCourseOrderDoPayParam.java
  38. 1 0
      fs-service/src/main/java/com/fs/course/param/FsUserVipOrderPayUParam.java
  39. 1 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseProductOrderServiceImpl.java
  40. 8 1
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  41. 4 3
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseOrderServiceImpl.java
  42. 1 1
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java
  43. 3 5
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  44. 3 2
      fs-service/src/main/java/com/fs/course/service/impl/FsUserVipOrderServiceImpl.java
  45. 67 57
      fs-service/src/main/java/com/fs/course/service/impl/FsUserWatchStatisticsServiceImpl.java
  46. 38 0
      fs-service/src/main/java/com/fs/crm/domain/CrmCustomerAssist.java
  47. 43 0
      fs-service/src/main/java/com/fs/crm/domain/Report.java
  48. 87 0
      fs-service/src/main/java/com/fs/crm/mapper/CrmCustomerAssistMapper.java
  49. 7 0
      fs-service/src/main/java/com/fs/crm/mapper/CrmCustomerMapper.java
  50. 11 0
      fs-service/src/main/java/com/fs/crm/param/CrmCustomerAssistDeLParam.java
  51. 21 0
      fs-service/src/main/java/com/fs/crm/param/ReportParam.java
  52. 11 0
      fs-service/src/main/java/com/fs/crm/service/ReportService.java
  53. 70 0
      fs-service/src/main/java/com/fs/crm/service/impl/ReportServiceImpl.java
  54. 14 1
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  55. 5 1
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java
  56. 31 0
      fs-service/src/main/java/com/fs/fastGpt/domain/FastgptExtUserTag.java
  57. 67 0
      fs-service/src/main/java/com/fs/fastGpt/mapper/FastgptExtUserTagMapper.java
  58. 66 0
      fs-service/src/main/java/com/fs/fastGpt/service/IFastgptExtUserTagService.java
  59. 58 2
      fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java
  60. 145 0
      fs-service/src/main/java/com/fs/fastGpt/service/impl/FastgptExtUserTagServiceImpl.java
  61. 34 0
      fs-service/src/main/java/com/fs/fastGpt/vo/FastgptExtUserTagVO.java
  62. 7 0
      fs-service/src/main/java/com/fs/his/config/FsSysConfig.java
  63. 42 0
      fs-service/src/main/java/com/fs/his/domain/FsComplaintTemplate.java
  64. 63 0
      fs-service/src/main/java/com/fs/his/domain/FsUserComplaint.java
  65. 6 1
      fs-service/src/main/java/com/fs/his/enums/FsStoreOrderLogEnum.java
  66. 62 0
      fs-service/src/main/java/com/fs/his/mapper/FsComplaintTemplateMapper.java
  67. 3 0
      fs-service/src/main/java/com/fs/his/mapper/FsHealthTongueMapper.java
  68. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsHfpayConfigMapper.java
  69. 6 1
      fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java
  70. 2 1
      fs-service/src/main/java/com/fs/his/mapper/FsStorePaymentMapper.java
  71. 63 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserComplaintMapper.java
  72. 8 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  73. 1 1
      fs-service/src/main/java/com/fs/his/param/FsInquiryOrderPayParam.java
  74. 62 0
      fs-service/src/main/java/com/fs/his/service/IFsComplaintTemplateService.java
  75. 3 0
      fs-service/src/main/java/com/fs/his/service/IFsHealthTongueService.java
  76. 2 2
      fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java
  77. 6 0
      fs-service/src/main/java/com/fs/his/service/IFsStorePaymentService.java
  78. 63 0
      fs-service/src/main/java/com/fs/his/service/IFsUserComplaintService.java
  79. 94 0
      fs-service/src/main/java/com/fs/his/service/impl/FsComplaintTemplateServiceImpl.java
  80. 5 0
      fs-service/src/main/java/com/fs/his/service/impl/FsFollowReportServiceImpl.java
  81. 60 57
      fs-service/src/main/java/com/fs/his/service/impl/FsHealthTongueServiceImpl.java
  82. 2 0
      fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderMsgServiceImpl.java
  83. 19 1
      fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java
  84. 54 15
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java
  85. 1 0
      fs-service/src/main/java/com/fs/his/service/impl/FsPrescribeServiceImpl.java
  86. 15 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java
  87. 22 12
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  88. 130 3
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  89. 94 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserComplaintServiceImpl.java
  90. 186 167
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  91. 88 0
      fs-service/src/main/java/com/fs/his/utils/ComplaintTreeUtil.java
  92. 16 0
      fs-service/src/main/java/com/fs/his/vo/FsComplaintTemplateVO.java
  93. 3 0
      fs-service/src/main/java/com/fs/his/vo/FsPackageOrderExcelVO.java
  94. 52 0
      fs-service/src/main/java/com/fs/his/vo/FsUserComplaintVo.java
  95. 71 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsStoreProductScrm.java
  96. 2 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  97. 2 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderPayParam.java
  98. 14 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStorePaymentGetWxaCodeParam.java
  99. 2 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStorePaymentPayParam.java
  100. 122 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreProductAddEditParam.java

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

@@ -2,10 +2,12 @@ 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.conditions.query.QueryWrapper;
 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.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.bean.BeanUtils;
@@ -112,4 +114,8 @@ public class FsCoursePlaySourceConfigController extends BaseController {
         fsCoursePlaySourceConfigService.update(updateWrapper);
         return AjaxResult.success();
     }
+    @GetMapping("/listAll")
+    public R listAll() {
+        return R.ok().put("data", fsCoursePlaySourceConfigService.list(new QueryWrapper<FsCoursePlaySourceConfig>().eq("is_del", 0)));
+    }
 }

+ 54 - 0
fs-admin/src/main/java/com/fs/crm/controller/ReportController.java

@@ -0,0 +1,54 @@
+package com.fs.crm.controller;
+
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.model.LoginUser;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.crm.domain.Report;
+import com.fs.framework.web.service.TokenService;
+import com.fs.crm.param.ReportParam;
+import com.fs.crm.service.ReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@RestController
+@RequestMapping("/crm/report")
+public class ReportController extends BaseController {
+    @Autowired
+    private ReportService reportService;
+    @Autowired
+    private TokenService tokenService;
+    @GetMapping("/reportList")
+    public TableDataInfo getReport(ReportParam param, HttpServletRequest request)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+
+        Long userId = loginUser.getUser().getUserId();
+        param.setCompanyUserId(userId);
+        List<Report> list = reportService.getReport(param);
+        return getDataTable(list);
+    }
+    @GetMapping("/export")
+    public AjaxResult export(ReportParam param,HttpServletRequest request)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(request);
+
+        Long userId = loginUser.getUser().getUserId();
+        param.setCompanyUserId(userId);
+        List<Report> list = reportService.getReport(param);
+        if (CollectionUtils.isEmpty(list)){
+            return AjaxResult.error("请选择导出数据");
+        }
+        ExcelUtil<Report> util = new ExcelUtil<Report>(Report.class);
+        return util.exportExcel(list, "report");
+    }
+
+}

+ 126 - 0
fs-admin/src/main/java/com/fs/fastGpt/FastgptExtUserTagController.java

@@ -0,0 +1,126 @@
+package com.fs.fastGpt;
+
+import java.util.List;
+
+import com.fs.common.core.domain.R;
+import com.fs.fastGpt.vo.FastgptExtUserTagVO;
+import com.fs.framework.web.service.TokenService;
+import com.fs.qw.service.IQwCompanyService;
+import com.fs.qw.vo.QwOptionsVO;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.fastGpt.domain.FastgptExtUserTag;
+import com.fs.fastGpt.service.IFastgptExtUserTagService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 处理新客标签Controller
+ * 
+ * @author fs
+ * @date 2025-09-10
+ */
+@RestController
+@RequestMapping("/fastGpt/FastGptExtUserTag")
+public class FastgptExtUserTagController extends BaseController
+{
+    @Autowired
+    private IFastgptExtUserTagService fastgptExtUserTagService;
+
+
+    @Autowired
+    private IQwCompanyService qwCompanyService;
+
+
+    /**
+     * 查询处理新客标签列表
+     */
+    @PreAuthorize("@ss.hasPermi('FastGptExtUserTag:FastGptExtUserTag:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FastgptExtUserTag fastgptExtUserTag)
+    {
+        startPage();
+        List<FastgptExtUserTag> list = fastgptExtUserTagService.selectFastgptExtUserTagList(fastgptExtUserTag);
+        return getDataTable(list);
+    }
+    @PreAuthorize("@ss.hasPermi('qw:externalContact:addTag')")
+    @Log(title = "添加标签", businessType = BusinessType.UPDATE)
+    @PostMapping("/addFastGptTagByCorpId")
+    public R addFastGptTagByCorpId(@RequestBody FastgptExtUserTagVO fastgptExtUserTag) {
+        return fastgptExtUserTagService.addFastGptTagByCorpId(fastgptExtUserTag);
+    }
+    @GetMapping("/getMyQwUserList")
+    public R getMyQwUserList()
+    {
+        List<QwOptionsVO> list = qwCompanyService.selectQwCompanyListOptionsVO();
+        return  R.ok().put("data",list);
+    }
+
+    /**
+     * 导出处理新客标签列表
+     */
+    @PreAuthorize("@ss.hasPermi('FastGptExtUserTag:FastGptExtUserTag:export')")
+    @Log(title = "处理新客标签", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FastgptExtUserTag fastgptExtUserTag)
+    {
+        List<FastgptExtUserTag> list = fastgptExtUserTagService.selectFastgptExtUserTagList(fastgptExtUserTag);
+        ExcelUtil<FastgptExtUserTag> util = new ExcelUtil<FastgptExtUserTag>(FastgptExtUserTag.class);
+        return util.exportExcel(list, "处理新客标签数据");
+    }
+
+    /**
+     * 获取处理新客标签详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('FastGptExtUserTag:FastGptExtUserTag:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fastgptExtUserTagService.selectFastgptExtUserTagById(id));
+    }
+
+    /**
+     * 新增处理新客标签
+     */
+    @PreAuthorize("@ss.hasPermi('FastGptExtUserTag:FastGptExtUserTag:add')")
+    @Log(title = "处理新客标签", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FastgptExtUserTag fastgptExtUserTag)
+    {
+        return toAjax(fastgptExtUserTagService.insertFastgptExtUserTag(fastgptExtUserTag));
+    }
+
+    /**
+     * 修改处理新客标签
+     */
+    @PreAuthorize("@ss.hasPermi('FastGptExtUserTag:FastGptExtUserTag:edit')")
+    @Log(title = "处理新客标签", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FastgptExtUserTag fastgptExtUserTag)
+    {
+        return toAjax(fastgptExtUserTagService.updateFastgptExtUserTag(fastgptExtUserTag));
+    }
+
+    /**
+     * 删除处理新客标签
+     */
+    @PreAuthorize("@ss.hasPermi('FastGptExtUserTag:FastGptExtUserTag:remove')")
+    @Log(title = "处理新客标签", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fastgptExtUserTagService.deleteFastgptExtUserTagByIds(ids));
+    }
+}

+ 99 - 0
fs-admin/src/main/java/com/fs/his/controller/FsHomeArticleCategoryController.java

@@ -0,0 +1,99 @@
+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.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.hisStore.domain.FsHomeArticleCategoryScrm;
+import com.fs.hisStore.service.IFsHomeArticleCategoryScrmService;
+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 2025-05-21
+ */
+@RestController
+@RequestMapping("/his/homeCategory")
+public class FsHomeArticleCategoryController extends BaseController {
+    @Autowired
+    private IFsHomeArticleCategoryScrmService fsHomeArticleCategoryService;
+
+    /**
+     * 查询期刊分类列表
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeCategory:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsHomeArticleCategoryScrm fsHomeArticleCategory) {
+        startPage();
+        List<FsHomeArticleCategoryScrm> list = fsHomeArticleCategoryService.selectFsHomeArticleCategoryList(fsHomeArticleCategory);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出期刊分类列表
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeCategory:export')")
+    @Log(title = "期刊分类", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsHomeArticleCategoryScrm fsHomeArticleCategory) {
+        List<FsHomeArticleCategoryScrm> list = fsHomeArticleCategoryService.selectFsHomeArticleCategoryList(fsHomeArticleCategory);
+        ExcelUtil<FsHomeArticleCategoryScrm> util = new ExcelUtil<FsHomeArticleCategoryScrm>(FsHomeArticleCategoryScrm.class);
+        return util.exportExcel(list, "homeCategory");
+    }
+
+    /**
+     * 获取期刊分类详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeCategory:query')")
+    @GetMapping(value = "/{categoryId}")
+    public AjaxResult getInfo(@PathVariable("categoryId") Long categoryId) {
+        return AjaxResult.success(fsHomeArticleCategoryService.selectFsHomeArticleCategoryById(categoryId));
+    }
+
+    /**
+     * 新增期刊分类
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeCategory:add')")
+    @Log(title = "期刊分类", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsHomeArticleCategoryScrm fsHomeArticleCategory) {
+        return toAjax(fsHomeArticleCategoryService.insertFsHomeArticleCategory(fsHomeArticleCategory));
+    }
+
+    /**
+     * 修改期刊分类
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeCategory:edit')")
+    @Log(title = "期刊分类", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsHomeArticleCategoryScrm fsHomeArticleCategory) {
+        return toAjax(fsHomeArticleCategoryService.updateFsHomeArticleCategory(fsHomeArticleCategory));
+    }
+
+    /**
+     * 删除期刊分类
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeCategory:remove')")
+    @Log(title = "期刊分类", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{categoryIds}")
+    public AjaxResult remove(@PathVariable Long[] categoryIds) {
+        return toAjax(fsHomeArticleCategoryService.deleteFsHomeArticleCategoryByIds(categoryIds));
+    }
+
+    @GetMapping("/allList")
+    public R getAllList(FsHomeArticleCategoryScrm fsHomeArticleCategory) {
+        fsHomeArticleCategory.setStatus(1);
+        List<FsHomeArticleCategoryScrm> list = fsHomeArticleCategoryService.selectFsHomeArticleCategoryList(fsHomeArticleCategory);
+        return R.ok().put("rows", list);
+    }
+
+}

+ 94 - 0
fs-admin/src/main/java/com/fs/his/controller/FsHomeArticleController.java

@@ -0,0 +1,94 @@
+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.core.domain.R;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.hisStore.domain.FsHomeArticleScrm;
+import com.fs.hisStore.service.IFsHomeArticleScrmService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+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 2025-05-21
+ */
+@RestController
+@RequestMapping("/his/homeArticle")
+public class FsHomeArticleController extends BaseController {
+    @Autowired
+    private IFsHomeArticleScrmService fsHomeArticleService;
+
+    /**
+     * 查询期刊列表
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeArticle:list')")
+    @GetMapping("/list")
+    public R list(FsHomeArticleScrm fsHomeArticle)
+    {
+        PageHelper.startPage(fsHomeArticle.getPageNum(), fsHomeArticle.getPageSize());
+        List<FsHomeArticleScrm> list = fsHomeArticleService.selectFsHomeArticleList(fsHomeArticle);
+        PageInfo<FsHomeArticleScrm> listPageInfo = new PageInfo<>(list);
+        return R.ok().put("rows", listPageInfo);
+    }
+
+    /**
+     * 导出期刊列表
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeArticle:export')")
+    @Log(title = "期刊", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsHomeArticleScrm fsHomeArticle) {
+        List<FsHomeArticleScrm> list = fsHomeArticleService.selectFsHomeArticleList(fsHomeArticle);
+        ExcelUtil<FsHomeArticleScrm> util = new ExcelUtil<FsHomeArticleScrm>(FsHomeArticleScrm.class);
+        return util.exportExcel(list, "homArticle");
+    }
+
+    /**
+     * 获取期刊详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeArticle:query')")
+    @GetMapping(value = "/{articleId}")
+    public AjaxResult getInfo(@PathVariable("articleId") Long articleId) {
+        return AjaxResult.success(fsHomeArticleService.selectFsHomeArticleById(articleId));
+    }
+
+    /**
+     * 新增期刊
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeArticle:add')")
+    @Log(title = "期刊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsHomeArticleScrm fsHomeArticle) {
+        return toAjax(fsHomeArticleService.insertFsHomeArticle(fsHomeArticle));
+    }
+
+    /**
+     * 修改期刊
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeArticle:edit')")
+    @Log(title = "期刊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsHomeArticleScrm fsHomeArticle) {
+        return toAjax(fsHomeArticleService.updateFsHomeArticle(fsHomeArticle));
+    }
+
+    /**
+     * 删除期刊
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeArticle:remove')")
+    @Log(title = "期刊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{articleIds}")
+    public AjaxResult remove(@PathVariable Long[] articleIds) {
+        return toAjax(fsHomeArticleService.deleteFsHomeArticleByIds(articleIds));
+    }
+}

+ 93 - 0
fs-admin/src/main/java/com/fs/his/controller/FsHomeArticleViewController.java

@@ -0,0 +1,93 @@
+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.core.domain.R;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.hisStore.domain.FsHomeArticleViewScrm;
+import com.fs.hisStore.service.IFsHomeArticleViewScrmService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+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 2025-05-21
+ */
+@RestController
+@RequestMapping("/his/homeView")
+public class FsHomeArticleViewController extends BaseController {
+    @Autowired
+    private IFsHomeArticleViewScrmService fsHomeArticleViewService;
+
+    /**
+     * 查询期刊阅读列表
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeView:list')")
+    @GetMapping("/list")
+    public R list(FsHomeArticleViewScrm fsHomeArticleView) {
+        PageHelper.startPage(fsHomeArticleView.getPageNum(), fsHomeArticleView.getPageSize());
+        List<FsHomeArticleViewScrm> list = fsHomeArticleViewService.selectFsHomeArticleViewList(fsHomeArticleView);
+        PageInfo<FsHomeArticleViewScrm> listPageInfo = new PageInfo<>(list);
+        return R.ok().put("rows", listPageInfo);
+    }
+
+    /**
+     * 导出期刊阅读列表
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeView:export')")
+    @Log(title = "期刊阅读", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsHomeArticleViewScrm fsHomeArticleView) {
+        List<FsHomeArticleViewScrm> list = fsHomeArticleViewService.selectFsHomeArticleViewList(fsHomeArticleView);
+        ExcelUtil<FsHomeArticleViewScrm> util = new ExcelUtil<FsHomeArticleViewScrm>(FsHomeArticleViewScrm.class);
+        return util.exportExcel(list, "homeView");
+    }
+
+    /**
+     * 获取期刊阅读详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeView:query')")
+    @GetMapping(value = "/{viewId}")
+    public AjaxResult getInfo(@PathVariable("viewId") Long viewId) {
+        return AjaxResult.success(fsHomeArticleViewService.selectFsHomeArticleViewById(viewId));
+    }
+
+    /**
+     * 新增期刊阅读
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeView:add')")
+    @Log(title = "期刊阅读", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsHomeArticleViewScrm fsHomeArticleView) {
+        return toAjax(fsHomeArticleViewService.insertFsHomeArticleView(fsHomeArticleView));
+    }
+
+    /**
+     * 修改期刊阅读
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeView:edit')")
+    @Log(title = "期刊阅读", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsHomeArticleViewScrm fsHomeArticleView) {
+        return toAjax(fsHomeArticleViewService.updateFsHomeArticleView(fsHomeArticleView));
+    }
+
+    /**
+     * 删除期刊阅读
+     */
+    @PreAuthorize("@ss.hasPermi('store:homeView:remove')")
+    @Log(title = "期刊阅读", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{viewIds}")
+    public AjaxResult remove(@PathVariable Long[] viewIds) {
+        return toAjax(fsHomeArticleViewService.deleteFsHomeArticleViewByIds(viewIds));
+    }
+}

+ 2 - 0
fs-admin/src/main/java/com/fs/his/controller/FsPackageOrderController.java

@@ -77,6 +77,7 @@ public class FsPackageOrderController extends BaseController
     @GetMapping("/export")
     public AjaxResult export(FsPackageOrderParam  fsPackageOrder)
     {
+        Integer status = fsPackageOrder.getStatus();
         Integer exportType1 = exportTaskService.isExportType1(SecurityUtils.getUserId());
         if (exportType1>0){
             return AjaxResult.error("你已经有正在导出的任务");
@@ -85,6 +86,7 @@ public class FsPackageOrderController extends BaseController
         if (fsPackageOrderService.isEntityNull(fsPackageOrder)){
             return AjaxResult.error("请筛选数据导出");
         }
+        fsPackageOrder.setStatus(status); //解决isEntityNull方法后status缺失
         Long count = fsPackageOrderService.selectFsPackageOrderExcelListVOCount(fsPackageOrder);
         if (count>30000){
             return AjaxResult.error("导出数据不可超过3w条");

+ 4 - 2
fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java

@@ -528,7 +528,8 @@ public class FsStoreOrderController extends BaseController
     @PutMapping("/sendGoods")
     public AjaxResult sendGoods(@RequestBody FsStoreOrder fsStoreOrder)
     {
-        return toAjax(fsStoreOrderService.sendGoods(fsStoreOrder));
+        String nickName = getLoginUser().getUser().getNickName();
+        return toAjax(fsStoreOrderService.sendGoods(fsStoreOrder,nickName));
     }
     /**
      * 推送到智慧药房
@@ -560,7 +561,8 @@ public class FsStoreOrderController extends BaseController
     public AjaxResult getGoods(@RequestBody FsStoreOrder fsStoreOrder)
     {
         logger.info("总后台手动确认收货:"+fsStoreOrder.getOrderId());
-        return toAjax(fsStoreOrderService.getGoods(fsStoreOrder.getOrderId()));
+        String nickName = getLoginUser().getUser().getNickName();
+        return toAjax(fsStoreOrderService.getGoods(fsStoreOrder.getOrderId(),nickName));
     }
 
     /**

+ 4 - 0
fs-admin/src/main/java/com/fs/his/controller/FsUserAddressController.java

@@ -99,6 +99,10 @@ public class FsUserAddressController extends BaseController
         String kdnAddress = fsUserAddressService.getKdnAddress(address);
         AddressInfoDTO addressInfoDTO = JSON.parseObject(kdnAddress, AddressInfoDTO.class);
         AddressInfoDTO.AddressData data = addressInfoDTO.getData();
+        logger.info("快递鸟返回:"+kdnAddress);
+        if (data==null){
+            return AjaxResult.error("解析地址失败请输入正确地址");
+        }
         String provinceName = data.getProvinceName();
         if (!provinceName.contains("省") && !provinceName.contains("区")){
             data.setProvinceName(data.getProvinceName()+"市");

+ 12 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwTagGroupController.java

@@ -38,4 +38,16 @@ public class QwTagGroupController extends BaseController
         List<QwTagGroupListVO> list = qwTagGroupService.selectQwTagGroupListVO(qwTagGroup);
         return getDataTable(list);
     }
+
+    /**
+     * 所有标签列表(无分页)
+     * @param qwTagGroup
+     * @return
+     */
+    @GetMapping("/getAllList")
+    public TableDataInfo getAllList(QwTagGroup qwTagGroup)
+    {
+        List<QwTagGroupListVO> list = qwTagGroupService.selectQwTagGroupListVO(qwTagGroup);
+        return getDataTable(list);
+    }
 }

+ 62 - 0
fs-admin/src/main/java/com/fs/stats/FsStatsMemberController.java

@@ -0,0 +1,62 @@
+package com.fs.stats;
+
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.statis.service.IFsStatsMemberDailyService;
+import com.fs.statis.vo.FsStatsMemberDailyVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDate;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/stats/member")
+@AllArgsConstructor
+public class FsStatsMemberController {
+
+    private final IFsStatsMemberDailyService statsMemberDailyService;
+
+    @GetMapping("/dailyData")
+    public AjaxResult dailyData(@RequestParam String startDate,
+                                @RequestParam String endDate,
+                                @RequestParam Integer type,
+                                @RequestParam(required = false) Long companyId,
+                                @RequestParam(required = false) Long companyUserId,
+                                @RequestParam(required = false) Long userId,
+                                @RequestParam(required = false) String phone,
+                                @RequestParam(required = false) Long trainCampId,
+                                @RequestParam(required = false) Long periodId,
+                                @RequestParam(required = false) Long courseId,
+                                @RequestParam(required = false) Long videoId,
+                                @RequestParam(required = false, defaultValue = "1") Integer pageNum,
+                                @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("companyId", companyId);
+        params.put("companyUserId", companyUserId);
+        params.put("userId", userId);
+        params.put("phone", phone);
+        params.put("trainCampId", trainCampId);
+        params.put("periodId", periodId);
+        params.put("courseId", courseId);
+        params.put("videoId", videoId);
+
+        if (type == 1) {
+            params.put("startDate", LocalDate.parse(startDate));
+            params.put("endDate", LocalDate.parse(endDate).plusDays(1));
+        } else {
+            params.put("startDate", LocalDate.parse(startDate).withDayOfMonth(1));
+            params.put("endDate", LocalDate.parse(endDate).withDayOfMonth(1).plusMonths(1));
+        }
+
+        PageHelper.startPage(pageNum, pageSize);
+        List<FsStatsMemberDailyVO> list = statsMemberDailyService.selectDailyData(params);
+        return AjaxResult.success(new PageInfo<>(list));
+    }
+}

+ 7 - 6
fs-common/src/main/java/com/fs/common/utils/CloudHostUtils.java

@@ -3,21 +3,22 @@ package com.fs.common.utils;
 
 import com.fs.common.utils.spring.SpringUtils;
 
+import java.util.Arrays;
+
 public class CloudHostUtils {
 
     /**
      * 是否指定项目名称配置
      */
-    public static boolean isCloudHostName(String cloudHostName) {
+    public static boolean hasCloudHostName(String... cloudHostName) {
         String cloudHostNameConfig = SpringUtils.getProperty("cloud_host.company_name");
         if (StringUtils.isBlank(cloudHostNameConfig)) {
             return false;
         }
 
-        if (StringUtils.isBlank(cloudHostName)) {
-            return false;
-        }
-
-        return cloudHostNameConfig.equalsIgnoreCase(cloudHostName);
+        return Arrays.stream(cloudHostName)
+                .filter(StringUtils::isNotBlank)
+                .map(String::trim)
+                .anyMatch(name -> cloudHostNameConfig.equalsIgnoreCase(name.trim()));
     }
 }

+ 13 - 0
fs-company-app/src/main/java/com/fs/app/exception/FSExceptionHandler.java

@@ -5,6 +5,7 @@ package com.fs.app.exception;
 
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
+import com.fs.common.exception.ServiceException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
@@ -36,6 +37,18 @@ public class FSExceptionHandler {
 		return r;
 	}
 
+	/**
+	 * 处理自定义异常
+	 */
+	@ExceptionHandler(ServiceException.class)
+	public R handleRRException(ServiceException e){
+		R r = new R();
+		r.put("code", e.getCode());
+		r.put("msg", e.getMessage());
+
+		return r;
+	}
+
 	@ExceptionHandler(NoHandlerFoundException.class)
 	public R handlerNoFoundException(Exception e) {
 		logger.error(e.getMessage(), e);

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

@@ -22,6 +22,7 @@ import com.fs.company.param.CompanyUserCodeParam;
 import com.fs.company.param.CompanyUserQwParam;
 import com.fs.company.service.*;
 import com.fs.company.utils.DomainUtil;
+import com.fs.company.vo.CompanyUserImportVO;
 import com.fs.company.vo.CompanyUserQwListVO;
 import com.fs.company.vo.CompanyUserVO;
 import com.fs.course.config.CourseConfig;
@@ -30,6 +31,7 @@ import com.fs.framework.security.SecurityUtils;
 import com.fs.framework.service.TokenService;
 import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.his.vo.OptionsVO;
+import com.fs.hisStore.vo.FsStoreProductExportVO;
 import com.fs.im.config.IMConfig;
 import com.fs.im.service.OpenIMService;
 import com.fs.qw.domain.QwCompany;
@@ -140,7 +142,7 @@ public class CompanyUserController extends BaseController
         }
         return getDataTable(list);
     }
-    @Log(title = "用户管理", businessType = BusinessType.EXPORT)
+    @Log(title = "用户管理导出", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('company:user:export')")
     @GetMapping("/export")
     public AjaxResult export(CompanyUser user)
@@ -153,6 +155,26 @@ public class CompanyUserController extends BaseController
     }
 
 
+    @Log(title = "销售信息导入", businessType = BusinessType.IMPORT,isStoreLog = true,logParam = {"销售","信息导入"})
+    @PreAuthorize("@ss.hasPermi('company:user:import')")
+    @PostMapping("/importCompanyUser")
+    public AjaxResult importData(@RequestParam("file") MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<CompanyUserImportVO> util = new ExcelUtil<>(CompanyUserImportVO.class);
+        List<CompanyUserImportVO> list = util.importExcel(file.getInputStream());
+        String message = companyUserService.importCompanyUser(list, updateSupport);
+        return AjaxResult.success(message);
+    }
+
+
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<CompanyUserImportVO> util = new ExcelUtil<>(CompanyUserImportVO.class);
+        return util.importTemplateExcel("销售数据");
+    }
+
+
 
     /**
      * 根据用户编号获取详细信息

+ 41 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwUserVoiceLogController.java

@@ -10,14 +10,20 @@ import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.qw.domain.QwUserVoiceLog;
+import com.fs.qw.param.QwTagSearchParam;
+import com.fs.qw.service.IQwTagService;
 import com.fs.qw.service.IQwUserVoiceLogService;
 import com.fs.qw.vo.QwUserVoiceLogTotalVo;
 import com.fs.qw.vo.QwUserVoiceLogVo;
+import com.github.pagehelper.PageHelper;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 企微用户通话记录Controller
@@ -35,6 +41,9 @@ public class QwUserVoiceLogController extends BaseController
     @Autowired
     private TokenService tokenService;
 
+    @Autowired
+    private IQwTagService iQwTagService;
+
     /**
      * 查询企微用户通话记录列表
      */
@@ -49,6 +58,35 @@ public class QwUserVoiceLogController extends BaseController
         return getDataTable(list);
     }
 
+
+    /**
+     * 查询企微用户通话记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwUserVoiceLog:list')")
+    @PostMapping("/newList")
+    public TableDataInfo newList(@RequestBody QwUserVoiceLogVo qwUserVoiceLog)
+    {
+        PageHelper.startPage(qwUserVoiceLog.getPageNum(), qwUserVoiceLog.getPageSize());
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        qwUserVoiceLog.setCompanyId(loginUser.getCompany().getCompanyId());
+        List<QwUserVoiceLogVo> list = qwUserVoiceLogService.selectQwUserVoiceLogList(qwUserVoiceLog);
+        list.forEach(item->{
+
+            if (!Objects.equals(item.getQwExternalContact().getTagIds(), "[]") && item.getQwExternalContact().getTagIds()!=null) {
+                QwTagSearchParam param = new QwTagSearchParam();
+                Gson gson = new Gson();
+                List<String> tagIds = gson.fromJson(
+                        item.getQwExternalContact().getTagIds(),
+                        new TypeToken<List<String>>() {
+                        }.getType()
+                );
+                param.setTagIds(tagIds);
+                item.setTagIdsName(iQwTagService.selectQwTagListByTagIds(param));
+            }
+        });
+        return getDataTable(list);
+    }
+
     /**
      * 查询我的通话记录列表
      * @param qwUserVoiceLog
@@ -141,6 +179,9 @@ public class QwUserVoiceLogController extends BaseController
     @GetMapping("/totalExport")
     public AjaxResult totalExport(QwUserVoiceLogTotalVo qwUserVoiceLog)
     {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        qwUserVoiceLog.setCompanyId(loginUser.getCompany().getCompanyId());
+        qwUserVoiceLog.setQwUserId(1L);
         List<QwUserVoiceLogTotalVo> list = qwUserVoiceLogService.selectQwUserVoiceLogTotalList(qwUserVoiceLog);
         list.forEach(m-> {
             m.setQwUserName(m.getQwUser().getQwUserName());

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

@@ -347,7 +347,8 @@ public class FsStoreOrderController extends BaseController
     @PutMapping("/sendGoods")
     public AjaxResult sendGoods(@RequestBody FsStoreOrder fsStoreOrder)
     {
-        return toAjax(fsStoreOrderService.sendGoods(fsStoreOrder));
+        String nickName = getLoginUser().getUser().getNickName();
+        return toAjax(fsStoreOrderService.sendGoods(fsStoreOrder,nickName));
     }
 
     @PutMapping("/bindCustomer")
@@ -401,7 +402,8 @@ public class FsStoreOrderController extends BaseController
     @RepeatSubmit
     public AjaxResult getGoods(@RequestBody FsStoreOrder fsStoreOrder)
     {
-        return toAjax(fsStoreOrderService.getGoods(fsStoreOrder.getOrderId()));
+        String nickName = getLoginUser().getUser().getNickName();
+        return toAjax(fsStoreOrderService.getGoods(fsStoreOrder.getOrderId(),nickName));
     }
 
     /**

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

@@ -134,7 +134,7 @@ public class DoctorController extends  AppBaseController {
                 int accountStatus = resultObj.getInt("accountStatus");
                 //未注册自动注册
                 if (accountStatus==0){
-                    String s = userId.replaceFirst("^"+IMConfig.PREFIX+"D", "");
+                    String s = userId.replaceFirst("^D", "");
                     FsDoctor fsDoctor = doctorService.selectFsDoctorByDoctorId(Long.parseLong(s));
                     if (null==fsDoctor){
                         return R.error("用户不存在");
@@ -143,10 +143,10 @@ public class DoctorController extends  AppBaseController {
                     HashMap<String, String> map = new HashMap<>();
                     map.put("userID",userId);
                     map.put("nickname",fsDoctor.getDoctorName());
-                    map.put("faceURL",StringUtils.isEmpty(fsDoctor.getAvatar())?"https://cos.his.cdwjyyh.com/fs/20240926/420728ee06e54575ba82665dedb4756b.png":fsDoctor.getAvatar());
+                    map.put("faceURL",fsDoctor.getAvatar());
                     users.add(map);
                     requestBody = new JSONObject();
-                    //userIds.add(userId);
+                    userIds.add(userId);
                     requestBody.put("users", users);
                     String body1 = HttpRequest.post(IMConfig.URL+"/user/user_register")
                             .header("operationID", String.valueOf(System.currentTimeMillis()))
@@ -156,6 +156,9 @@ public class DoctorController extends  AppBaseController {
             } else {
                 return R.error("返回结果为空");
             }
+           /* HashMap<String, String> tokenMap = new HashMap<>();
+            tokenMap.put("platformID","1");
+            tokenMap.put("userID",userId);*/
             requestBody = new JSONObject();
             requestBody.put("platformID",5);
             requestBody.put("userID",userId);

+ 7 - 8
fs-doctor-app/src/main/java/com/fs/framework/config/MyBatisConfig.java

@@ -1,6 +1,5 @@
 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;
@@ -140,11 +139,11 @@ public SqlSessionFactory sqlSessionFactorys(DataSource dataSource) throws Except
     typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
     VFS.addImplClass(SpringBootVFS.class);
 
-    final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
-    sessionFactory.setDataSource(dataSource);
-    sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
-    sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
-    sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
-    return sessionFactory.getObject();
-}
+        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+        sessionFactory.setDataSource(dataSource);
+        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
+        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
+        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
+        return sessionFactory.getObject();
+    }
 }

+ 2 - 0
fs-service/src/main/java/com/fs/aiTongueApi/config/AiTongueConfig.java

@@ -5,4 +5,6 @@ public interface AiTongueConfig {
     String quanxiUrl="https://api.aikanshe.com/agency/quanxi";
     String checkTongue="https://api.aikanshe.com/agency/checkTongue";
     String appKey="";
+
+    String newCheckTongue="http://132.232.234.246:5056/api/detect";
 }

+ 58 - 0
fs-service/src/main/java/com/fs/aiTongueApi/domain/enums/TongueTypeEnums.java

@@ -0,0 +1,58 @@
+package com.fs.aiTongueApi.domain.enums;
+
+public enum TongueTypeEnums {
+
+    SheZhi_xianHong("SheZhi","01","主热证,可能是身体积热过多。舌尖红有芒刺表示心火上炎;"),
+    SheZhi_danBai("SheZhi","02","淡白舌而属于机体虚证、寒证之舌象。"),
+    SheZhi_danHong("SheZhi","03","为正常舌色或者疾病初期舌象。"),
+    SheZhi_zi("SheZhi","04","舌质带紫色,有可能是拍照原因。"),
+
+    TaiSe_huang("TaiSe","01","主里证、热证。舌苔灰黄而干燥,表示身体有内热,耗伤津液。"),
+    TaiSe_hui("TaiSe","02","主里证苔厚腻,为湿浊、痰饮。"),
+    TaiSe_bai("TaiSe","03","舌苔薄白为正常舌苔或表证初起。苔白而润滑,为里寒证;"),
+
+    Xing_boTuo("Xing","01","舌见剥落表示脏腑气阴不平衡。"),
+    Xing_chiHen("Xing","02","舌见齿痕表示脾虚或湿盛证。"),
+    Xing_lieWen("Xing","03","舌见裂纹提示脏腑阴血亏虚。"),
+
+    HouDu_hou("HouDu","01","厚"),
+    HouDu_bao("HouDu","02","薄");
+
+    private final String category;
+    private final String code;
+    private final String description;
+
+    TongueTypeEnums(String category, String code, String description) {
+        this.category = category;
+        this.code = code;
+        this.description = description;
+    }
+
+
+    public String getCategory() {
+        return category;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+
+    public String getDescription() {
+        return description;
+    }
+
+
+    public static String fromCategoryAndCode(String category, String code) {
+        for (TongueTypeEnums type : TongueTypeEnums.values()) {
+            if (type.getCategory().equals(category) && type.getCode().equals(code)) {
+                return type.getDescription();
+            }
+        }
+        return null;
+    }
+
+
+
+
+}

+ 14 - 0
fs-service/src/main/java/com/fs/aiTongueApi/domain/inner/ConfidenceDataNew.java

@@ -0,0 +1,14 @@
+package com.fs.aiTongueApi.domain.inner;
+
+import lombok.Data;
+
+@Data
+public class ConfidenceDataNew {
+
+    private int sub; // 下标
+    private String label; // 类别
+    private String labelName; // 类别名称
+    private String val; // 置信度
+    private int[] xyxy; // 坐标 (没啥大用,凑凑数)
+
+}

+ 14 - 0
fs-service/src/main/java/com/fs/aiTongueApi/domain/inner/TongueInfo.java

@@ -0,0 +1,14 @@
+package com.fs.aiTongueApi.domain.inner;
+
+import lombok.Data;
+
+@Data
+public class TongueInfo {
+    private Long id;
+    private Integer botai;
+    private String houdu;
+    private String shemianName;
+    private String taiseName;
+    private String typeName;
+    private String typeJson;
+}

+ 3 - 0
fs-service/src/main/java/com/fs/aiTongueApi/service/AiTongueService.java

@@ -5,6 +5,7 @@ import com.fs.aiTongueApi.domain.QueryAiTongue;
 import com.fs.aiTongueApi.domain.QueryQuanXi;
 import com.fs.aiTongueApi.domain.inner.ConfidenceData;
 import com.fs.aiTongueApi.domain.inner.TongueData;
+import com.fs.his.domain.FsHealthTongue;
 
 public interface AiTongueService {
     AITongueResult<TongueData> getHistoryTongue(QueryAiTongue queryAiTongue);
@@ -12,4 +13,6 @@ public interface AiTongueService {
     AITongueResult<ConfidenceData> checkTongue(String url);
 
     AITongueResult<TongueData> quanXiTongue(QueryQuanXi queryQuanXi);
+
+    AITongueResult<FsHealthTongue> newCheckTongue(String tongueUrl);
 }

+ 187 - 2
fs-service/src/main/java/com/fs/aiTongueApi/service/impl/AiTongueServiceImpl.java

@@ -6,10 +6,13 @@ import com.fs.aiTongueApi.config.AiTongueConfig;
 import com.fs.aiTongueApi.domain.AITongueResult;
 import com.fs.aiTongueApi.domain.QueryAiTongue;
 import com.fs.aiTongueApi.domain.QueryQuanXi;
-import com.fs.aiTongueApi.domain.inner.ConfidenceData;
-import com.fs.aiTongueApi.domain.inner.TongueData;
+import com.fs.aiTongueApi.domain.enums.TongueTypeEnums;
+import com.fs.aiTongueApi.domain.inner.*;
 import com.fs.aiTongueApi.service.AiTongueService;
 import com.fs.common.utils.uuid.UUID;
+import com.fs.his.domain.FsHealthTongue;
+import com.fs.his.service.IFsHealthTongueService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.hc.core5.net.URIBuilder;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
@@ -20,6 +23,8 @@ import org.apache.http.entity.StringEntity;
 import org.apache.http.entity.mime.MultipartEntityBuilder;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.io.InputStream;
@@ -27,9 +32,18 @@ import java.net.URI;
 import java.net.URL;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+@Slf4j
 @Service
 public class AiTongueServiceImpl implements AiTongueService {
 
+    @Autowired
+    private IFsHealthTongueService tongueService;
+
     @Override
     public AITongueResult<TongueData> getHistoryTongue(QueryAiTongue queryAiTongue) {
         queryAiTongue.setAppkey(AiTongueConfig.appKey);
@@ -108,6 +122,177 @@ public class AiTongueServiceImpl implements AiTongueService {
         return aiTongueResult;
     }
 
+    @Override
+    public AITongueResult<FsHealthTongue> newCheckTongue(String url) {
+        String s="";
+        try {
+            HttpClient httpClient = HttpClients.createDefault();
+            HttpPost httpPost = new HttpPost(AiTongueConfig.newCheckTongue);
+            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
+            URL urlItem = new URL(url);
+            InputStream inputStream =urlItem.openStream();
+            // 添加文件或表单参数
+            builder.addBinaryBody("file", inputStream, ContentType.DEFAULT_BINARY, "图片.jpg");
+
+            HttpEntity multipart = builder.build();
+            httpPost.setEntity(multipart);
+            // 执行请求
+            HttpResponse response = httpClient.execute(httpPost);
+            String responseBody = EntityUtils.toString(response.getEntity());
+            log.info(responseBody);
+            s=responseBody;
+
+            AITongueResult<List<List<ConfidenceDataNew>>> aiTongueResult = JSON.parseObject(s, new TypeReference<AITongueResult<List<List<ConfidenceDataNew>>>>(){});
+            List<List<ConfidenceDataNew>> data = aiTongueResult.getData();
+            FsHealthTongue healthTongue = new FsHealthTongue();
+            if (data != null && !data.isEmpty()){
+                String boTaiDesc =  "舌未见剥落提示脏腑气充足,胃阴正常,气阴平衡。";
+                String chiHenDesc = "舌未见齿痕表示脾气正常。";
+                String lieWenDesc = "舌未见裂纹表示脏腑津液正常。";
+                String houDu;
+                TongueInfo tongueInfo = new TongueInfo();
+                for (int i = 0; i < 4; i++) {
+                    List<ConfidenceDataNew> confidenceDataNews = data.get(i);
+                    if (confidenceDataNews != null && !confidenceDataNews.isEmpty()){
+                        Optional<ConfidenceDataNew> oldestPerson = confidenceDataNews.stream()
+                                .max(Comparator.comparingDouble(p -> Double.parseDouble(p.getVal())));
+                        ConfidenceDataNew confidenceDataNew = oldestPerson.get();
+
+                        healthTongue.setTongueUrl(url);
+                        if(i == 0){
+                            switch (confidenceDataNew.getLabel()){
+                                case "01":
+                                    healthTongue.setShemianName("鲜红舌");
+                                    break;
+                                case "02":
+                                    healthTongue.setShemianName("淡白舌");
+                                    break;
+                                case "03":
+                                    healthTongue.setShemianName("淡红舌");
+                                    break;
+                                case "04":
+                                    healthTongue.setShemianName("紫舌");
+                                    break;
+                            }
+                            String sheZhi = TongueTypeEnums.fromCategoryAndCode("SheZhi", confidenceDataNew.getLabel());
+                            healthTongue.setShemianDesc(sheZhi);
+                            //设置舌质
+                            tongueInfo.setShemianName(healthTongue.getShemianName());
+                        }
+                        if(i == 1){
+                            switch (confidenceDataNew.getLabel()){
+                                case "01":
+                                    healthTongue.setTaiseName("黄苔");
+                                    break;
+                                case "02":
+                                    healthTongue.setTaiseName("灰苔");
+                                    break;
+                                case "03":
+                                    healthTongue.setTaiseName("白苔");
+                                    break;
+                            }
+                            String taiSe = TongueTypeEnums.fromCategoryAndCode("TaiSe", confidenceDataNew.getLabel());
+                            healthTongue.setTaiseDesc(taiSe);
+                            //设置苔色
+                            tongueInfo.setTaiseName(healthTongue.getTaiseName());
+                        }
+                        if(i == 2){
+                            switch (confidenceDataNew.getLabel()){
+                                case "01":
+                                    healthTongue.setBotai(1L);
+                                    String boTai = TongueTypeEnums.fromCategoryAndCode("Xing", "01");
+                                    healthTongue.setBotaiDesc(boTai);
+                                    //设置是否剥脱 0正常 1剥脱
+                                    tongueInfo.setBotai(1);
+
+                                    healthTongue.setChihen(0L);
+                                    healthTongue.setChihenDesc(chiHenDesc);
+                                    healthTongue.setLiewen(0);
+                                    healthTongue.setLiewenDesc(lieWenDesc);
+                                    break;
+                                case "02":
+                                    healthTongue.setBotai(0L);
+                                    healthTongue.setBotaiDesc(boTaiDesc);
+                                    //设置是否剥脱 0正常 1剥脱
+                                    tongueInfo.setBotai(0);
+
+                                    healthTongue.setChihen(1L);
+                                    String chiHen = TongueTypeEnums.fromCategoryAndCode("Xing", "02");
+                                    healthTongue.setChihenDesc(chiHen);
+                                    healthTongue.setLiewen(0);
+                                    healthTongue.setLiewenDesc(lieWenDesc);
+                                    break;
+                                case "03":
+                                    healthTongue.setBotai(0L);
+                                    healthTongue.setBotaiDesc(boTaiDesc);
+                                    //设置是否剥脱 0正常 1剥脱
+                                    tongueInfo.setBotai(0);
+
+                                    healthTongue.setChihen(0L);
+                                    healthTongue.setChihenDesc(chiHenDesc);
+                                    healthTongue.setLiewen(1);
+                                    String lieWen = TongueTypeEnums.fromCategoryAndCode("Xing", "03");
+                                    healthTongue.setLiewenDesc(lieWen);
+                                    break;
+                            }
+                        }
+                        if(i == 3){
+                            switch (confidenceDataNew.getLabel()){
+                                case "01":
+                                    //厚
+                                    houDu = TongueTypeEnums.fromCategoryAndCode("HouDu", "01");
+                                    break;
+                                default:
+                                    //薄
+                                    houDu = TongueTypeEnums.fromCategoryAndCode("HouDu", "02");
+                                    break;
+                            }
+                            //设置厚度
+                            tongueInfo.setHoudu(houDu);
+                        }
+
+                    }else{
+                        //形状相关的为空就将这几个值置为0(表示正常)
+                        if(i == 2){
+                            healthTongue.setBotai(0L);
+                            healthTongue.setBotaiDesc(boTaiDesc);
+                            //设置是否剥脱 0正常 1剥脱
+                            tongueInfo.setBotai(0);
+
+                            healthTongue.setChihen(0L);
+                            healthTongue.setChihenDesc(chiHenDesc);
+                            healthTongue.setLiewen(0);
+                            healthTongue.setLiewenDesc(lieWenDesc);
+                        }
+                    }
+                }
+
+                TongueInfo fastTongueInfo = tongueService.selectFsTongueInfo(tongueInfo);
+                if(fastTongueInfo != null && fastTongueInfo.getTypeName() != null){
+                    healthTongue.setTypeName(fastTongueInfo.getTypeName());
+                    healthTongue.setTypeJson(fastTongueInfo.getTypeJson());
+                    return getAiTongueResult(healthTongue,"40001","ok");
+                }
+                return getAiTongueResult(healthTongue,"40003","未检测到舌头,请按照要求查询拍照检测");
+            }
+            return getAiTongueResult(healthTongue,"40003","未能从服务器获取结果,请稍后再试");
+        } catch (Exception e) {
+            return getAiTongueResult(null,"40003","请求频繁,请稍后再试");
+        }
+    }
+
+    private static @NotNull AITongueResult<FsHealthTongue> getAiTongueResult(FsHealthTongue healthTongue, String code, String msg) {
+        AITongueResult<FsHealthTongue> result = new AITongueResult<>();
+        result.setData(healthTongue);
+        result.setCode(code);
+        meta meta = new meta();
+        meta.setCode(code);
+        meta.setMsg(msg);
+        meta.setTimestamp(String.valueOf(new Date()));
+        result.setMeta(meta);
+        return result;
+    }
+
 
     public  String sendPost(String url,Object param){
         HttpClient httpClient = HttpClients.createDefault();

+ 2 - 2
fs-service/src/main/java/com/fs/company/domain/CompanyUser.java

@@ -35,8 +35,8 @@ public class CompanyUser extends BaseEntity
 
     private String corpId;
 
-    /** 部门ID */
-    @Excel(name = "部门ID")
+    /** 部门编号 */
+    @Excel(name = "部门编号")
     private Long deptId;
 
     /** 用户账号 */

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

@@ -116,4 +116,6 @@ public interface CompanyDeptMapper
 
     @Select("select dept_id,dept_name from company_dept where dept_name=#{deptName} limit 1")
     CompanyDept selectDeptNameBydeptName(@Param("deptName") String deptName);
+
+    void deleteCompanyDeptByCompanyIds(Long[] companyIds);
 }

+ 1 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyRoleMapper.java

@@ -84,4 +84,5 @@ public interface CompanyRoleMapper
      * @return 角色信息
      * **/
     CompanyRole selectCompanyRoleByRoleKey(@Param("roleKey") String roleKey);
+    Long selectRolesByUserNameAndCompanyId(@Param("roleName") String roleName,@Param("companyId") Long companyId);
 }

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

@@ -315,4 +315,7 @@ public interface CompanyUserMapper
 
     @Update("update company_user set doctor_id = null where user_id = #{userId}")
     public int unBindDoctorId(@Param("userId")Long userId);
+
+
+    List<String> selectCompanyUserNameByIdsList(@Param("companyUserIDs")List<Long> companyUserID);
 }

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

@@ -8,6 +8,7 @@ import com.fs.company.param.CompanyUserQwParam;
 import com.fs.company.vo.*;
 import com.fs.his.vo.CitysAreaVO;
 import com.fs.his.vo.OptionsVO;
+import com.fs.hisStore.vo.FsStoreProductExportVO;
 import com.fs.qw.dto.UserProjectDTO;
 import com.fs.qw.vo.CompanyUserQwVO;
 import com.fs.qw.vo.QwOptionsVO;
@@ -53,6 +54,9 @@ public interface ICompanyUserService {
      */
     public int insertCompanyUser(CompanyUser companyUser);
 
+    String importCompanyUser(List<CompanyUserImportVO> list, boolean updateSupport);
+
+
     /**
      * 修改物业公司管理员信息
      *

+ 6 - 1
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -295,7 +295,12 @@ public class CompanyServiceImpl implements ICompanyService
     @Override
     public int deleteCompanyByIds(Long[] companyIds)
     {
-        return companyMapper.deleteCompanyByIds(companyIds);
+        int i = companyMapper.deleteCompanyByIds(companyIds);
+        //删除对应部门
+        if (i > 0){
+            companyDeptMapper.deleteCompanyDeptByCompanyIds(companyIds);
+        }
+        return i;
     }
 
     /**

+ 166 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -1,9 +1,12 @@
 package com.fs.company.service.impl;
 
+import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
+import com.fs.common.BeanCopyUtils;
 import com.fs.common.annotation.DataScope;
 import com.fs.common.constant.UserConstants;
+import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
@@ -23,6 +26,11 @@ import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.service.IFsCityService;
 import com.fs.his.vo.CitysAreaVO;
 import com.fs.his.vo.OptionsVO;
+import com.fs.hisStore.domain.FsStoreProductAttrScrm;
+import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
+import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hisStore.dto.ProductArrtDTO;
+import com.fs.hisStore.vo.FsStoreProductExportVO;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.dto.UserProjectDTO;
 import com.fs.qw.mapper.QwUserMapper;
@@ -43,6 +51,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -152,6 +161,163 @@ public class CompanyUserServiceImpl implements ICompanyUserService
         return companyUserMapper.insertCompanyUser(companyUser);
     }
 
+    @Override
+    public String importCompanyUser(List<CompanyUserImportVO> list, boolean updateSupport) {
+
+        if (com.fs.common.utils.StringUtils.isNull(list) || list.size() == 0)
+        {
+            throw new CustomException("导入销售信息不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (CompanyUserImportVO importVO : list){
+            try
+            {
+                CompanyUser copy = BeanCopyUtils.copy(importVO, CompanyUser.class);
+
+                assert copy != null;
+
+                if (StringUtil.strIsNullOrEmpty(copy.getPassword())){
+                    throw new CustomException("密码不能为空");
+                }
+
+
+                if (!PatternUtils.checkPassword(copy.getPassword())) {
+                    throw new CustomException("密码格式不正确,需包含字母、数字和特殊字符,长度为 8-20 位");
+                }
+
+                if (copy.getCompanyId() == null){
+                    throw new CustomException("公司ID不能为空,且为数字!");
+                } else if (!String.valueOf(copy.getCompanyId()).matches("\\d+")) {
+                    throw new CustomException("公司ID必须为数字!");
+                }
+
+                if (copy.getDeptId() == null){
+                    throw new CustomException("部门编号不能为空,且为数字!");
+                } else if (!String.valueOf(copy.getDeptId()).matches("\\d+")) {
+                    throw new CustomException("部门编号必须为数字!");
+                }
+
+                if (StringUtil.strIsNullOrEmpty(copy.getPhonenumber())){
+                    throw new CustomException("手机号不能为空");
+                } else if (!copy.getPhonenumber().matches("\\d+")) {
+                    throw new CustomException("手机号必须为数字!");
+                }
+
+                if (StringUtil.strIsNullOrEmpty(copy.getAddressId())){
+                    throw new CustomException("区域不能为空");
+                } else if (!copy.getAddressId().matches("\\d+")) {
+                    throw new CustomException("区域ID必须为数字!");
+                }
+
+                Integer count=companyUserService.selectCompanyUserCountByCompanyId(copy.getCompanyId());
+                Company company=companyService.selectCompanyById(copy.getCompanyId());
+
+                if(count>company.getLimitUserCount()){
+                    throw new CustomException("销售公司的销售数量已达到上限!");
+                }
+
+                if (UserConstants.NOT_UNIQUE.equals(String.valueOf(companyUserService.checkUserName(copy.getUserName()))))
+                {
+                    throw new CustomException("新增用户'" + copy.getUserName() + "'失败,登录账号已存在");
+                }
+
+                if (StringUtil.strIsNullOrEmpty(copy.getNickName())){
+                    throw new CustomException("用户昵称不能为空");
+                }
+
+                if (StringUtil.strIsNullOrEmpty(importVO.getRoleString())){
+                    throw new CustomException("角色-不能为空");
+                }
+
+                try {
+                    String[] splitRoles = splitRoles(importVO.getRoleString());
+
+                    // 新增用户与岗位管理
+                    Set<Long> setList= new HashSet<>();
+
+                    for (String stringRole : splitRoles) {
+                        Long rolesId = roleMapper.selectRolesByUserNameAndCompanyId(stringRole, copy.getCompanyId());
+
+                        if (StringUtils.isNotNull(rolesId)) {
+                            setList.add(rolesId);
+                        }else {
+                            throw new CustomException("当前销售公司没有此角色");
+                        }
+                    }
+
+                    // 转换为 Long[]
+                    Long[] roleIds = setList.toArray(new Long[0]);
+                    copy.setRoleIds(roleIds);
+
+
+                }catch (Exception e){
+                    throw new CustomException("角色-格式不正确");
+                }
+
+
+
+                copy.setUserType("01");//一般用户
+                copy.setIsAudit(1);
+                copy.setPassword(SecurityUtils.encryptPassword(copy.getPassword()));
+                copy.setCreateTime(new Date());
+                copy.setStatus("0");
+
+                int rows = companyUserMapper.insertCompanyUser(copy);
+                if (rows>0){
+                    // 新增用户与角色管理
+                    insertUserRole(copy);
+                }else {
+                    throw new CustomException("新增用户'" + copy.getUserName() + "'失败");
+                }
+
+
+                successNum++;
+                successMsg.append("<br/>" + successNum + "、销售账号 " + copy.getUserName() + " 导入成功");
+            }
+            catch (Exception e)
+            {
+
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、销售账号 " + importVO.getUserName()  + " 导入失败:";
+                failureMsg.append(msg + e.getMessage());
+            }
+
+        }
+        if (failureNum > 0)
+        {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new CustomException(failureMsg.toString());
+        }
+        else
+        {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
+
+
+    public String[] splitRoles(String roleString) {
+        if (roleString == null || roleString.trim().isEmpty()) {
+            return new String[0];
+        }
+
+        // 预处理:替换中文标点,去除首尾空格
+        String processed = roleString
+                .replace(",", ",")
+                .replace(";", ";")
+                .replace("、", ",")
+                .trim();
+
+        // 分割并过滤空值
+        return Arrays.stream(processed.split("[,;\\s]+"))
+                .filter(s -> !s.isEmpty())
+                .map(String::trim)
+                .toArray(String[]::new);
+    }
+
     /**
      * 修改物业公司管理员信息
      *

+ 18 - 351
fs-service/src/main/java/com/fs/company/vo/CompanyUserImportVO.java

@@ -5,32 +5,24 @@ import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
 import com.fs.company.domain.CompanyDept;
 import com.fs.company.domain.CompanyRole;
+import lombok.Data;
 
 import java.util.Date;
 import java.util.List;
 
+@Data
 public class CompanyUserImportVO extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
     /** 用户ID */
     private Long userId;
 
-    /** 公司ID */
-    @Excel(name = "公司ID")
+    /** 公司编号 */
+    @Excel(name = "公司编号")
     private Long companyId;
 
-    public String getCorpId() {
-        return corpId;
-    }
-
-    public void setCorpId(String corpId) {
-        this.corpId = corpId;
-    }
-
-    private String corpId;
-
-    /** 部门ID */
-    @Excel(name = "部门ID")
+    /** 部门编号 */
+    @Excel(name = "部门编号")
     private Long deptId;
 
     /** 用户账号 */
@@ -41,8 +33,7 @@ public class CompanyUserImportVO extends BaseEntity {
     @Excel(name = "用户昵称")
     private String nickName;
 
-    /** 用户类型(00系统用户) */
-    @Excel(name = "用户类型", readConverterExp = "0=0系统用户")
+    /** 用户类型(00管理员 01员工 ) */
     private String userType;
 
     /** 用户邮箱 */
@@ -54,13 +45,9 @@ public class CompanyUserImportVO extends BaseEntity {
     private String phonenumber;
 
     /** 用户性别(0男 1女 2未知) */
-    @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
+    @Excel(name = "用户性别(0男 1女 2未知)", readConverterExp = "0=男,1=女,2=未知")
     private String sex;
 
-    /** 头像地址 */
-    @Excel(name = "头像地址")
-    private String avatar;
-
     /** 身份证号 */
     @Excel(name = "身份证号")
     private String idCard;
@@ -69,23 +56,24 @@ public class CompanyUserImportVO extends BaseEntity {
     @Excel(name = "密码")
     private String password;
 
+    /** 角色字符串 */
+    @Excel(name = "角色(多角色用逗号分割)")
+    private String roleString;
+
     /** 帐号状态(0正常 1停用) */
-    @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
     private String status;
 
+    private String corpId;
+
     /** 删除标志(0代表存在 2代表删除) */
     private String delFlag;
 
+    /** 头像地址 */
+    private String avatar;
+
     private String qwUserId;
     private Integer qwStatus;
 
-    public String getIdCard() {
-        return idCard;
-    }
-
-    public void setIdCard(String idCard) {
-        this.idCard = idCard;
-    }
 
     /** 最后登录IP */
     private String loginIp;
@@ -111,9 +99,6 @@ public class CompanyUserImportVO extends BaseEntity {
     /** 角色组 */
     private Long[] roleIds;
 
-    /** 角色字符串 */
-    @Excel(name = "角色(多角色用逗号分割)")
-    private String roleString;
 
     /** 岗位组 */
     private Long[] postIds;
@@ -131,328 +116,10 @@ public class CompanyUserImportVO extends BaseEntity {
     private String callerNo;
 
     private String voicePrintUrl;
-
+    @Excel(name = "销售区域编码")
     private String addressId;
 
     /** 看课域名 */
     private String domain;
 
-    public String getDomain() {
-        return domain;
-    }
-
-    public void setDomain(String domain) {
-        this.domain = domain;
-    }
-
-    public String getAddressId() {
-        return addressId;
-    }
-
-    public void setAddressId(String addressId) {
-        this.addressId = addressId;
-    }
-
-    public String getVoicePrintUrl() {
-        return voicePrintUrl;
-    }
-
-    public void setVoicePrintUrl(String voicePrintUrl) {
-        this.voicePrintUrl = voicePrintUrl;
-    }
-
-    public String getCallerNo() {
-        return callerNo;
-    }
-
-    public void setCallerNo(String callerNo) {
-        this.callerNo = callerNo;
-    }
-
-    public String getJpushId() {
-        return jpushId;
-    }
-
-    public String getQwUserId() {
-        return qwUserId;
-    }
-
-    public void setQwUserId(String qwUserId) {
-        this.qwUserId = qwUserId;
-    }
-
-    public Integer getQwStatus() {
-        return qwStatus;
-    }
-
-    public void setQwStatus(Integer qwStatus) {
-        this.qwStatus = qwStatus;
-    }
-
-    public void setJpushId(String jpushId) {
-        this.jpushId = jpushId;
-    }
-
-    public String getQrCodeWeixin() {
-        return qrCodeWeixin;
-    }
-
-    public void setQrCodeWeixin(String qrCodeWeixin) {
-        this.qrCodeWeixin = qrCodeWeixin;
-    }
-
-    public String getQrCodeWecom() {
-        return qrCodeWecom;
-    }
-
-    public void setQrCodeWecom(String qrCodeWecom) {
-        this.qrCodeWecom = qrCodeWecom;
-    }
-
-    public String getOpenId() {
-        return openId;
-    }
-
-    public void setOpenId(String openId) {
-        this.openId = openId;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getNickName() {
-        return nickName;
-    }
-
-
-    public void setNickName(String nickName) {
-        this.nickName = nickName;
-    }
-
-    public String getFirstchar() {
-        return firstchar;
-    }
-
-    public void setFirstchar(String firstchar) {
-        this.firstchar = firstchar;
-    }
-
-    public String getPostName() {
-        return postName;
-    }
-
-    public void setPostName(String postName) {
-        this.postName = postName;
-    }
-
-    public String getDeptName() {
-        return deptName;
-    }
-
-    public void setDeptName(String deptName) {
-        this.deptName = deptName;
-    }
-
-    public CompanyDept getDept() {
-        return dept;
-    }
-
-    public void setDept(CompanyDept dept) {
-        this.dept = dept;
-    }
-
-    public static long getSerialVersionUID() {
-        return serialVersionUID;
-    }
-
-    public boolean isAdmin()
-    {
-        return isAdmin(this.userType);
-    }
-
-    public static boolean isAdmin(String userType)
-    {
-        if(userType!=null&&(userType.equals("00") || userType.equals("02"))){
-            return true;
-        }
-        else return false;
-    }
-
-    public List<CompanyRole> getRoles() {
-        return roles;
-    }
-
-    public void setRoles(List<CompanyRole> roles) {
-        this.roles = roles;
-    }
-
-    public String getRoleString() {
-        return roleString;
-    }
-
-    public void setRoleString(String roleString) {
-        this.roleString = roleString;
-    }
-
-    public Long[] getRoleIds() {
-        return roleIds;
-    }
-
-    public void setRoleIds(Long[] roleIds) {
-        this.roleIds = roleIds;
-    }
-
-    public Long[] getPostIds() {
-        return postIds;
-    }
-
-    public void setPostIds(Long[] postIds) {
-        this.postIds = postIds;
-    }
-
-
-    public void setUserId(Long userId)
-    {
-        this.userId = userId;
-    }
-
-    public Long getUserId()
-    {
-        return userId;
-    }
-    public void setCompanyId(Long companyId)
-    {
-        this.companyId = companyId;
-    }
-
-    public Long getCompanyId()
-    {
-        return companyId;
-    }
-    public void setDeptId(Long deptId)
-    {
-        this.deptId = deptId;
-    }
-
-    public Long getDeptId()
-    {
-        return deptId;
-    }
-
-    public void setUserType(String userType)
-    {
-        this.userType = userType;
-    }
-
-    public String getUserType()
-    {
-        return userType;
-    }
-    public void setEmail(String email)
-    {
-        this.email = email;
-    }
-
-    public String getEmail()
-    {
-        return email;
-    }
-    public void setPhonenumber(String phonenumber)
-    {
-        this.phonenumber = phonenumber;
-    }
-
-    public String getPhonenumber()
-    {
-        return phonenumber;
-    }
-    public void setSex(String sex)
-    {
-        this.sex = sex;
-    }
-
-    public String getSex()
-    {
-        return sex;
-    }
-    public void setAvatar(String avatar)
-    {
-        this.avatar = avatar;
-    }
-
-    public String getAvatar()
-    {
-        return avatar;
-    }
-
-    public void setPassword(String password)
-    {
-        this.password = password;
-    }
-
-    public String getPassword()
-    {
-        return password;
-    }
-    public void setStatus(String status)
-    {
-        this.status = status;
-    }
-
-    public String getStatus()
-    {
-        return status;
-    }
-    public void setDelFlag(String delFlag)
-    {
-        this.delFlag = delFlag;
-    }
-
-    public String getDelFlag()
-    {
-        return delFlag;
-    }
-    public void setLoginIp(String loginIp)
-    {
-        this.loginIp = loginIp;
-    }
-
-    public String getLoginIp()
-    {
-        return loginIp;
-    }
-    public void setLoginDate(Date loginDate)
-    {
-        this.loginDate = loginDate;
-    }
-
-    public Date getLoginDate()
-    {
-        return loginDate;
-    }
-
-
-    public void setToken(String token)
-    {
-        this.token = token;
-    }
-
-    public String getToken()
-    {
-        return token;
-    }
-    public void setIsDel(Integer isDel)
-    {
-        this.isDel = isDel;
-    }
-
-    public Integer getIsDel()
-    {
-        return isDel;
-    }
 }

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

@@ -128,4 +128,7 @@ public class CompanyUserQwListVO extends BaseEntity {
     /** 是否允许所有方式注册会员,1-是,0-否,默认1(用于个微注册会员) */
     private Integer isAllowedAllRegister;
 
+    /** 医生id */
+    private Long doctorId;
+
 }

+ 2 - 0
fs-service/src/main/java/com/fs/company/vo/CompanyVO.java

@@ -79,6 +79,8 @@ public class CompanyVO implements Serializable
 
     private Integer limitUserCount;
 
+    private Integer maxPadNum;
+
     private Integer voiceCallerNumber;
     @Excel(name = "商务负责人")
     private String manager;

+ 5 - 0
fs-service/src/main/java/com/fs/course/config/CourseConfig.java

@@ -63,6 +63,11 @@ public class CourseConfig implements Serializable {
      */
     private Boolean isBound;
 
+    /**
+     * 是否开启IM
+     */
+    private Boolean isOpenIM;
+
 
     @Data
     public static class DisabledTimeVo{

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

@@ -66,6 +66,7 @@ public interface FsUserCourseVideoRedPackageMapper
      * @return 结果
      */
     public int deleteFsUserCourseVideoRedPackageByIds(Long[] ids);
+    public int deleteFsUserCourseVideoRedPackageByVedioIds(Long[] ids);
     @Update("INSERT INTO fs_user_course_video_red_package (company_id, video_id, red_packet_money) " +
             "VALUES (#{companyId}, #{videoId}, #{redPacketMoney}) " +
             "ON DUPLICATE KEY UPDATE red_packet_money = VALUES(red_packet_money);")

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

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

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

@@ -11,4 +11,5 @@ public class FsUserVipOrderPayUParam implements Serializable {
    private Long userId;
    @NotNull(message = "orderId不能为空")
    private Long orderId;
+   private String appId;
 }

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

@@ -424,6 +424,7 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
                         o.setOpenid(fsUserWx.getOpenId());
                         o.setReqSeqId("product-"+storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
+                        o.setAppId(param.getAppId());
                         o.setGoodsDesc("拍商品订单支付");
                         HuifuCreateOrderResult result = huiFuService.createOrder(o);
                         logger.info("创建汇付支付:"+result);

+ 8 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -777,7 +777,14 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
             watchLog.setDuration(duration);
 
             //取对应视频的时长
-            Long videoDuration = getVideoDuration(videoId);
+            Long videoDuration = 0L;
+            try {
+                videoDuration = getVideoDuration(videoId);
+            }catch (Exception e){
+                log.error("视频时长识别错误:{}", key);
+                continue;
+            }
+
             if (videoDuration != null && videoDuration != 0) {
                 boolean complete = false;
                 // 判断百分比

+ 4 - 3
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseOrderServiceImpl.java

@@ -487,6 +487,7 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
                         o.setReqSeqId("course-" + storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
                         o.setGoodsDesc("课程订单支付");
+                        o.setAppId(param.getAppId());
                         HuifuCreateOrderResult result = huiFuService.createOrder(o);
                         FsStorePayment mt = new FsStorePayment();
                         mt.setPaymentId(storePayment.getPaymentId());
@@ -496,10 +497,10 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
 
                     }
 
-                } else {
-                    return R.error("用户OPENID不存在");
                 }
             }
+        } else {
+            return R.error("用户OPENID不存在");
         }
         return R.error();
     }
@@ -738,7 +739,7 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
             param.setUserCouponId(order.getUserCouponId());
         }
         FsUser user=fsUserMapper.selectFsUserByUserId(order.getUserId());
-        if(user!=null&& StringUtils.isNotEmpty(user.getMaOpenId())){
+        if(user!=null){
             Map<String,Object> moneys=computeOrderMoney(order.getPayPrice(),param);
             return R.ok().put("moneys",moneys);
         }

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

@@ -133,7 +133,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
         if(!periodDayIds.isEmpty()){
             flag = fsUserCoursePeriodDaysMapper.updateBatchDelFlag(periodDayIds.toArray(new Long[0]),1);
             //删除红包记录
-            fsUserCourseVideoRedPackageMapper.updateBatchDelFlag(videoIds.toArray(new Long[0]),1);
+            fsUserCourseVideoRedPackageMapper.deleteFsUserCourseVideoRedPackageByVedioIds(videoIds.toArray(new Long[0]));
         }
         return flag;
     }

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

@@ -4,7 +4,6 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.BeanCopyUtils;
 import com.fs.common.core.domain.R;
@@ -13,11 +12,11 @@ import com.fs.common.core.domain.entity.SysDictData;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.BizResponseEnum;
 import com.fs.common.exception.CustomException;
+import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.date.DateUtil;
 import com.fs.company.domain.Company;
-import com.fs.company.domain.CompanyMoneyLogs;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyMoneyLogsMapper;
@@ -74,7 +73,6 @@ import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
@@ -1221,7 +1219,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 if (fsUserWx ==null){
                     if (user.getCourseMaOpenId()==null){
                         logger.error("zyp \n 【转账openId参数错误】:{}", user.getUserId());
-                        return R.error("openId参数错误");
+                        return R.error("openId参数错误,请清理缓存后重新授权!");
                     }
                     packetParam.setOpenId(user.getCourseMaOpenId());
                     try {
@@ -1639,7 +1637,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             return ResponseResult.fail(504, "请观看最新的课程项目");
         }
         // 项目看课数限制
-        if(!"福本源".equals(signProjectName) && !"宽益堂".equals(signProjectName)) {
+        if(!"福本源".equals(signProjectName) && !"宽益堂".equals(signProjectName) && !CloudHostUtils.hasCloudHostName("弘德堂")) {
             Integer logCount = fsUserCourseMapper.selectTodayCourseWatchLogCountByUserIdAndProjectId(param.getUserId(), courseProject);
             if (Objects.isNull(watchCourseVideo) && logCount > 0) {
                 return ResponseResult.fail(504, "超过项目看课数量限制");

+ 3 - 2
fs-service/src/main/java/com/fs/course/service/impl/FsUserVipOrderServiceImpl.java

@@ -346,6 +346,7 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
                         o.setReqSeqId("appvip-" + storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
                         o.setGoodsDesc("会员开通订单支付");
+                        o.setAppId(param.getAppId());
                         HuifuCreateOrderResult result = huiFuService.createOrder(o);
                         FsStorePayment mt = new FsStorePayment();
                         mt.setPaymentId(storePayment.getPaymentId());
@@ -353,10 +354,10 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
                         storePaymentService.updateFsStorePayment(mt);
                         return R.ok().put("isPay", 0).put("data", result).put("type", "hf");
                     }
-                } else {
-                    return R.error("用户OPENID不存在");
                 }
             }
+        }  else {
+            return R.error("用户OPENID不存在");
         }
         return R.error();
     }

+ 67 - 57
fs-service/src/main/java/com/fs/course/service/impl/FsUserWatchStatisticsServiceImpl.java

@@ -140,63 +140,73 @@ public class FsUserWatchStatisticsServiceImpl extends ServiceImpl<FsUserWatchSta
 
         //获取公司的会员数量和今日新增会员数量
         List<FsUserWatchStatistics> userTotal = fsUserMapper.selectFsUserTotal();
-        Map<String, FsUserWatchStatistics> userTotalMap = userTotal.stream().collect(Collectors.toMap(FsUserWatchStatistics::getCompanyId, Function.identity()));
-
-        List<FsUserWatchStatistics> list = fsUserCoursePeriods.stream()
-                .flatMap(item -> Arrays.stream(item.getCompanyId().split(","))
-                        .map(companyIdStr -> {
-                            Long companyId = Long.valueOf(companyIdStr.trim());
-                            Company company = companyMap.get(companyId);
-
-                            // 赋值
-                            FsUserWatchStatistics fsUserWatchStatistics = new FsUserWatchStatistics();
-                            BeanUtils.copyProperties(item, fsUserWatchStatistics);
-                            ZonedDateTime zonedDateTime = item.getPeriodStartingTime().atStartOfDay(ZoneId.systemDefault());
-                            // 改成使用营期线来表示营期开始时间
-                            fsUserWatchStatistics.setPeriodStartingTime(item.getPeriodLine() != null ? item.getPeriodLine() : Date.from(zonedDateTime.toInstant()));
-                            fsUserWatchStatistics.setCompanyId(companyIdStr.trim());
-                            fsUserWatchStatistics.setCompanyName(company != null ? company.getCompanyName() : null);
-
-                            FsUserWatchStatistics userTotalData = userTotalMap.get(fsUserWatchStatistics.getCompanyId());
-
-                            String key = String.format("%s-%s", fsUserWatchStatistics.getPeriodId(), fsUserWatchStatistics.getCompanyId());
-                            FsUserWatchStatistics watchData = courseWatchStatisticsMap.get(key);
-
-                            if(userTotalData != null){
-                                fsUserWatchStatistics.setUserNum(userTotalData.getUserNum());
-                                fsUserWatchStatistics.setNewUserNum(userTotalData.getNewUserNum());
-                            } else {
-                                fsUserWatchStatistics.setUserNum(0);
-                                fsUserWatchStatistics.setNewUserNum(0);
-                            }
-
-                            if(watchData != null){
-                                fsUserWatchStatistics.setWatchNum(watchData.getWatchNum());
-                                fsUserWatchStatistics.setCompleteWatchNum(watchData.getCompleteWatchNum());
-                                fsUserWatchStatistics.setCompleteWatchRate(watchData.getCompleteWatchRate());
-                            } else {
-                                fsUserWatchStatistics.setWatchNum(0);
-                                fsUserWatchStatistics.setCompleteWatchNum(0);
-                                fsUserWatchStatistics.setCompleteWatchRate(BigDecimal.ZERO);
-                            }
-
-                            // 计算上线率
-                            BigDecimal watchNum = new BigDecimal(fsUserWatchStatistics.getWatchNum());
-                            BigDecimal userNum = new BigDecimal(fsUserWatchStatistics.getUserNum());
-                            if(!userNum.equals(BigDecimal.ZERO)){
-                                BigDecimal onlineRate = watchNum.divide(userNum, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
-                                fsUserWatchStatistics.setOnlineRate(onlineRate);
-                            } else {
-                                fsUserWatchStatistics.setOnlineRate(BigDecimal.ZERO);
-                            }
-
-                            fsUserWatchStatistics.setCreateTime(new Date());
-                            fsUserWatchStatistics.setUpdateTime(new Date());
-                            return fsUserWatchStatistics;
-                        })).collect(Collectors.toList());
-
-        //2、分批次插入数据
-        this.batchInsert(list);
+        Map<String, FsUserWatchStatistics> userTotalMap;
+        if (userTotal != null && userTotal.size() > 0) {
+            userTotalMap = userTotal.stream().collect(Collectors.toMap(FsUserWatchStatistics::getCompanyId, Function.identity()));
+
+        } else {
+            userTotalMap = null;
+        }
+        if (!fsUserCoursePeriods.isEmpty()) {
+            List<FsUserWatchStatistics> list = fsUserCoursePeriods.stream()
+                    .flatMap(item -> Arrays.stream(item.getCompanyId().split(","))
+                            .map(companyIdStr -> {
+                                Long companyId = Long.valueOf(companyIdStr.trim());
+                                Company company = companyMap.get(companyId);
+
+                                // 赋值
+                                FsUserWatchStatistics fsUserWatchStatistics = new FsUserWatchStatistics();
+                                BeanUtils.copyProperties(item, fsUserWatchStatistics);
+                                ZonedDateTime zonedDateTime = item.getPeriodStartingTime().atStartOfDay(ZoneId.systemDefault());
+                                // 改成使用营期线来表示营期开始时间
+                                fsUserWatchStatistics.setPeriodStartingTime(item.getPeriodLine() != null ? item.getPeriodLine() : Date.from(zonedDateTime.toInstant()));
+                                fsUserWatchStatistics.setCompanyId(companyIdStr.trim());
+                                fsUserWatchStatistics.setCompanyName(company != null ? company.getCompanyName() : null);
+                                if (Objects.nonNull(userTotalMap)){
+                                    FsUserWatchStatistics userTotalData = userTotalMap.get(fsUserWatchStatistics.getCompanyId());
+                                    if(userTotalData != null){
+                                        fsUserWatchStatistics.setUserNum(userTotalData.getUserNum());
+                                        fsUserWatchStatistics.setNewUserNum(userTotalData.getNewUserNum());
+                                    } else {
+                                        fsUserWatchStatistics.setUserNum(0);
+                                        fsUserWatchStatistics.setNewUserNum(0);
+                                    }
+                                }
+
+                                String key = String.format("%s-%s", fsUserWatchStatistics.getPeriodId(), fsUserWatchStatistics.getCompanyId());
+                                FsUserWatchStatistics watchData = courseWatchStatisticsMap.get(key);
+
+
+
+                                if(watchData != null){
+                                    fsUserWatchStatistics.setWatchNum(watchData.getWatchNum());
+                                    fsUserWatchStatistics.setCompleteWatchNum(watchData.getCompleteWatchNum());
+                                    fsUserWatchStatistics.setCompleteWatchRate(watchData.getCompleteWatchRate());
+                                } else {
+                                    fsUserWatchStatistics.setWatchNum(0);
+                                    fsUserWatchStatistics.setCompleteWatchNum(0);
+                                    fsUserWatchStatistics.setCompleteWatchRate(BigDecimal.ZERO);
+                                }
+
+                                // 计算上线率
+                                BigDecimal watchNum = new BigDecimal(fsUserWatchStatistics.getWatchNum());
+                                BigDecimal userNum = new BigDecimal(fsUserWatchStatistics.getUserNum());
+                                if(!userNum.equals(BigDecimal.ZERO)){
+                                    BigDecimal onlineRate = watchNum.divide(userNum, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
+                                    fsUserWatchStatistics.setOnlineRate(onlineRate);
+                                } else {
+                                    fsUserWatchStatistics.setOnlineRate(BigDecimal.ZERO);
+                                }
+
+                                fsUserWatchStatistics.setCreateTime(new Date());
+                                fsUserWatchStatistics.setUpdateTime(new Date());
+                                return fsUserWatchStatistics;
+                            })).collect(Collectors.toList());
+            //2、分批次插入数据
+            this.batchInsert(list);
+        }
+
+
     }
 
     private void batchInsert(List<FsUserWatchStatistics> list) {

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

@@ -0,0 +1,38 @@
+package com.fs.crm.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 客户员工协作对象 crm_customer_assist
+ *
+ * @author fs
+ * @date 2025-05-27
+ */
+@Data
+public class CrmCustomerAssist extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long companyId;
+
+    /** 销售ID */
+    @Excel(name = "销售ID")
+    private Long companyUserId;
+
+    /** 销售名字 */
+    @Excel(name = "销售名字")
+    private String companyUserName;
+
+    /** 销售公司ID */
+    @Excel(name = "销售公司ID")
+    private Long customerId;
+
+    private Integer Rate;
+}

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

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

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

@@ -0,0 +1,87 @@
+package com.fs.crm.mapper;
+
+import com.fs.crm.domain.CrmCustomerAssist;
+import com.fs.crm.param.CrmCustomerAssistDeLParam;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 客户员工协作Mapper接口
+ *
+ * @author fs
+ * @date 2025-05-27
+ */
+public interface CrmCustomerAssistMapper
+{
+    /**
+     * 查询客户员工协作
+     *
+     * @param id 客户员工协作ID
+     * @return 客户员工协作
+     */
+    public CrmCustomerAssist selectCrmCustomerAssistById(Long id);
+
+    /**
+     * 查询客户员工协作列表
+     *
+     * @param crmCustomerAssist 客户员工协作
+     * @return 客户员工协作集合
+     */
+    public List<CrmCustomerAssist> selectCrmCustomerAssistList(CrmCustomerAssist crmCustomerAssist);
+
+    /**
+     * 新增客户员工协作
+     *
+     * @param crmCustomerAssist 客户员工协作
+     * @return 结果
+     */
+    public int insertCrmCustomerAssist(CrmCustomerAssist crmCustomerAssist);
+
+    /**
+     * 修改客户员工协作
+     *
+     * @param crmCustomerAssist 客户员工协作
+     * @return 结果
+     */
+    public int updateCrmCustomerAssist(CrmCustomerAssist crmCustomerAssist);
+
+    /**
+     * 删除客户员工协作
+     *
+     * @param id 客户员工协作ID
+     * @return 结果
+     */
+    public int deleteCrmCustomerAssistById(Long id);
+
+    /**
+     * 批量删除客户员工协作
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteCrmCustomerAssistByIds(Long[] ids);
+
+    List<String> selectCompanyUserNameByCustomerId(@Param("customerId") Long customerId);
+
+    int removeByCustomer(@Param("maps") CrmCustomerAssistDeLParam param);
+
+    int deleteCrmCustomerAssistByCustomerId(Long customerId);
+
+    /**
+     * 查询当前销售协作的客户
+     * @param companyUserId
+     * @return
+     */
+    List<Long> selectCustomerIdByCompanyUserId(@Param("companyUserId") Long companyUserId);
+
+    /**
+     * 根据客户id查询销售
+     * @param customerId
+     * @return
+     */
+    List<Long> selectCompanyUserIdByCustomerId(@Param("customerId") Long customerId,@Param("createTime") Date createTime);
+
+    List<CrmCustomerAssist> selectByCustomerId(Long customerId);
+}

+ 7 - 0
fs-service/src/main/java/com/fs/crm/mapper/CrmCustomerMapper.java

@@ -959,4 +959,11 @@ public interface CrmCustomerMapper extends BaseMapper<CrmCustomer> {
 
     List<CrmMyCustomerListQueryVO> selectCrmMyAssistListQuery(@Param("maps") CrmMyCustomerListQueryParam param);
 
+    /**
+     * 查询当前销售的客户
+     * @param companyUserId
+     * @return
+     */
+    List<Long> selectCustomerIdByCompanyUserId(@Param("companyUserId") Long companyUserId);
+
 }

+ 11 - 0
fs-service/src/main/java/com/fs/crm/param/CrmCustomerAssistDeLParam.java

@@ -0,0 +1,11 @@
+package com.fs.crm.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CrmCustomerAssistDeLParam {
+    private List<Long> customerIds;
+    private Long companyUserId;
+}

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

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

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

@@ -0,0 +1,11 @@
+package com.fs.crm.service;
+
+
+import com.fs.crm.domain.Report;
+import com.fs.crm.param.ReportParam;
+
+import java.util.List;
+
+public interface ReportService {
+    List<Report> getReport(ReportParam param);
+}

+ 70 - 0
fs-service/src/main/java/com/fs/crm/service/impl/ReportServiceImpl.java

@@ -0,0 +1,70 @@
+package com.fs.crm.service.impl;
+
+import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.crm.domain.Report;
+import com.fs.crm.mapper.CrmCustomerAssistMapper;
+import com.fs.crm.mapper.CrmCustomerMapper;
+import com.fs.crm.service.ReportService;
+import com.fs.his.mapper.FsStoreOrderMapper;
+import com.fs.crm.param.ReportParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Service
+public class ReportServiceImpl implements ReportService {
+    @Autowired
+    private CrmCustomerMapper crmCustomerMapper;
+    @Autowired
+    private CrmCustomerAssistMapper crmCustomerAssistMapper;
+    @Autowired
+    private FsStoreOrderMapper storeOrderMapper;
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+    @Override
+    public List<Report> getReport(ReportParam param) {
+        Set<Long> mergedSet = new HashSet<>();
+
+        if (param.getCompanyUserId()!=null){
+            //查询当前销售的客户以及协作客户
+            List<Long> customerIds = Optional.ofNullable(crmCustomerMapper.selectCustomerIdByCompanyUserId(param.getCompanyUserId()))
+                    .orElse(Collections.emptyList());
+            List<Long> assistCustomerIds = Optional.ofNullable(crmCustomerAssistMapper.selectCustomerIdByCompanyUserId(param.getCompanyUserId()))
+                    .orElse(Collections.emptyList());
+            mergedSet = Stream.concat(customerIds.stream(), assistCustomerIds.stream())
+                    .collect(Collectors.toSet());
+            mergedSet.addAll(customerIds);
+            mergedSet.addAll(assistCustomerIds);
+            if (mergedSet.isEmpty()){
+                return Collections.emptyList();
+            }
+            param.setCustomerIds(new ArrayList<>(mergedSet));
+        }
+        //查询客户的订单记录
+        List<Report> reports = storeOrderMapper.selectOrderByCustomerIds(param);
+        for (Report report : reports) {
+            //查询用户下单时是否共享客户,有哪些销售共享
+            List<Long> companyUserIds = crmCustomerAssistMapper.selectCompanyUserIdByCustomerId(report.getCustomerId(), report.getPayTime());
+            if (companyUserIds.size()>0){
+                report.setStatus("1");
+                String s = companyUserMapper.selectCompanyUserNameByIdsList(companyUserIds).toString();
+                String replace = s.replace("[", "");
+                String replace1 = replace.replace("]", "");
+                report.setCompanyUserNames(replace1);
+            }
+            //计算销售的业绩
+            //分成比例
+            BigDecimal bigDecimal = new BigDecimal("100.00");
+            BigDecimal ratio = bigDecimal.divide(new BigDecimal(companyUserIds.size()), 2, RoundingMode.HALF_UP);
+            report.setProportion(ratio);
+            report.setMyPerformance(ratio.multiply(report.getMoney()).divide(bigDecimal));
+            //修改对象
+        }
+        return reports;
+    }
+}

+ 14 - 1
fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java

@@ -20,6 +20,7 @@ import com.fs.erp.service.IErpOrderService;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
 import com.fs.his.enums.FsStoreOrderLogEnum;
+import com.fs.his.enums.FsStoreOrderStatusEnum;
 import com.fs.his.mapper.*;
 import com.fs.his.param.FsStoreOrderSalesParam;
 import com.fs.his.service.IFsExpressService;
@@ -263,6 +264,10 @@ public class DfOrderServiceImpl implements IErpOrderService
             if ("运单不存在".equals(dfApiResponse.getMsg())){
                 //取消订单
                 FsStoreOrderSalesParam afterSalesParam = new FsStoreOrderSalesParam();
+                //修改订单状态 方便后续重新发货
+                order.setStatus(FsStoreOrderStatusEnum.STATUS_2.getValue());
+                order.setExtendOrderId("");
+                fsStoreOrderMapper.updateFsStoreOrder(order);
                 afterSalesParam.setOrderId(order.getOrderId());
                 afterSalesParam.setReasons("代服管家取消订单");
                 afterSalesParam.setOperator("代服管家");
@@ -272,6 +277,8 @@ public class DfOrderServiceImpl implements IErpOrderService
                 df.setStatus(2);
                 df.setUpdateTime(new Date());
                 fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+                fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.REFUND_ORDER_DF.getValue(),
+                        "运单不存在,"+FsStoreOrderLogEnum.REFUND_ORDER_DF.getDesc());
                 log.info("代服管家 订单取消成功: {}", response);
             }
             //3.处理请求结果
@@ -329,7 +336,7 @@ public class DfOrderServiceImpl implements IErpOrderService
                         Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
                         Object isUpdateOrder = config.get("isUpdateOrder");
                         if (isUpdateOrder == null || "1".equals(isUpdateOrder.toString())) {
-                            fsStoreOrderService.getGoods(order.getOrderId());
+                            fsStoreOrderService.getGoods(order.getOrderId(),"物流自动");
                         }
                         break;
                     case 10:
@@ -339,6 +346,10 @@ public class DfOrderServiceImpl implements IErpOrderService
                         if (fsStoreOrders != null && !fsStoreOrders.isEmpty()) {
                             fsStoreOrders.forEach(tempOrder -> {
                                 FsStoreOrderSalesParam afterSalesParam = new FsStoreOrderSalesParam();
+                                //修改订单状态 方便后续重新发货
+                                order.setStatus(FsStoreOrderStatusEnum.STATUS_2.getValue());
+                                order.setExtendOrderId("");
+                                fsStoreOrderMapper.updateFsStoreOrder(order);
                                 afterSalesParam.setOrderId(tempOrder.getOrderId());
                                 afterSalesParam.setReasons("代服管家取消订单");
                                 afterSalesParam.setOperator("代服管家");
@@ -348,6 +359,8 @@ public class DfOrderServiceImpl implements IErpOrderService
                                 df.setStatus(2);
                                 df.setUpdateTime(new Date());
                                 fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+                                fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.REFUND_ORDER_DF.getValue(),
+                                        FsStoreOrderLogEnum.REFUND_ORDER_DF.getDesc());
                                 log.info("代服管家 订单取消成功: {}", response);
                             });
                         }

+ 5 - 1
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.erp.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
@@ -35,6 +36,7 @@ import org.springframework.util.CollectionUtils;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -113,7 +115,9 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
             shopOrderDTO.setFreight(fsStoreOrder.getPayDelivery().doubleValue());
         }
         // 备注
-        shopOrderDTO.setRemark(order.getBuyer_memo());
+        //shopOrderDTO.setRemark(order.getBuyer_memo());
+        shopOrderDTO.setRemark(DateUtil.format(new Date(), "dd"));
+
         // 买家留言
         shopOrderDTO.setBuyerMessage(order.getBuyer_memo());
 

+ 31 - 0
fs-service/src/main/java/com/fs/fastGpt/domain/FastgptExtUserTag.java

@@ -0,0 +1,31 @@
+package com.fs.fastGpt.domain;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 处理新客标签对象 fastgpt_ext_user_tag
+ *
+ * @author fs
+ * @date 2025-09-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FastgptExtUserTag extends BaseEntity{
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 标签id */
+    @Excel(name = "标签id")
+    private String tagId;
+
+    /** 企业id */
+    @Excel(name = "企业id")
+    private String corpId;
+
+
+
+}

+ 67 - 0
fs-service/src/main/java/com/fs/fastGpt/mapper/FastgptExtUserTagMapper.java

@@ -0,0 +1,67 @@
+package com.fs.fastGpt.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.fastGpt.domain.FastgptExtUserTag;
+import com.fs.fastGpt.vo.FastgptExtUserTagVO;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 处理新客标签Mapper接口
+ * 
+ * @author fs
+ * @date 2025-09-10
+ */
+public interface FastgptExtUserTagMapper extends BaseMapper<FastgptExtUserTag>{
+    /**
+     * 查询处理新客标签
+     * 
+     * @param id 处理新客标签主键
+     * @return 处理新客标签
+     */
+    FastgptExtUserTag selectFastgptExtUserTagById(Long id);
+
+    /**
+     * 查询处理新客标签列表
+     * 
+     * @param fastgptExtUserTag 处理新客标签
+     * @return 处理新客标签集合
+     */
+    List<FastgptExtUserTag> selectFastgptExtUserTagList(FastgptExtUserTag fastgptExtUserTag);
+
+    /**
+     * 新增处理新客标签
+     * 
+     * @param fastgptExtUserTag 处理新客标签
+     * @return 结果
+     */
+    int insertFastgptExtUserTag(FastgptExtUserTag fastgptExtUserTag);
+
+    /**
+     * 修改处理新客标签
+     * 
+     * @param fastgptExtUserTag 处理新客标签
+     * @return 结果
+     */
+    int updateFastgptExtUserTag(FastgptExtUserTag fastgptExtUserTag);
+
+    /**
+     * 删除处理新客标签
+     * 
+     * @param id 处理新客标签主键
+     * @return 结果
+     */
+    int deleteFastgptExtUserTagById(Long id);
+
+    /**
+     * 批量删除处理新客标签
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFastgptExtUserTagByIds(Long[] ids);
+
+    int addFastGptTagByCorpId(@Param("data") FastgptExtUserTagVO fastgptExtUserTag);
+
+    List<FastgptExtUserTag> selectFastgptExtUserTagByIds(@Param("ids") Long[] ids);
+}

+ 66 - 0
fs-service/src/main/java/com/fs/fastGpt/service/IFastgptExtUserTagService.java

@@ -0,0 +1,66 @@
+package com.fs.fastGpt.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.common.core.domain.R;
+import com.fs.fastGpt.domain.FastgptExtUserTag;
+import com.fs.fastGpt.vo.FastgptExtUserTagVO;
+
+/**
+ * 处理新客标签Service接口
+ * 
+ * @author fs
+ * @date 2025-09-10
+ */
+public interface IFastgptExtUserTagService extends IService<FastgptExtUserTag>{
+    /**
+     * 查询处理新客标签
+     * 
+     * @param id 处理新客标签主键
+     * @return 处理新客标签
+     */
+    FastgptExtUserTag selectFastgptExtUserTagById(Long id);
+
+    /**
+     * 查询处理新客标签列表
+     * 
+     * @param fastgptExtUserTag 处理新客标签
+     * @return 处理新客标签集合
+     */
+    List<FastgptExtUserTag> selectFastgptExtUserTagList(FastgptExtUserTag fastgptExtUserTag);
+
+    /**
+     * 新增处理新客标签
+     * 
+     * @param fastgptExtUserTag 处理新客标签
+     * @return 结果
+     */
+    int insertFastgptExtUserTag(FastgptExtUserTag fastgptExtUserTag);
+
+    /**
+     * 修改处理新客标签
+     * 
+     * @param fastgptExtUserTag 处理新客标签
+     * @return 结果
+     */
+    int updateFastgptExtUserTag(FastgptExtUserTag fastgptExtUserTag);
+
+    /**
+     * 批量删除处理新客标签
+     * 
+     * @param ids 需要删除的处理新客标签主键集合
+     * @return 结果
+     */
+    int deleteFastgptExtUserTagByIds(Long[] ids);
+
+    /**
+     * 删除处理新客标签信息
+     * 
+     * @param id 处理新客标签主键
+     * @return 结果
+     */
+    int deleteFastgptExtUserTagById(Long id);
+
+    R addFastGptTagByCorpId(FastgptExtUserTagVO fastgptExtUserTag);
+
+}

+ 58 - 2
fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java

@@ -3,6 +3,7 @@ package com.fs.fastGpt.service.impl;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.fs.common.annotation.Excel;
 import com.fs.common.config.FSConfig;
 import com.fs.common.core.domain.R;
@@ -161,6 +162,10 @@ public class AiHookServiceImpl implements AiHookService {
     @Autowired
     private IFastGptChatReplaceTextService fastGptChatReplaceTextService;
 
+    private static final String AI_REPLY = "AI_REPLY:";
+    private static final String AI_REPLY_TAG = "AI_REPLY_TAG:";
+
+
     /** Ai半小时未回复提醒 **/
     /**
      *
@@ -376,7 +381,7 @@ public class AiHookServiceImpl implements AiHookService {
         }
         if(user.getFastGptRoleId()==null){
             log.error("未绑定角色");
-            return R.ok();
+            return userIsReply(sender, uid, user);
         }
         Long serverId = user.getServerId();
         log.info("服务器id"+serverId);
@@ -388,7 +393,7 @@ public class AiHookServiceImpl implements AiHookService {
         //没用ai角色跳过
         if(role==null){
             log.error("没用ai角色跳过");
-            return R.ok();
+            return userIsReply(sender, uid, user);
         }
         String modeConfig=role.getModeConfigJson();
         //key不为空
@@ -598,6 +603,57 @@ public class AiHookServiceImpl implements AiHookService {
         return R.ok();
     }
 
+    /**
+     * 根据发送者id设置用户是否为首次回复
+     * @param sender 发送者id
+     * @param uid   企微用户的uuid
+     * @param user  企微用户信息
+     * @return
+     */
+    private @Nullable R userIsReply(Long sender, String uid, QwUser user) {
+        Long qwExternalContactId = redisCache.getCacheObject(AI_REPLY + sender);
+        if(qwExternalContactId == null){
+            WxWorkVid2UserIdDTO wxWorkVid2UserIdDTO = new WxWorkVid2UserIdDTO();
+            wxWorkVid2UserIdDTO.setUser_id(Arrays.asList(sender));
+            wxWorkVid2UserIdDTO.setUuid(uid);
+            WxWorkResponseDTO<List<WxWorkVid2UserIdRespDTO>> WxWorkVid2UserIdRespDTO = wxWorkService.Vid2UserId(wxWorkVid2UserIdDTO, user.getServerId());
+            List<WxWorkVid2UserIdRespDTO> data = WxWorkVid2UserIdRespDTO.getData();
+            if (data==null|| data.isEmpty()){
+                log.error("未获取到extId"+wxWorkVid2UserIdDTO);
+                return R.ok();
+            }
+            com.fs.wxwork.dto.WxWorkVid2UserIdRespDTO dto = data.get(0);
+
+            QwExternalContact qwExternalContacts = qwExternalContactMapper.selectQwExternalContactByExternalUserIdAndQwUserId(dto.getOpenid(), user.getCorpId(), user.getQwUserId());
+            if (qwExternalContacts==null){
+                log.error("没有外部联系人" + "user:" + user);
+                return R.ok();
+            }
+            List<String> oldCache = redisCache.getCacheObject(AI_REPLY_TAG + user.getCorpId());
+            if(oldCache != null && !oldCache.isEmpty()){
+                QwExternalContact qwExternalContact = new QwExternalContact();
+                if(qwExternalContacts.getTagIds() != null && !qwExternalContacts.getTagIds().isEmpty() && !"[]".equals(qwExternalContacts.getTagIds())){
+                    List<String> parsedTags = JSON.parseArray(qwExternalContacts.getTagIds(), String.class);
+                    if (parsedTags != null && !parsedTags.isEmpty()) {
+                        for (String parsedTag : oldCache) {
+                            if (!oldCache.contains(parsedTag)) {
+                                oldCache.add(parsedTag);
+                            }
+                        }
+                    }
+                    qwExternalContact.setTagIds(JSON.toJSONString(oldCache));
+                }else if("[]".equals(qwExternalContacts.getTagIds()) || qwExternalContacts.getTagIds() == null){
+                    qwExternalContact.setTagIds(JSON.toJSONString(oldCache));
+                }
+                qwExternalContact.setId(qwExternalContacts.getId());
+                qwExternalContactMapper.updateQwExternalContact(qwExternalContact);
+            }
+            qwExternalContactMapper.updateQwExternalContactIsRePlyById(qwExternalContacts.getId());
+            redisCache.setCacheObject(AI_REPLY + sender,qwExternalContacts.getId());
+        }
+        return R.ok();
+    }
+
     /**
      * 通过用户发送的对话去查询用户是否为新客,是就删除sop,否就不做处理
      * @param user

+ 145 - 0
fs-service/src/main/java/com/fs/fastGpt/service/impl/FastgptExtUserTagServiceImpl.java

@@ -0,0 +1,145 @@
+package com.fs.fastGpt.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.fastGpt.vo.FastgptExtUserTagVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.fastGpt.mapper.FastgptExtUserTagMapper;
+import com.fs.fastGpt.domain.FastgptExtUserTag;
+import com.fs.fastGpt.service.IFastgptExtUserTagService;
+
+/**
+ * 处理新客标签Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-09-10
+ */
+@Service
+public class FastgptExtUserTagServiceImpl extends ServiceImpl<FastgptExtUserTagMapper, FastgptExtUserTag> implements IFastgptExtUserTagService {
+
+    @Autowired
+    private FastgptExtUserTagMapper fastgptExtUserTagMapper;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    private static final String AI_REPLY_TAG = "AI_REPLY_TAG:";
+
+    /**
+     * 查询处理新客标签
+     * 
+     * @param id 处理新客标签主键
+     * @return 处理新客标签
+     */
+    @Override
+    public FastgptExtUserTag selectFastgptExtUserTagById(Long id)
+    {
+        return baseMapper.selectFastgptExtUserTagById(id);
+    }
+
+    /**
+     * 查询处理新客标签列表
+     * 
+     * @param fastgptExtUserTag 处理新客标签
+     * @return 处理新客标签
+     */
+    @Override
+    public List<FastgptExtUserTag> selectFastgptExtUserTagList(FastgptExtUserTag fastgptExtUserTag)
+    {
+        return baseMapper.selectFastgptExtUserTagList(fastgptExtUserTag);
+    }
+
+    /**
+     * 新增处理新客标签
+     * 
+     * @param fastgptExtUserTag 处理新客标签
+     * @return 结果
+     */
+    @Override
+    public int insertFastgptExtUserTag(FastgptExtUserTag fastgptExtUserTag)
+    {
+        fastgptExtUserTag.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFastgptExtUserTag(fastgptExtUserTag);
+    }
+
+    /**
+     * 修改处理新客标签
+     * 
+     * @param fastgptExtUserTag 处理新客标签
+     * @return 结果
+     */
+    @Override
+    public int updateFastgptExtUserTag(FastgptExtUserTag fastgptExtUserTag)
+    {
+        return baseMapper.updateFastgptExtUserTag(fastgptExtUserTag);
+    }
+
+    /**
+     * 批量删除处理新客标签
+     * 
+     * @param ids 需要删除的处理新客标签主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFastgptExtUserTagByIds(Long[] ids)
+    {
+        List<FastgptExtUserTag> fastgptExtUserTags = fastgptExtUserTagMapper.selectFastgptExtUserTagByIds(ids);
+        int i = baseMapper.deleteFastgptExtUserTagByIds(ids);
+        if(i > 0){
+            if(fastgptExtUserTags != null && !fastgptExtUserTags.isEmpty()){
+                String corpId = fastgptExtUserTags.get(0).getCorpId();
+                List<String> oldCache = redisCache.getCacheObject(AI_REPLY_TAG + corpId);
+                for (FastgptExtUserTag fastgptExtUserTag : fastgptExtUserTags) {
+                    if(fastgptExtUserTag != null && fastgptExtUserTag.getTagId() != null){
+                        if(oldCache != null && !oldCache.isEmpty()){
+                            oldCache.remove(fastgptExtUserTag.getTagId());
+                        }
+                    }
+                }
+                redisCache.setCacheObject(AI_REPLY_TAG + corpId,oldCache);
+            }
+        }
+        return i;
+    }
+
+    /**
+     * 删除处理新客标签信息
+     * 
+     * @param id 处理新客标签主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFastgptExtUserTagById(Long id)
+    {
+        return baseMapper.deleteFastgptExtUserTagById(id);
+    }
+
+    @Override
+    public R addFastGptTagByCorpId(FastgptExtUserTagVO fastgptExtUserTag) {
+        int i = 0;
+        try {
+            i = fastgptExtUserTagMapper.addFastGptTagByCorpId(fastgptExtUserTag);
+        } catch (Exception e) {
+            return R.error("添加失败,存在重复的标签");
+        }
+        if(i > 0){
+            if(fastgptExtUserTag != null && fastgptExtUserTag.getTagIds() != null){
+                List<String> oldCache = redisCache.getCacheObject(AI_REPLY_TAG + fastgptExtUserTag.getCorpId());
+                if(oldCache != null && !oldCache.isEmpty()){
+                    oldCache.addAll(fastgptExtUserTag.getTagIds());
+                    redisCache.setCacheObject(AI_REPLY_TAG + fastgptExtUserTag.getCorpId(),oldCache);
+                }else{
+                    List<String> newCacheTagList = new ArrayList<>(fastgptExtUserTag.getTagIds());
+                    redisCache.setCacheObject(AI_REPLY_TAG + fastgptExtUserTag.getCorpId(),newCacheTagList);
+                }
+            }
+        }
+        return R.ok("添加成功");
+    }
+}

+ 34 - 0
fs-service/src/main/java/com/fs/fastGpt/vo/FastgptExtUserTagVO.java

@@ -0,0 +1,34 @@
+package com.fs.fastGpt.vo;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * 处理新客标签对象 fastgpt_ext_user_tag
+ *
+ * @author fs
+ * @date 2025-09-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FastgptExtUserTagVO extends BaseEntity{
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 标签id */
+    @Excel(name = "标签id")
+    private String tagId;
+
+    /** 企业id */
+    @Excel(name = "企业id")
+    private String corpId;
+
+    List<String> tagIds;
+
+
+}

+ 7 - 0
fs-service/src/main/java/com/fs/his/config/FsSysConfig.java

@@ -3,6 +3,7 @@ package com.fs.his.config;
 import com.fs.erp.dto.df.DFConfigVo;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 @Data
@@ -74,4 +75,10 @@ public class FsSysConfig {
 
     //不推送erp的公司id
     List<Long> noErpCompany;
+
+    //最低定金金额
+    private BigDecimal retainer;
+
+    //物流代收定金比例
+    private BigDecimal rate;
 }

+ 42 - 0
fs-service/src/main/java/com/fs/his/domain/FsComplaintTemplate.java

@@ -0,0 +1,42 @@
+package com.fs.his.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 投诉模板对象 fs_complaint_template
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsComplaintTemplate extends BaseEntity{
+
+    @TableId
+    private Long id;
+
+    /** 上级编码 */
+    @Excel(name = "上级编码")
+    private Long parentId;
+
+    /** 同级下排序 */
+    @Excel(name = "同级下排序")
+    private Long sort;
+
+    /** 投诉分类 */
+    @Excel(name = "投诉分类")
+    private String name;
+
+
+    @Excel(name = "投诉分类")
+    private Long isDel;
+
+
+    private String description;
+
+
+}

+ 63 - 0
fs-service/src/main/java/com/fs/his/domain/FsUserComplaint.java

@@ -0,0 +1,63 @@
+package com.fs.his.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 用户投诉对象 fs_user_complaint
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserComplaint extends BaseEntity{
+
+    @TableId
+    private Long id;
+
+    /** 用户id */
+//    @Excel(name = "用户id")
+    private Long userId;
+
+    @Excel(name = "用户")
+    private String userName;
+
+    /** 投诉模板id */
+    @Excel(name = "投诉模板id")
+    private Long templateId;
+
+    /** 详细内容 */
+    @Excel(name = "详细内容")
+    private String content;
+
+    /** 联系方式 */
+    @Excel(name = "联系方式")
+    private String phone;
+
+    /** 图片地址 */
+    @Excel(name = "图片地址")
+    private String urls;
+
+    @Excel(name = "交易截图")
+    private String tradeImage;
+
+    /** 被投诉人信息 */
+    @Excel(name = "被投诉人信息")
+    private String account;
+
+    /** 是否处理 */
+    @Excel(name = "是否处理")
+    private Integer isHandle;
+
+    //投诉时间
+    private Date complaintsTime;
+    private Date complainteTime;
+
+    private String remarks;
+}

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

@@ -13,6 +13,7 @@ public enum FsStoreOrderLogEnum {
     REMOVE_ORDER("remove_order","删除订单"),
     EVAL_ORDER("order_eval","用户评价"),
     REFUND_ORDER_APPLY("apply_refund","用户申请退款"),
+    REFUND_ORDER_DF("refund_order_df","代服取消订单,申请退款"),
     TAKE_ORDER_DELIVERY("user_take_delivery","用户已收货"),
     PAY_ORDER_SUCCESS("pay_success","用户付款成功"),
     PAY_REMAIN_ORDER_SUCCESS("pay_remain_success","用户付款尾款成功"),
@@ -24,8 +25,12 @@ public enum FsStoreOrderLogEnum {
     FINISH_ORDER("finish","确认收货"),
     LOCK_TUI_MONEY("lock_tui_money","冻结推广金"),
     UNLOCK_TUI_MONEY("unlock_tui_money","解冻推广金"),
-    EDIT_ORDER_PRICE("edit_order_money","改价");
+    EDIT_ORDER_PRICE("edit_order_money","改价"),
 
+    PLATFORM_REVIEW_SALES("PLATFORM_REVIEW_SALES","平台已审核"),
+    WAREHOUSE_REVIEW_SALES("WAREHOUSE_REVIEW_SALES","仓库已审核"),
+    FINANCE_REVIEW_SALES("FINANCE_REVIEW_SALES","财务已审核"),
+    PLATFORM_REVIEW_CANCEL("PLATFORM_REVIEW_CANCEL","平台已取消售后");
     private String value;
     private String desc;
 

+ 62 - 0
fs-service/src/main/java/com/fs/his/mapper/FsComplaintTemplateMapper.java

@@ -0,0 +1,62 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsComplaintTemplate;
+
+import java.util.List;
+
+/**
+ * 投诉模板Mapper接口
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+public interface FsComplaintTemplateMapper extends BaseMapper<FsComplaintTemplate>{
+    /**
+     * 查询投诉模板
+     *
+     * @param id 投诉模板主键
+     * @return 投诉模板
+     */
+    FsComplaintTemplate selectFsComplaintTemplateById(Long id);
+
+    /**
+     * 查询投诉模板列表
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 投诉模板集合
+     */
+    List<FsComplaintTemplate> selectFsComplaintTemplateList(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 新增投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    int insertFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 修改投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    int updateFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 删除投诉模板
+     *
+     * @param id 投诉模板主键
+     * @return 结果
+     */
+    int deleteFsComplaintTemplateById(Long id);
+
+    /**
+     * 批量删除投诉模板
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsComplaintTemplateByIds(Long[] ids);
+}

+ 3 - 0
fs-service/src/main/java/com/fs/his/mapper/FsHealthTongueMapper.java

@@ -2,6 +2,7 @@ package com.fs.his.mapper;
 
 import java.util.List;
 
+import com.fs.aiTongueApi.domain.inner.TongueInfo;
 import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsHealthTongue;
 import com.fs.his.param.FsHealthTongueListUParam;
@@ -95,4 +96,6 @@ public interface FsHealthTongueMapper
     FsHealthTongueUVO selectFsHealthTongueUVOById(Long id);
 
     List<String> selectListByDateAndUserId(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("userId") Long userId);
+
+    TongueInfo selectFsTongueInfo(TongueInfo tongueInfo);
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/mapper/FsHfpayConfigMapper.java

@@ -3,6 +3,7 @@ package com.fs.his.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsHfpayConfig;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * 汇付多支付配置Mapper接口
@@ -58,4 +59,7 @@ public interface FsHfpayConfigMapper extends BaseMapper<FsHfpayConfig>{
      * @return 结果
      */
     int deleteFsHfpayConfigByIds(Long[] ids);
+
+    @Select("select * from fs_hfpay_config where app_id = #{appId} limit 1")
+    FsHfpayConfig selectByAppId(String appId);
 }

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

@@ -7,6 +7,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.fs.company.param.FsStoreStatisticsParam;
 import com.fs.company.vo.FsStoreOrderStatisticsVO;
 import com.fs.company.vo.FsStoreProductStatisticsVO;
+import com.fs.crm.domain.Report;
+import com.fs.crm.param.ReportParam;
 import com.fs.his.domain.FsInquiryOrderMsg;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.domain.FsStoreOrderItem;
@@ -641,7 +643,7 @@ public interface FsStoreOrderMapper
             "</if>" +
             "</script>"})
     Long selectFsStoreOrderTotalCount(@Param("type") int type, @Param("companyId") Long companyId);
-    @Select("select order_id from fs_store_order WHERE `status`= 2 and order_type=1 and store_id in (select store_id from fs_store where delivery_type=2) and  extend_order_id is null ")
+    @Select("select order_id from fs_store_order WHERE `status`= 2 and  extend_order_id is null ")
     List<Long> selectFsStoreOrderNoCreateOms();
     @Select("select order_id from fs_store_order WHERE `status`= 2 and order_type=2 and store_id in(select store_id from fs_store where delivery_type=1) and  extend_order_id is null ")
     List<Long> selectFsStoreOrderNoTuiOrder();
@@ -1163,4 +1165,7 @@ public interface FsStoreOrderMapper
     Long selectFsStoreOrderListVOByErpAccountByExportCount(@Param("maps")FsStoreOrderParam param);
 
     List<FsStoreOrderErpExportVO> selectFsStoreOrderListErpVOByExport(@Param("maps")FsStoreOrderParam fsStoreOrder);
+
+
+    List<Report> selectOrderByCustomerIds(@Param("map") ReportParam param);
 }

+ 2 - 1
fs-service/src/main/java/com/fs/his/mapper/FsStorePaymentMapper.java

@@ -175,7 +175,7 @@ public interface FsStorePaymentMapper
     @Select("select * from fs_store_payment where business_type=#{type} and  business_id=#{businessId} and (status=1 or starus=-1)")
     List<FsStorePayment> selectFsStorePaymentByPayOrRefund(int i, Long orderId);
     @Select({"<script> " +
-            " SELECT CONCAT('package-', sp.business_code) AS business_code,sp.*,u.nick_name,u.phone,s.store_name,c.company_name,cu.nick_name as companyUserName,fso.delivery_name,fso.package_name,fso.package_second_name FROM fs_store_payment sp " +
+            " SELECT CONCAT('package-', sp.pay_code) AS pay_code,sp.*,u.nick_name,u.phone,s.store_name,c.company_name,cu.nick_name as companyUserName,fso.delivery_name,fso.package_name,fso.package_second_name FROM fs_store_payment sp " +
             " LEFT JOIN  fs_user u ON u.user_id=sp.user_id " +
             " LEFT JOIN fs_store s ON s.store_id=sp.store_id " +
             " left join fs_store_order fso on fso.order_code = sp.business_code " +
@@ -312,4 +312,5 @@ public interface FsStorePaymentMapper
             "</script>"})
     List<FsStorePaymentVO> selectFsStorePaymentListQueryVO(@Param("maps") FsStorePaymentParam fsStorePayment);
 
+    FsStorePayment selectLastByBusinessCode(@Param("orderSn")String orderSn);
 }

+ 63 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserComplaintMapper.java

@@ -0,0 +1,63 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsUserComplaint;
+import com.fs.his.vo.FsUserComplaintVo;
+
+import java.util.List;
+
+/**
+ * 用户投诉Mapper接口
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+public interface FsUserComplaintMapper extends BaseMapper<FsUserComplaint>{
+    /**
+     * 查询用户投诉
+     *
+     * @param id 用户投诉主键
+     * @return 用户投诉
+     */
+    FsUserComplaintVo selectFsUserComplaintById(Long id);
+
+    /**
+     * 查询用户投诉列表
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 用户投诉集合
+     */
+    List<FsUserComplaintVo> selectFsUserComplaintList(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 新增用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    int insertFsUserComplaint(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 修改用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    int updateFsUserComplaint(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 删除用户投诉
+     *
+     * @param id 用户投诉主键
+     * @return 结果
+     */
+    int deleteFsUserComplaintById(Long id);
+
+    /**
+     * 批量删除用户投诉
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsUserComplaintByIds(Long[] ids);
+}

+ 8 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -402,4 +402,12 @@ public interface FsUserMapper
 
     @Update("update fs_user set status = 0,phone = null,union_id = null,is_del = 1 where user_id = #{userId}")
     void removeUser(Long userId);
+
+
+    /**
+     * 统计用户相关数据(课程、答题、红包)
+     */
+    Map<String, Object> countUserStats(
+            UserStatisticsCommonParam param);
+
 }

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

@@ -8,5 +8,5 @@ import java.io.Serializable;
 public class FsInquiryOrderPayParam implements Serializable {
     Long orderId;
     Long userCouponId;
-
+    String appId;
 }

+ 62 - 0
fs-service/src/main/java/com/fs/his/service/IFsComplaintTemplateService.java

@@ -0,0 +1,62 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsComplaintTemplate;
+
+import java.util.List;
+
+/**
+ * 投诉模板Service接口
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+public interface IFsComplaintTemplateService extends IService<FsComplaintTemplate>{
+    /**
+     * 查询投诉模板
+     *
+     * @param id 投诉模板主键
+     * @return 投诉模板
+     */
+    FsComplaintTemplate selectFsComplaintTemplateById(Long id);
+
+    /**
+     * 查询投诉模板列表
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 投诉模板集合
+     */
+    List<FsComplaintTemplate> selectFsComplaintTemplateList(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 新增投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    int insertFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 修改投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    int updateFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate);
+
+    /**
+     * 批量删除投诉模板
+     *
+     * @param ids 需要删除的投诉模板主键集合
+     * @return 结果
+     */
+    int deleteFsComplaintTemplateByIds(Long[] ids);
+
+    /**
+     * 删除投诉模板信息
+     *
+     * @param id 投诉模板主键
+     * @return 结果
+     */
+    int deleteFsComplaintTemplateById(Long id);
+}

+ 3 - 0
fs-service/src/main/java/com/fs/his/service/IFsHealthTongueService.java

@@ -2,6 +2,7 @@ package com.fs.his.service;
 
 import java.util.List;
 
+import com.fs.aiTongueApi.domain.inner.TongueInfo;
 import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsHealthTongue;
 import com.fs.his.param.FsHealthTongueListUParam;
@@ -80,4 +81,6 @@ public interface IFsHealthTongueService
     FsHealthTongueUVO selectFsHealthTongueUVOById(Long id);
 
     Long selectFsHealthTongueAllCountByUserId(Long l);
+
+    TongueInfo selectFsTongueInfo(TongueInfo tongueInfo);
 }

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

@@ -93,9 +93,9 @@ public interface IFsStoreOrderService
     List<FsStoreOrderLogs> selectFsStoreOrderLogsList(String orderId);
 
 
-    int sendGoods(FsStoreOrder fsStoreOrder);
+    int sendGoods(FsStoreOrder fsStoreOrder,String opeName);
 
-    int getGoods(Long orderId);
+    int getGoods(Long orderId,String opeName);
 
     int updateMoney(FsStoreOrder fsStoreOrder);
 

+ 6 - 0
fs-service/src/main/java/com/fs/his/service/IFsStorePaymentService.java

@@ -13,6 +13,8 @@ import com.fs.his.param.PayOrderParam;
 import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.vo.FsStorePaymentExcelVO;
 import com.fs.his.vo.FsStorePaymentVO;
+import com.fs.hisStore.param.FsStorePaymentGetWxaCodeParam;
+import com.fs.hisStore.param.FsStorePaymentPayParam;
 import me.chanjar.weixin.common.error.WxErrorException;
 
 import javax.servlet.http.HttpServletRequest;
@@ -114,4 +116,8 @@ public interface IFsStorePaymentService
      * @return R
      */
     R processPayment(PayOrderParam payOrderParam);
+
+    R paymentByWxaCode(FsStorePaymentPayParam payment);
+
+    R getWxaCodeByPayment(FsStorePaymentGetWxaCodeParam param);
 }

+ 63 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserComplaintService.java

@@ -0,0 +1,63 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsUserComplaint;
+import com.fs.his.vo.FsUserComplaintVo;
+
+import java.util.List;
+
+/**
+ * 用户投诉Service接口
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+public interface IFsUserComplaintService extends IService<FsUserComplaint>{
+    /**
+     * 查询用户投诉
+     *
+     * @param id 用户投诉主键
+     * @return 用户投诉
+     */
+    FsUserComplaintVo selectFsUserComplaintById(Long id);
+
+    /**
+     * 查询用户投诉列表
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 用户投诉集合
+     */
+    List<FsUserComplaintVo> selectFsUserComplaintList(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 新增用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    int insertFsUserComplaint(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 修改用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    int updateFsUserComplaint(FsUserComplaint fsUserComplaint);
+
+    /**
+     * 批量删除用户投诉
+     *
+     * @param ids 需要删除的用户投诉主键集合
+     * @return 结果
+     */
+    int deleteFsUserComplaintByIds(Long[] ids);
+
+    /**
+     * 删除用户投诉信息
+     *
+     * @param id 用户投诉主键
+     * @return 结果
+     */
+    int deleteFsUserComplaintById(Long id);
+}

+ 94 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsComplaintTemplateServiceImpl.java

@@ -0,0 +1,94 @@
+package com.fs.his.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsComplaintTemplate;
+import com.fs.his.mapper.FsComplaintTemplateMapper;
+import com.fs.his.service.IFsComplaintTemplateService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 投诉模板Service业务层处理
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+@Service
+public class FsComplaintTemplateServiceImpl extends ServiceImpl<FsComplaintTemplateMapper, FsComplaintTemplate> implements IFsComplaintTemplateService {
+
+    /**
+     * 查询投诉模板
+     *
+     * @param id 投诉模板主键
+     * @return 投诉模板
+     */
+    @Override
+    public FsComplaintTemplate selectFsComplaintTemplateById(Long id)
+    {
+        return baseMapper.selectFsComplaintTemplateById(id);
+    }
+
+    /**
+     * 查询投诉模板列表
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 投诉模板
+     */
+    @Override
+    public List<FsComplaintTemplate> selectFsComplaintTemplateList(FsComplaintTemplate fsComplaintTemplate)
+    {
+        return baseMapper.selectFsComplaintTemplateList(fsComplaintTemplate);
+    }
+
+    /**
+     * 新增投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    @Override
+    public int insertFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate)
+    {
+        fsComplaintTemplate.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsComplaintTemplate(fsComplaintTemplate);
+    }
+
+    /**
+     * 修改投诉模板
+     *
+     * @param fsComplaintTemplate 投诉模板
+     * @return 结果
+     */
+    @Override
+    public int updateFsComplaintTemplate(FsComplaintTemplate fsComplaintTemplate)
+    {
+        fsComplaintTemplate.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsComplaintTemplate(fsComplaintTemplate);
+    }
+
+    /**
+     * 批量删除投诉模板
+     *
+     * @param ids 需要删除的投诉模板主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsComplaintTemplateByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsComplaintTemplateByIds(ids);
+    }
+
+    /**
+     * 删除投诉模板信息
+     *
+     * @param id 投诉模板主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsComplaintTemplateById(Long id)
+    {
+        return baseMapper.deleteFsComplaintTemplateById(id);
+    }
+}

+ 5 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsFollowReportServiceImpl.java

@@ -29,6 +29,7 @@ import io.swagger.models.auth.In;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import com.fs.his.mapper.FsFollowReportMapper;
 import com.fs.his.service.IFsFollowReportService;
@@ -43,6 +44,7 @@ import com.fs.his.service.IFsFollowReportService;
 public class FsFollowReportServiceImpl implements IFsFollowReportService
 {
     @Autowired
+    @Lazy
     private FsFollowReportMapper fsFollowReportMapper;
     @Autowired
     private FsDoctorMapper  doctorMapper;
@@ -50,10 +52,13 @@ public class FsFollowReportServiceImpl implements IFsFollowReportService
     private FsStoreOrderMapper fsStoreOrderMapper;
     @Autowired
     private FsPrescribeMapper fsPrescribeMapper;
+
     @Autowired
     private IImService imService;
 //    @Autowired
 //    SmsServiceImpl smsService;
+    @Lazy
+    SmsServiceImpl smsService;
     Logger logger= LoggerFactory.getLogger(getClass());
     /**
      * 查询咨询报告

+ 60 - 57
fs-service/src/main/java/com/fs/his/service/impl/FsHealthTongueServiceImpl.java

@@ -4,15 +4,18 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 import com.alibaba.fastjson.JSON;
 import com.fs.aiTongueApi.domain.AITongueResult;
 import com.fs.aiTongueApi.domain.QueryQuanXi;
 import com.fs.aiTongueApi.domain.inner.TongueData;
+import com.fs.aiTongueApi.domain.inner.TongueInfo;
 import com.fs.aiTongueApi.service.AiTongueService;
 import com.fs.aiTongueApi.service.impl.AiTongueServiceImpl;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.spring.SpringUtils;
 import com.fs.his.param.FsHealthTongueListUParam;
 import com.fs.his.param.FsHealthTongueParam;
 import com.fs.his.param.FsHealthTongueUParam;
@@ -20,6 +23,8 @@ import com.fs.his.vo.FsHealthTongueListUVO;
 import com.fs.his.vo.FsHealthTongueListVO;
 import com.fs.his.vo.FsHealthTongueUVO;
 import com.qiniu.util.Json;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.his.mapper.FsHealthTongueMapper;
@@ -125,66 +130,59 @@ public class FsHealthTongueServiceImpl implements IFsHealthTongueService
     @Override
     public R insertFsHealthTongueByImgUrl(FsHealthTongueUParam param) {
 
-        QueryQuanXi queryQuanXi = new QueryQuanXi();
-        if (param.getName()!=null&&!param.getName().equals("")){
-            queryQuanXi.setName(param.getName());
-        }{
-            queryQuanXi.setName("匿名");
-        }
-        if (param.getAge()!=null){
-            queryQuanXi.setAge(param.getAge()+"");
-        }else {
-            queryQuanXi.setAge("55");
-        }
+        // 使用Redisson分布式锁保证高并发下的同步执行
+        RedissonClient redissonClient = SpringUtils.getBean(RedissonClient.class);
+        String lockKey = "tongueAnalysis:" + param.getUserId();
+        RLock lock = redissonClient.getLock(lockKey);
 
-        queryQuanXi.setFile(param.getTongueUrl());
-        if (param.getSex()!=null){
-            queryQuanXi.setMale(param.getSex()==1?"1":"0");
-        }else {
-            queryQuanXi.setMale("0");
-        }
+        try {
+            // 尝试获取锁,最多等待3秒,持有锁时间最多30秒
+            boolean isLocked = lock.tryLock(3,  30, TimeUnit.SECONDS);
+            if (!isLocked) {
+                return R.error("系统繁忙,请稍后再试");
+            }
+
+            // 检查用户使用频率限制(每天最多3次)
+            /*Long count = selectFsHealthTongueCountByUserId(param.getUserId());
+            if (count >= 5) {
+                return R.error("今日使用次数已达上限");
+            }*/
+
+            AITongueResult<FsHealthTongue> tongueDataAITongueResult = aiTongueService.newCheckTongue(param.getTongueUrl());
+            FsHealthTongue data = tongueDataAITongueResult.getData();
+
+            if (param.getName()!=null&&!param.getName().isEmpty()){
+                data.setName(param.getName());
+            }
 
-        AITongueResult<TongueData> tongueDataAITongueResult = aiTongueService.quanXiTongue(queryQuanXi);
-
-        if (tongueDataAITongueResult.getCode().equals("40001")){
-            FsHealthTongue fsHealthTongue = new FsHealthTongue();
-            fsHealthTongue.setAge(param.getAge());
-            fsHealthTongue.setPatientId(param.getPatientId());
-            fsHealthTongue.setName(param.getName());
-            fsHealthTongue.setSex(param.getSex());
-            fsHealthTongue.setStatus(0);
-            fsHealthTongue.setUserId(param.getUserId());
-            fsHealthTongue.setTongueUrl(param.getTongueUrl());
-            TongueData data = tongueDataAITongueResult.getData();
-            fsHealthTongue.setTongueId(data.getId());
-            fsHealthTongue.setCreateTime(new Date());
-            fsHealthTongue.setTypeName(data.getTypeName()+"质");
-
-            fsHealthTongue.setBotai(data.getBotai());
-            fsHealthTongue.setBotaiDesc(data.getBotaiDesc());
-            fsHealthTongue.setChihen(data.getChihen());
-            fsHealthTongue.setChihenDesc(data.getChihenDesc());
-            fsHealthTongue.setLiewen(data.getLiewen());
-            fsHealthTongue.setLiewenDesc(data.getLiewenDesc());
-            fsHealthTongue.setShemianName(data.getShemianName());
-            fsHealthTongue.setShemianDesc(data.getShemianDesc());
-            fsHealthTongue.setTaiseName(data.getTaiseName());
-            fsHealthTongue.setTaiseDesc(data.getTaiseDesc());
-            String json =fsHealthTongueMapper.selectTypeJSON();
-            String typeName = fsHealthTongue.getTypeName();
-            String itemTypeJSonValue="[]";
-            List<Map<String, Object>> itemTypeJsonList = (List<Map<String, Object>>) JSON.parse(json);
-            for (Map<String, Object> stringStringMap : itemTypeJsonList) {
-                String itemType = (String) stringStringMap.get("itemType");
-                if (itemType.equals(typeName)){
-                    itemTypeJSonValue= Json.encode(stringStringMap.get("item"));
-                }
+            if (param.getAge()!=null){
+                data.setAge(param.getAge());
+            }
+
+            if (param.getSex()!=null){
+                data.setSex(param.getSex());
+            }
+
+            if (tongueDataAITongueResult.getCode().equals("40001")){
+                data.setPatientId(param.getPatientId());
+                data.setStatus(0);
+                data.setUserId(param.getUserId());
+                data.setCreateTime(new Date());
+                fsHealthTongueMapper.insertFsHealthTongue(data);
+                return R.ok().put("data",data);
+            }else {
+                return R.error(tongueDataAITongueResult.getMeta().getMsg());
+            }
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            return R.error("系统繁忙,请稍后再试");
+        } catch (Exception e) {
+            return R.error("系统异常,请稍后再试!");
+        } finally {
+            // 释放锁
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
             }
-            fsHealthTongue.setTypeJson(itemTypeJSonValue);
-            fsHealthTongueMapper.insertFsHealthTongue(fsHealthTongue);
-            return R.ok().put("data",fsHealthTongue);
-        }else {
-            return R.error(tongueDataAITongueResult.getMeta().getMsg());
         }
     }
 
@@ -207,4 +205,9 @@ public class FsHealthTongueServiceImpl implements IFsHealthTongueService
     public Long selectFsHealthTongueAllCountByUserId(Long id) {
         return fsHealthTongueMapper.selectFsHealthTongueAllCountByUserId(id);
     }
+
+    @Override
+    public TongueInfo selectFsTongueInfo(TongueInfo tongueInfo) {
+        return fsHealthTongueMapper.selectFsTongueInfo(tongueInfo);
+    }
 }

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

@@ -63,11 +63,13 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService
     @Autowired
     private IFsFollowReportService fsFollowReportService;
     @Autowired
+    @Lazy
     private FsFollowReportMapper fsFollowReportMapper;
     @Autowired
     private FsDoctorMapper  doctorMapper;
     @Lazy
     @Autowired
+            @Lazy
     SmsServiceImpl smsService;
     @Autowired
     FsUserMapper fsUserMapper;

+ 19 - 1
fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java

@@ -645,7 +645,18 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         }
         else if(param.getInquiryType().equals(2)){
             //快速
-
+            FsDoctor doctor = null;
+            //获取销售绑定的医生信息
+            if (param.getCompanyUserId() != null) {
+                CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
+                if (companyUser != null && companyUser.getDoctorId() != null) {
+                    doctor = doctorMapper.selectFsDoctorByDoctorId(companyUser.getDoctorId());
+                    if (doctor != null) {
+                        order.setDoctorId(doctor.getDoctorId());
+                        order.setDepartmentId(doctor.getDeptId());
+                    }
+                }
+            }
             List<FsPriceDTO> price = configDTO.getPrices().stream().filter(x -> x.getType().equals(param.getOrderType())).collect(Collectors.toList());
             if(price!=null&&price.size()==1){
                 order.setMoney(price.get(0).getPrice());
@@ -664,6 +675,9 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
                 report.setPatientJson(JSONUtil.toJsonStr(dto));
                 report.setReportSn(reportSn);
                 report.setStatus(1);
+                if (doctor != null) {
+                    report.setDoctorId(doctor.getDoctorId());
+                }
                 order.setIsAudit(1);
             }
             else{
@@ -678,9 +692,13 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
                 report.setPatientJson(JSONUtil.toJsonStr(dto));
                 report.setReportSn(reportSn);
                 report.setStatus(0);
+                if (doctor != null) {
+                    report.setDoctorId(doctor.getDoctorId());
+                }
                 order.setIsAudit(0);
             }
 
+
         }
         else if(param.getInquiryType().equals(3)){
             //开药

+ 54 - 15
fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java

@@ -7,6 +7,7 @@ import java.time.Duration;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 
 import cn.hutool.core.bean.BeanUtil;
@@ -24,15 +25,10 @@ import com.fs.common.exception.CustomException;
 import com.fs.common.utils.*;
 import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.poi.ExcelUtil;
-import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
-import com.fs.company.vo.CompanyMoneyLogsExportVO;
 import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
-import com.fs.event.TemplateBean;
-import com.fs.event.TemplateEvent;
-import com.fs.event.TemplateListenEnum;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
 import com.fs.his.dto.PackageConfigDTO;
@@ -54,7 +50,6 @@ import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.system.domain.SysConfig;
-import com.fs.ybPay.config.PayConfig;
 import com.fs.ybPay.domain.CreateWxOrderResult;
 import com.fs.ybPay.domain.OrderResult;
 import com.fs.ybPay.dto.OrderQueryDTO;
@@ -64,7 +59,6 @@ import com.fs.ybPay.service.IPayService;
 import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
 import com.fs.tzBankPay.TzBankService.TzBankService;
-import com.fs.tzBankPay.config.TzBankConfig;
 import com.fs.tzBankPay.doman.*;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
@@ -79,7 +73,6 @@ import com.google.gson.Gson;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -320,9 +313,12 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         }
 
         if (param.getType()==1) {
-            if (StringUtils.isBlank(user.getMaOpenId()) && !CloudHostUtils.isCloudHostName("弘德堂")) {
-                return R.error("用户OPENID不存在");
-            }
+//            if (StringUtils.isBlank(user.getMaOpenId()) && !CloudHostUtils.hasCloudHostName("弘德堂")) {
+//                return R.error("用户OPENID不存在");
+//            }
+//            if (!CloudHostUtils.hasCloudHostName("弘德堂")) {
+//                return R.error("用户OPENID不存在");
+//            }
 
             param.setCompanyId(order.getCompanyId());
             param.setCompanyUserId(order.getUserId());
@@ -347,6 +343,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         BigDecimal payDelivery = new BigDecimal(0);
         BigDecimal discountMoney = new BigDecimal(0);
         String json = configService.selectConfigByKey("his.package");
+        FsSysConfig sysConfig = configUtil.getSysConfig();
         PackageConfigDTO configDTO = JSONUtil.toBean(json, PackageConfigDTO.class);
         if (param.getUserCouponId() != null && param.getUserCouponId() > 0l) {
             FsUserCoupon userCoupon = userCouponService.selectFsUserCouponById(param.getUserCouponId());
@@ -409,7 +406,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
             payPrice = orderPrice;
             discountMoney = new BigDecimal(0);
         }
-
+        //payRemain-代收金额 payDelivery-邮费 payPrice-实际支付金额 payMoney-支付金额
         if (payPrice.compareTo(new BigDecimal(0)) == 1) {
             if (param.getPayType().equals(1)) {
                 //全款
@@ -419,13 +416,35 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
 
             } else if (param.getPayType().equals(2)) {
                 //代收
-                payMoney = payPrice.multiply(new BigDecimal((100 - configDTO.getPayRate()))).divide(new BigDecimal(100));
-                payMoney = new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
+//                payMoney = payPrice.multiply(new BigDecimal((100 - configDTO.getPayRate()))).divide(new BigDecimal(100));
+//                payMoney = new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
+//                payRemain = payPrice.subtract(payMoney);
+//                payDelivery = new BigDecimal(0);
+//                if (payRemain.compareTo(new BigDecimal(0)) == 0) {
+//                    throw new CustomException("代收金额应大于0");
+//                }
+                if (sysConfig.getRetainer() != null && sysConfig.getRate() != null && sysConfig.getRate().compareTo(new BigDecimal(0)) > 0) {
+                    if (payPrice.compareTo(new BigDecimal(100)) < 0) {
+                        throw new CustomException("订单金额应大于等于100");
+                    }
+                    //有最低定金金额和提成比率
+                    if (payPrice.compareTo(new BigDecimal(1000)) < 0) {
+                        payMoney = new BigDecimal(100);
+                    } else {
+                        payMoney = payPrice.multiply(sysConfig.getRate()).divide(new BigDecimal(100));
+                        payMoney = new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
+                    }
+                } else {
+                    payMoney = payPrice.multiply(new BigDecimal((100 - configDTO.getPayRate()))).divide(new BigDecimal(100));
+                    payMoney = new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
+                }
                 payRemain = payPrice.subtract(payMoney);
                 payDelivery = new BigDecimal(0);
                 if (payRemain.compareTo(new BigDecimal(0)) == 0) {
                     throw new CustomException("代收金额应大于0");
                 }
+
+
             } else if (param.getPayType().equals(3)) {
                 //货到付款
                 payMoney = configDTO.getPayDelivery();
@@ -461,8 +480,15 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         }else {
             return R.error("请提交患者信息");
         }
+        logger.info("用户{}创建套餐订单,套餐id{},患者id{}",param.getUserId(),param.getPackageId(),param.getPatientId());
 
         FsPackage fsPackage=fsPackageMapper.selectFsPackageByPackageId(param.getPackageId());
+        logger.info("是否是中药或者西药{},{}",fsPackage.getProductType(),fsPackage.getProductType() == 1 || fsPackage.getProductType() == 2);
+        if (fsPackage.getProductType() == 1 || fsPackage.getProductType() == 2) {
+            if (StringUtils.isEmpty(patient.getIdCard())) {
+                return R.error("请完善患者身份证信息");
+            }
+        }
         if(fsPackage.getStatus().equals(0)){
             return R.error("套餐名已下架");
         }
@@ -730,6 +756,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
             inquiryOrderService.createOrderByPackageOrder(order);
         }
         if (packageSubType!=1){
+            logger.info("创建订单2");
             storeOrderService.createOrderByPackageOrder(order);
             logger.info("创建订单");
         }
@@ -740,6 +767,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
             u.setIsBuy(1);
             fsUserService.updateFsUser(u);
         }
+        logger.info("更新完成");
         return R.ok();
     }
 
@@ -1195,7 +1223,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         }
         //如果存在优惠券  判断优惠券是否已使用
         FsUser user=userService.selectFsUserByUserId(param.getUserId());
-        if(user!=null&& StringUtils.isNotEmpty(user.getMpOpenId())){
+        if(user!=null){
             if(fsPackageOrder.getPayMoney().compareTo(new BigDecimal(0))==1){
                 String json = configService.selectConfigByKey("his.pay");
                 PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
@@ -1251,6 +1279,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
                         o.setReqSeqId("package-"+storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
                         o.setGoodsDesc("套餐包订单支付");
+                        o.setAppId(param.getAppId());
                         HuifuCreateOrderResult result = huiFuService.createOrder(o);
                         logger.info("创建汇付支付:"+result);
                         FsStorePayment mt=new FsStorePayment();
@@ -1405,9 +1434,19 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         String configValue = sysConfigMapper.selectConfigByConfigKey("his.package").getConfigValue();
         Map<String, Object> config = (Map<String, Object>) JSON.parse(configValue);
         Integer followRate = (Integer)config.get("followRate");
+        List<CompletableFuture<Void>> futures = new ArrayList<>();
         for (FsPackageOrderExcelVO vo : list) {
             vo.setFollowRate(followRate);
+            //银行交易单号
+            CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+                FsStorePayment fsStorePayment = fsStorePaymentMapper.selectLastByBusinessCode(vo.getOrderSn());
+                if (fsStorePayment != null) {
+                    vo.setBusinessCode("package-" + fsStorePayment.getBusinessCode());
+                }
+            });
+            futures.add(future);
         }
+        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
         ExcelUtil<FsPackageOrderExcelVO> util = new ExcelUtil<FsPackageOrderExcelVO>(FsPackageOrderExcelVO.class);
         AjaxResult result= util.exportExcel(list, "套餐包导出");
         FsExportTask task=exportTaskService.selectFsExportTaskByTaskId(fsPackageOrder.getTaskId());

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

@@ -528,6 +528,7 @@ public class FsPrescribeServiceImpl implements IFsPrescribeService
         if (fsDoctor==null){
             throw new CustomException("医生查询错误:"+packageOrder.getDoctorId());
         }
+
         fsPrescribe.setPrescribeDoctorId(fsDoctor.getDoctorId());
         fsPrescribe.setPrescribeDoctorSignUrl(fsDoctor.getSignUrl());
 

+ 15 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -32,6 +32,7 @@ import com.fs.his.dto.FsStoreAfterSalesProductDTO;
 import com.fs.his.dto.PayConfigDTO;
 import com.fs.his.enums.FsInquiryOrderStatusEnum;
 import com.fs.his.enums.FsStoreAfterSalesStatusEnum;
+import com.fs.his.enums.FsStoreOrderLogEnum;
 import com.fs.his.enums.FsStoreOrderStatusEnum;
 import com.fs.his.mapper.*;
 import com.fs.his.param.*;
@@ -152,6 +153,8 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
     IFsStoreOrderBillLogService fsStoreOrderBillLogService;
     @Autowired
     private ConfigUtil configUtil;
+    @Autowired
+    private IFsStoreOrderLogsService fsStoreOrderLogsService;
 
     /**
      * 查询售后记录
@@ -280,6 +283,9 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
         logs.setChangeMessage(FsStoreAfterSalesStatusEnum.STATUS_1.getDesc());
         logs.setOperator(fsStoreAfterSales.getOperator());
         fsStoreAfterSalesLogsMapper.insertFsStoreAfterSalesLogs(logs);
+        //添加订单日志
+        fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.PLATFORM_REVIEW_SALES.getValue(),
+                logs.getOperator()+" "+FsStoreOrderLogEnum.PLATFORM_REVIEW_SALES.getDesc());
         return 1;
     }
 
@@ -306,6 +312,9 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
         logs.setChangeMessage(FsStoreAfterSalesStatusEnum.STATUS_6.getDesc() + " " + fsStoreAfterSales.getRemark());
         logs.setOperator(fsStoreAfterSales.getOperator());
         fsStoreAfterSalesLogsMapper.insertFsStoreAfterSalesLogs(logs);
+        //添加订单日志
+        fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.PLATFORM_REVIEW_CANCEL.getValue(),
+                logs.getOperator() + " " +FsStoreOrderLogEnum.PLATFORM_REVIEW_CANCEL.getDesc());
 //        FsStoreOrderLogs Logs = new FsStoreOrderLogs();
 //        Logs.setChangeMessage("已取消退款");
 //        Logs.setOrderId(order.getOrderId());
@@ -383,6 +392,9 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
         logs.setChangeMessage(FsStoreAfterSalesStatusEnum.STATUS_4.getDesc());
         logs.setOperator(fsStoreAfterSales.getOperator());
         fsStoreAfterSalesLogsMapper.insertFsStoreAfterSalesLogs(logs);
+        //添加订单日志
+        fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.FINANCE_REVIEW_SALES.getValue(),
+                logs.getOperator() + " " +FsStoreOrderLogEnum.FINANCE_REVIEW_SALES.getDesc());
         //更改订单状态
         FsStoreOrder or = new FsStoreOrder();
         or.setOrderId(order.getOrderId());
@@ -870,6 +882,9 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
         logs.setChangeMessage(FsStoreAfterSalesStatusEnum.STATUS_3.getDesc());
         logs.setOperator(fsStoreAfterSales.getOperator());
         fsStoreAfterSalesLogsMapper.insertFsStoreAfterSalesLogs(logs);
+        //添加订单日志
+        fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.WAREHOUSE_REVIEW_SALES.getValue(),
+                logs.getOperator() + " " +FsStoreOrderLogEnum.WAREHOUSE_REVIEW_SALES.getDesc());
         return 1;
     }
 

+ 22 - 12
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java

@@ -426,7 +426,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
 
 
     @Override
-    public int sendGoods(FsStoreOrder fsStoreOrder) {
+    public int sendGoods(FsStoreOrder fsStoreOrder,String opeName) {
         FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderId(fsStoreOrder.getOrderId());
         if (order == null) throw new CustomException("订单不存在");
         if (order.getStatus() != 2) throw new CustomException("非法更改");
@@ -445,12 +445,11 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
             companyService.subtractCompanyMoney(order);
         }
         FsStoreOrderLogs Logs = new FsStoreOrderLogs();
-        Logs.setChangeMessage("订单发货");
+        Logs.setChangeMessage(opeName+" 订单发货");
         Logs.setOrderId(fsStoreOrder.getOrderId());
         Logs.setChangeTime(new DateTime());
         Logs.setChangeType("delivery_goods");
         fsStoreOrderLogsMapper.insertFsStoreOrderLogs(Logs);
-
         String lastFourNumber = "";
         if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
             lastFourNumber = order.getUserPhone();
@@ -463,8 +462,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
     }
 
     @Override
-    public int getGoods(Long orderId) {
-
+    public int getGoods(Long orderId,String opeName) {
         FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderId(orderId);
         if (order == null) throw new CustomException("订单不存在");
         if (order.getStatus() != FsStoreOrderStatusEnum.STATUS_3.getValue()) throw new CustomException("非法更改");
@@ -482,7 +480,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
         fsUserWatchService.addUserWatch(order);
         int i = fsStoreOrderMapper.updateFsStoreOrder(o1);
         fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.FINISH_ORDER.getValue(),
-                FsStoreOrderLogEnum.FINISH_ORDER.getDesc());
+                opeName + " " +FsStoreOrderLogEnum.FINISH_ORDER.getDesc());
         return i;
     }
 
@@ -666,21 +664,25 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
 
     @Override
     public R createOrderByPackageOrder(FsPackageOrder packageOrder) {
+        logger.info("111111111111111");
         if (packageOrder.getDoctorId() == null) {
             Long doctorID = iFsDoctorService.selectFsDoctorDoctorByPackage();
             packageOrder.setDoctorId(doctorID);
         }
+        logger.info("2222222222222");
         FsPackage fsPackage = fsPackageMapper.selectFsPackageByPackageId(packageOrder.getPackageId());
         JSONArray objects = JSONUtil.parseArray(fsPackage.getProductJson());
         List<FsPackagePruductDTO> products = JSONUtil.toList(objects, FsPackagePruductDTO.class);
-
+        logger.info("3333333333333333333");
         Map<String, Object> packageJson = (Map) JSON.parse(packageOrder.getPackageJson());
+        logger.info("55555555555555555555");
         Integer packageSubType = (Integer) packageJson.get("packageSubType");
         if (packageSubType == 3) {
             inquiryOrderService.createOrderByPackageOrderStatus4(packageOrder);
         }
+        logger.info("4444444444444444444");
         Long prescribeId = fsPrescribeService.insertFsPrescribeByPackageOrder(packageOrder);
-
+        logger.info("66666666666666666");
         FsStoreOrder order = new FsStoreOrder();
         List<FsStoreOrderItem> items = new ArrayList<>();
         log.info("套餐包生成药品订单:{}", packageOrder.getOrderSn());
@@ -1212,7 +1214,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
 
         FsUser user = userService.selectFsUserByUserId(order.getUserId());
         Map<String, BigDecimal> data = new HashMap<>();
-        if (user != null && StringUtils.isNotEmpty(user.getMaOpenId())) {
+        if (user != null ) {
             if (param.getUserCouponId() != null && param.getUserCouponId() > 0l) {
                 FsUserCoupon userCoupon = userCouponService.selectFsUserCouponById(param.getUserCouponId());
                 if (userCoupon == null) {
@@ -1921,7 +1923,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                                 this.updateFsStoreOrder(map);
                                 //如果是正常签收,更新订单状态
                                 if (dto.getState().equals("3") && (dto.getStateEx().equals("301") || dto.getStateEx().equals("302") || dto.getStateEx().equals("304") || dto.getStateEx().equals("311"))) {
-                                    this.getGoods(order.getOrderId());
+                                    this.getGoods(order.getOrderId(),"物流签收");
                                     //app订单签收通知
                                     try {
                                         uniPush2Service.pushOne(
@@ -2050,7 +2052,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
             Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
             Object isUpdateOrder = config.get("isUpdateOrder");
             if (isUpdateOrder == null || "1".equals(isUpdateOrder.toString())) {
-                this.getGoods(order.getOrderId());
+                this.getGoods(order.getOrderId(),"物流签收");
             }
         }
         return R.ok();
@@ -2800,6 +2802,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                         o.setReqSeqId("store-" + storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
                         o.setGoodsDesc("药品订单支付");
+                        o.setAppId(param.getAppId());
                         HuifuCreateOrderResult result = huiFuService.createOrder(o);
                         FsStorePayment mt = new FsStorePayment();
                         mt.setPaymentId(storePayment.getPaymentId());
@@ -2888,6 +2891,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                         o.setReqSeqId("store-" + storePayment.getPayCode());
                         o.setTransAmt(storePayment.getPayMoney().toString());
                         o.setGoodsDesc("药品订单支付");
+                        o.setAppId(param.getAppId());
                         HuifuCreateOrderResult result = huiFuService.createOrder(o);
                         FsStorePayment mt = new FsStorePayment();
                         mt.setPaymentId(storePayment.getPaymentId());
@@ -3445,7 +3449,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                 Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
                 Object isUpdateOrder = config.get("isUpdateOrder");
                 if (isUpdateOrder == null || "1".equals(isUpdateOrder.toString())) {
-                    this.getGoods(order.getOrderId());
+                    this.getGoods(order.getOrderId(),"物流签收");
                 }
 
             }
@@ -3541,6 +3545,10 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                             if (fsStoreOrders != null && !fsStoreOrders.isEmpty()) {
                                 fsStoreOrders.forEach(order -> {
                                     FsStoreOrderSalesParam afterSalesParam = new FsStoreOrderSalesParam();
+                                    //修改订单状态 方便后续重新发货
+                                    order.setStatus(FsStoreOrderStatusEnum.STATUS_2.getValue());
+                                    order.setExtendOrderId("");
+                                    fsStoreOrderMapper.updateFsStoreOrder(order);
                                     afterSalesParam.setOrderId(order.getOrderId());
                                     afterSalesParam.setReasons("代服管家取消订单");
                                     afterSalesParam.setOperator("代服管家");
@@ -3550,6 +3558,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                                     df.setStatus(2);
                                     df.setUpdateTime(new Date());
                                     fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+                                    fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.REFUND_ORDER_DF.getValue(),
+                                            FsStoreOrderLogEnum.REFUND_ORDER_DF.getDesc());
                                 });
                             }
                         }

+ 130 - 3
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -5,9 +5,11 @@ import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.annotation.DataScope;
@@ -20,9 +22,15 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyConfigMapper;
 import com.fs.company.param.FsStoreStatisticsParam;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.company.vo.FsStorePaymentStatisticsVO;
+import com.fs.config.cloud.CloudHostProper;
+import com.fs.core.config.WxMaConfiguration;
 import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.config.CourseConfig;
@@ -47,9 +55,12 @@ import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.service.IFsInquiryOrderService;
 import com.fs.his.service.IFsPackageOrderService;
 import com.fs.his.service.IFsStoreOrderService;
+import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsStorePaymentExcelVO;
 import com.fs.his.vo.FsStorePaymentVO;
+import com.fs.hisStore.param.FsStorePaymentGetWxaCodeParam;
+import com.fs.hisStore.param.FsStorePaymentPayParam;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuiFuQueryOrderResult;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
@@ -59,6 +70,8 @@ import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
+import com.fs.system.oss.CloudStorageService;
+import com.fs.system.oss.OSSFactory;
 import com.fs.system.service.ISysConfigService;
 import com.fs.tzBankPay.TzBankService.TzBankService;
 import com.fs.tzBankPay.TzBankService.TzBankServiceImpl.TzBankServiceImpl;
@@ -102,7 +115,6 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
-import com.fs.his.service.IFsStorePaymentService;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletRequest;
@@ -152,6 +164,13 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
     private FsUserMapper userMapper;
     @Autowired
     private FsUserWxMapper userWxMapper;
+    @Autowired
+    private ICompanyUserService companyUserService;
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private CloudHostProper cloudHostProper;
 
     /**
      * 查询支付明细
@@ -571,7 +590,7 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         if(StringUtils.isEmpty(code)){
             return R.error("红包单号生成失败,请重试");
         }
-        request.setOutBatchNo("fsCourse" + code);
+        request.setOutBatchNo("fsCourse"+cloudHostProper.getProjectCode() + code);
         request.setBatchRemark("课堂答题奖励");
         request.setBatchName("课堂答题奖励");
         Integer amount = WxPayUnifiedOrderRequest.yuanToFen(param.getAmount().toString());
@@ -583,7 +602,7 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         TransferBatchesRequest.TransferDetail transferDetail = new TransferBatchesRequest.TransferDetail();
         transferDetail.setOpenid(param.getOpenId());
         String code1 = IdUtil.getSnowflake(0, 0).nextIdStr();
-        transferDetail.setOutDetailNo("fsCourse" + code1);
+        transferDetail.setOutDetailNo("fsCourse"+cloudHostProper.getProjectCode() + code1);
         transferDetail.setTransferAmount(amount);
         transferDetail.setTransferRemark("恭喜同学,认真听课,奖励你一朵小红花!");
         transferDetailList.add(transferDetail);
@@ -1152,4 +1171,112 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         return storePayment;
     }
 
+
+    @Override
+    public R getWxaCodeByPayment(FsStorePaymentGetWxaCodeParam param)  {
+        final WxMaService wxMaService = WxMaConfiguration.getMaService(param.getAppId());
+        String scene;
+        //判断销售id
+        if (param.getCompanyUserId() == null){
+            scene = "companyId="+ param.getCompanyId();
+        }else {
+            scene = "companyId="+ param.getCompanyId()+"&"+"companyUserId="+ param.getCompanyUserId();
+        }
+        byte[] file;
+        try {
+            file = wxMaService.getQrcodeService().createWxaCodeUnlimitBytes(
+                    scene,
+                    "pages_user/user/pay",
+                    true,
+                    "release",
+                    430,
+                    true,
+                    null,
+                    false);
+
+            // 上传图片到存储桶
+            String suffix = ".png";
+            CloudStorageService storage = OSSFactory.build();
+            String url;
+            try {
+                url = storage.uploadSuffix(file, suffix);
+            }  catch (Exception e) {
+                // 记录错误日志
+                logger.error("生成图片失败:{}",e.getMessage(),e);
+                return R.error("生成图片失败");
+            }
+            // 返回成功信息
+            return R.ok().put("url",url);
+
+        } catch (WxErrorException e) {
+            logger.error(e.getMessage(), e);
+            return R.error("微信接口调用失败: " + e.getMessage());
+        }
+    }
+
+
+
+    @Override
+    public R paymentByWxaCode(FsStorePaymentPayParam param) {
+        FsUser user = userMapper.selectFsUserById(param.getUserId());
+        if (user==null){
+            return R.error("用户不存在!");
+        }
+        Company company = companyService.selectCompanyById(param.getCompanyId());
+        if (company==null || company.getStatus()==0){
+            return R.error("服务商不存在,或已被停用!");
+        }
+        if(param.getPayMoney().compareTo(new BigDecimal(0.0))<1){
+            return R.error("支付金额必须大于0");
+        }
+        if (param.getCompanyUserId()!=null){
+            CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
+            if(companyUser == null || companyUser.getStatus().equals("1")){
+                return R.error("注册失败客服已停用,或不存在!");
+            }
+        }
+
+
+        //生成支付流水
+        String orderSn = IdUtil.getSnowflake(0, 0).nextIdStr();
+        FsStorePayment storePayment=new FsStorePayment();
+        storePayment.setCompanyId(param.getCompanyId());
+        //判断销售是否存在
+        if (param.getCompanyUserId()!=null){
+            storePayment.setCompanyUserId(param.getCompanyUserId());
+        }
+        storePayment.setStatus(0);
+        storePayment.setPayCode(orderSn);
+        storePayment.setPayMoney(param.getPayMoney());
+        storePayment.setCreateTime(new Date());
+        storePayment.setPayTypeCode("weixin");
+        storePayment.setBusinessType(1);
+        storePayment.setRemark("商城收款订单支付");
+        storePayment.setOpenId(user.getMaOpenId());
+        storePayment.setUserId(user.getUserId());
+        fsStorePaymentMapper.insertFsStorePayment(storePayment);
+
+        //汇付支付
+        HuiFuCreateOrder o = new HuiFuCreateOrder();
+        o.setTradeType("T_MINIAPP");
+        o.setOpenid(user.getMaOpenId());
+        o.setReqSeqId("payment-"+storePayment.getPayCode());
+        o.setTransAmt(storePayment.getPayMoney().toString());
+        o.setGoodsDesc("商城订单支付");
+        HuifuCreateOrderResult result = huiFuService.createOrder(o);
+        if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+            FsStorePayment mt=new FsStorePayment();
+            mt.setPaymentId(storePayment.getPaymentId());
+            mt.setTradeNo(result.getHf_seq_id());
+            fsStorePaymentMapper.updateFsStorePayment(mt);
+            Map<String, Object> resultMap = com.alibaba.fastjson.JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+            String s = (String) resultMap.get("package");
+            resultMap.put("packageValue",s);
+            return R.ok().put("result",resultMap);
+        }
+        else{
+            return R.error(result.getResp_desc());
+        }
+    }
+
 }

+ 94 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserComplaintServiceImpl.java

@@ -0,0 +1,94 @@
+package com.fs.his.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsUserComplaint;
+import com.fs.his.mapper.FsUserComplaintMapper;
+import com.fs.his.service.IFsUserComplaintService;
+import com.fs.his.vo.FsUserComplaintVo;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 用户投诉Service业务层处理
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+@Service
+public class FsUserComplaintServiceImpl extends ServiceImpl<FsUserComplaintMapper, FsUserComplaint> implements IFsUserComplaintService {
+
+    /**
+     * 查询用户投诉
+     *
+     * @param id 用户投诉主键
+     * @return 用户投诉
+     */
+    @Override
+    public FsUserComplaintVo selectFsUserComplaintById(Long id)
+    {
+        return baseMapper.selectFsUserComplaintById(id);
+    }
+
+    /**
+     * 查询用户投诉列表
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 用户投诉
+     */
+    @Override
+    public List<FsUserComplaintVo> selectFsUserComplaintList(FsUserComplaint fsUserComplaint)
+    {
+        return baseMapper.selectFsUserComplaintList(fsUserComplaint);
+    }
+
+    /**
+     * 新增用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    @Override
+    public int insertFsUserComplaint(FsUserComplaint fsUserComplaint)
+    {
+        fsUserComplaint.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsUserComplaint(fsUserComplaint);
+    }
+
+    /**
+     * 修改用户投诉
+     *
+     * @param fsUserComplaint 用户投诉
+     * @return 结果
+     */
+    @Override
+    public int updateFsUserComplaint(FsUserComplaint fsUserComplaint)
+    {
+        return baseMapper.updateFsUserComplaint(fsUserComplaint);
+    }
+
+    /**
+     * 批量删除用户投诉
+     *
+     * @param ids 需要删除的用户投诉主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserComplaintByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsUserComplaintByIds(ids);
+    }
+
+    /**
+     * 删除用户投诉信息
+     *
+     * @param id 用户投诉主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserComplaintById(Long id)
+    {
+        return baseMapper.deleteFsUserComplaintById(id);
+    }
+}

+ 186 - 167
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -6,6 +6,8 @@ import java.math.BigInteger;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -19,6 +21,7 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.domain.entity.SysDictData;
 import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.param.LoginMaWxParam;
 import com.fs.common.utils.DateUtils;
@@ -105,9 +108,9 @@ import static com.fs.hisStore.enums.BillDetailEnum.CATEGORY_3;
  * @date 2023-06-07
  */
 @Service
-public class FsUserServiceImpl implements IFsUserService
-{
-    Logger logger= LoggerFactory.getLogger(getClass());;
+public class FsUserServiceImpl implements IFsUserService {
+    Logger logger = LoggerFactory.getLogger(getClass());
+    ;
     @Autowired
     private FsUserMapper fsUserMapper;
     @Autowired
@@ -157,6 +160,9 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Autowired
     private CompanyRoleMapper companyRoleMapper;
+
+    @Autowired
+    private RedisCache redisCache;
     @Autowired
     private IFsUserProjectTagService userProjectTagService;
 
@@ -181,8 +187,7 @@ public class FsUserServiceImpl implements IFsUserService
      * @return 用户
      */
     @Override
-    public FsUser selectFsUserByUserId(Long userId)
-    {
+    public FsUser selectFsUserByUserId(Long userId) {
         return fsUserMapper.selectFsUserByUserId(userId);
     }
 
@@ -198,8 +203,7 @@ public class FsUserServiceImpl implements IFsUserService
      * @return 用户
      */
     @Override
-    public List<FsUser> selectFsUserList(FsUser fsUser)
-    {
+    public List<FsUser> selectFsUserList(FsUser fsUser) {
         return fsUserMapper.selectFsUserList(fsUser);
     }
 
@@ -211,10 +215,9 @@ public class FsUserServiceImpl implements IFsUserService
      */
     @Override
     @Transactional
-    public int insertFsUser(FsUser fsUser)
-    {
+    public int insertFsUser(FsUser fsUser) {
         fsUser.setCreateTime(DateUtils.getNowDate());
-        if (StringUtils.isNotEmpty(fsUser.getPhone())){
+        if (StringUtils.isNotEmpty(fsUser.getPhone())) {
             fsUser.setPhone(encryptPhone(fsUser.getPhone()));
         }
         int i = fsUserMapper.insertFsUser(fsUser);
@@ -233,12 +236,11 @@ public class FsUserServiceImpl implements IFsUserService
      * @return 结果
      */
     @Override
-    public int updateFsUser(FsUser fsUser)
-    {
+    public int updateFsUser(FsUser fsUser) {
         fsUser.setUpdateTime(DateUtils.getNowDate());
-        if (fsUser.getPhone()!=null&&fsUser.getPhone().length()==11&&fsUser.getPhone().matches("\\d+")){
+        if (fsUser.getPhone() != null && fsUser.getPhone().length() == 11 && fsUser.getPhone().matches("\\d+")) {
             fsUser.setPhone(encryptPhone(fsUser.getPhone()));
-        }else {
+        } else {
             fsUser.setPhone(null);
         }
         return fsUserMapper.updateFsUser(fsUser);
@@ -251,8 +253,7 @@ public class FsUserServiceImpl implements IFsUserService
      * @return 结果
      */
     @Override
-    public int deleteFsUserByUserIds(Long[] userIds)
-    {
+    public int deleteFsUserByUserIds(Long[] userIds) {
         for (Long userId : userIds) {
             fsUserMapper.updateFsUserByUserId(userId);
         }
@@ -266,8 +267,7 @@ public class FsUserServiceImpl implements IFsUserService
      * @return 结果
      */
     @Override
-    public int deleteFsUserByUserId(Long userId)
-    {
+    public int deleteFsUserByUserId(Long userId) {
         return fsUserMapper.updateFsUserByUserId(userId);
     }
 
@@ -325,9 +325,9 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     @Transactional
-    public void addUserIntegral(BigDecimal payMoney,Long userId,Long orderId ,Integer orderType) {
-        String json =configService.selectConfigByKey("his.integral");
-        IntegralConfig config = JSONUtil.toBean(json,IntegralConfig.class);
+    public void addUserIntegral(BigDecimal payMoney, Long userId, Long orderId, Integer orderType) {
+        String json = configService.selectConfigByKey("his.integral");
+        IntegralConfig config = JSONUtil.toBean(json, IntegralConfig.class);
 
         int points = payMoney.intValue() * config.getIntegralRatio();
 
@@ -347,7 +347,7 @@ public class FsUserServiceImpl implements IFsUserService
     /**
      * 判断是否节气套餐包
      */
-    private boolean isSolarTerm(Long orderId ,Integer orderType) {
+    private boolean isSolarTerm(Long orderId, Integer orderType) {
         if (orderType == 2) {
             FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderId(orderId);
             if (Objects.nonNull(fsStoreOrder.getPackageId())) {
@@ -368,34 +368,34 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     @Transactional
-    public void followAddIntegral(Long userId,Long orderId) {
+    public void followAddIntegral(Long userId, Long orderId) {
         FsUser fsUser = fsUserMapper.selectFsUserByUserId(userId);
-        if(fsUser!=null){
-            String json =configService.selectConfigByKey("his.integral");
-            IntegralConfig config= JSONUtil.toBean(json,IntegralConfig.class);
-            Integer todayTotalIntegral= integralLogsMapper.selectTodayTotalIntegral(config.getIntegralTypeByOneDay(),userId);
-            if (todayTotalIntegral==null){
-                todayTotalIntegral=0;
+        if (fsUser != null) {
+            String json = configService.selectConfigByKey("his.integral");
+            IntegralConfig config = JSONUtil.toBean(json, IntegralConfig.class);
+            Integer todayTotalIntegral = integralLogsMapper.selectTodayTotalIntegral(config.getIntegralTypeByOneDay(), userId);
+            if (todayTotalIntegral == null) {
+                todayTotalIntegral = 0;
             }
-            if (todayTotalIntegral!=null&&todayTotalIntegral>=config.getIntegralByOneDay()){
+            if (todayTotalIntegral != null && todayTotalIntegral >= config.getIntegralByOneDay()) {
                 return;
             }
-            Long integral = config.getIntegralFollow()+0L;
-                FsUser u = new FsUser();
-                u.setUserId(userId);
-                u.setIntegral(fsUser.getIntegral()+integral);
-                fsUserMapper.updateFsUser(u);
-                logger.info("用户{}获取积分{}",fsUser.getUserId(),integral);
-                //写入日志
-                FsUserIntegralLogs logs = new FsUserIntegralLogs();
-                logs.setIntegral(integral.longValue());
-                logs.setBusinessType(4);
-                logs.setUserId(userId);
-                logs.setBalance(u.getIntegral());
-                logs.setLogType(6);
-                logs.setBusinessId(orderId.toString());
-                logs.setCreateTime(new Date());
-                integralLogsMapper.insertFsUserIntegralLogs(logs);
+            Long integral = config.getIntegralFollow() + 0L;
+            FsUser u = new FsUser();
+            u.setUserId(userId);
+            u.setIntegral(fsUser.getIntegral() + integral);
+            fsUserMapper.updateFsUser(u);
+            logger.info("用户{}获取积分{}", fsUser.getUserId(), integral);
+            //写入日志
+            FsUserIntegralLogs logs = new FsUserIntegralLogs();
+            logs.setIntegral(integral.longValue());
+            logs.setBusinessType(4);
+            logs.setUserId(userId);
+            logs.setBalance(u.getIntegral());
+            logs.setLogType(6);
+            logs.setBusinessId(orderId.toString());
+            logs.setCreateTime(new Date());
+            integralLogsMapper.insertFsUserIntegralLogs(logs);
 
         }
     }
@@ -403,26 +403,26 @@ public class FsUserServiceImpl implements IFsUserService
     @Transactional
     public void subIntegral(Long userId) {
         FsUser fsUser = fsUserMapper.selectFsUserByUserId(userId);
-        if(fsUser!=null&&fsUser.getIntegral()!=0){
+        if (fsUser != null && fsUser.getIntegral() != 0) {
             Long integral = fsUser.getIntegral();
             fsUser.setIntegral(0L);
             fsUserMapper.updateFsUser(fsUser);
-            logger.info("用户{}扣除积分{}",fsUser.getUserId(),0-integral);
+            logger.info("用户{}扣除积分{}", fsUser.getUserId(), 0 - integral);
             FsUserIntegralLogs logs = new FsUserIntegralLogs();
-            logs.setIntegral(0-integral);
+            logs.setIntegral(0 - integral);
             logs.setUserId(userId);
             logs.setBalance(0L);
             logs.setLogType(7);
             logs.setCreateTime(new Date());
             integralLogsMapper.insertFsUserIntegralLogs(logs);
-            }
-
         }
 
+    }
+
     @Override
     public FsUserFollowDoctorVO getUserFollowDoctorAndOrderId(Long userId) {
         FsUserFollowDoctorVO fsUserFollowDoctorVO = fsStoreOrderMapper.selectFsFollowDoctorIdByUserId(userId);
-        if (fsUserFollowDoctorVO!=null&&fsUserFollowDoctorVO.getFollowDoctorId()!=null){
+        if (fsUserFollowDoctorVO != null && fsUserFollowDoctorVO.getFollowDoctorId() != null) {
             Long followId = fsFollowMapper.selectFsFollowByStoreOrderId(fsUserFollowDoctorVO.getOrderId());
             fsUserFollowDoctorVO.setFollowId(followId);
         }
@@ -437,34 +437,34 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     @Transactional
-    public void subUserIntegral(Long userId,Long orderId ,Integer orderType) {
-            FsUser fsUser = fsUserMapper.selectFsUserByUserId(userId);
-            if(fsUser!=null){
-                FsUserIntegralLogs maps=new FsUserIntegralLogs();
-                maps.setLogType(2);
-                maps.setBusinessType(orderType);
-                maps.setBusinessId(orderId.toString());
-                List<FsUserIntegralLogs> logsList=integralLogsMapper.selectFsUserIntegralLogsList(maps);
-                if(logsList.size()>0){
-                    for (FsUserIntegralLogs userLogs : logsList) {
-                        fsUser.setIntegral(fsUser.getIntegral()-userLogs.getIntegral());
-                        fsUserMapper.updateFsUser(fsUser);
-                        logger.info("用户{}扣除积分{}",fsUser.getUserId(),userLogs.getIntegral());
-                        //写入日志
-                        FsUserIntegralLogs logs = new FsUserIntegralLogs();
-                        logs.setIntegral(-logsList.get(0).getIntegral());
-                        logs.setUserId(userId);
-                        logs.setBalance(fsUser.getIntegral());
-                        logs.setBusinessType(orderType);
-                        logs.setLogType(4);
-                        logs.setBusinessId(orderId.toString());
-                        logs.setCreateTime(new Date());
-                        integralLogsMapper.insertFsUserIntegralLogs(logs);
-                    }
+    public void subUserIntegral(Long userId, Long orderId, Integer orderType) {
+        FsUser fsUser = fsUserMapper.selectFsUserByUserId(userId);
+        if (fsUser != null) {
+            FsUserIntegralLogs maps = new FsUserIntegralLogs();
+            maps.setLogType(2);
+            maps.setBusinessType(orderType);
+            maps.setBusinessId(orderId.toString());
+            List<FsUserIntegralLogs> logsList = integralLogsMapper.selectFsUserIntegralLogsList(maps);
+            if (logsList.size() > 0) {
+                for (FsUserIntegralLogs userLogs : logsList) {
+                    fsUser.setIntegral(fsUser.getIntegral() - userLogs.getIntegral());
+                    fsUserMapper.updateFsUser(fsUser);
+                    logger.info("用户{}扣除积分{}", fsUser.getUserId(), userLogs.getIntegral());
+                    //写入日志
+                    FsUserIntegralLogs logs = new FsUserIntegralLogs();
+                    logs.setIntegral(-logsList.get(0).getIntegral());
+                    logs.setUserId(userId);
+                    logs.setBalance(fsUser.getIntegral());
+                    logs.setBusinessType(orderType);
+                    logs.setLogType(4);
+                    logs.setBusinessId(orderId.toString());
+                    logs.setCreateTime(new Date());
+                    integralLogsMapper.insertFsUserIntegralLogs(logs);
                 }
-
             }
 
+        }
+
     }
 
     @Override
@@ -485,7 +485,7 @@ public class FsUserServiceImpl implements IFsUserService
         user.setIsVip(0);
         user.setVipStartDate(null);
         user.setVipEndDate(null);
-        if (fsUserMapper.updateFsUser(user)>0){
+        if (fsUserMapper.updateFsUser(user) > 0) {
             return R.ok("清除成功");
         }
         return R.error("清除vip失败");
@@ -533,7 +533,7 @@ public class FsUserServiceImpl implements IFsUserService
         map.put("tagName", "重粉");
         List<CompanyTag> companyTags = companyTagMapper.selectCompanyTagListByMap(map);
         Long tagId;
-        if(companyTags == null || companyTags.isEmpty()){
+        if (companyTags == null || companyTags.isEmpty()) {
             CompanyTag companyTag = new CompanyTag();
             companyTag.setCompanyId(param.getCompanyId());
             companyTag.setTag("重粉");
@@ -547,7 +547,7 @@ public class FsUserServiceImpl implements IFsUserService
         companyTagUserParam.setUserId(param.getUserId());
         companyTagUserParam.setTagIds(tagId.toString());
         List<CompanyTagUser> companyTagUsers = companyTagUserMapper.selectCompanyTagUserList(companyTagUserParam);
-        if(companyTagUsers == null || companyTagUsers.isEmpty()){
+        if (companyTagUsers == null || companyTagUsers.isEmpty()) {
             CompanyTagUser companyTagUser = new CompanyTagUser();
             companyTagUser.setUserId(param.getUserId());
             companyTagUser.setCompanyId(param.getCompanyId());
@@ -561,12 +561,12 @@ public class FsUserServiceImpl implements IFsUserService
     @Override
     public PageInfo<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param) {
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
-        if (companyUser!=null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             param.setUserId(0L);
             param.setCompanyId(companyUser.getCompanyId());
         }
         //筛选问题
-        if (StringUtils.isNotBlank(param.getCompanyUserId())){
+        if (StringUtils.isNotBlank(param.getCompanyUserId())) {
             param.setUserId(Long.valueOf(param.getCompanyUserId()));
         }
 
@@ -585,7 +585,7 @@ public class FsUserServiceImpl implements IFsUserService
         List<SysDictData> courseProject = dictDataMapper.selectDictDataByType("sys_course_project");
         for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOS) {
             if (courseProject != null && !courseProject.isEmpty()) {
-                if (fsUserPageListVO.getProjectId() != null){
+                if (fsUserPageListVO.getProjectId() != null) {
                     // 项目
                     courseProject.stream()
                             .filter(c -> c.getDictValue().equals(fsUserPageListVO.getProjectId().toString()))
@@ -593,7 +593,7 @@ public class FsUserServiceImpl implements IFsUserService
                             .ifPresent(c -> fsUserPageListVO.setProjectName(c.getDictLabel()));
                 }
             }
-            if (StringUtils.isEmpty(fsUserPageListVO.getNickname())){
+            if (StringUtils.isEmpty(fsUserPageListVO.getNickname())) {
                 fsUserPageListVO.setNickname("用户暂未授权昵称");
             }
 
@@ -620,7 +620,7 @@ public class FsUserServiceImpl implements IFsUserService
         String[] splitTag = tag.split(",");
         StringBuilder newTag = new StringBuilder();
         for (String s : splitTag) {
-            if(!"重粉".equals(s)){
+            if (!"重粉".equals(s)) {
                 newTag.append(s);
             }
         }
@@ -659,7 +659,7 @@ public class FsUserServiceImpl implements IFsUserService
     public TableDataInfo selectFsUserPageListNew(FsUserPageListParam param) {
         // 找出下级销售
         String companyUserId = param.getCompanyUserId();
-        if(StringUtils.isNotBlank(companyUserId)) {
+        if (StringUtils.isNotBlank(companyUserId)) {
             Long companyUser = Long.parseLong(companyUserId);
             Set<Long> userIds = companyUserCacheService.selectUserAllCompanyUserId(companyUser);
             if (userIds != null || userIds.size() <= 1) {
@@ -676,34 +676,34 @@ public class FsUserServiceImpl implements IFsUserService
         //获取会员的最新的看课状态和最后看课时间
         Set<Long> userIds = fsUserPageListVOS.stream().map(FsUserPageListVO::getUserId).collect(Collectors.toSet());
         List<FsUserLastCount> fsUserCourseCounts = Collections.emptyList();
-        if(!userIds.isEmpty()){
+        if (!userIds.isEmpty()) {
             fsUserCourseCounts = fsUserCourseCountMapper.selectUserLastCount(userIds);
         }
         Map<Long, FsUserLastCount> countMap = fsUserCourseCounts.stream().collect(Collectors.toMap(FsUserLastCount::getUserId, Function.identity()));
 
         for (FsUserPageListVO item : fsUserPageListVOS) {
-            if(item.getCompanyUserId() != null) {
+            if (item.getCompanyUserId() != null) {
                 String companyUserName = companyUserCacheService.selectCompanyUserNameUserById(item.getCompanyUserId());
-                if(companyUserName != null) {
+                if (companyUserName != null) {
                     item.setCompanyUserNickName(companyUserName);
                 }
             }
-            if(item.getPhone() != null) {
+            if (item.getPhone() != null) {
                 item.setPhone(ParseUtils.parsePhone(item.getPhone()));
             }
-            if(item.getStatus() != null) {
+            if (item.getStatus() != null) {
                 String userStatus = DictUtils.getDictLabel("user_status", String.valueOf(item.getStatus()));
-                if(StringUtils.isNotBlank(userStatus)){
+                if (StringUtils.isNotBlank(userStatus)) {
                     item.setStatusText(userStatus);
                 }
             }
-            if(item.getUserId() != null) {
+            if (item.getUserId() != null) {
                 FsUserCourseCount byUserId = fsUserCourseCountCacheService.findByUserId(item.getUserId());
-                if(byUserId != null) {
+                if (byUserId != null) {
                     item.setWatchCourseCount(byUserId.getWatchCourseCount());
                     item.setMissCourseCount(byUserId.getMissCourseCount());
                     item.setMissCourseStatus(byUserId.getMissCourseStatus());
-                    if(StringUtils.isNotEmpty(byUserId.getPartCourseCount())){
+                    if (StringUtils.isNotEmpty(byUserId.getPartCourseCount())) {
                         item.setPartCourseCount(new BigDecimal(byUserId.getPartCourseCount()).longValue());
                     }
 //                    item.setCourseCountStatus(byUserId.getStatus());
@@ -712,25 +712,25 @@ public class FsUserServiceImpl implements IFsUserService
                     item.setLastWatchDate(byUserId.getLastWatchDate());
                 }
                 FsUserLastCount fsUserCourseCount = countMap.get(item.getUserId());
-                if(fsUserCourseCount != null){
+                if (fsUserCourseCount != null) {
                     item.setCourseCountStatus(fsUserCourseCount.getStatus());
                 }
                 String userTagByUserId = companyTagCacheService
-                        .findUserTagByUserId(item.getUserId(),item.getCompanyUserId());
-                if(StringUtils.isNotEmpty(userTagByUserId)) {
+                        .findUserTagByUserId(item.getUserId(), item.getCompanyUserId());
+                if (StringUtils.isNotEmpty(userTagByUserId)) {
                     String[] split = userTagByUserId.split(",");
                     Set<String> tagNames = new HashSet<>();
                     for (String tag : split) {
-                        if(StringUtils.isNotBlank(tag)) {
+                        if (StringUtils.isNotBlank(tag)) {
                             Long tagL = Long.parseLong(tag);
                             CompanyTag companyTag = tagMap.get(tagL);
-                            if(companyTag != null) {
+                            if (companyTag != null) {
                                 tagNames.add(companyTag.getTag());
                             }
                         }
                     }
                     item.setTagIds(userTagByUserId);
-                    item.setTag(String.join(",",tagNames));
+                    item.setTag(String.join(",", tagNames));
                 }
 
                 // 是否宠粉
@@ -741,10 +741,10 @@ public class FsUserServiceImpl implements IFsUserService
             }
 
             // 解密
-            if(item.getPhone() != null && item.getPhone() != ""){
-                if (item.getPhone().length()>11){
+            if (item.getPhone() != null && item.getPhone() != "") {
+                if (item.getPhone().length() > 11) {
                     item.setPhone(decryptPhoneMk(item.getPhone()));
-                }else {
+                } else {
                     item.setPhone(item.getPhone().replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"));
                 }
             }
@@ -759,14 +759,15 @@ public class FsUserServiceImpl implements IFsUserService
         rspData.setTotal(this.selectFsUserCount(param));
         return rspData;
     }
+
     @Override
     public Long selectFsUserCount(FsUserPageListParam param) {
         return fsUserMapper.selectFsUserPageListCount(param);
     }
 
     @Override
-    public Long selectFsUserCount(int type,Long companyId,Long companyUserId) {
-        return fsUserMapper.selectFsUserCount(type,companyId,companyUserId);
+    public Long selectFsUserCount(int type, Long companyId, Long companyUserId) {
+        return fsUserMapper.selectFsUserCount(type, companyId, companyUserId);
     }
 
     @Override
@@ -784,7 +785,7 @@ public class FsUserServiceImpl implements IFsUserService
         // 判断是否是管理员
         Long companyId = null;
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             userId = 0L;
             companyId = companyUser.getCompanyId();
         }
@@ -807,13 +808,13 @@ public class FsUserServiceImpl implements IFsUserService
 
     @Override
     public UserDetailsVO getUserDetails(Long userId, Long fsUserId, String dateTag, Long userCompanyId) {
-        UserDetailsVO countWatchCourse = fsUserMapper.getCountWatchCourse(userId, fsUserId, dateTag,userCompanyId);
+        UserDetailsVO countWatchCourse = fsUserMapper.getCountWatchCourse(userId, fsUserId, dateTag, userCompanyId);
         FsUserCompanyUser fsUserCompanyUser = userCompanyUserService.selectFsUserCompanyUserById(userCompanyId);
 
         UserDetailsVO countAnswer = fsUserMapper.getCountAnswer(fsUserCompanyUser.getCompanyUserId(), fsUserId, dateTag);
         UserDetailsVO countRedPacket = fsUserMapper.getCountRedPacket(fsUserCompanyUser.getCompanyUserId(), fsUserId, dateTag);
         UserDetailsVO vo = new UserDetailsVO();
-        if (countWatchCourse != null){
+        if (countWatchCourse != null) {
             BeanUtils.copyProperties(countWatchCourse, vo);
         }
         if (countRedPacket != null) {
@@ -839,7 +840,7 @@ public class FsUserServiceImpl implements IFsUserService
         // 判断是否是管理员
         Long companyId = null;
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             userId = 0L;
             companyId = companyUser.getCompanyId();
         }
@@ -860,12 +861,12 @@ public class FsUserServiceImpl implements IFsUserService
 
         // 判断是否是管理员
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             param.setUserId(0L);
         }
         //统计课程数据详情,在查询统计详情的时候需要显示
         Map<String, Long> courseDetailsMap = fsUserMapper.countCourseDetailsNew(param);
-        if(courseDetailsMap != null && courseDetailsMap.get("courseNum") != null && courseDetailsMap.get("videoNum") != null && courseDetailsMap.get("courseUserNum") != null){
+        if (courseDetailsMap != null && courseDetailsMap.get("courseNum") != null && courseDetailsMap.get("videoNum") != null && courseDetailsMap.get("courseUserNum") != null) {
             userStatisticsVO.setCourseNum(Integer.parseInt(courseDetailsMap.get("courseNum").toString()))
                     .setVideoNum(Integer.parseInt(courseDetailsMap.get("videoNum").toString()))
                     .setCourseUserNum(Integer.parseInt(courseDetailsMap.get("courseUserNum").toString()));
@@ -878,7 +879,7 @@ public class FsUserServiceImpl implements IFsUserService
 
         // 判断是否是管理员
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             param.setUserId(0L);
             param.setCompanyId(companyUser.getCompanyId());
         }
@@ -913,7 +914,7 @@ public class FsUserServiceImpl implements IFsUserService
 
         // 获取红包统计
         Map<String, Object> redPacketMap = fsUserMapper.countUserRedPacket(param);
-        if(redPacketMap != null && redPacketMap.get("redPacketNum") != null && redPacketMap.get("redPacketAmount") != null) {
+        if (redPacketMap != null && redPacketMap.get("redPacketNum") != null && redPacketMap.get("redPacketAmount") != null) {
             fsUserStatisticsVO.setRedPacketNum(Integer.parseInt(redPacketMap.get("redPacketNum").toString()))
                     .setRedPacketAmount(new BigDecimal(redPacketMap.get("redPacketAmount").toString()));
         }
@@ -926,15 +927,15 @@ public class FsUserServiceImpl implements IFsUserService
         // 判断是否是管理员
         Long companyId = null;
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             userId = 0L;
             companyId = companyUser.getCompanyId();
         }
-        if(type == 1){
+        if (type == 1) {
             //按完播率
             listVO = fsUserMapper.countUserRankingByComplete(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
-        if(type == 2){
+        if (type == 2) {
             //按正确率
             listVO = fsUserMapper.countUserRankingByRight(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
@@ -946,15 +947,15 @@ public class FsUserServiceImpl implements IFsUserService
         // 判断是否是管理员
         Long companyId = null;
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             userId = 0L;
             companyId = companyUser.getCompanyId();
         }
         List<FsCourseRankingVO> list = Collections.emptyList();
-        if(type == 1){
+        if (type == 1) {
             list = fsUserMapper.countCourseRankingByComplete(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
-        if(type == 2){
+        if (type == 2) {
             list = fsUserMapper.countCourseRankingByRight(userId, companyId, startTime, endTime, periodId, videoId, order);
         }
 
@@ -965,7 +966,7 @@ public class FsUserServiceImpl implements IFsUserService
     public List<FsUserGraphicStatisticsVO> graphicStatistics(UserStatisticsCommonParam param) {
         FsUserStatisticsVO userStatistics = getUserStatistics(param);
         List<FsUserGraphicStatisticsVO> list = new ArrayList<>();
-        list.add(new FsUserGraphicStatisticsVO("观看人数",userStatistics.getCourseWatchNum(), userStatistics.getCourseWatchNum()));
+        list.add(new FsUserGraphicStatisticsVO("观看人数", userStatistics.getCourseWatchNum(), userStatistics.getCourseWatchNum()));
         list.add(new FsUserGraphicStatisticsVO("完播人数", userStatistics.getCourseCompleteNum(), userStatistics.getCourseCompleteNum()));
         list.add(new FsUserGraphicStatisticsVO("答题人数", userStatistics.getAnswerNum(), userStatistics.getAnswerNum()));
         list.add(new FsUserGraphicStatisticsVO("正确人数", userStatistics.getAnswerRightNum(), userStatistics.getAnswerRightNum()));
@@ -1019,7 +1020,7 @@ public class FsUserServiceImpl implements IFsUserService
             countVO.setRedPacketNum(redPacketVO.getRedPacketNum())
                     .setRedPacketAmount(redPacketVO.getRedPacketAmount() != null ? redPacketVO.getRedPacketAmount() : new BigDecimal(BigInteger.ZERO));
             countVO.setAnswerNum(answerVO.getAnswerNum()).setAnswerRightNum(answerVO.getAnswerRightNum())
-                    .setAnswerRightRate(answerVO.getAnswerRightRate()!=null ? answerVO.getAnswerRightRate() : new BigDecimal(BigInteger.ZERO));
+                    .setAnswerRightRate(answerVO.getAnswerRightRate() != null ? answerVO.getAnswerRightRate() : new BigDecimal(BigInteger.ZERO));
             allVO.setCountVO(countVO);
             return allVO;
         }).collect(Collectors.toList());
@@ -1030,7 +1031,7 @@ public class FsUserServiceImpl implements IFsUserService
         // 判断是否是管理员
         Long companyId = null;
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
-        if (companyUser != null && companyUser.isAdmin()){
+        if (companyUser != null && companyUser.isAdmin()) {
             companyUserId = String.valueOf(0);
             companyId = companyUser.getCompanyId();
         }
@@ -1048,25 +1049,25 @@ public class FsUserServiceImpl implements IFsUserService
     public ResponseResult<Boolean> becomeMember(FsUserCourseBeMemberParam param) {
         //查询用户
         FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
-        if (Objects.isNull(fsUser)){
-            return ResponseResult.fail(404,"当前用户信息不存在");
+        if (Objects.isNull(fsUser)) {
+            return ResponseResult.fail(404, "当前用户信息不存在");
         }
 
         //判断该销售是否存在
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
-        if (Objects.isNull(companyUser)){
-            return ResponseResult.fail(405,"销售不存在");
+        if (Objects.isNull(companyUser)) {
+            return ResponseResult.fail(405, "销售不存在");
         }
         // 通过字段值判断该销售是否允许注册会员
-        if(companyUser.getIsAllowedAllRegister() != null && companyUser.getIsAllowedAllRegister() == 0){
-            return ResponseResult.fail(407,"不允许注册会员,请联系管理员");
+        if (companyUser.getIsAllowedAllRegister() != null && companyUser.getIsAllowedAllRegister() == 0) {
+            return ResponseResult.fail(407, "不允许注册会员,请联系管理员");
         }
 
         // 逻辑调整:如果会员已经绑定了销售,直接提示,不添加重粉数据了-2025年6月16日14点53分
         // 逻辑调整:会员与销售的绑定关系通过中间表关联 /20250625 17:13
         FsUserCompanyUser userCompanyUser = userCompanyUserService.selectByUserIdAndProjectId(fsUser.getUserId(), param.getProjectId());
-        if (Objects.nonNull(userCompanyUser) && !userCompanyUser.getCompanyUserId().equals(param.getCompanyUserId())){
-            return ResponseResult.fail(500,"该用户("+fsUser.getUserId() + ")已成为其他销售会员");
+        if (Objects.nonNull(userCompanyUser) && !userCompanyUser.getCompanyUserId().equals(param.getCompanyUserId())) {
+            return ResponseResult.fail(500, "该用户(" + fsUser.getUserId() + ")已成为其他销售会员");
         }
 
         // 特殊(需求设计:需要根据公司是否开启黑名单来设置会员初始化的状态)
@@ -1075,7 +1076,7 @@ public class FsUserServiceImpl implements IFsUserService
         int isDefaultBlack = company != null ? company.getFsUserIsDefaultBlack() : 0;
 
         // 添加关系表数据
-        if (Objects.isNull(userCompanyUser)){
+        if (Objects.isNull(userCompanyUser)) {
             int defaultStatus = isDefaultBlack == 1 ? 0 : 1;
             userCompanyUser = userCompanyUserService.bindRelationship(param.getUserId(), param.getProjectId(), companyUser.getCompanyId(), companyUser.getUserId(), defaultStatus);
         }
@@ -1096,7 +1097,7 @@ public class FsUserServiceImpl implements IFsUserService
         }
 
         //如果是设置了需要进入小黑屋,则需要返回提示,否则正常返回
-        if(isDefaultBlack == 1){
+        if (isDefaultBlack == 1) {
             return ResponseResult.fail(402, "已成功注册,待管理审核");
         }
         return ResponseResult.ok(Boolean.TRUE);
@@ -1109,28 +1110,28 @@ public class FsUserServiceImpl implements IFsUserService
         BeanUtils.copyProperties(fsUser, item);
         item.setNickname(fsUser.getNickName());
         Map<Long, CompanyTag> tagMap = companyTagCacheService.queryAllTagMap();
-        if(item.getPhone() != null) {
+        if (item.getPhone() != null) {
             item.setPhone(ParseUtils.parsePhone(item.getPhone()));
         }
         String userTagByUserId = null;
-        if (item.getUserId()!=null && item.getCompanyUserId() != null){
+        if (item.getUserId() != null && item.getCompanyUserId() != null) {
             userTagByUserId = companyTagCacheService
-                    .findUserTagByUserId(item.getUserId(),item.getCompanyUserId());
+                    .findUserTagByUserId(item.getUserId(), item.getCompanyUserId());
         }
-        if(StringUtils.isNotEmpty(userTagByUserId)) {
+        if (StringUtils.isNotEmpty(userTagByUserId)) {
             String[] split = userTagByUserId.split(",");
             Set<String> tagNames = new HashSet<>();
             for (String tag : split) {
-                if(StringUtils.isNotBlank(tag)) {
+                if (StringUtils.isNotBlank(tag)) {
                     Long tagL = Long.parseLong(tag);
                     CompanyTag companyTag = tagMap.get(tagL);
-                    if(companyTag != null) {
+                    if (companyTag != null) {
                         tagNames.add(companyTag.getTag());
                     }
                 }
             }
             item.setTagIds(userTagByUserId);
-            item.setTag(String.join(",",tagNames));
+            item.setTag(String.join(",", tagNames));
         }
         return item;
     }
@@ -1138,26 +1139,26 @@ public class FsUserServiceImpl implements IFsUserService
     @Override
     @Transactional
     public void addMoney(FsStoreOrderScrm order) {
-        FsUserBillScrm map=new FsUserBillScrm();
+        FsUserBillScrm map = new FsUserBillScrm();
         map.setCategory(CATEGORY_3.getValue());
         map.setBusinessId(order.getId().toString());
         map.setBillType(1);
-        List<FsUserBillScrm> list=billService.selectFsUserBillList(map);
-        if(list!=null&&list.size()>0){
-            for(FsUserBillScrm bill:list){
-                FsUser tuiUser= fsUserMapper.selectFsUserByIdForUpdate(bill.getUserId());
-                if(tuiUser!=null){
-                    FsUser tuiUserMap=new FsUser();
+        List<FsUserBillScrm> list = billService.selectFsUserBillList(map);
+        if (list != null && list.size() > 0) {
+            for (FsUserBillScrm bill : list) {
+                FsUser tuiUser = fsUserMapper.selectFsUserByIdForUpdate(bill.getUserId());
+                if (tuiUser != null) {
+                    FsUser tuiUserMap = new FsUser();
                     tuiUserMap.setUserId(tuiUser.getUserId());
                     tuiUserMap.setNowMoney(tuiUser.getNowMoney().add(new BigDecimal(bill.getNumber())));
                     tuiUserMap.setBrokeragePrice(tuiUser.getBrokeragePrice().subtract(new BigDecimal(bill.getNumber())));
                     fsUserMapper.updateFsUser(tuiUserMap);
-                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_3.getValue(),0, BillDetailEnum.TYPE_6.getDesc(),bill.getNumber().doubleValue(),tuiUserMap.getBrokeragePrice().doubleValue(),"订单分佣金",order.getId().toString(),bill.getTuiUserId());
-                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_1.getValue(),1,BillDetailEnum.TYPE_5.getDesc(),bill.getNumber().doubleValue(),tuiUserMap.getNowMoney().doubleValue(),"订单分佣金",order.getId().toString(),bill.getTuiUserId());
+                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_3.getValue(), 0, BillDetailEnum.TYPE_6.getDesc(), bill.getNumber().doubleValue(), tuiUserMap.getBrokeragePrice().doubleValue(), "订单分佣金", order.getId().toString(), bill.getTuiUserId());
+                    billService.addBill(tuiUserMap.getUserId(), CATEGORY_1.getValue(), 1, BillDetailEnum.TYPE_5.getDesc(), bill.getNumber().doubleValue(), tuiUserMap.getNowMoney().doubleValue(), "订单分佣金", order.getId().toString(), bill.getTuiUserId());
                 }
             }
         }
-        FsStoreOrderScrm orderMap=new FsStoreOrderScrm();
+        FsStoreOrderScrm orderMap = new FsStoreOrderScrm();
         orderMap.setId(order.getId());
         orderMap.setTuiUserMoneyStatus(1);
         storeOrderMapper.updateFsStoreOrder(orderMap);
@@ -1198,14 +1199,22 @@ public class FsUserServiceImpl implements IFsUserService
             param.setUserId(0L);
             param.setCompanyId(companyUser.getCompanyId());
         }
-        // 获取课程统计
-        Map<String, Long> couserMap = fsUserMapper.countUserCourse2(param);
-        if (couserMap != null) {
-            fsUserStatisticsVO.setCourseWatchNum(couserMap.get("courseWatchNum").intValue()).setCourseCompleteNum(couserMap.get("courseCompleteNum").intValue());
 
-            if (couserMap.get("courseCompleteNum") != null && couserMap.get("courseWatchNum") > 0) {
-                int courseCompleteRate = BigDecimal.valueOf(couserMap.get("courseCompleteNum"))
-                        .divide(BigDecimal.valueOf(couserMap.get("courseWatchNum")), 2, RoundingMode.HALF_UP)
+
+        Map<String, Object> map = fsUserMapper.countUserStats(
+                param
+        );
+        // 获取课程统计
+//        Map<String, Long> courseMap = fsUserMapper.countUserCourse2(param);
+        if (map != null) {
+            fsUserStatisticsVO.setCourseWatchNum(Integer.valueOf(map.getOrDefault("courseWatchNum", 0L).toString()))
+                    .setCourseCompleteNum(Integer.valueOf(map.getOrDefault("courseCompleteNum", 0L).toString()));
+
+            Long completeNum = (Long) map.get("courseCompleteNum");
+            Long watchNum = (Long) map.get("courseWatchNum");
+            if (completeNum != null && watchNum != null && watchNum > 0) {
+                int courseCompleteRate = BigDecimal.valueOf(completeNum)
+                        .divide(BigDecimal.valueOf(watchNum), 2, RoundingMode.HALF_UP)
                         .multiply(BigDecimal.valueOf(100))
                         .intValue();
                 fsUserStatisticsVO.setCourseCompleteRate(courseCompleteRate);
@@ -1213,13 +1222,16 @@ public class FsUserServiceImpl implements IFsUserService
         }
 
         // 获取答题统计
-        Map<String, Long> answerMap = fsUserMapper.countUserAnswer(param);
-        if (answerMap != null) {
-            fsUserStatisticsVO.setAnswerNum(answerMap.get("answerNum").intValue()).setAnswerRightNum(answerMap.get("answerRightNum").intValue());
+//        Map<String, Long> answerMap = fsUserMapper.countUserAnswer(param);
+        if (map != null) {
+            Long answerRightNum = (Long) map.get("answerRightNum");
+            Long answerNum = (Long) map.get("answerNum");
 
-            if (answerMap.get("answerRightNum") != null && answerMap.get("answerNum") > 0) {
-                int answerCompleteRate = BigDecimal.valueOf(answerMap.get("answerRightNum"))
-                        .divide(BigDecimal.valueOf(answerMap.get("answerNum")), 2, RoundingMode.HALF_UP)
+            fsUserStatisticsVO.setAnswerNum(answerNum.intValue()).setAnswerRightNum(answerRightNum.intValue());
+
+            if (answerRightNum != null && answerNum != null && answerNum > 0) {
+                int answerCompleteRate = BigDecimal.valueOf(answerRightNum)
+                        .divide(BigDecimal.valueOf(answerNum), 2, RoundingMode.HALF_UP)
                         .multiply(BigDecimal.valueOf(100))
                         .intValue();
                 fsUserStatisticsVO.setAnswerRightRate(answerCompleteRate);
@@ -1227,13 +1239,18 @@ public class FsUserServiceImpl implements IFsUserService
         }
 
         // 获取红包统计
-        Map<String, Object> redPacketMap = fsUserMapper.countUserRedPacket(param);
-        if(redPacketMap != null && redPacketMap.get("redPacketNum") != null && redPacketMap.get("redPacketAmount") != null) {
-            fsUserStatisticsVO.setRedPacketNum(Integer.parseInt(redPacketMap.get("redPacketNum").toString()))
-                    .setRedPacketAmount(new BigDecimal(redPacketMap.get("redPacketAmount").toString()));
+//        Map<String, Object> redPacketMap = fsUserMapper.countUserRedPacket(param);
+        if (map != null) {
+            Object numObj = map.get("redPacketNum");
+            Object amtObj = map.get("redPacketAmount");
+            if (numObj != null && amtObj != null) {
+                fsUserStatisticsVO.setRedPacketNum(Integer.parseInt(numObj.toString()))
+                        .setRedPacketAmount(new BigDecimal(amtObj.toString()));
+            }
         }
         return fsUserStatisticsVO;
     }
+
     private static FsUserCompanyUser getFsUserCompanyUser(FsUserCourseBeMemberParam param, FsUser fsUser) {
         FsUserCompanyUser fsUserCompanyUser = new FsUserCompanyUser();
         // 判断是否绑定了销售,如果已绑定,则需要标识为重粉,且放黑名单
@@ -1247,10 +1264,12 @@ public class FsUserServiceImpl implements IFsUserService
         fsUserCompanyUser.setCompanyUserId(param.getCompanyUserId());
         return fsUserCompanyUser;
     }
+
     @Override
     public List<FsCompanyUserListQueryVO> selectFsCompanyUserListQuery(FsUser fsUser) {
         return fsUserMapper.selectFsCompanyUserListQuery(fsUser);
     }
+
     @Override
     public List<FsUser> getUserListLimit(FsUser fsUser) {
         return fsUserMapper.selectFsUserListLimit(fsUser);

+ 88 - 0
fs-service/src/main/java/com/fs/his/utils/ComplaintTreeUtil.java

@@ -0,0 +1,88 @@
+package com.fs.his.utils;
+
+import com.fs.his.vo.FsComplaintTemplateVO;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName 树形工具类
+ **/
+public class ComplaintTreeUtil {
+    /**
+     * 获得指定节点下所有归档
+     *
+     * @param list
+     * @param parentId
+     * @return
+     */
+    public static List<FsComplaintTemplateVO> list2TreeConverter(List<FsComplaintTemplateVO> list, int parentId) {
+        List<FsComplaintTemplateVO> returnList = new ArrayList<>();
+
+        for (FsComplaintTemplateVO res : list) {
+            //判断对象是否为根节点
+
+            if (res.getParentId() == parentId) {
+                //该节点为根节点,开始递归
+                //通过递归为节点设置childList
+                recursionFn(list, res);
+                returnList.add(res);
+            }
+        }
+
+        return returnList;
+    }
+
+    /**
+     * 递归列表
+     * 通过递归,给指定t节点设置childList
+     *
+     * @param list
+     * @param t
+     */
+    public static void recursionFn(List<FsComplaintTemplateVO> list, FsComplaintTemplateVO t) {
+        //只能获取当前t节点的子节点集,并不是所有子节点集
+        List<FsComplaintTemplateVO> childsList = getChildList(list, t);
+
+        if(childsList!=null&&childsList.size()>0){
+            //设置他的子集对象集
+            t.setChildren(childsList);
+        }
+
+
+
+        //迭代子集对象集
+
+        //遍历完,则退出递归
+        for (FsComplaintTemplateVO nextChild : childsList) {
+
+            //判断子集对象是否还有子节点
+            if (!CollectionUtils.isEmpty(childsList)) {
+                //有下一个子节点,继续递归
+                recursionFn(list, nextChild);
+            }
+        }
+    }
+
+    /**
+     * 获得指定节点下的所有子节点
+     *
+     * @param list
+     * @param t
+     * @return
+     */
+    public static List<FsComplaintTemplateVO> getChildList(List<FsComplaintTemplateVO> list, FsComplaintTemplateVO t) {
+        List<FsComplaintTemplateVO> childsList = new ArrayList<>();
+        //遍历集合元素,如果元素的Parentid==指定元素的id,则说明是该元素的子节点
+        for (FsComplaintTemplateVO t1 : list) {
+            if (t1.getParentId().equals(t.getId())) {
+                childsList.add(t1);
+            }
+        }
+
+        return childsList;
+    }
+
+
+}

+ 16 - 0
fs-service/src/main/java/com/fs/his/vo/FsComplaintTemplateVO.java

@@ -0,0 +1,16 @@
+package com.fs.his.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FsComplaintTemplateVO {
+    private static final long serialVersionUID = 1L;
+    private Long id;
+    private String name;
+    private Long parentId;
+    private String description;
+    private Long sort;
+    private List<FsComplaintTemplateVO> children; //子集
+}

+ 3 - 0
fs-service/src/main/java/com/fs/his/vo/FsPackageOrderExcelVO.java

@@ -10,6 +10,9 @@ import java.util.Date;
 @Data
 public class FsPackageOrderExcelVO {
 
+    @Excel(name = "支付订单号")
+    private String businessCode;
+
     @Excel(name = "订单号")
     private String orderSn;
 

+ 52 - 0
fs-service/src/main/java/com/fs/his/vo/FsUserComplaintVo.java

@@ -0,0 +1,52 @@
+package com.fs.his.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FsUserComplaintVo {
+    private Long id;
+
+    /** 用户id */
+    @Excel(name = "用户")
+    private String userName;
+
+    /** 投诉模板id */
+    @Excel(name = "投诉模板id")
+    private Long templateId;
+
+    private String name;
+
+    /** 详细内容 */
+    @Excel(name = "详细内容")
+    private String content;
+
+    /** 联系方式 */
+//   2025-7-3 新增需求不在导出 @Excel(name = "联系方式")
+    private String phone;
+
+    /** 图片地址 */
+    @Excel(name = "图片地址")
+    private String urls;
+
+    @Excel(name = "交易截图")
+    private String tradeImage;
+
+    /** 被投诉人信息 */
+    @Excel(name = "被投诉人信息")
+    private String account;
+
+    /** 是否处理 */
+    @Excel(name = "是否处理")
+    private Integer isHandle;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "投诉时间",dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @Excel(name="备注")
+    private String remarks;
+}

+ 71 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsStoreProductScrm.java

@@ -67,6 +67,9 @@ public class FsStoreProductScrm extends BaseEntity
     @Excel(name = "市场价")
     private BigDecimal otPrice;
 
+    @Excel(name = "市场价")
+    private BigDecimal agentPrice;
+
     /** 邮费 */
     @Excel(name = "邮费")
     private BigDecimal postage;
@@ -183,6 +186,74 @@ public class FsStoreProductScrm extends BaseEntity
     /** 指定企业 */
     private String companyIds;
 
+    /** 店铺ID */
+    @Excel(name = "店铺ID")
+    private Long storeId;
+
+    /** 药品展示图 */
+    @Excel(name = "药品展示图")
+    private String drugImage;
+
+    /** 药品注册证书编号 */
+    @Excel(name = "药品注册证书编号")
+    private String drugRegCertNo;
+
+    /** 通用名称 */
+    @Excel(name = "通用名称")
+    private String commonName;
+
+    /** 剂型 */
+    @Excel(name = "剂型")
+    private String dosageForm;
+
+    /** 单价 */
+    @Excel(name = "单价")
+    private String unitPrice;
+
+    /** 批号 */
+    @Excel(name = "批号")
+    private String batchNumber;
+
+    /** 上市许可持有人 */
+    @Excel(name = "上市许可持有人")
+    private String mah;
+
+    /** 上市许可持有人地址 */
+    @Excel(name = "上市许可持有人地址")
+    private String mahAddress;
+
+    /** 生产企业 */
+    @Excel(name = "生产企业")
+    private String manufacturer;
+
+    /** 生产企业地址 */
+    @Excel(name = "生产企业地址")
+    private String manufacturerAddress;
+
+    /** 功能主治 */
+    @Excel(name = "功能主治")
+    private String indications;
+
+    /** 用法用量 */
+    @Excel(name = "用法用量")
+    private String dosage;
+
+    /** 不良反应 */
+    @Excel(name = "不良反应")
+    private String adverseReactions;
+
+    /** 禁忌 */
+    @Excel(name = "禁忌")
+    private String contraindications;
+
+    /** 注意事项 */
+    @Excel(name = "注意事项")
+    private String precautions;
+
+    /** 审核状态(0未审核1审核通过2审核退回) */
+    @Excel(name = "审核状态(0未审核1审核通过2审核退回)")
+    private String isAudit;
+
     /**
      * 商品图片
      */

+ 2 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java

@@ -72,7 +72,8 @@ public interface FsStoreProductScrmMapper
      */
     public int deleteFsStoreProductByIds(Long[] productIds);
     @Select({"<script> " +
-            "select p.*,pc.cate_name  from fs_store_product_scrm p left join fs_store_product_category_scrm pc on p.cate_id=pc.cate_id   " +
+            "select p.*,pc.cate_name, fs_store.store_name from fs_store_product_scrm p left join fs_store_product_category_scrm pc on p.cate_id=pc.cate_id  " +
+            "left join fs_store on fs_store.store_id = p.store_id " +
             "where 1=1 " +
             "<if test = 'maps.productName != null and  maps.productName !=\"\"    '> " +
             "and p.product_name like CONCAT('%',#{maps.productName},'%') " +

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderPayParam.java

@@ -16,4 +16,6 @@ public class FsStoreOrderPayParam implements Serializable
     @ApiModelProperty(value = "payType")
     @NotNull(message = "支付类型不能为空")
     private Integer payType;
+
+    private String appId;
 }

+ 14 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStorePaymentGetWxaCodeParam.java

@@ -0,0 +1,14 @@
+package com.fs.hisStore.param;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class FsStorePaymentGetWxaCodeParam {
+    private Long companyId;
+
+    private Long companyUserId;
+
+    private String appId;
+}

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStorePaymentPayParam.java

@@ -20,4 +20,6 @@ public class FsStorePaymentPayParam implements Serializable
     private Long companyUserId;
 
     private String code;
+
+    private String appId;
 }

+ 122 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreProductAddEditParam.java

@@ -1,5 +1,6 @@
 package com.fs.hisStore.param;
 
+import com.fs.common.annotation.Excel;
 import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
 import com.fs.hisStore.dto.ProductArrtDTO;
 import lombok.Data;
@@ -138,6 +139,127 @@ public class FsStoreProductAddEditParam implements Serializable
 
     private Integer tuiCateId;
 
+    /** 店铺ID */
+    @Excel(name = "店铺ID")
+    private Long storeId;
+
+    /** 药品展示图 */
+    @Excel(name = "药品展示图")
+    private String drugImage;
+
+    /** 药品注册证书编号 */
+    @Excel(name = "药品注册证书编号")
+    private String drugRegCertNo;
+
+    /** 通用名称 */
+    @Excel(name = "通用名称")
+    private String commonName;
+
+    /** 剂型 */
+    @Excel(name = "剂型")
+    private String dosageForm;
+
+    /** 单价 */
+    @Excel(name = "单价")
+    private String unitPrice;
+
+    /** 批号 */
+    @Excel(name = "批号")
+    private String batchNumber;
+
+    /** 上市许可持有人 */
+    @Excel(name = "上市许可持有人")
+    private String mah;
+
+    /** 上市许可持有人地址 */
+    @Excel(name = "上市许可持有人地址")
+    private String mahAddress;
+
+    /** 生产企业 */
+    @Excel(name = "生产企业")
+    private String manufacturer;
+
+    /** 生产企业地址 */
+    @Excel(name = "生产企业地址")
+    private String manufacturerAddress;
+
+    /** 功能主治 */
+    @Excel(name = "功能主治")
+    private String indications;
+
+    /** 用法用量 */
+    @Excel(name = "用法用量")
+    private String dosage;
+
+    /** 不良反应 */
+    @Excel(name = "不良反应")
+    private String adverseReactions;
+
+    /** 禁忌 */
+    @Excel(name = "禁忌")
+    private String contraindications;
+
+    /** 注意事项 */
+    @Excel(name = "注意事项")
+    private String precautions;
+
+    /** 审核状态(0未审核1审核通过2审核退回) */
+    @Excel(name = "审核状态(0未审核1审核通过2审核退回)")
+    private String isAudit;
+
+    /**
+     * 商品图片
+     */
+    @Excel(name = "商品图片")
+    private String imgUrl;
+
+    /**
+     * 轮播图
+     */
+    @Excel(name = "轮播图")
+    private String images;
+
+    /**
+     * 商品介绍
+     */
+    @Excel(name = "商品介绍")
+    private String productIntroduce;
+
+    /**
+     * 产品描述
+     */
+    @Excel(name = "产品描述")
+    private String desc;
+    /**
+     * 成本价
+     */
+    @Excel(name = "成本价")
+    private BigDecimal costPrice;
+
+    /**
+     * 浏览量
+     */
+    @Excel(name = "浏览量")
+    private Long views;
+
+    /**
+     * 产品二维码地址(用户小程序海报)
+     */
+    @Excel(name = "产品二维码地址(用户小程序海报)")
+    private String codeUrl;
+    /**
+     * 商品类型:1非处方 2处方
+     */
+    @Excel(name = "是否为处方药:1非处方 2处方")
+    private Integer isPrescribe;
+
+
+    /** 品牌 */
+    @Excel(name = "品牌")
+    private String brand;
+
+    private Integer isDrug;
+
     //属性项目
     private List<ProductArrtDTO> items;
     //sku结果集

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels