Browse Source

Merge remote-tracking branch 'origin/master'

吴树波 1 week ago
parent
commit
f6d66eaf3d
100 changed files with 2839 additions and 176 deletions
  1. 2 2
      .gitignore
  2. 38 0
      fs-admin/src/main/java/com/fs/course/controller/FsVideoResourceController.java
  3. 1 1
      fs-admin/src/main/java/com/fs/his/controller/FsInquiryOrderController.java
  4. 114 0
      fs-admin/src/main/java/com/fs/his/controller/FsPhysicalReportTemplateController.java
  5. 140 0
      fs-admin/src/main/java/com/fs/his/controller/FsPhysicalReportTemplateFieldController.java
  6. 76 11
      fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java
  7. 7 1
      fs-admin/src/main/java/com/fs/his/task/Task.java
  8. 103 0
      fs-admin/src/main/java/com/fs/qw/controller/QwIpadServerController.java
  9. 118 0
      fs-admin/src/main/java/com/fs/qw/controller/QwIpadServerLogController.java
  10. 118 0
      fs-admin/src/main/java/com/fs/qw/controller/QwIpadServerUserController.java
  11. 11 0
      fs-admin/src/main/java/com/fs/qw/qwTask/qwTask.java
  12. 1 1
      fs-admin/src/main/resources/application.yml
  13. 67 0
      fs-company-app/src/main/java/com/fs/app/controller/FsUserCoursePeriodController.java
  14. 46 0
      fs-company-app/src/main/java/com/fs/app/controller/qw/QwFsCourseWatchLogController.java
  15. 0 1
      fs-company/src/main/java/com/fs/company/controller/fastGpt/FastGptRoleController.java
  16. 2 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwMaterialController.java
  17. 1 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwUserVoiceLogController.java
  18. 4 5
      fs-company/src/main/java/com/fs/company/controller/qw/SopUserLogsInfoController.java
  19. 29 3
      fs-company/src/main/java/com/fs/company/controller/store/FsInquiryOrderController.java
  20. 7 0
      fs-company/src/main/java/com/fs/company/controller/store/FsStoreOrderController.java
  21. 4 3
      fs-company/src/main/java/com/fs/company/controller/store/FsUserController.java
  22. 11 2
      fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java
  23. 1 1
      fs-qw-task/src/main/resources/application.yml
  24. 73 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisQwMaterialBySidebar.java
  25. 18 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisQwUserController.java
  26. 72 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/QwMaterialBySidebar.java
  27. 18 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/QwUserController.java
  28. 1 1
      fs-qwhook-sop/src/main/resources/application.yml
  29. 81 0
      fs-qwhook/src/main/java/com/fs/app/controller/ApisQwMaterialBySidebar.java
  30. 10 4
      fs-qwhook/src/main/java/com/fs/app/controller/ApisQwUserController.java
  31. 73 0
      fs-qwhook/src/main/java/com/fs/app/controller/QwMaterialBySidebar.java
  32. 9 4
      fs-qwhook/src/main/java/com/fs/app/controller/QwUserController.java
  33. 1 0
      fs-service/src/main/java/com/fs/common/param/LoginParam.java
  34. 4 1
      fs-service/src/main/java/com/fs/config/ai/AiHostProper.java
  35. 3 0
      fs-service/src/main/java/com/fs/course/mapper/FsVideoResourceMapper.java
  36. 1 1
      fs-service/src/main/java/com/fs/course/service/IFsUserCoursePeriodDaysService.java
  37. 2 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java
  38. 16 1
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java
  39. 41 22
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  40. 3 0
      fs-service/src/main/java/com/fs/erp/domain/ErpGoods.java
  41. 10 0
      fs-service/src/main/java/com/fs/erp/dto/OrderItemDTO.java
  42. 2 1
      fs-service/src/main/java/com/fs/erp/http/JstErpHttpService.java
  43. 14 1
      fs-service/src/main/java/com/fs/erp/http/JstErpHttpServiceImpl.java
  44. 36 7
      fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java
  45. 75 1
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java
  46. 3 0
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java
  47. 22 2
      fs-service/src/main/java/com/fs/erp/service/impl/JstTokenService.java
  48. 7 2
      fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java
  49. 5 1
      fs-service/src/main/java/com/fs/fastGpt/service/impl/AiNewServiceImpl.java
  50. 6 1
      fs-service/src/main/java/com/fs/fastGpt/service/impl/AiServiceImpl.java
  51. 20 0
      fs-service/src/main/java/com/fs/his/domain/FsIntegralOrder.java
  52. 32 0
      fs-service/src/main/java/com/fs/his/domain/FsPhysicalReportTemplate.java
  53. 72 0
      fs-service/src/main/java/com/fs/his/domain/FsPhysicalReportTemplateField.java
  54. 3 0
      fs-service/src/main/java/com/fs/his/domain/FsStoreOrderDf.java
  55. 4 0
      fs-service/src/main/java/com/fs/his/domain/FsStoreProduct.java
  56. 19 0
      fs-service/src/main/java/com/fs/his/dto/FsPhysicalReportTemplateFieldDTO.java
  57. 6 0
      fs-service/src/main/java/com/fs/his/mapper/FsInquiryOrderReportMapper.java
  58. 75 0
      fs-service/src/main/java/com/fs/his/mapper/FsPhysicalReportTemplateFieldMapper.java
  59. 61 0
      fs-service/src/main/java/com/fs/his/mapper/FsPhysicalReportTemplateMapper.java
  60. 3 1
      fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java
  61. 7 1
      fs-service/src/main/java/com/fs/his/mapper/FsStoreProductAttrValueMapper.java
  62. 6 0
      fs-service/src/main/java/com/fs/his/mapper/FsStoreProductMapper.java
  63. 5 0
      fs-service/src/main/java/com/fs/his/param/FsInquiryOrderCreateParam.java
  64. 18 3
      fs-service/src/main/java/com/fs/his/param/FsStoreOrderParam.java
  65. 4 0
      fs-service/src/main/java/com/fs/his/param/FsStoreProductAddEditParam.java
  66. 2 0
      fs-service/src/main/java/com/fs/his/service/IFsInquiryOrderService.java
  67. 2 0
      fs-service/src/main/java/com/fs/his/service/IFsPackageOrderService.java
  68. 80 0
      fs-service/src/main/java/com/fs/his/service/IFsPhysicalReportTemplateFieldService.java
  69. 61 0
      fs-service/src/main/java/com/fs/his/service/IFsPhysicalReportTemplateService.java
  70. 2 0
      fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java
  71. 7 0
      fs-service/src/main/java/com/fs/his/service/IFsStoreProductAttrValueService.java
  72. 7 0
      fs-service/src/main/java/com/fs/his/service/IFsStoreProductService.java
  73. 41 14
      fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java
  74. 0 16
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java
  75. 153 0
      fs-service/src/main/java/com/fs/his/service/impl/FsPhysicalReportTemplateFieldServiceImpl.java
  76. 125 0
      fs-service/src/main/java/com/fs/his/service/impl/FsPhysicalReportTemplateServiceImpl.java
  77. 93 39
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  78. 5 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreProductAttrValueServiceImpl.java
  79. 50 6
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreProductServiceImpl.java
  80. 3 0
      fs-service/src/main/java/com/fs/his/vo/FsStoreOrderListVO.java
  81. 3 2
      fs-service/src/main/java/com/fs/huifuPay/service/test.java
  82. 1 0
      fs-service/src/main/java/com/fs/qw/domain/QwExternalContact.java
  83. 11 2
      fs-service/src/main/java/com/fs/qw/domain/QwMaterial.java
  84. 1 1
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  85. 9 0
      fs-service/src/main/java/com/fs/qw/mapper/QwIpadServerLogMapper.java
  86. 10 0
      fs-service/src/main/java/com/fs/qw/mapper/QwIpadServerUserMapper.java
  87. 5 1
      fs-service/src/main/java/com/fs/qw/mapper/QwMaterialMapper.java
  88. 21 0
      fs-service/src/main/java/com/fs/qw/param/IPadServerLogParam.java
  89. 15 0
      fs-service/src/main/java/com/fs/qw/param/IPadServerUserParam.java
  90. 21 0
      fs-service/src/main/java/com/fs/qw/param/QwExtCourseSopWatchLog.java
  91. 6 1
      fs-service/src/main/java/com/fs/qw/param/QwMaterialParam.java
  92. 28 0
      fs-service/src/main/java/com/fs/qw/param/QwMaterialParamBySidebar.java
  93. 9 0
      fs-service/src/main/java/com/fs/qw/service/IQwIpadServerLogService.java
  94. 10 0
      fs-service/src/main/java/com/fs/qw/service/IQwIpadServerUserService.java
  95. 8 0
      fs-service/src/main/java/com/fs/qw/service/IQwMaterialService.java
  96. 8 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwIpadServerLogServiceImpl.java
  97. 8 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwIpadServerUserServiceImpl.java
  98. 147 7
      fs-service/src/main/java/com/fs/qw/service/impl/QwMaterialServiceImpl.java
  99. 2 0
      fs-service/src/main/java/com/fs/qw/vo/QwExternalContactVO.java
  100. 43 0
      fs-service/src/main/java/com/fs/qw/vo/QwIPadServerLogVO.java

+ 2 - 2
.gitignore

@@ -6,8 +6,8 @@ target/
 !**/src/main/**/target/
 !**/src/test/**/target/
 #logback.xml
-application-druid-rt.yml
-application-druid-yjf.yml
+application.yml
+
 
 ### STS ###
 .apt_generated

+ 38 - 0
fs-admin/src/main/java/com/fs/course/controller/FsVideoResourceController.java

@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 资源库管理
@@ -102,6 +103,43 @@ public class FsVideoResourceController extends BaseController {
         return AjaxResult.success();
     }
 
+    /**
+     * 批量修改视频分类
+     * @param typeId
+     * @param typeSubId
+     * @param ids
+     * @return
+     */
+    @PreAuthorize("@ss.hasPermi('course:videoResource:batchUpdateClass')")
+    @Log(title = "视频素材库", businessType = BusinessType.UPDATE)
+    @PostMapping("/batchUpdateClass")
+    public AjaxResult batchUpdateClass(@RequestParam("typeId") Long typeId,
+                                       @RequestParam("typeSubId") Long typeSubId,
+                                       @RequestParam("ids") String ids) {
+        if(typeId == null || typeId <= 0){
+            return AjaxResult.error("请选择分类");
+        }
+        if(typeSubId == null || typeSubId <= 0){
+            return AjaxResult.error("请选择子分类");
+        }
+        if(ids == null || ids.isEmpty()){
+            return AjaxResult.error("请选择要修改的分类");
+        }
+
+        // 将ids字符串分割为ID列表
+        List<String> idList = Arrays.asList(ids.split(","));
+
+        // 创建更新条件
+        Wrapper<FsVideoResource> updateWrapper = Wrappers.<FsVideoResource>lambdaUpdate()
+                .set(FsVideoResource::getTypeId, typeId)
+                .set(FsVideoResource::getTypeSubId, typeSubId)
+                .in(FsVideoResource::getId, idList.stream().map(Long::valueOf).collect(Collectors.toList()));
+
+        // 执行批量更新
+        fsVideoResourceService.update(updateWrapper);
+        return AjaxResult.success();
+    }
+
     @PreAuthorize("@ss.hasPermi('course:videoResource:batchAdd')")
     @Log(title = "视频素材库", businessType = BusinessType.INSERT)
     @PostMapping("/batchAddVideoResource")

+ 1 - 1
fs-admin/src/main/java/com/fs/his/controller/FsInquiryOrderController.java

@@ -157,7 +157,7 @@ public class FsInquiryOrderController extends BaseController
     @GetMapping(value = "/sendMsg/{orderId}")
     public AjaxResult sendMsg(@PathVariable("orderId") Long orderId)
     {
-        ;
+
         return AjaxResult.success(fsInquiryOrderService.sendStartMsg(orderId));
     }
     /**

+ 114 - 0
fs-admin/src/main/java/com/fs/his/controller/FsPhysicalReportTemplateController.java

@@ -0,0 +1,114 @@
+package com.fs.his.controller;
+
+import java.util.List;
+
+import com.fs.common.core.domain.model.LoginUser;
+import com.fs.common.utils.ServletUtils;
+import com.fs.framework.web.service.TokenService;
+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.his.domain.FsPhysicalReportTemplate;
+import com.fs.his.service.IFsPhysicalReportTemplateService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 体检报告模板Controller
+ * 
+ * @author fs
+ * @date 2025-07-23
+ */
+@RestController
+@RequestMapping("/his/physicalReportTemplate")
+public class FsPhysicalReportTemplateController extends BaseController
+{
+    @Autowired
+    private IFsPhysicalReportTemplateService fsPhysicalReportTemplateService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 查询体检报告模板列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplate:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsPhysicalReportTemplate fsPhysicalReportTemplate)
+    {
+        startPage();
+        List<FsPhysicalReportTemplate> list = fsPhysicalReportTemplateService.selectFsPhysicalReportTemplateList(fsPhysicalReportTemplate);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出体检报告模板列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplate:export')")
+    @Log(title = "体检报告模板", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsPhysicalReportTemplate fsPhysicalReportTemplate)
+    {
+        List<FsPhysicalReportTemplate> list = fsPhysicalReportTemplateService.selectFsPhysicalReportTemplateList(fsPhysicalReportTemplate);
+        ExcelUtil<FsPhysicalReportTemplate> util = new ExcelUtil<FsPhysicalReportTemplate>(FsPhysicalReportTemplate.class);
+        return util.exportExcel(list, "体检报告模板数据");
+    }
+
+    /**
+     * 获取体检报告模板详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplate:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(fsPhysicalReportTemplateService.selectFsPhysicalReportTemplateById(id));
+    }
+
+    /**
+     * 新增体检报告模板
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplate:add')")
+    @Log(title = "体检报告模板", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsPhysicalReportTemplate fsPhysicalReportTemplate)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        fsPhysicalReportTemplate.setCreateBy(String.valueOf(loginUser.getUserId()));
+        return toAjax(fsPhysicalReportTemplateService.insertFsPhysicalReportTemplate(fsPhysicalReportTemplate));
+    }
+
+    /**
+     * 修改体检报告模板
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplate:edit')")
+    @Log(title = "体检报告模板", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsPhysicalReportTemplate fsPhysicalReportTemplate)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        fsPhysicalReportTemplate.setUpdateBy(String.valueOf(loginUser.getUserId()));
+        return toAjax(fsPhysicalReportTemplateService.updateFsPhysicalReportTemplate(fsPhysicalReportTemplate));
+    }
+
+    /**
+     * 删除体检报告模板
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplate:remove')")
+    @Log(title = "体检报告模板", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(fsPhysicalReportTemplateService.deleteFsPhysicalReportTemplateByIds(ids));
+    }
+}

+ 140 - 0
fs-admin/src/main/java/com/fs/his/controller/FsPhysicalReportTemplateFieldController.java

@@ -0,0 +1,140 @@
+package com.fs.his.controller;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.api.R;
+import com.fs.common.core.domain.model.LoginUser;
+import com.fs.common.exception.ServiceException;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.framework.web.service.TokenService;
+import com.fs.his.dto.FsPhysicalReportTemplateFieldDTO;
+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.his.domain.FsPhysicalReportTemplateField;
+import com.fs.his.service.IFsPhysicalReportTemplateFieldService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 体检报告模板字段Controller
+ *
+ * @author fs
+ * @date 2025-07-24
+ */
+@RestController
+@RequestMapping("/his/physicalReportTemplateField")
+public class FsPhysicalReportTemplateFieldController extends BaseController {
+    @Autowired
+    private IFsPhysicalReportTemplateFieldService fsPhysicalReportTemplateFieldService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 查询体检报告模板字段列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplateField:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsPhysicalReportTemplateField fsPhysicalReportTemplateField) {
+        startPage();
+        List<FsPhysicalReportTemplateField> list = fsPhysicalReportTemplateFieldService.selectFsPhysicalReportTemplateFieldList(fsPhysicalReportTemplateField);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出体检报告模板字段列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplateField:export')")
+    @Log(title = "体检报告模板字段", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsPhysicalReportTemplateField fsPhysicalReportTemplateField) {
+        List<FsPhysicalReportTemplateField> list = fsPhysicalReportTemplateFieldService.selectFsPhysicalReportTemplateFieldList(fsPhysicalReportTemplateField);
+        ExcelUtil<FsPhysicalReportTemplateField> util = new ExcelUtil<FsPhysicalReportTemplateField>(FsPhysicalReportTemplateField.class);
+        return util.exportExcel(list, "体检报告模板字段数据");
+    }
+
+    /**
+     * 获取体检报告模板字段详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplateField:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id) {
+        return AjaxResult.success(fsPhysicalReportTemplateFieldService.selectFsPhysicalReportTemplateFieldById(id));
+    }
+
+    /**
+     * 新增体检报告模板字段
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplateField:add')")
+    @Log(title = "体检报告模板字段", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsPhysicalReportTemplateField fsPhysicalReportTemplateField) {
+        return toAjax(fsPhysicalReportTemplateFieldService.insertFsPhysicalReportTemplateField(fsPhysicalReportTemplateField));
+    }
+
+    /**
+     * 修改体检报告模板字段
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplateField:edit')")
+    @Log(title = "体检报告模板字段", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsPhysicalReportTemplateField fsPhysicalReportTemplateField) {
+        return toAjax(fsPhysicalReportTemplateFieldService.updateFsPhysicalReportTemplateField(fsPhysicalReportTemplateField));
+    }
+
+    /**
+     * 删除体检报告模板字段
+     */
+    @PreAuthorize("@ss.hasPermi('his:physicalReportTemplateField:remove')")
+    @Log(title = "体检报告模板字段", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids) {
+        return toAjax(fsPhysicalReportTemplateFieldService.deleteFsPhysicalReportTemplateFieldByIds(ids));
+    }
+
+    /**
+     * 获取模板自定义字段
+     *
+     * @param templateId 模板ID
+     * @return R
+     **/
+    @PostMapping("/getTemplateField/{templateId}")
+    public R getTemplateField(@PathVariable String templateId) {
+        if (StringUtils.isNull(templateId)) {
+            return R.failed("操作失败,模板ID不能为空!");
+        }
+        return fsPhysicalReportTemplateFieldService.getTemplateField(templateId);
+    }
+
+    /**
+     * 新增模板
+     *
+     * @param fieldDTO
+     * @return AjaxResult
+     **/
+    @Log(title = "体检报告模板字段", businessType = BusinessType.INSERT)
+    @PostMapping("/saveTemplate")
+    public AjaxResult saveTemplate(@RequestBody FsPhysicalReportTemplateFieldDTO fieldDTO) {
+        if (StringUtils.isNull(fieldDTO.getTemplateId())) {
+            throw new ServiceException("操作失败,模板ID不能为空!");
+        } else if (fieldDTO.getTemplateFieldList().isEmpty()) {
+            throw new ServiceException("操作失败,字段列表不能为空!");
+        }
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        fieldDTO.setCreateBy(String.valueOf(loginUser.getUserId()));
+        return toAjax(fsPhysicalReportTemplateFieldService.saveFsPhysicalReportTemplateField(fieldDTO));
+    }
+}

+ 76 - 11
fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java

@@ -17,6 +17,7 @@ import com.fs.common.utils.StringUtils;
 import com.fs.company.param.CompanyStoreOrderMoneyLogsListParam;
 import com.fs.company.service.ICompanyMoneyLogsService;
 import com.fs.company.vo.CompanyStoreOrderMoneyLogsVO;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.erp.domain.ErpDeliverys;
 import com.fs.erp.domain.ErpOrderQuery;
 import com.fs.erp.dto.ErpDeliverysRequest;
@@ -42,6 +43,7 @@ import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.*;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
+import com.github.pagehelper.PageHelper;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -100,23 +102,50 @@ public class FsStoreOrderController extends BaseController
     @Qualifier("dfOrderServiceImpl")
     private IErpOrderService dfOrderService;
 
+    @Autowired
+    @Qualifier("JSTErpOrderServiceImpl")
+    private IErpOrderService jSTOrderService;
+
     @Autowired
     SysConfigMapper sysConfigMapper;
 
     @Autowired
     private IFsStoreOrderDfService fsStoreOrderDfService;
+
+    @Autowired
+    private CloudHostProper cloudHostProper;
     /**
      * 查询订单列表
      */
-    @GetMapping("/list")
-    public TableDataInfo list(FsStoreOrderParam fsStoreOrder)
+    @PostMapping("/list")
+    public TableDataInfo list(@RequestBody FsStoreOrderParam fsStoreOrder)
     {
-        startPage();
-        if (fsStoreOrder.getUserPhoneMk()!=null&&fsStoreOrder.getUserPhoneMk()!=""){
+        PageHelper.startPage(fsStoreOrder);
+        if (fsStoreOrder.getUserPhoneMk()!=null&& !fsStoreOrder.getUserPhoneMk().isEmpty()){
             fsStoreOrder.setUserPhone(encryptPhone(fsStoreOrder.getUserPhoneMk()));
         }
-        List<FsStoreOrderListVO> list = fsStoreOrderService.selectFsStoreOrderListVO(fsStoreOrder);
-        return getDataTable(list);
+        List<FsStoreOrderListVO> list;
+        if (StringUtils.isNotBlank(fsStoreOrder.getErpAccount())){
+            //金牛erp查询
+            list = fsStoreOrderService.selectFsStoreOrderListVOByErpAccount(fsStoreOrder);
+        } else {
+            list = fsStoreOrderService.selectFsStoreOrderListVO(fsStoreOrder);
+        }
+        //金牛需求 区别其他项目 status = 6 (金牛代服管家) ,其他项目请避免使用订单状态status = 6
+        TableDataInfo dataTable = getDataTable(list);
+        if ("金牛明医".equals(cloudHostProper.getCompanyName())){
+            if (fsStoreOrder.getStatus() !=null && fsStoreOrder.getStatus() != 1){
+                list.forEach(vo->{
+                    //查询顺丰代服账号
+                    FsStoreOrderDf df = fsStoreOrderDfService.selectFsStoreOrderDfByOrderId(vo.getOrderId());
+                    if (df != null){
+                        vo.setErpAccount(df.getLoginAccount());
+                    }
+                });
+            }
+            dataTable.setMsg("jnmy");
+        }
+        return dataTable;
     }
 
     /**
@@ -388,6 +417,8 @@ public class FsStoreOrderController extends BaseController
                 } else if (erpType == 4){
                     //代服
                     erpOrderService =  dfOrderService;
+                }else if(erpType == 5){
+                    erpOrderService=jSTOrderService;
                 }
                 return erpOrderService;
 
@@ -527,13 +558,9 @@ public class FsStoreOrderController extends BaseController
             try {
                 df.setOrderId(orderId);
                 FsStoreOrderDf temp = fsStoreOrderDfService.selectFsStoreOrderDfByOrderId(df.getOrderId());
-                if (temp != null){
-                    df.setUpdateTime(new Date());
-                    fsStoreOrderDfService.updateFsStoreOrderDf(df);
-                } else {
+                if (temp == null){
                     fsStoreOrderDfService.insertFsStoreOrderDf(df);
                 }
-
                 fsStoreOrderService.createOmsOrder(orderId);
             } catch (ParseException e) {
                 throw new RuntimeException(e);
@@ -543,6 +570,44 @@ public class FsStoreOrderController extends BaseController
         return R.ok();
     }
 
+
+    @ApiOperation("批量设置订单账户")
+    @PreAuthorize("@ss.hasPermi('his:storeOrder:createErpOrder')")
+    @PostMapping(value = "/batchSetErpOrder")
+    public R batchSetErpOrder(@RequestBody FsStoreOrderSetErpPhoneParam param)
+    {
+        String loginAccount = param.getLoginAccount();
+        if (StringUtils.isBlank(loginAccount)){
+            return R.error("未选择erp账户");
+        }
+        FsStoreOrderDf df = getDFInfo(loginAccount);
+        if (df.getLoginAccount() == null){
+            return R.error("未查询到所选erp账户");
+        }
+        List<Long> orderIds = param.getOrderIds();
+        if (orderIds  == null || orderIds.isEmpty()) {
+            if (param.getUserPhoneMk() != null && !param.getUserPhoneMk().isEmpty()) {
+                param.setUserPhone(encryptPhone(param.getUserPhoneMk()));
+            }
+            List<FsStoreOrderListVO> list = fsStoreOrderService.selectFsStoreOrderListVO(param);
+            orderIds = list.stream().map(FsStoreOrderListVO::getOrderId).collect(Collectors.toList());
+        }
+        if (orderIds.isEmpty()){
+            return R.ok();
+        }
+        orderIds.forEach(orderId->{
+            df.setOrderId(orderId);
+            FsStoreOrderDf temp = fsStoreOrderDfService.selectFsStoreOrderDfByOrderId(df.getOrderId());
+            if (temp != null){
+                df.setUpdateTime(new Date());
+                fsStoreOrderDfService.updateFsStoreOrderDf(df);
+            } else {
+                fsStoreOrderDfService.insertFsStoreOrderDf(df);
+            }
+        });
+        return R.ok();
+    }
+
     private FsStoreOrderDf getDFInfo(String loginAccount) {
         //查询订单账户 判断是否存在该订单账户
         List<DFConfigVo> erpAccounts = fsStoreOrderService.getErpAccount();

+ 7 - 1
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -266,7 +266,7 @@ public class Task {
         List<FsStoreOrder> orders = null;
         if (erpOrderService == gyOrderService){
             orders = fsStoreOrderMapper.selectOmsOrderdeliveryOp();
-        } else if (erpOrderService == wdtOrderService || erpOrderService == dfOrderService){
+        } else if (erpOrderService == wdtOrderService || erpOrderService == dfOrderService || erpOrderService == jSTOrderService){
             orders = fsStoreOrderMapper.selectWdtOmsOrderdeliveryOp();
         }
 
@@ -1030,6 +1030,10 @@ public class Task {
     @Qualifier("dfOrderServiceImpl")
     private IErpOrderService dfOrderService;
 
+    @Autowired
+    @Qualifier("JSTErpOrderServiceImpl")
+    private IErpOrderService jSTOrderService;
+
     private IErpOrderService getErpService() {
         FsSysConfig sysConfig = configUtil.getSysConfig();
         Integer erpOpen = sysConfig.getErpOpen();
@@ -1050,6 +1054,8 @@ public class Task {
                 } else if (erpType == 4){
                     //代服
                     erpOrderService =  dfOrderService;
+                }else if(erpType == 5){
+                    erpOrderService=jSTOrderService;
                 }
                 return erpOrderService;
 

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

@@ -0,0 +1,103 @@
+package com.fs.qw.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.qw.domain.QwIpadServer;
+import com.fs.qw.service.IQwIpadServerService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * ipad服务器Controller
+ *
+ * @author fs
+ * @date 2025-07-23
+ */
+@RestController
+@RequestMapping("/qw/qwIpadServer")
+public class QwIpadServerController extends BaseController
+{
+    @Autowired
+    private IQwIpadServerService qwIpadServerService;
+
+    /**
+     * 查询ipad服务器列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServer:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(QwIpadServer qwIpadServer)
+    {
+        startPage();
+        List<QwIpadServer> list = qwIpadServerService.selectQwIpadServerList(qwIpadServer);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出ipad服务器列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServer:export')")
+    @Log(title = "ipad服务器", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(QwIpadServer qwIpadServer)
+    {
+        List<QwIpadServer> list = qwIpadServerService.selectQwIpadServerList(qwIpadServer);
+        ExcelUtil<QwIpadServer> util = new ExcelUtil<QwIpadServer>(QwIpadServer.class);
+        return util.exportExcel(list, "ipad服务器数据");
+    }
+
+    /**
+     * 获取ipad服务器详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServer:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(qwIpadServerService.selectQwIpadServerById(id));
+    }
+
+    /**
+     * 新增ipad服务器
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServer:add')")
+    @Log(title = "ipad服务器", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody QwIpadServer qwIpadServer)
+    {
+        return toAjax(qwIpadServerService.insertQwIpadServer(qwIpadServer));
+    }
+
+    /**
+     * 修改ipad服务器
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServer:edit')")
+    @Log(title = "ipad服务器", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody QwIpadServer qwIpadServer)
+    {
+        return toAjax(qwIpadServerService.updateQwIpadServer(qwIpadServer));
+    }
+
+    /**
+     * 删除ipad服务器
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServer:remove')")
+    @Log(title = "ipad服务器", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(qwIpadServerService.deleteQwIpadServerByIds(ids));
+    }
+}

+ 118 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwIpadServerLogController.java

@@ -0,0 +1,118 @@
+package com.fs.qw.controller;
+
+import java.util.List;
+
+import com.fs.qw.param.IPadServerLogParam;
+import com.fs.qw.vo.QwIPadServerLogVO;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.qw.domain.QwIpadServerLog;
+import com.fs.qw.service.IQwIpadServerLogService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * ipad服务器日志Controller
+ *
+ * @author fs
+ * @date 2025-07-23
+ */
+@RestController
+@RequestMapping("/qw/qwIpadServerLog")
+public class QwIpadServerLogController extends BaseController
+{
+    @Autowired
+    private IQwIpadServerLogService qwIpadServerLogService;
+
+    /**
+     * 查询ipad服务器日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerLog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(QwIpadServerLog qwIpadServerLog)
+    {
+        startPage();
+        List<QwIpadServerLog> list = qwIpadServerLogService.selectQwIpadServerLogList(qwIpadServerLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询ipad服务器日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerLog:list')")
+    @GetMapping("/ipadServerLogList")
+    public TableDataInfo ipadServerLogList(IPadServerLogParam iPadServerLogParam)
+    {
+        startPage();
+        List<QwIPadServerLogVO> list = qwIpadServerLogService.selectIpadServerLogList(iPadServerLogParam);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出ipad服务器日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerLog:export')")
+    @Log(title = "ipad服务器日志", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(IPadServerLogParam qwIpadServerLog)
+    {
+        List<QwIPadServerLogVO> list = qwIpadServerLogService.selectIpadServerLogList(qwIpadServerLog);
+        ExcelUtil<QwIPadServerLogVO> util = new ExcelUtil<QwIPadServerLogVO>(QwIPadServerLogVO.class);
+        return util.exportExcel(list, "ipad服务器日志数据");
+    }
+
+    /**
+     * 获取ipad服务器日志详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerLog:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(qwIpadServerLogService.selectQwIpadServerLogById(id));
+    }
+
+    /**
+     * 新增ipad服务器日志
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerLog:add')")
+    @Log(title = "ipad服务器日志", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody QwIpadServerLog qwIpadServerLog)
+    {
+        return toAjax(qwIpadServerLogService.insertQwIpadServerLog(qwIpadServerLog));
+    }
+
+    /**
+     * 修改ipad服务器日志
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerLog:edit')")
+    @Log(title = "ipad服务器日志", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody QwIpadServerLog qwIpadServerLog)
+    {
+        return toAjax(qwIpadServerLogService.updateQwIpadServerLog(qwIpadServerLog));
+    }
+
+    /**
+     * 删除ipad服务器日志
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerLog:remove')")
+    @Log(title = "ipad服务器日志", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(qwIpadServerLogService.deleteQwIpadServerLogByIds(ids));
+    }
+}

+ 118 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwIpadServerUserController.java

@@ -0,0 +1,118 @@
+package com.fs.qw.controller;
+
+import java.util.List;
+
+import com.fs.qw.param.IPadServerUserParam;
+import com.fs.qw.vo.QwIPadServerUserVO;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.qw.domain.QwIpadServerUser;
+import com.fs.qw.service.IQwIpadServerUserService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * ipad用户Controller
+ *
+ * @author fs
+ * @date 2025-07-23
+ */
+@RestController
+@RequestMapping("/qw/qwIpadServerUser")
+public class QwIpadServerUserController extends BaseController
+{
+    @Autowired
+    private IQwIpadServerUserService qwIpadServerUserService;
+
+    /**
+     * 查询ipad用户列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerUser:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(QwIpadServerUser qwIpadServerUser)
+    {
+        startPage();
+        List<QwIpadServerUser> list = qwIpadServerUserService.selectQwIpadServerUserList(qwIpadServerUser);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询ipad用户列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerUser:list')")
+    @GetMapping("/ipadServerUserList")
+    public TableDataInfo list(IPadServerUserParam iPadServerUserParam)
+    {
+        startPage();
+        List<QwIPadServerUserVO> list = qwIpadServerUserService.selectIpadServerUserList(iPadServerUserParam);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出ipad用户列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerUser:export')")
+    @Log(title = "ipad用户", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(IPadServerUserParam iPadServerUserParam)
+    {
+        List<QwIPadServerUserVO> list = qwIpadServerUserService.selectIpadServerUserList(iPadServerUserParam);
+        ExcelUtil<QwIPadServerUserVO> util = new ExcelUtil<QwIPadServerUserVO>(QwIPadServerUserVO.class);
+        return util.exportExcel(list, "ipad用户数据");
+    }
+
+    /**
+     * 获取ipad用户详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerUser:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(qwIpadServerUserService.selectQwIpadServerUserById(id));
+    }
+
+    /**
+     * 新增ipad用户
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerUser:add')")
+    @Log(title = "ipad用户", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody QwIpadServerUser qwIpadServerUser)
+    {
+        return toAjax(qwIpadServerUserService.insertQwIpadServerUser(qwIpadServerUser));
+    }
+
+    /**
+     * 修改ipad用户
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerUser:edit')")
+    @Log(title = "ipad用户", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody QwIpadServerUser qwIpadServerUser)
+    {
+        return toAjax(qwIpadServerUserService.updateQwIpadServerUser(qwIpadServerUser));
+    }
+
+    /**
+     * 删除ipad用户
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwIpadServerUser:remove')")
+    @Log(title = "ipad用户", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(qwIpadServerUserService.deleteQwIpadServerUserByIds(ids));
+    }
+}

+ 11 - 0
fs-admin/src/main/java/com/fs/qw/qwTask/qwTask.java

@@ -3,6 +3,7 @@ package com.fs.qw.qwTask;
 import com.fs.course.service.IFsUserCourseService;
 import com.fs.qw.service.IQwExternalContactService;
 import com.fs.qw.service.IQwGroupMsgService;
+import com.fs.qw.service.IQwMaterialService;
 import com.fs.qw.service.IQwUserService;
 import com.fs.sop.service.impl.QwSopLogsServiceImpl;
 import com.fs.sop.service.impl.QwSopServiceImpl;
@@ -46,6 +47,10 @@ public class qwTask {
     @Autowired
     private IFsStatisQwWatchService fsStatisQwWatchService;
 
+    @Autowired
+    private IQwMaterialService iQwMaterialService;
+
+
     //正在使用
     public void qwExternalContact()
     {
@@ -188,4 +193,10 @@ public class qwTask {
         fsStatisQwWatchService.writeData(today.toString());
     }
 
+    /**
+    * 每俩天 更新一次 素材库
+    */
+    public void updateMaterialByTwoDays(){
+        iQwMaterialService.updateQwMaterialByQw();
+    }
 }

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

@@ -4,7 +4,7 @@ server:
 # Spring配置
 spring:
   profiles:
-    active: dev
+    active: druid-myhk-test
 #    active: druid-hdt
 #    active: druid-yzt
 #    active: druid-sxjz

+ 67 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserCoursePeriodController.java

@@ -0,0 +1,67 @@
+package com.fs.app.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.course.domain.FsUserCoursePeriod;
+import com.fs.course.domain.FsUserCoursePeriodDays;
+import com.fs.course.domain.FsUserCourseVideoRedPackage;
+import com.fs.course.param.CompanyRedPacketParam;
+import com.fs.course.param.FsBatchPeriodRedPackageParam;
+import com.fs.course.param.PeriodCountParam;
+import com.fs.course.param.PeriodStatisticCountParam;
+import com.fs.course.service.IFsUserCoursePeriodDaysService;
+import com.fs.course.service.IFsUserCoursePeriodService;
+import com.fs.course.service.IFsUserCourseVideoRedPackageService;
+import com.fs.course.vo.FsPeriodCountVO;
+import com.fs.course.vo.FsUserCoursePeriodVO;
+import com.fs.course.vo.PeriodRedPacketVO;
+import com.fs.course.vo.UpdateCourseTimeVo;
+import com.fs.his.vo.OptionsVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 会员营期Controller
+ *
+ * @author fs
+ * @date 2025-04-11
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/course/period")
+@Slf4j
+public class FsUserCoursePeriodController extends BaseController {
+
+    private final IFsUserCoursePeriodService fsUserCoursePeriodService;
+
+    @PostMapping("/periodCourseStatisticCount")
+    @ApiOperation("会员详情训练营数据总览")
+    public R periodCourseStatisticCount(@RequestBody PeriodStatisticCountParam param) {
+        if (param == null) {
+            return R.error("请求参数不能为空!");
+        }
+        return R.ok().put("data", fsUserCoursePeriodService.periodCourseStatisticCount(param));
+    }
+
+    @PostMapping("/periodlist")
+    public R periodList(@RequestBody PeriodStatisticCountParam param)
+    {
+        List<FsUserCoursePeriod> list = fsUserCoursePeriodService.selectFsPeriodlist(param);
+        return R.ok().put("data", list);
+    }
+}

+ 46 - 0
fs-company-app/src/main/java/com/fs/app/controller/qw/QwFsCourseWatchLogController.java

@@ -0,0 +1,46 @@
+package com.fs.app.controller.qw;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.exception.CustomException;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.course.domain.FsCourseWatchLog;
+import com.fs.course.param.FsCourseWatchLogListParam;
+import com.fs.course.param.FsCourseWatchLogStatisticsListParam;
+import com.fs.course.param.PeriodStatisticCountParam;
+import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.course.vo.FsCourseWatchLogListVO;
+import com.fs.course.vo.FsCourseWatchLogStatisticsListVO;
+import com.fs.qw.param.QwWatchLogStatisticsListParam;
+import com.fs.qw.service.IQwWatchLogService;
+import com.fs.qw.vo.QwWatchLogAllStatisticsListVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 短链课程看课记录Controller
+ *
+ * @author fs
+ * @date 2024-10-24
+ */
+@RestController
+@RequestMapping("/qw/course/courseWatchLog")
+public class QwFsCourseWatchLogController extends BaseController {
+    @Autowired
+    private IFsCourseWatchLogService fsCourseWatchLogService;
+
+    //    @PreAuthorize("@ss.hasPermi('course:courseWatchLog:list')")
+    @GetMapping("/listBytrainingCampId")
+    public TableDataInfo listBytrainingCampId(PeriodStatisticCountParam param) {
+        startPage();
+        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectListBytrainingCampId(param);
+        return getDataTable(list);
+    }
+}

+ 0 - 1
fs-company/src/main/java/com/fs/company/controller/fastGpt/FastGptRoleController.java

@@ -61,7 +61,6 @@ public class FastGptRoleController extends BaseController
     @GetMapping("/getAllRoleType")
     public R list()
     {
-
         List<OptionsVO> list = fastGptRoleService.selectFastGptRoleType();
         return R.ok().put("data",list);
     }

+ 2 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwMaterialController.java

@@ -1,6 +1,7 @@
 package com.fs.company.controller.qw;
 
 import com.fs.common.annotation.Log;
+import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
@@ -101,6 +102,7 @@ public class QwMaterialController extends BaseController
     @PreAuthorize("@ss.hasPermi('qw:material:add')")
     @Log(title = "素材库", businessType = BusinessType.INSERT)
     @PostMapping
+    @RepeatSubmit
     public R add(@RequestBody QwMaterial qwMaterial) throws Exception {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         qwMaterial.setCreateUserId(loginUser.getUser().getUserId());

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

@@ -107,7 +107,7 @@ public class QwUserVoiceLogController extends BaseController
         return getDataTable(list);
     }
 
-    @PreAuthorize("@ss.hasPermi('qw:qwUserVoiceLog:sellTotalList')")
+
     @GetMapping("/sellTotalList")
     public TableDataInfo sellTotalList(QwUserVoiceLogTotalVo qwUserVoiceLog)
     {

+ 4 - 5
fs-company/src/main/java/com/fs/company/controller/qw/SopUserLogsInfoController.java

@@ -26,14 +26,11 @@ import com.fs.sop.params.SendUserLogsInfoMsgParam;
 import com.fs.sop.service.ISopUserLogsInfoService;
 import com.fs.voice.utils.StringUtil;
 import com.google.gson.Gson;
-import com.google.gson.JsonSyntaxException;
 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.io.IOException;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -98,8 +95,10 @@ public class SopUserLogsInfoController extends BaseController
                     Map<String, QwTag> tagMap = PubFun.listToMapByGroupObject(tagList, QwTag::getTagId);
                     qwExternalContactVOTimes.forEach(e -> {
                         List<String> tagId = JSON.parseArray(e.getTagIds(), String.class);
-                        List<String> tagNameList = tagId.stream().filter(tagMap::containsKey).map(t -> tagMap.get(t).getName()).filter(StringUtils::isNotEmpty).collect(Collectors.toList());
-                        e.setTagIdsName(tagNameList);
+                        if(StringUtils.isNotEmpty(tagId)){
+                            List<String> tagNameList = tagId.stream().filter(tagMap::containsKey).map(t -> tagMap.get(t).getName()).filter(StringUtils::isNotEmpty).collect(Collectors.toList());
+                            e.setTagIdsName(tagNameList);
+                        }
                     });
                 }
                 // 设置联系信息

+ 29 - 3
fs-company/src/main/java/com/fs/company/controller/store/FsInquiryOrderController.java

@@ -1,5 +1,6 @@
 package com.fs.company.controller.store;
 
+import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.annotation.Log;
 import com.fs.common.annotation.RepeatSubmit;
@@ -7,6 +8,7 @@ import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.StringUtils;
 import com.fs.framework.security.LoginUser;
@@ -16,6 +18,7 @@ import com.fs.his.domain.FsInquiryOrder;
 import com.fs.his.domain.FsInquiryOrderMsg;
 import com.fs.his.domain.FsStoreOrderLogs;
 import com.fs.his.param.FsInquiryOrderCancelParam;
+import com.fs.his.param.FsInquiryOrderCreateParam;
 import com.fs.his.param.FsInquiryOrderParam;
 import com.fs.his.param.FsInquiryOrderRefundParam;
 import com.fs.his.service.IFsDoctorService;
@@ -32,9 +35,11 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Base64;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 问诊订单Controller
@@ -247,16 +252,24 @@ public class FsInquiryOrderController extends BaseController
         }
         return AjaxResult.success(fsInquiryOrderVO);
     }
-
+    @Autowired
+    RedisCache redisCache;
     /**
      * 新增问诊订单
      */
     @PreAuthorize("@ss.hasPermi('store:inquiryOrder:add')")
     @Log(title = "问诊订单", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody FsInquiryOrder fsInquiryOrder)
+    public R add(@RequestBody FsInquiryOrderCreateParam param)
     {
-        return toAjax(fsInquiryOrderService.insertFsInquiryOrder(fsInquiryOrder));
+        String uuid = IdUtil.randomUUID();
+        redisCache.setCacheObject("orderKey:"+uuid,uuid,200, TimeUnit.MINUTES);
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        param.setOrderKey(uuid);
+        param.setCompanyId(loginUser.getCompany().getCompanyId());
+        param.setCompanyUserId(loginUser.getUser().getUserId());
+        param.setIsVisit("就诊过");
+        return fsInquiryOrderService.createOrder(param);
     }
 
     /**
@@ -350,4 +363,17 @@ public class FsInquiryOrderController extends BaseController
     }
 
 
+    /**
+    * 生成订单二维码
+    */
+    @PreAuthorize("@ss.hasPermi('store:inquiryOrder:wxaCodeInquiryOrder')")
+    @GetMapping("/getWxaCodeInquiryOrderUnLimit/{orderId}")
+    public AjaxResult getWxaCodeInquiryOrderUnLimit(@PathVariable("orderId") Long orderId)
+    {
+
+        byte[] bytes = fsInquiryOrderService.getWxaCodeInquiryOrderUnLimit(orderId);
+        String base64 = Base64.getEncoder().encodeToString(bytes);
+        return AjaxResult.success("成功",base64);
+
+    }
 }

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

@@ -527,6 +527,11 @@ public class FsStoreOrderController extends BaseController
     @Autowired
     @Qualifier("wdtErpOrderServiceImpl")
     private IErpOrderService wdtOrderService;
+
+    @Autowired
+    @Qualifier("JSTErpOrderServiceImpl")
+    private IErpOrderService jSTOrderService;
+
     private IErpOrderService getErpService() {
         FsSysConfig sysConfig = configUtil.getSysConfig();
         Integer erpOpen = sysConfig.getErpOpen();
@@ -541,6 +546,8 @@ public class FsStoreOrderController extends BaseController
                 } else if (erpType == 2){
                     //旺店通
                     erpOrderService =  wdtOrderService;
+                }else if(erpType == 5){
+                    erpOrderService = jSTOrderService;
                 }
                 return erpOrderService;
 

+ 4 - 3
fs-company/src/main/java/com/fs/company/controller/store/FsUserController.java

@@ -76,9 +76,10 @@ public class FsUserController extends BaseController
     public TableDataInfo userList(FsUserParam fsUser)
     {
         startPage();
-        if(fsUser.getPhoneMk()!=null&&fsUser.getPhone()!=""){
-            fsUser.setPhone(encryptPhone(fsUser.getPhoneMk()));
-        }
+
+
+        fsUser.setPhone(encryptPhone(fsUser.getPhone()));
+
         List<FsUserVO> list = fsUserService.selectFsUserListVOByComponent(fsUser);
         for (FsUserVO fsUserVO : list) {
             fsUserVO.setPhone(decryptAutoPhoneMk(fsUserVO.getPhone()));

+ 11 - 2
fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -12,8 +12,11 @@ import com.fs.course.service.IFsCourseLinkService;
 import com.fs.course.service.IFsCourseWatchLogService;
 import com.fs.course.service.IFsUserVideoService;
 import com.fs.course.service.IHuaweiObsService;
+import com.fs.his.service.IFsInquiryOrderService;
+import com.fs.his.service.IFsPackageOrderService;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.service.IQwMaterialService;
 import com.fs.qwApi.service.QwApiService;
 import com.fs.sop.mapper.QwSopLogsMapper;
 import com.fs.sop.mapper.QwSopMapper;
@@ -34,6 +37,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
+import java.util.Base64;
 import java.util.List;
 
 @Api("公共接口")
@@ -93,6 +97,11 @@ public class CommonController {
     @Autowired
     private ISopUserLogsInfoService iSopUserLogsInfoService;
 
+    @Autowired
+    private IFsInquiryOrderService inquiryOrderService;
+
+    @Autowired
+    private IQwMaterialService iQwMaterialService;
 
     /**
     * 发官方通连
@@ -133,8 +142,8 @@ public class CommonController {
     @GetMapping("/testSop")
     public R testSop() throws Exception {
 
-        List<ExtCourseSopWatchLogVO> tagList = iSopUserLogsInfoService.getExtCourseSopWatchLog(14185L);
-        return R.ok().put("data",tagList);
+        iQwMaterialService.updateQwMaterialByQw();
+        return R.ok();
     }
 
     @GetMapping("/testRatingSop")

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

@@ -10,4 +10,4 @@ spring:
 #    active: druid-hcl
 #    active: druid-sxjz
 #    active: druid-hdt
-    active: druid-fcky-test
+    active: druid-myhk-test

+ 73 - 0
fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisQwMaterialBySidebar.java

@@ -0,0 +1,73 @@
+package com.fs.app.controller;
+
+import com.fs.common.core.domain.R;
+import com.fs.qw.domain.QwUser;
+import com.fs.qw.param.QwMaterialParam;
+import com.fs.qw.param.QwMaterialParamBySidebar;
+import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.service.IQwMaterialService;
+import com.fs.qw.vo.QwMaterialVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Api("素材库库相关接口")
+@RestController
+@RequestMapping("/apis/app/qw/material")
+@Slf4j
+public class ApisQwMaterialBySidebar {
+
+
+
+    @Autowired
+    private IQwExternalContactService qwExternalContactService;
+
+    @Autowired
+    private IQwMaterialService qwMaterialService;
+
+    /**
+     * 查询素材库列表
+     */
+    @PostMapping("/MaterialList")
+    public R list(@RequestBody QwMaterialParamBySidebar param)
+    {
+
+        QwUser qwUser = qwExternalContactService.getQwUserByRedis(param.getCorpId().trim(),param.getQwUserId().trim());
+
+        if (qwUser == null || qwUser.getCompanyId() == null) {
+            return R.error("员工未绑定 销售公司 或 未获取到员工信息,请重试!");
+        }
+
+
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
+        QwMaterialParam materialParam=new QwMaterialParam();
+        materialParam.setCompanyId(qwUser.getCompanyId());
+        materialParam.setTitle(param.getKeyword());
+        List<QwMaterialVO> list = qwMaterialService.selectQwMaterialList(materialParam);
+
+
+        PageInfo<QwMaterialVO> result = new PageInfo<>(list);
+        return R.ok().put("data", result);
+
+
+    }
+
+    @GetMapping("/updateMaterialTime/{materialId}")
+    public R updateMaterialTime(@PathVariable Long materialId) throws Exception {
+
+        return R.ok().put("data",qwMaterialService.selectQwMaterialByMaterialIdByTime(materialId));
+    }
+
+    @GetMapping("/getMaterialByTime/{materialId}")
+    public R getMaterialByTime(@PathVariable Long materialId) throws Exception {
+
+        return R.ok().put("data",qwMaterialService.selectQwMaterialByMaterialIdByTimeTwo(materialId));
+    }
+
+}

+ 18 - 0
fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisQwUserController.java

@@ -7,10 +7,13 @@ import com.fs.course.param.FsCourseListBySidebarParam;
 import com.fs.qw.domain.QwExternalContactInfo;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.param.ExternalContactDetailsParam;
+import com.fs.qw.param.QwExtCourseSopWatchLog;
 import com.fs.qw.service.IQwExternalContactInfoService;
 import com.fs.qw.service.IQwExternalContactService;
 import com.fs.qw.vo.ExternalContactDetailsVO;
 import com.fs.qw.vo.QwExternalListByHeavyVO;
+import com.fs.sop.service.ISopUserLogsInfoService;
+import com.fs.sop.vo.ExtCourseSopWatchLogVO;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -36,6 +39,9 @@ public class ApisQwUserController extends BaseController {
     @Autowired
     private IQwExternalContactInfoService qwExternalContactInfoService;
 
+    @Autowired
+    private ISopUserLogsInfoService iSopUserLogsInfoService;
+
     @GetMapping("/details")
     @ApiOperation("会员看课详情")
     public R getUserDetails(@ApiParam(value = "外部联系人id", required = true) @RequestParam Long contactId,
@@ -98,4 +104,16 @@ public class ApisQwUserController extends BaseController {
         PageInfo<QwExternalListByHeavyVO> result = new PageInfo<>(qwExternalListByHeavy);
         return R.ok().put("data", result);
     }
+
+    @PostMapping("/extCourseSopWatchLog")
+    @ApiOperation("获取外部联系人按照 营期天数 获取到的今天该看的课")
+    public R getExtCourseSopWatchLog(@RequestBody QwExtCourseSopWatchLog param) {
+
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        List<ExtCourseSopWatchLogVO> list = iSopUserLogsInfoService.getExtCourseSopWatchLog(param);
+        PageInfo<ExtCourseSopWatchLogVO> result = new PageInfo<>(list);
+
+        return R.ok().put("data", result);
+    }
+
 }

+ 72 - 0
fs-qwhook-sop/src/main/java/com/fs/app/controller/QwMaterialBySidebar.java

@@ -0,0 +1,72 @@
+package com.fs.app.controller;
+
+import com.fs.common.core.domain.R;
+import com.fs.qw.domain.QwUser;
+import com.fs.qw.param.QwMaterialParam;
+import com.fs.qw.param.QwMaterialParamBySidebar;
+import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.service.IQwMaterialService;
+import com.fs.qw.vo.QwMaterialVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Api("素材库库相关接口")
+@RestController
+@RequestMapping("/app/qw/material")
+@Slf4j
+public class QwMaterialBySidebar {
+
+
+
+    @Autowired
+    private IQwExternalContactService qwExternalContactService;
+
+    @Autowired
+    private IQwMaterialService qwMaterialService;
+
+    /**
+     * 查询素材库列表
+     */
+    @PostMapping("/MaterialList")
+    public R list(@RequestBody QwMaterialParamBySidebar param)
+    {
+
+        QwUser qwUser = qwExternalContactService.getQwUserByRedis(param.getCorpId().trim(),param.getQwUserId().trim());
+
+        if (qwUser == null || qwUser.getCompanyId() == null) {
+            return R.error("员工未绑定 销售公司 或 未获取到员工信息,请重试!");
+        }
+
+
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
+        QwMaterialParam materialParam=new QwMaterialParam();
+        materialParam.setCompanyId(qwUser.getCompanyId());
+        materialParam.setTitle(param.getKeyword());
+        List<QwMaterialVO> list = qwMaterialService.selectQwMaterialList(materialParam);
+
+
+        PageInfo<QwMaterialVO> result = new PageInfo<>(list);
+        return R.ok().put("data", result);
+
+    }
+
+    @GetMapping("/updateMaterialTime/{materialId}")
+    public R updateMaterialTime(@PathVariable Long materialId) throws Exception {
+
+        return R.ok().put("data",qwMaterialService.selectQwMaterialByMaterialIdByTime(materialId));
+    }
+
+    @GetMapping("/getMaterialByTime/{materialId}")
+    public R getMaterialByTime(@PathVariable Long materialId) throws Exception {
+
+        return R.ok().put("data",qwMaterialService.selectQwMaterialByMaterialIdByTimeTwo(materialId));
+    }
+
+}

+ 18 - 0
fs-qwhook-sop/src/main/java/com/fs/app/controller/QwUserController.java

@@ -7,6 +7,7 @@ import com.fs.common.exception.CustomException;
 import com.fs.qw.domain.QwExternalContactInfo;
 import com.fs.qw.domain.QwTagGroup;
 import com.fs.qw.param.ExternalContactDetailsParam;
+import com.fs.qw.param.QwExtCourseSopWatchLog;
 import com.fs.qw.param.sidebar.ExternalContactInfoParam;
 import com.fs.qw.param.sidebar.TagGroupListParam;
 import com.fs.qw.param.sidebar.TagGroupUpdateParam;
@@ -17,6 +18,8 @@ import com.fs.qw.vo.ExternalContactDetailsVO;
 import com.fs.qw.vo.QwTagGroupListVO;
 import com.fs.qw.vo.sidebar.ExternalContactInfoVO;
 import com.fs.qw.vo.sidebar.ExternalContactTagVO;
+import com.fs.sop.service.ISopUserLogsInfoService;
+import com.fs.sop.vo.ExtCourseSopWatchLogVO;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -45,6 +48,9 @@ public class QwUserController extends BaseController {
     @Autowired
     private IQwTagGroupService qwTagGroupService;
 
+    @Autowired
+    private ISopUserLogsInfoService iSopUserLogsInfoService;
+
     @GetMapping("/details")
     @ApiOperation("会员看课详情")
     public R getUserDetails(@ApiParam(value = "外部联系人id", required = true) @RequestParam Long contactId,
@@ -81,6 +87,18 @@ public class QwUserController extends BaseController {
         return R.ok();
     }
 
+    @PostMapping("/extCourseSopWatchLog")
+    @ApiOperation("获取外部联系人按照 营期天数 获取到的今天该看的课")
+    public R getExtCourseSopWatchLog(@RequestBody QwExtCourseSopWatchLog param) {
+
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        List<ExtCourseSopWatchLogVO> list = iSopUserLogsInfoService.getExtCourseSopWatchLog(param);
+        PageInfo<ExtCourseSopWatchLogVO> result = new PageInfo<>(list);
+
+        return R.ok().put("data", result);
+    }
+
+
     @GetMapping("/externalContact")
     @ApiOperation("获取侧边栏外部联系人信息")
     public R getExternalContactInfo(@RequestParam(value = "qwExternalContactId") Long qwExternalContactId) {

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

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

+ 81 - 0
fs-qwhook/src/main/java/com/fs/app/controller/ApisQwMaterialBySidebar.java

@@ -0,0 +1,81 @@
+package com.fs.app.controller;
+
+import com.fs.common.core.domain.R;
+import com.fs.qw.domain.QwMaterial;
+import com.fs.qw.domain.QwUser;
+import com.fs.qw.param.QwMaterialParam;
+import com.fs.qw.param.QwMaterialParamBySidebar;
+import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.service.IQwMaterialService;
+import com.fs.qw.vo.QwMaterialVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Api("素材库库相关接口")
+@RestController
+@RequestMapping("/apis/app/qw/material")
+@Slf4j
+public class ApisQwMaterialBySidebar {
+
+
+
+    @Autowired
+    private IQwExternalContactService qwExternalContactService;
+
+    @Autowired
+    private IQwMaterialService qwMaterialService;
+
+    /**
+     * 查询素材库列表
+     */
+    @PostMapping("/MaterialList")
+    public R list(@RequestBody QwMaterialParamBySidebar param)
+    {
+
+        QwUser qwUser = qwExternalContactService.getQwUserByRedis(param.getCorpId().trim(),param.getQwUserId().trim());
+
+        if (qwUser == null || qwUser.getCompanyId() == null) {
+            return R.error("员工未绑定 销售公司 或 未获取到员工信息,请重试!");
+        }
+
+
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
+        QwMaterialParam materialParam=new QwMaterialParam();
+        materialParam.setCompanyId(qwUser.getCompanyId());
+        materialParam.setTitle(param.getKeyword());
+        List<QwMaterialVO> list = qwMaterialService.selectQwMaterialList(materialParam);
+
+
+        PageInfo<QwMaterialVO> result = new PageInfo<>(list);
+        return R.ok().put("data", result);
+
+
+    }
+
+    /**
+    * 更新 素材库的某个素材的 media_id
+    */
+    @GetMapping("/updateMaterialTime/{materialId}")
+    public R updateMaterialTime(@PathVariable Long materialId) throws Exception {
+
+        return R.ok().put("data",qwMaterialService.selectQwMaterialByMaterialIdByTime(materialId));
+    }
+
+    /**
+    * 获取某个素材id
+    */
+    @GetMapping("/getMaterialByTime/{materialId}")
+    public R getMaterialByTime(@PathVariable Long materialId) throws Exception {
+
+        return R.ok().put("data",qwMaterialService.selectQwMaterialByMaterialIdByTimeTwo(materialId));
+    }
+
+
+}

+ 10 - 4
fs-qwhook/src/main/java/com/fs/app/controller/ApisQwUserController.java

@@ -3,12 +3,14 @@ package com.fs.app.controller;
 import com.fs.common.BeanCopyUtils;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.exception.CustomException;
 import com.fs.course.param.FsCourseListBySidebarParam;
 import com.fs.qw.domain.QwExternalContactInfo;
 import com.fs.qw.domain.QwTagGroup;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.param.ExternalContactDetailsParam;
+import com.fs.qw.param.QwExtCourseSopWatchLog;
 import com.fs.qw.param.sidebar.ExternalContactInfoParam;
 import com.fs.qw.param.sidebar.TagGroupListParam;
 import com.fs.qw.param.sidebar.TagGroupUpdateParam;
@@ -119,11 +121,15 @@ public class ApisQwUserController extends BaseController {
     }
 
 
-    @GetMapping("/extCourseSopWatchLog")
+    @PostMapping("/extCourseSopWatchLog")
     @ApiOperation("获取外部联系人按照 营期天数 获取到的今天该看的课")
-    public R getExtCourseSopWatchLog(@RequestParam(value = "qwExternalContactId") Long qwExternalContactId) {
-        List<ExtCourseSopWatchLogVO> tagList = iSopUserLogsInfoService.getExtCourseSopWatchLog(qwExternalContactId);
-        return R.ok().put("data", tagList);
+    public R getExtCourseSopWatchLog(@RequestBody QwExtCourseSopWatchLog param) {
+
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        List<ExtCourseSopWatchLogVO> list = iSopUserLogsInfoService.getExtCourseSopWatchLog(param);
+        PageInfo<ExtCourseSopWatchLogVO> result = new PageInfo<>(list);
+
+        return R.ok().put("data", result);
     }
 
     @GetMapping("/externalContact")

+ 73 - 0
fs-qwhook/src/main/java/com/fs/app/controller/QwMaterialBySidebar.java

@@ -0,0 +1,73 @@
+package com.fs.app.controller;
+
+import com.fs.common.core.domain.R;
+import com.fs.qw.domain.QwUser;
+import com.fs.qw.param.QwMaterialParam;
+import com.fs.qw.param.QwMaterialParamBySidebar;
+import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.service.IQwMaterialService;
+import com.fs.qw.vo.QwMaterialVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Api("素材库库相关接口")
+@RestController
+@RequestMapping("/app/qw/material")
+@Slf4j
+public class QwMaterialBySidebar {
+
+
+
+    @Autowired
+    private IQwExternalContactService qwExternalContactService;
+
+    @Autowired
+    private IQwMaterialService qwMaterialService;
+
+    /**
+     * 查询素材库列表
+     */
+    @PostMapping("/MaterialList")
+    public R list(@RequestBody QwMaterialParamBySidebar param)
+    {
+
+        QwUser qwUser = qwExternalContactService.getQwUserByRedis(param.getCorpId().trim(),param.getQwUserId().trim());
+
+        if (qwUser == null || qwUser.getCompanyId() == null) {
+            return R.error("员工未绑定 销售公司 或 未获取到员工信息,请重试!");
+        }
+
+
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+
+        QwMaterialParam materialParam=new QwMaterialParam();
+        materialParam.setCompanyId(qwUser.getCompanyId());
+        materialParam.setTitle(param.getKeyword());
+        List<QwMaterialVO> list = qwMaterialService.selectQwMaterialList(materialParam);
+
+
+        PageInfo<QwMaterialVO> result = new PageInfo<>(list);
+        return R.ok().put("data", result);
+
+
+    }
+
+    @GetMapping("/updateMaterialTime/{materialId}")
+    public R updateMaterialTime(@PathVariable Long materialId) throws Exception {
+
+        return R.ok().put("data",qwMaterialService.selectQwMaterialByMaterialIdByTime(materialId));
+    }
+
+    @GetMapping("/getMaterialByTime/{materialId}")
+    public R getMaterialByTime(@PathVariable Long materialId) throws Exception {
+
+        return R.ok().put("data",qwMaterialService.selectQwMaterialByMaterialIdByTimeTwo(materialId));
+    }
+
+}

+ 9 - 4
fs-qwhook/src/main/java/com/fs/app/controller/QwUserController.java

@@ -7,6 +7,7 @@ import com.fs.common.exception.CustomException;
 import com.fs.qw.domain.QwExternalContactInfo;
 import com.fs.qw.domain.QwTagGroup;
 import com.fs.qw.param.ExternalContactDetailsParam;
+import com.fs.qw.param.QwExtCourseSopWatchLog;
 import com.fs.qw.param.sidebar.ExternalContactInfoParam;
 import com.fs.qw.param.sidebar.TagGroupListParam;
 import com.fs.qw.param.sidebar.TagGroupUpdateParam;
@@ -86,11 +87,15 @@ public class QwUserController extends BaseController {
         return R.ok();
     }
 
-    @GetMapping("/extCourseSopWatchLog")
+    @PostMapping("/extCourseSopWatchLog")
     @ApiOperation("获取外部联系人按照 营期天数 获取到的今天该看的课")
-    public R getExtCourseSopWatchLog(@RequestParam(value = "qwExternalContactId") Long qwExternalContactId) {
-        List<ExtCourseSopWatchLogVO> tagList = iSopUserLogsInfoService.getExtCourseSopWatchLog(qwExternalContactId);
-        return R.ok().put("data", tagList);
+    public R getExtCourseSopWatchLog(@RequestBody QwExtCourseSopWatchLog param) {
+
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        List<ExtCourseSopWatchLogVO> list = iSopUserLogsInfoService.getExtCourseSopWatchLog(param);
+        PageInfo<ExtCourseSopWatchLogVO> result = new PageInfo<>(list);
+
+        return R.ok().put("data", result);
     }
 
     @GetMapping("/externalContact")

+ 1 - 0
fs-service/src/main/java/com/fs/common/param/LoginParam.java

@@ -14,4 +14,5 @@ public class LoginParam implements Serializable {
     private String rawData;
     private String signature;
     private String appId;
+    private Integer authType;
 }

+ 4 - 1
fs-service/src/main/java/com/fs/config/ai/AiHostProper.java

@@ -9,5 +9,8 @@ import org.springframework.stereotype.Component;
 public class AiHostProper {
     @Value("${ipad.ipadUrl}")
     private String ipadUrl;
-    
+
+    @Value("${ipad.aiApi}")
+    private String aiApi;
+
 }

+ 3 - 0
fs-service/src/main/java/com/fs/course/mapper/FsVideoResourceMapper.java

@@ -24,4 +24,7 @@ public interface FsVideoResourceMapper extends BaseMapper<FsVideoResource> {
 
     @Select("select * from fs_video_resource where is_transcode = 1 and is_del = 0 and transcode_file_key is null")
     List<FsVideoResource> selectVideoIsTranscode();
+
+    @Select("select * from fs_video_resource where file_key = #{fileKey} limit 1")
+    FsVideoResource selectByFileKey(String fileKey);
 }

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

@@ -13,7 +13,7 @@ import com.fs.his.vo.OptionsVO;
 import java.util.List;
 import java.util.Map;
 
-/**
+    /**
  * 营期课程Service接口
  *
  * @author fs

+ 2 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java

@@ -180,4 +180,6 @@ public interface IFsUserCourseVideoService
     FsUserCourseVideo selectByFileKey(String fileKey);
 
     String selectFsUserCourseVideoByVideoForTitle(Long videoId);
+
+    R updateVideo();
 }

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

@@ -1,6 +1,7 @@
 package com.fs.course.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
@@ -24,6 +25,8 @@ import com.fs.course.vo.UpdateCourseTimeVo;
 import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.vo.OptionsVO;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
@@ -54,6 +57,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
     private final FsUserCoursePeriodMapper fsUserCoursePeriodMapper;
 
     private final FsUserMapper fsUserMapper;
+    private final SysConfigMapper sysConfigMapper;
 
     private final FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper;
     private final IFsUserCourseVideoService fsUserCourseVideoService;
@@ -178,6 +182,10 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
             }else if(video.getViewEndTime() != null){
                 day.setEndDateTime(LocalDateTime.of(day.getDayDate(), video.getViewEndTime()));
             }
+            SysConfig config = sysConfigMapper.selectConfigByConfigKey("joinTime.switch.config");
+            if (ObjectUtils.isNotEmpty(config)&&config.getConfigValue().equals("1")){
+                entity.setJoinTime(entity.getEndTime1());
+            }
             if(entity.getJoinTime() != null){
                 day.setLastJoinTime(LocalDateTime.of(day.getDayDate(), entity.getJoinTime()));
             }else if(video.getLastJoinTime() != null){
@@ -339,7 +347,14 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
             // 调整时间为直接接收前端传入的年月日,不使用营期的日期(2025年6月11日 10点41分)
             day.setStartDateTime(vo.getStartTime());
             day.setEndDateTime(vo.getEndTime1());
-            day.setLastJoinTime(vo.getJoinTime());
+
+            SysConfig config = sysConfigMapper.selectConfigByConfigKey("joinTime.switch.config");
+            if (ObjectUtils.isNotEmpty(config)&&config.getConfigValue().equals("1")){
+                day.setLastJoinTime(vo.getEndTime1());
+            }else {
+                day.setLastJoinTime(vo.getJoinTime());
+            }
+
             // 把营期时间改成开始时间
             day.setDayDate(vo.getStartTime().toLocalDate());
             // 设置状态

+ 41 - 22
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -78,6 +78,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.SocketTimeoutException;
+import java.text.SimpleDateFormat;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -654,6 +655,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             QwExternalContact contact = new QwExternalContact();
             contact.setId(param.getQwExternalId());
             contact.setFsUserId(param.getUserId());
+            contact.setRegisterTime(new Date());
             qwExternalContactMapper.updateQwExternalContact(contact);
 
             iSopUserLogsInfoService.updateSopUserInfoByExternalId(qwExternalId,param.getUserId());
@@ -665,14 +667,22 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             fsUserMapper.updateFsUser(user);
 
 
-            //小访客特有
+//            //小访客特有
 //            SendXfkParam xfkParam=new SendXfkParam();
 //            xfkParam.setCorpId(externalContact.getCorpId());
 //            xfkParam.setUserId(externalContact.getUserId());
 //            xfkParam.setName(externalContact.getName());
 //            xfkParam.setAddWay(externalContact.getAddWay());
 //            xfkParam.setState(externalContact.getState());
-//            xfkParam.setCreateTime(externalContact.getCreateTime().toString());
+//            if (externalContact.getCreateTime()!=null){
+//                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//                String formattedTime = sdf.format(externalContact.getCreateTime());
+//                xfkParam.setCreateTime(formattedTime);
+//            }else {
+//                xfkParam.setCreateTime("");
+//            }
+//
+//
 //            xfkService.executeSopByIds(xfkParam);
 
             iSopUserLogsInfoService.updateSopUserInfoByExternalId(qwExternalId,param.getUserId());
@@ -848,6 +858,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 //        if (StringUtils.isEmpty(user.getMpOpenId())){
 //            return R.error("未识别到领取信息");
 //        }
+        if (user.getStatus()==0){
+            return R.error("会员被停用,无权限,请联系客服!");
+        }
         FsCourseWatchLog log = new FsCourseWatchLog();
 
         // 根据链接类型判断是否已发放奖励
@@ -950,23 +963,6 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
      * @return 处理结果
      */
     private R sendRedPacketReward(FsCourseSendRewardUParam param, FsUser user, FsCourseWatchLog log, FsUserCourseVideo video, CourseConfig config) {
-        // 判断是否属于领取红包时间(会员看课发放红包)
-        if (param.getPeriodId()!=null && param.getPeriodId()>0) {
-            FsUserCoursePeriodDays periodDays = new FsUserCoursePeriodDays();
-            periodDays.setVideoId(param.getVideoId());
-            periodDays.setPeriodId(param.getPeriodId());
-            //正常情况是只能查询到一条,之前可能存在重复的脏数据,暂使用查询list的方式
-            List<FsUserCoursePeriodDays> fsUserCoursePeriodDays = fsUserCoursePeriodDaysMapper.selectFsUserCoursePeriodDaysList(periodDays);
-            if(fsUserCoursePeriodDays != null && !fsUserCoursePeriodDays.isEmpty()){
-                periodDays = fsUserCoursePeriodDays.get(0);
-            }
-            if(periodDays != null && periodDays.getLastJoinTime() !=null && LocalDateTime.now().isAfter(periodDays.getLastJoinTime())) {
-                return R.error(403,"已超过领取红包时间");
-            }
-        }
-
-
-
 
         // 确定红包金额
         BigDecimal amount = BigDecimal.ZERO;
@@ -980,12 +976,18 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
         // 准备发送红包参数
         WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
-//        packetParam.setOpenId(getOpenId(user.getUserId(), param.getCompanyId(), param.getSource()));
         packetParam.setOpenId(user.getMpOpenId());
         // 来源是小程序切换openId
         if (param.getSource() == 2) {
-            System.out.println("小程序id"+user.getCourseMaOpenId());
-            packetParam.setOpenId(user.getCourseMaOpenId());
+            //处理多小程序问题
+            FsUserWx fsUserWx = fsUserWxService.selectByAppIdAndUserId(param.getAppId(),user.getUserId(),1);
+            if (fsUserWx ==null || fsUserWx.getOpenId()==null){
+                packetParam.setOpenId(user.getCourseMaOpenId());
+            }else {
+                packetParam.setOpenId(fsUserWx.getOpenId());
+            }
+            //查出公司绑定openid并赋值
+
         }
         packetParam.setAmount(amount);
         packetParam.setSource(param.getSource());
@@ -1840,6 +1842,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
             //存看课记录
             courseWatchLogMapper.insertOrUpdateFsCourseWatchLog(watchLog);
+
         }catch (Exception e){
             logger.error("一键群发失败-插入观看记录失败:"+e.getMessage());
         }
@@ -2154,4 +2157,20 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 videoDuration/60, config.getMinutesNum()));
     }
 
+
+    @Override
+    public R updateVideo() {
+        FsUserCourseVideo param = new FsUserCourseVideo();
+        param.setCourseId(144L);
+        List<FsUserCourseVideo> videos = selectFsUserCourseVideoListByCourseId(param);
+        for (FsUserCourseVideo courseVideo :  videos){
+            FsVideoResource resource = fsVideoResourceMapper.selectByFileKey(courseVideo.getFileKey());
+            if (resource==null){
+                continue;
+            }
+            courseVideo.setLineOne(resource.getLine1());
+            fsUserCourseVideoMapper.updateFsUserCourseVideo(courseVideo);
+        }
+        return R.ok();
+    }
 }

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

@@ -21,4 +21,7 @@ public class ErpGoods {
     List<ErpCombineItem> combine_item;
     //hzOMSErp 使用 商品id
     Long storeProductId;
+
+    //适用多商品批量上传
+    List<Long> productIdList;
 }

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

@@ -55,4 +55,14 @@ public class OrderItemDTO implements Serializable {
      * 生产日期
      */
     private String producedDate;
+
+    /**
+     * 商品属性
+     * **/
+    private String propertiesValue;
+
+    /**
+     * 款式编码
+     * **/
+    private String shopIId;
 }

+ 2 - 1
fs-service/src/main/java/com/fs/erp/http/JstErpHttpService.java

@@ -1,5 +1,6 @@
 package com.fs.erp.http;
 
+import com.alibaba.fastjson.JSONObject;
 import com.fs.erp.dto.*;
 import com.fs.ybPay.dto.RefundOrderDTO;
 
@@ -32,7 +33,7 @@ public interface JstErpHttpService {
      * @param dto 请求参数
      * @return ProductUploadResultDTO
      */
-    ProductUploadResultDTO uploadGoods(GoodsInfoDTO dto);
+    ProductUploadResultDTO uploadGoods(JSONObject dto);
 
     /**
      * 普通商品资料查询(按sku查询)

+ 14 - 1
fs-service/src/main/java/com/fs/erp/http/JstErpHttpServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.map.MapUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.PropertyNamingStrategy;
 import com.alibaba.fastjson.TypeReference;
 import com.alibaba.fastjson.serializer.SerializeConfig;
@@ -27,6 +28,7 @@ import java.util.Map;
 @Service
 public class JstErpHttpServiceImpl implements JstErpHttpService {
 
+    //正式
     private static final String BASE_URL = "https://openapi.jushuitan.com/";
     /**
      * 获取access_token、refresh_token url
@@ -38,6 +40,17 @@ public class JstErpHttpServiceImpl implements JstErpHttpService {
      */
     private static final String REFRESH_TOKEN_URL = BASE_URL + "openWeb/auth/refreshToken";
 
+    //测试
+//    private static final String BASE_URL = "https://dev-api.jushuitan.com/";
+//    /**
+//     * 获取access_token、refresh_token url
+//     */
+//    private static final String GET_INIT_TOKEN_URL = BASE_URL + "openWebIsv/auth/getInitToken";
+//
+//    /**
+//     * 更新access_token、refresh_token url
+//     */
+//    private static final String REFRESH_TOKEN_URL = BASE_URL + "openWebIsv/auth/refreshToken;
 
     @Value("${jst.app_key:''}")
     private String appKey;
@@ -68,7 +81,7 @@ public class JstErpHttpServiceImpl implements JstErpHttpService {
     }
 
     @Override
-    public ProductUploadResultDTO uploadGoods(GoodsInfoDTO dto) {
+    public ProductUploadResultDTO uploadGoods(JSONObject dto) {
         String url = BASE_URL + "/open/jushuitan/itemsku/upload";
         log.info("上传商品信息 - URL: {}, 请求体: {}", url, JSON.toJSONString(dto));
 

+ 36 - 7
fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java

@@ -155,7 +155,7 @@ public class DfOrderServiceImpl implements IErpOrderService
                         if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
                             dfApiResponse.setCode(mailNumber);
                             Object result = dfApiResponse.getResult();
-                            String jsonStr = JSONUtil.toJsonStr(result);
+                            String jsonStr = JSON.toJSONString(JSON.parseObject(JSONUtil.toJsonStr(result), HashMap.class).get("list"));
                             List<ErpDeliverys> dfDeliveryResponse = null;
                             try {
                                 dfDeliveryResponse = JSON.parseArray(jsonStr, ErpDeliverys.class);
@@ -264,10 +264,11 @@ public class DfOrderServiceImpl implements IErpOrderService
             //3.处理请求结果
             if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
                 String jsonString = JSON.toJSONString(dfApiResponse.getResult());
-                List<DFOrderStatusResultRequest> requestList = JSON.parseArray(jsonString, DFOrderStatusResultRequest.class);
-                if (requestList != null && !requestList.isEmpty()){
+//                List<DFOrderStatusResultRequest> requestList = JSON.parseArray(jsonString, DFOrderStatusResultRequest.class);
+                DFOrderStatusResultRequest temp = JSON.parseObject(jsonString, DFOrderStatusResultRequest.class);
+//                if (requestList != null && !requestList.isEmpty()){
                     //0待揽收 1已揽收 2运输中 3派送中 4异常件 5退回件 6退回签收 7转寄件 8作废件 9已签收 10 已取消
-                    for (DFOrderStatusResultRequest temp : requestList) {
+//                    for (DFOrderStatusResultRequest temp : requestList) {
                         if (temp.getStatus() == 10){
                             //取消订单
                             String mailNumber = temp.getMailNumber();
@@ -287,10 +288,13 @@ public class DfOrderServiceImpl implements IErpOrderService
                                     log.info("代服管家 订单取消成功: {}", response);
                                 });
                             }
+                        } else if (temp.getStatus() == 9){
+                            //已签收
+                            fsStoreOrderService.getGoods(order.getOrderId());
                         }
                     }
-                }
-            }
+//                }
+//            }
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -533,7 +537,17 @@ public class DfOrderServiceImpl implements IErpOrderService
                         //下单结果
                         BspOrderResponseWrapper bspOrderResponse = JSONUtil.toBean(jsonString, BspOrderResponseWrapper.class);
                         if (bspOrderResponse != null) {
-                            setExpress(bspOrderResponse);
+                            String failMsg = bspOrderResponse.getFailMsg();
+                            if (StringUtils.isNotBlank(failMsg)) {
+                                if (failMsg.equals("暂未结果, 请稍后再查")){
+                                    return;
+                                }
+                                //下单失败 返回未推送状态
+                                String  orderNumber = bspOrderResponse.getOrderNumber();
+                                rollBackOrder(orderNumber,failMsg);
+                            } else {
+                                setExpress(bspOrderResponse);
+                            }
                         }
                     } else if ("2".equals(status)) {
                         //取消订单
@@ -556,6 +570,21 @@ public class DfOrderServiceImpl implements IErpOrderService
         }
     }
 
+    private void rollBackOrder(String orderNumber,String failMsg) {
+        FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
+        FsStoreOrder tempOrder = new FsStoreOrder();
+        tempOrder.setOrderId(fsStoreOrder.getOrderId());
+        tempOrder.setExtendOrderId("");
+        fsStoreOrderMapper.updateFsStoreOrder(tempOrder);
+        FsStoreOrderDf df = new FsStoreOrderDf();
+        df.setOrderId(fsStoreOrder.getOrderId());
+        df.setStatus(0); //回到默认
+        df.setFailMsg(failMsg); //失败消息
+        df.setUpdateTime(new Date());
+        fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+        //推送失败消息
+    }
+
     /**
      * 顺丰会有自己的轨迹推送 不使用快递鸟(代服务管家设置推送地址)
      *

+ 75 - 1
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java

@@ -1,22 +1,54 @@
 package com.fs.erp.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fs.common.utils.StringUtils;
 import com.fs.erp.domain.ErpGoods;
 import com.fs.erp.dto.*;
 import com.fs.erp.http.JstErpHttpService;
 import com.fs.erp.service.IErpGoodsService;
+import com.fs.his.domain.FsStoreProduct;
+import com.fs.his.domain.FsStoreProductAttrValue;
+import com.fs.his.service.IFsStoreProductAttrValueService;
+import com.fs.his.service.IFsStoreProductService;
+import com.fs.voice.utils.StringUtil;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
 
 @Service("JSTErpGoodsServiceImpl")
 public class JSTErpGoodsServiceImpl implements IErpGoodsService {
     @Autowired
     private JstErpHttpService jstErpHttpService;
+
+    @Autowired
+    private IFsStoreProductService fsStoreProductService;
+
+    @Autowired
+    private IFsStoreProductAttrValueService fsStoreProductAttrValueService;
+
+    // 每次最大处理数量
+    private static final int BATCH_SIZE = 190;
+
     @Override
     public BaseResponse addGoods(ErpGoods goods) {
+        List<Long> storeProductIds = goods.getProductIdList();
+        JSONArray bulidJSONArray = buildGoods(storeProductIds);
+
+        //调用接口
+        for (int i = 0; i < bulidJSONArray.size(); i += BATCH_SIZE) {
+            JSONObject request=new JSONObject();
+            int end = Math.min(i + BATCH_SIZE, bulidJSONArray.size());
+            request.put("items",bulidJSONArray.subList(i, end));
+            jstErpHttpService.uploadGoods(request);
+        }
+
         return null;
     }
 
@@ -27,7 +59,7 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
         ProductResponseDTO productResponseDTO = jstErpHttpService.queryGoods(requestDTO);
         List<ProductResponseDTO.ProductInfo> datas = productResponseDTO.getDatas();
         ErpGoodsQueryResponse erpGoodsQueryResponse = new ErpGoodsQueryResponse();
-        if(CollectionUtils.isNotEmpty(datas)){
+        if (CollectionUtils.isNotEmpty(datas)) {
             List<ErpGoods> erpGoodsList = new ArrayList<>();
             for (ProductResponseDTO.ProductInfo data : datas) {
                 ErpGoods erpGoods = new ErpGoods();
@@ -49,4 +81,46 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
     public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
         return null;
     }
+
+    /**
+     * 构建店铺商品上传的参数
+     *
+     * @param storeProductIds
+     * @return
+     */
+    public JSONArray buildGoods(List<Long> storeProductIds) {
+        JSONArray res = new JSONArray();
+        //商品
+        List<FsStoreProduct> fsStoreProductList = fsStoreProductService.getStoreProductInProductIds(storeProductIds);
+        if (!fsStoreProductList.isEmpty()) {
+
+            Map<Long, FsStoreProduct> productMap = fsStoreProductList.stream().collect(Collectors.toMap(FsStoreProduct::getProductId, p -> p));
+            //商品规格List
+            List<FsStoreProductAttrValue> fsStoreProductAttrValues = fsStoreProductAttrValueService.getFsStoreProductAttrValueListInProductId(storeProductIds);
+
+            //按规格构建商品数据
+            fsStoreProductAttrValues.forEach(v -> {
+                JSONObject productJson = new JSONObject();
+                FsStoreProduct product = productMap.get(v.getProductId());
+                productJson.put("sku_id", v.getBarCode());//商品编码
+                productJson.put("i_id", v.getBarCode());//如果没有款式默认商品编码一致
+                productJson.put("name", v.getSku());//名称
+                productJson.put("short_name", product.getKeyword());//简称
+                if(StringUtils.isNotEmpty(product.getBrand())){
+                    productJson.put("brand", product.getBrand());//品牌
+                }
+                productJson.put("weight", v.getWeight());//重量
+                productJson.put("s_price",v.getPrice());//基本售价
+                productJson.put("c_price", v.getCost());//成本
+                productJson.put("market_price", v.getOtPrice());//市场|吊牌价
+                productJson.put("unit", product.getUnitName());//单位
+                productJson.put("sku_pic", v.getImage());//商品图片
+                productJson.put("pic", v.getImage());//图片地址(款图片)
+                productJson.put("pic_big", v.getImage());//大图地址
+                res.add(productJson);
+            });
+        }
+
+        return res;
+    }
 }

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

@@ -135,10 +135,13 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
 
             String barCode = jsonObject.getString("barCode");
             String productName = jsonObject.getString("productName");
+            String sku=jsonObject.getString("sku");
 
             orderItemDTO.setSkuId(barCode);
             orderItemDTO.setShopSkuId(barCode);
             orderItemDTO.setName(productName);
+            orderItemDTO.setShopIId(orderItemDTO.getSkuId());//款式编码ID,当前没有这个目前就与SKU ID一致
+            orderItemDTO.setPropertiesValue(sku);//商品属性
 
             FsStoreProduct fsStoreProduct = fsStoreProductService.selectFsStoreProductById(item.getProductId());
 

+ 22 - 2
fs-service/src/main/java/com/fs/erp/service/impl/JstTokenService.java

@@ -6,6 +6,8 @@ import com.fs.erp.dto.GetInitTokenResponseDTO;
 import com.fs.erp.dto.RefreshTokenRequestDTO;
 import com.fs.erp.http.JstErpHttpService;
 import com.fs.erp.utils.SignUtil;
+import com.fs.his.config.FsSysConfig;
+import com.fs.his.utils.ConfigUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -40,6 +42,9 @@ public class JstTokenService {
     @Autowired
     private StringRedisTemplate redisTemplate;
 
+    @Autowired
+    private ConfigUtil configUtil;
+
     /**
      * 获取访问令牌,如果缓存中存在有效令牌则直接返回,否则重新获取
      * @return 有效的访问令牌
@@ -159,14 +164,29 @@ public class JstTokenService {
     }
 
     /**
-     * 定时任务,每20天刷新一次令牌
+     * 定时任务,每28天凌晨3点刷新一次令牌
      * 根据文档说明,刷新token必须在有效期小于15天时进行,所以这里设置20天刷新一次
      */
 //    @Scheduled(fixedRate = 20 * 24 * 60 * 60 * 1000)
+    @Scheduled(cron = "0 0 3 */28 * ?")
     public void scheduleTokenRefresh() {
         log.info("定时任务:刷新聚水潭API令牌");
         try {
-            refreshAccessToken();
+            //判断是否开启erp
+            FsSysConfig sysConfig = configUtil.getSysConfig();
+            Integer erpOpen = sysConfig.getErpOpen();
+            if (erpOpen == null || erpOpen == 0) {
+                return;
+            }
+
+            //判断erp类型
+            Integer erpType = sysConfig.getErpType();
+            if (erpType == null) {
+                return;
+            } else if (erpType == 5){
+                //聚水潭
+                refreshAccessToken();
+            }
         } catch (Exception e) {
             log.error("定时刷新令牌失败", e);
         }

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

@@ -3,8 +3,10 @@ package com.fs.fastGpt.service.impl;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.annotation.Excel;
+import com.fs.common.config.FSConfig;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.config.ai.AiHostProper;
 import com.fs.course.domain.FsUserCourseVideo;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
@@ -123,6 +125,9 @@ public class AiHookServiceImpl implements AiHookService {
     @Autowired
     WxWorkService wxWorkService;
 
+    @Autowired
+    AiHostProper aiHostProper;
+
 //    @Autowired
 //    private IFastGptKeywordSendService fastGptKeywordSendService;
 
@@ -406,7 +411,7 @@ public class AiHookServiceImpl implements AiHookService {
             //存聊天记录
             addSaveAiMsg(2,2,contentKh,user,fastGptChatSession.getSessionId(),role.getRoleId(),qwExternalContacts,fastGptChatSession.getUserId(),result.getUsage().prompt_tokens,result.getUsage().completion_tokens,token);
             Integer replyOne = redisCache.getCacheObject("reply:" + fastGptChatSession.getSessionId());
-            if (replyOne == 1){
+            if (replyOne!=null && replyOne == 1){
                 QwUser qwUser = qwUserService.selectQwUserById(fastGptChatSession.getQwUserId());
                 if (ObjectUtils.isNotEmpty(qwUser)&&ObjectUtils.isNotEmpty(qwUser.getIpadStatus())&&qwUser.getIpadStatus() == 1){
                     addQwAutoTags(qwUser,qwExternalContacts.getUserId(),qwExternalContacts.getExternalUserId());
@@ -988,7 +993,7 @@ public class AiHookServiceImpl implements AiHookService {
             String msgC = (String)redisCache.getCacheObject("msg:" + fastGptChatSession.getSessionId());
             //添加关键词
             addPromptWord(messageList,msgC,qwExternalContactsId,role.getReminderWords(), role.getContactInfo(),fastGptChatSession.getSessionId());
-            R r = chatService.initiatingTakeChat(param,"http://154.8.194.176:3000/api",appKey);
+            R r = chatService.initiatingTakeChat(param, aiHostProper.getAiApi(), appKey);
             Integer reply2 = (Integer)redisCache.getCacheObject("reply:" + fastGptChatSession.getSessionId());
             //次数变动 重新等待5秒
             if (reply2!=i){

+ 5 - 1
fs-service/src/main/java/com/fs/fastGpt/service/impl/AiNewServiceImpl.java

@@ -3,8 +3,10 @@ package com.fs.fastGpt.service.impl;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.annotation.Excel;
+import com.fs.common.config.FSConfig;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.config.ai.AiHostProper;
 import com.fs.course.domain.FsUserCourseVideo;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
@@ -102,6 +104,8 @@ public class AiNewServiceImpl implements AiNewService {
     private FastGptChatReplaceWordsMapper fastGptChatReplaceWordsMapper;
     @Autowired
     RedisTemplate<String, String> redisTemplate;
+    @Autowired
+    private AiHostProper aiHostProper;
 
 
     /** Ai半小时未回复提醒 **/
@@ -623,7 +627,7 @@ public class AiNewServiceImpl implements AiNewService {
             String msgC = (String)redisCache.getCacheObject("msg:" + fastGptChatSession.getSessionId());
             //添加关键词
             addPromptWord(messageList,msgC,qwExternalContactsId,role.getReminderWords(), role.getContactInfo(),fastGptChatSession.getSessionId());
-            R r = chatService.initiatingTakeChat(param,"http://154.8.194.176:3000/api",appKey);
+            R r = chatService.initiatingTakeChat(param, aiHostProper.getAiApi(),appKey);
             Integer reply2 = (Integer)redisCache.getCacheObject("reply:" + fastGptChatSession.getSessionId());
             //次数变动 重新等待5秒
             if (reply2!=i){

+ 6 - 1
fs-service/src/main/java/com/fs/fastGpt/service/impl/AiServiceImpl.java

@@ -3,8 +3,10 @@ package com.fs.fastGpt.service.impl;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.annotation.Excel;
+import com.fs.common.config.FSConfig;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.config.ai.AiHostProper;
 import com.fs.course.domain.FsUserCourseVideo;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
@@ -97,6 +99,9 @@ public class AiServiceImpl implements AiService {
     @Autowired
     RedisTemplate<String, String> redisTemplate;
 
+    @Autowired
+    AiHostProper aiHostProper;
+
 
     /** Ai半小时未回复提醒 **/
     @Override
@@ -600,7 +605,7 @@ public class AiServiceImpl implements AiService {
             String msgC = (String)redisCache.getCacheObject("msg:" + fastGptChatSession.getSessionId());
             //添加关键词
             addPromptWord(messageList,msgC,qwExternalContactsId,role.getReminderWords(), role.getContactInfo(),fastGptChatSession.getSessionId());
-            R r = chatService.initiatingTakeChat(param,"http://154.8.194.176:3000/api",appKey);
+            R r = chatService.initiatingTakeChat(param, aiHostProper.getAiApi(),appKey);
             Integer reply2 = (Integer)redisCache.getCacheObject("reply:" + fastGptChatSession.getSessionId());
             //次数变动 重新等待5秒
             if (reply2!=i){

+ 20 - 0
fs-service/src/main/java/com/fs/his/domain/FsIntegralOrder.java

@@ -79,4 +79,24 @@ public class FsIntegralOrder extends BaseEntity
     private Date deliveryTime;
 
 
+    /**
+     * 企业微信ID
+     * **/
+    @Excel(name = "企业微信ID")
+    private Long qwUserId;
+
+    /**
+     * 销售ID
+     * **/
+    @Excel(name = "销售ID")
+    private Long companyUserId;
+
+    /**
+     * 销售公司ID
+     * **/
+    @Excel(name = "销售公司ID")
+    private Long companyId;
+
+
+
 }

+ 32 - 0
fs-service/src/main/java/com/fs/his/domain/FsPhysicalReportTemplate.java

@@ -0,0 +1,32 @@
+package com.fs.his.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 体检报告模板对象 fs_physical_report_template
+ *
+ * @author fs
+ * @date 2025-07-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsPhysicalReportTemplate extends BaseEntity{
+
+    /** 体检模板ID */
+    @Excel(name = "模板编码")
+    private Long id;
+
+    /** 体检模板名称 */
+    @Excel(name = "模板名称")
+    private String templateName;
+
+    /** 状态(0未启用、1启用) */
+    @Excel(name = "状态", readConverterExp = "0=未启用、1启用")
+    private String status;
+
+
+}

+ 72 - 0
fs-service/src/main/java/com/fs/his/domain/FsPhysicalReportTemplateField.java

@@ -0,0 +1,72 @@
+package com.fs.his.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 体检报告模板字段对象 fs_physical_report_template_field
+ *
+ * @author fs
+ * @date 2025-07-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsPhysicalReportTemplateField extends BaseEntity{
+
+    /** 字段id */
+    private String id;
+
+    /** 模板ID */
+    @Excel(name = "模板ID")
+    private Long templateId;
+
+    /** 组件ID,后续可联动组件 */
+    @Excel(name = "组件ID,后续可联动组件")
+    private Long componentId;
+
+    /** 字段组件名称 */
+    @Excel(name = "字段组件名称")
+    private String label;
+
+    /** 字段类型 */
+    @Excel(name = "字段类型")
+    private String type;
+
+    /** 排序 */
+    @Excel(name = "排序")
+    private Integer sort;
+
+    /** 是否必填0否1是 */
+    @Excel(name = "是否必填0否1是")
+    private Integer required;
+
+    /** 是否多选0否1是 */
+    @Excel(name = "是否多选0否1是")
+    private Integer multiple;
+
+    /** 多选下来数据 */
+    @Excel(name = "多选下来数据")
+    private String multiples;
+
+    /** 输入框最大长度 */
+    @Excel(name = "输入框最大长度")
+    private Long maxLength;
+
+    /** 输入框最小长度 */
+    @Excel(name = "输入框最小长度")
+    private Long minLength;
+
+    /** 状态(1未启用、2启用) */
+    @Excel(name = "状态", readConverterExp = "1=未启用、2启用")
+    private Long status;
+
+    /**
+     * 下拉多选,复选框多选值
+     * **/
+    private String options;
+
+
+}

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

@@ -54,5 +54,8 @@ public class FsStoreOrderDf extends BaseEntity{
     @Excel(name = "0:默认 1下单 2取消订单")
     private Integer status;
 
+    /** 失败原因 */
+    private String failMsg;
+
 
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/domain/FsStoreProduct.java

@@ -229,6 +229,10 @@ public class FsStoreProduct extends BaseEntity {
     @Excel(name = "是否在商品展示")
     private Integer isDisplay;
 
+    /** 品牌 */
+    @Excel(name = "品牌")
+    private String brand;
+
     /**
      * 运费模板
      */

+ 19 - 0
fs-service/src/main/java/com/fs/his/dto/FsPhysicalReportTemplateFieldDTO.java

@@ -0,0 +1,19 @@
+package com.fs.his.dto;
+
+import com.fs.his.domain.FsPhysicalReportTemplateField;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class FsPhysicalReportTemplateFieldDTO implements Serializable {
+    //模板ID
+    private Long templateId;
+
+    //自定义字段类型
+    private List<FsPhysicalReportTemplateField> templateFieldList;
+
+    //创建人
+    private String createBy;
+}

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

@@ -102,19 +102,25 @@ public interface FsInquiryOrderReportMapper
 
     @Select("select ior.*,u.nick_name,u.phone,d.doctor_name,su.nick_name user_name,send.nick_name send_name,fio.status inquiry_status,fio. inquiry_sub_type,fio.company_user_remark FROM fs_inquiry_order_report ior  LEFT JOIN fs_user u ON u.user_id=ior.user_id LEFT JOIN fs_doctor d ON d.doctor_id=ior.doctor_id LEFT JOIN sys_user su ON su.user_id=ior.audit_user_id LEFT JOIN fs_inquiry_order fio ON fio.order_id=ior.order_id LEFT JOIN fs_user_coupon fuc ON fuc.business_type =1 AND fuc.business_id=ior.order_id LEFT JOIN sys_user send ON send.user_id=fuc.send_user_id  where ior.report_id=#{reportId}")
     FsInquiryOrderReportVO selectFsInquiryOrderReportByReportIdVO(Long reportId);
+
     @Select("select report_id FROM fs_inquiry_order_report WHERE order_id=#{id}")
     Integer selectFsInquiryOrderReportIdByOrderId(Long id);
+
     @Select("select * FROM fs_inquiry_order_report   where order_id=#{orderId}")
     FsInquiryOrderReport selectFsInquiryOrderReportByOrderId(Long orderId);
+
     @Select("select o.*,d.dept_id FROM fs_inquiry_order_report o  LEFT JOIN fs_doctor d ON d.doctor_id=o.doctor_id   where o.order_id=#{orderId}")
     FsInquiryOrderReportUVO selectFsInquiryOrderReportUVOByOrderId(Long orderId);
+
     @Select("select item_type_json FROM fs_test_temp WHERE temp_code ='C1694077002122'")
     String selectFsTestBody();
 
     @Select("select * from fs_inquiry_order_report where patient_json LIKE '%https://htj-1258038825.cos.ap-beijing.myqcloud.com%' order by report_id desc limit 2 ")
     List<FsInquiryOrderReport> selectFsInquiryOrderReportListByUpdate();
+
     @Select("select ior.*,u.nick_name,u.phone,d.doctor_name,su.nick_name user_name,send.nick_name send_name,fio.status inquiry_status,fio. inquiry_sub_type,fio.company_user_remark FROM fs_inquiry_order_report ior  LEFT JOIN fs_user u ON u.user_id=ior.user_id LEFT JOIN fs_doctor d ON d.doctor_id=ior.doctor_id LEFT JOIN sys_user su ON su.user_id=ior.audit_user_id LEFT JOIN fs_inquiry_order fio ON fio.order_id=ior.order_id LEFT JOIN fs_user_coupon fuc ON fuc.business_type =1 AND fuc.business_id=ior.order_id LEFT JOIN sys_user send ON send.user_id=fuc.send_user_id  where ior.order_id=#{orderId} limit 1")
     FsInquiryOrderReportVO selectFsInquiryOrderReportByOrderIdVO(Long orderId);
+
     @Select({"<script> " +
             "select count(1) FROM fs_inquiry_order_report ior  " +
             " LEFT JOIN fs_user u ON u.user_id=ior.user_id " +

+ 75 - 0
fs-service/src/main/java/com/fs/his/mapper/FsPhysicalReportTemplateFieldMapper.java

@@ -0,0 +1,75 @@
+package com.fs.his.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsPhysicalReportTemplateField;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 体检报告模板字段Mapper接口
+ *
+ * @author fs
+ * @date 2025-07-24
+ */
+public interface FsPhysicalReportTemplateFieldMapper extends BaseMapper<FsPhysicalReportTemplateField> {
+    /**
+     * 查询体检报告模板字段
+     *
+     * @param id 体检报告模板字段主键
+     * @return 体检报告模板字段
+     */
+    FsPhysicalReportTemplateField selectFsPhysicalReportTemplateFieldById(String id);
+
+    /**
+     * 查询体检报告模板字段列表
+     *
+     * @param fsPhysicalReportTemplateField 体检报告模板字段
+     * @return 体检报告模板字段集合
+     */
+    List<FsPhysicalReportTemplateField> selectFsPhysicalReportTemplateFieldList(FsPhysicalReportTemplateField fsPhysicalReportTemplateField);
+
+    /**
+     * 新增体检报告模板字段
+     *
+     * @param fsPhysicalReportTemplateField 体检报告模板字段
+     * @return 结果
+     */
+    int insertFsPhysicalReportTemplateField(FsPhysicalReportTemplateField fsPhysicalReportTemplateField);
+
+    /**
+     * 修改体检报告模板字段
+     *
+     * @param fsPhysicalReportTemplateField 体检报告模板字段
+     * @return 结果
+     */
+    int updateFsPhysicalReportTemplateField(FsPhysicalReportTemplateField fsPhysicalReportTemplateField);
+
+    /**
+     * 删除体检报告模板字段
+     *
+     * @param id 体检报告模板字段主键
+     * @return 结果
+     */
+    int deleteFsPhysicalReportTemplateFieldById(String id);
+
+    /**
+     * 批量删除体检报告模板字段
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsPhysicalReportTemplateFieldByIds(String[] ids);
+
+    /**
+     * 批量插入模板自定义字段
+     *
+     * @param templateFieldList 插入数据
+     **/
+    void batchInsertFsPhysicalReportTemplateField(@Param("templateFieldList") List<FsPhysicalReportTemplateField> templateFieldList);
+
+    /**
+     * 删除自定也模板
+     * **/
+    void deleteTemplateFieldByTemplateId(@Param("templateId") Long templateId);
+}

+ 61 - 0
fs-service/src/main/java/com/fs/his/mapper/FsPhysicalReportTemplateMapper.java

@@ -0,0 +1,61 @@
+package com.fs.his.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsPhysicalReportTemplate;
+
+/**
+ * 体检报告模板Mapper接口
+ * 
+ * @author fs
+ * @date 2025-07-23
+ */
+public interface FsPhysicalReportTemplateMapper extends BaseMapper<FsPhysicalReportTemplate>{
+    /**
+     * 查询体检报告模板
+     * 
+     * @param id 体检报告模板主键
+     * @return 体检报告模板
+     */
+    FsPhysicalReportTemplate selectFsPhysicalReportTemplateById(String id);
+
+    /**
+     * 查询体检报告模板列表
+     * 
+     * @param fsPhysicalReportTemplate 体检报告模板
+     * @return 体检报告模板集合
+     */
+    List<FsPhysicalReportTemplate> selectFsPhysicalReportTemplateList(FsPhysicalReportTemplate fsPhysicalReportTemplate);
+
+    /**
+     * 新增体检报告模板
+     * 
+     * @param fsPhysicalReportTemplate 体检报告模板
+     * @return 结果
+     */
+    int insertFsPhysicalReportTemplate(FsPhysicalReportTemplate fsPhysicalReportTemplate);
+
+    /**
+     * 修改体检报告模板
+     * 
+     * @param fsPhysicalReportTemplate 体检报告模板
+     * @return 结果
+     */
+    int updateFsPhysicalReportTemplate(FsPhysicalReportTemplate fsPhysicalReportTemplate);
+
+    /**
+     * 删除体检报告模板
+     * 
+     * @param id 体检报告模板主键
+     * @return 结果
+     */
+    int deleteFsPhysicalReportTemplateById(String id);
+
+    /**
+     * 批量删除体检报告模板
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsPhysicalReportTemplateByIds(String[] ids);
+}

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

@@ -1082,7 +1082,7 @@ public interface FsStoreOrderMapper
             "</script>"})
     Integer selectFsStoreOrderCountByType(@Param("companyId") Long companyId,@Param("userId") long userId, @Param("type")int type);
 
-    @Select("select * from fs_store_order where  `status`=2 and extend_order_id is not null ")
+    @Select("select * from fs_store_order where  `status`=2 and extend_order_id is not null and extend_order_id != '' ")
     List<FsStoreOrder> selectWdtOmsOrderdeliveryOp();
 
     int batchUpdateErpByOrderIds(@Param("maps") List<Map<String, String>> maps);
@@ -1097,4 +1097,6 @@ public interface FsStoreOrderMapper
 
     @Select("select * from fs_store_order where  `status`=3 and extend_order_id is not null and delivery_sn is not null")
     List<FsStoreOrder> selectShippedOrder();
+
+    List<FsStoreOrderListVO> selectFsStoreOrderListVOByErpAccount(@Param("maps") FsStoreOrderParam fsStoreOrder);
 }

+ 7 - 1
fs-service/src/main/java/com/fs/his/mapper/FsStoreProductAttrValueMapper.java

@@ -1,7 +1,6 @@
 package com.fs.his.mapper;
 
 
-import com.fs.his.domain.FsStoreProductAttr;
 import com.fs.his.domain.FsStoreProductAttrValue;
 import com.fs.his.param.FsStoreProductAttrValueListDParam;
 import com.fs.his.vo.FsStoreProductAttrValueListDVO;
@@ -164,4 +163,11 @@ public interface FsStoreProductAttrValueMapper
 
     @Select("select * from fs_store_product_attr_value where product_id = #{productId}")
     List<FsStoreProductAttrValue> selectFsStoreProductAttrValueListByProductId(@Param("productId") Long productId);
+
+    /**
+     * 批量获取商品规格
+     * @param productIds
+     * @return productIds
+     * **/
+    List<FsStoreProductAttrValue> getFsStoreProductAttrValueListInProductId(@Param("productIds") List<Long> productIds);
 }

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

@@ -259,4 +259,10 @@ public interface FsStoreProductMapper {
     int updateStoreProductStock(@Param("productId") Long productId, @Param("stock") Integer stock);
 
 
+    /**
+     * 批量获取商品信息
+     * @param productIds
+     * @return List<FsStoreProduct>
+     * **/
+    List<FsStoreProduct> getStoreProductInProductIds(@Param("productIds") List<Long> productIds);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/his/param/FsInquiryOrderCreateParam.java

@@ -18,6 +18,8 @@ public class FsInquiryOrderCreateParam implements Serializable {
 
     @NotEmpty(message = "病情描述不能为空")
     private String title;
+
+    private String companyUserRemark;
 //    @NotEmpty(message = "患病时长不能为空")
     private String duration;
 //    @NotEmpty(message = "是否就诊不能为空")
@@ -25,9 +27,12 @@ public class FsInquiryOrderCreateParam implements Serializable {
 
     @NotNull(message = "问诊类型不能为空")
     private Integer inquiryType;
+
     private Integer inquirySubType;
+
     @NotNull(message = "订单类型不能为空")
     private Integer orderType;
+
     private Long doctorId;
     private String reportImages;//检测报告
     private String tongueImages;//舌苔

+ 18 - 3
fs-service/src/main/java/com/fs/his/param/FsStoreOrderParam.java

@@ -8,6 +8,7 @@ import lombok.Data;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 @Data
 public class FsStoreOrderParam extends BaseEntity implements Serializable {
@@ -18,6 +19,8 @@ public class FsStoreOrderParam extends BaseEntity implements Serializable {
     private Long storeId;
     @Excel(name = "订单号")
     private String orderCode;
+    //多个订单号搜索
+    private List<String> orderCodes;
     /** 订单号 */
     @Excel(name = "订单号")
     private String subOrderCode;
@@ -77,7 +80,7 @@ public class FsStoreOrderParam extends BaseEntity implements Serializable {
     @Excel(name = "支付方式 1微信")
     private String payType;
 
-    /** 订单状态(-1 : 申请退款 -2 : 退货成功 1:待支付 2:待发货;3:待收货;4:待评价;5:已完成) */
+    /** 订单状态(-1 : 申请退款 -2 : 退货成功 1:待支付 2:待发货;3:待收货;4:待评价;5:已完成) 6(金牛代服待推送,请避开6)*/
     @Excel(name = "订单状态", readConverterExp = "-=1,:=,申=请退款,-=2,:=,退=货成功,1=:待支付,2=:待发货;3:待收货;4:待评价;5:已完成")
     private Integer status;
 
@@ -176,6 +179,7 @@ public class FsStoreOrderParam extends BaseEntity implements Serializable {
     @Excel(name = "订单类型")
     private Integer orderType;
     private Long companyId;
+    private List<Long> companyIds;
     private Long companyUserId;
 
     private Long userCouponId;
@@ -212,9 +216,9 @@ public class FsStoreOrderParam extends BaseEntity implements Serializable {
 
     private String qwSubject;
 //    @ApiModelProperty(value = "页码,默认为1")
-//    private Integer pageNum =1;
+    private Integer pageNum;
 //    @ApiModelProperty(value = "页大小,默认为10")
-//    private Integer pageSize = 10;
+    private Integer pageSize;
 
 
     private String packageSecondName;
@@ -228,4 +232,15 @@ public class FsStoreOrderParam extends BaseEntity implements Serializable {
     private String source;
 
     private Long taskId;//任务ID
+
+    //排序字段
+    private String sortField;
+    //排序规则
+    private String sortOrder;
+
+    //erp电话
+    private String erpPhoneNumber;
+
+    //erp账户
+    private String erpAccount;
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/param/FsStoreProductAddEditParam.java

@@ -156,6 +156,10 @@ public class FsStoreProductAddEditParam implements Serializable {
     @Excel(name = "运费模板")
     private Long tempId;
 
+    /** 品牌 */
+    @Excel(name = "品牌")
+    private String brand;
+
     //属性项目
     private List<ProductArrtDTO> items;
     //sku结果集

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

@@ -126,4 +126,6 @@ public interface IFsInquiryOrderService
     void exportData(FsInquiryOrderParam fsInquiryOrder);
 
     void exportFeedbackData(FsInquiryOrderParam fsInquiryOrder);
+
+    byte[] getWxaCodeInquiryOrderUnLimit(Long orderId);
 }

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

@@ -120,4 +120,6 @@ public interface IFsPackageOrderService
     FsPackage selectFsPackageByOrderId(Long packageOrderId);
 
     List<PackageOrderDTO> getNewOrder();
+
+
 }

+ 80 - 0
fs-service/src/main/java/com/fs/his/service/IFsPhysicalReportTemplateFieldService.java

@@ -0,0 +1,80 @@
+package com.fs.his.service;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.api.R;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsPhysicalReportTemplateField;
+import com.fs.his.dto.FsPhysicalReportTemplateFieldDTO;
+
+/**
+ * 体检报告模板字段Service接口
+ * 
+ * @author fs
+ * @date 2025-07-24
+ */
+public interface IFsPhysicalReportTemplateFieldService extends IService<FsPhysicalReportTemplateField>{
+    /**
+     * 查询体检报告模板字段
+     * 
+     * @param id 体检报告模板字段主键
+     * @return 体检报告模板字段
+     */
+    FsPhysicalReportTemplateField selectFsPhysicalReportTemplateFieldById(String id);
+
+    /**
+     * 查询体检报告模板字段列表
+     * 
+     * @param fsPhysicalReportTemplateField 体检报告模板字段
+     * @return 体检报告模板字段集合
+     */
+    List<FsPhysicalReportTemplateField> selectFsPhysicalReportTemplateFieldList(FsPhysicalReportTemplateField fsPhysicalReportTemplateField);
+
+    /**
+     * 新增体检报告模板字段
+     * 
+     * @param fsPhysicalReportTemplateField 体检报告模板字段
+     * @return 结果
+     */
+    int insertFsPhysicalReportTemplateField(FsPhysicalReportTemplateField fsPhysicalReportTemplateField);
+
+    /**
+     * 修改体检报告模板字段
+     * 
+     * @param fsPhysicalReportTemplateField 体检报告模板字段
+     * @return 结果
+     */
+    int updateFsPhysicalReportTemplateField(FsPhysicalReportTemplateField fsPhysicalReportTemplateField);
+
+    /**
+     * 批量删除体检报告模板字段
+     * 
+     * @param ids 需要删除的体检报告模板字段主键集合
+     * @return 结果
+     */
+    int deleteFsPhysicalReportTemplateFieldByIds(String[] ids);
+
+    /**
+     * 删除体检报告模板字段信息
+     * 
+     * @param id 体检报告模板字段主键
+     * @return 结果
+     */
+    int deleteFsPhysicalReportTemplateFieldById(String id);
+
+    /**
+     * 获取模板自定义字段
+     * @param templateId 模板ID
+     * @return R
+     * **/
+    R getTemplateField(String templateId);
+
+
+    /**
+     * 新增体检报告模板字段
+     *
+     * @param fieldDTO 体检报告模板字段
+     * @return 结果
+     */
+    int saveFsPhysicalReportTemplateField(FsPhysicalReportTemplateFieldDTO fieldDTO);
+}

+ 61 - 0
fs-service/src/main/java/com/fs/his/service/IFsPhysicalReportTemplateService.java

@@ -0,0 +1,61 @@
+package com.fs.his.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsPhysicalReportTemplate;
+
+/**
+ * 体检报告模板Service接口
+ * 
+ * @author fs
+ * @date 2025-07-23
+ */
+public interface IFsPhysicalReportTemplateService extends IService<FsPhysicalReportTemplate>{
+    /**
+     * 查询体检报告模板
+     * 
+     * @param id 体检报告模板主键
+     * @return 体检报告模板
+     */
+    FsPhysicalReportTemplate selectFsPhysicalReportTemplateById(String id);
+
+    /**
+     * 查询体检报告模板列表
+     * 
+     * @param fsPhysicalReportTemplate 体检报告模板
+     * @return 体检报告模板集合
+     */
+    List<FsPhysicalReportTemplate> selectFsPhysicalReportTemplateList(FsPhysicalReportTemplate fsPhysicalReportTemplate);
+
+    /**
+     * 新增体检报告模板
+     * 
+     * @param fsPhysicalReportTemplate 体检报告模板
+     * @return 结果
+     */
+    int insertFsPhysicalReportTemplate(FsPhysicalReportTemplate fsPhysicalReportTemplate);
+
+    /**
+     * 修改体检报告模板
+     * 
+     * @param fsPhysicalReportTemplate 体检报告模板
+     * @return 结果
+     */
+    int updateFsPhysicalReportTemplate(FsPhysicalReportTemplate fsPhysicalReportTemplate);
+
+    /**
+     * 批量删除体检报告模板
+     * 
+     * @param ids 需要删除的体检报告模板主键集合
+     * @return 结果
+     */
+    int deleteFsPhysicalReportTemplateByIds(String[] ids);
+
+    /**
+     * 删除体检报告模板信息
+     * 
+     * @param id 体检报告模板主键
+     * @return 结果
+     */
+    int deleteFsPhysicalReportTemplateById(String id);
+}

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

@@ -245,4 +245,6 @@ public interface IFsStoreOrderService
      * @return
      */
     R receiveWaybillPush(String body);
+
+    List<FsStoreOrderListVO> selectFsStoreOrderListVOByErpAccount(FsStoreOrderParam fsStoreOrder);
 }

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

@@ -68,4 +68,11 @@ public interface IFsStoreProductAttrValueService
     int updateStoreProductAttrValueStock(Long id , Integer stock);
 
     List<FsStoreProductAttrValue> selectFsStoreProductAttrValueListByProductId( Long productId);
+
+    /**
+     * 批量获取商品规格
+     * @param productIds
+     * @return productIds
+     * **/
+    List<FsStoreProductAttrValue> getFsStoreProductAttrValueListInProductId(List<Long> productIds);
 }

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

@@ -97,4 +97,11 @@ public interface IFsStoreProductService
     FsStoreProduct getStoreProductByProductIdAndStoreId(Long productId, Long storeId);
 
     int updateStoreProductStock(Long productId, Integer num);
+
+    /**
+     * 批量获取商品信息
+     * @param productIds
+     * @return List<FsStoreProduct>
+     * **/
+    List<FsStoreProduct> getStoreProductInProductIds(List<Long> productIds);
 }

+ 41 - 14
fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java

@@ -28,12 +28,15 @@ 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.*;
 import com.fs.his.enums.FsInquiryOrderStatusEnum;
 import com.fs.his.mapper.*;
 import com.fs.his.param.*;
 import com.fs.his.service.*;
+import com.fs.his.utils.ConfigUtil;
+import com.fs.his.utils.HttpUtil;
 import com.fs.his.vo.*;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
@@ -60,6 +63,7 @@ import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
+import com.google.common.reflect.TypeToken;
 import com.google.gson.Gson;
 import lombok.Synchronized;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
@@ -165,7 +169,8 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
     private IFsUserCouponService userCouponService;
     @Autowired
     private IFsCouponService couponService;
-
+    @Autowired
+    private ConfigUtil configUtil;
     /**
      * 查询问诊订单
      *
@@ -527,7 +532,6 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         fsInquiryOrderLogsService.insertFsInquiryOrderLogs(log);
         return R.ok("操作成功");
     }
-
     @Override
     @Transactional
     public R createOrder(FsInquiryOrderCreateParam param) {
@@ -588,6 +592,7 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         order.setUserId(param.getUserId());
         order.setPatientId(patient.getPatientId());
         order.setInquirySubType(param.getInquirySubType());
+        order.setCompanyUserRemark(param.getCompanyUserRemark());
         if (param.getSource()!=null){
             order.setSource(param.getSource());
         }
@@ -810,18 +815,18 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
                 String redisKey = String.valueOf(StrUtil.format("{}{}", FsConstants.REDIS_INQUIRY_ORDER_OUTTIME_UNRECEIVE, order.getOrderId()));
                 redisCache.setCacheObject(redisKey,order.getOrderId(),configDTO.getUnReceiveCancelTime(), TimeUnit.MINUTES);
             }
-            try {
-                new Thread(() -> {
-                    try {
-                        rocketMQTemplate.syncSend("repeat-upload", JSON.toJSONString(RepeatUploadVo.builder().type(2).fsUserId(order.getUserId()).build()));
-                    }catch (Exception e){
-                        logger.error("看课重粉提交mq失败", e);
-                    }
-                }).start();
-
-            }catch (Exception e){
-                logger.error("看课重粉提交mq失败", e);
-            }
+//            try {
+//                new Thread(() -> {
+//                    try {
+//                        rocketMQTemplate.syncSend("repeat-upload", JSON.toJSONString(RepeatUploadVo.builder().type(2).fsUserId(order.getUserId()).build()));
+//                    }catch (Exception e){
+//                        logger.error("看课重粉提交mq失败", e);
+//                    }
+//                }).start();
+//
+//            }catch (Exception e){
+//                logger.error("看课重粉提交mq失败", e);
+//            }
 
 
             return R.ok();
@@ -1766,4 +1771,26 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         task.setFileUrl(result.get("msg").toString());
         fsExportTaskMapper.updateFsExportTask(task);
     }
+
+    @Override
+    public byte[] getWxaCodeInquiryOrderUnLimit(Long orderId) {
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        String url="https://api.weixin.qq.com/cgi-bin/stable_token";
+        HashMap<String, String> map = new HashMap<>();
+        map.put("grant_type","client_credential");
+        map.put("appid",sysConfig.getAppid());
+        map.put("secret",sysConfig.getSecret());
+
+
+        String accessToken = HttpUtil.endApi(url, null, map);
+        Map<String, String> accessTokenMap  = new Gson().fromJson(accessToken, new TypeToken<Map<String, Object>>(){}.getType());
+        String codeUrl="https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessTokenMap.get("access_token");
+        HashMap<String, String> jsonMap = new HashMap<>();
+        jsonMap.put("page","pages_order/inquiryPay");
+        jsonMap.put("scene","orderId="+ orderId);
+        //正式版为 "release",体验版为 "trial",开发版为 "develop"
+        jsonMap.put("env_version","release");
+        byte[] bytes = HttpUtil.getWechatQrcodeByHttpURL(codeUrl, jsonMap);
+        return bytes;
+    }
 }

+ 0 - 16
fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java

@@ -726,23 +726,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
             u.setIsBuy(1);
             fsUserService.updateFsUser(u);
         }
-        //新用户首次下单公域成功
-//        if (order.getCompanyUserId()==null){
-//            fsUserNewTaskService.performTaskThree(fsUser.getUserId(),fsUser.getIntegral(),order.getOrderId());
-//        }
         return R.ok();
-//        }catch (Exception e){
-//            logger.info("台州银行支付错误:"+e.getMessage());
-//            TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
-//            FsStorePaymentError err = new FsStorePaymentError();
-//            err.setOrderNo(orderSn);
-//            err.setOrderFlowNo(tradeNo);
-//            err.setStatus(0);
-//            err.setMsg(e.getMessage());
-//            err.setCreateTime(DateUtils.getNowDate());
-//            fsStorePaymentErrorMapper.insertFsStorePaymentError(err);
-//            return R.error();
-//        }
     }
 
     @Override

+ 153 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsPhysicalReportTemplateFieldServiceImpl.java

@@ -0,0 +1,153 @@
+package com.fs.his.service.impl;
+
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.api.R;
+import com.fs.common.exception.ServiceException;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.StringUtils;
+import com.fs.his.domain.FsPhysicalReportTemplate;
+import com.fs.his.dto.FsPhysicalReportTemplateFieldDTO;
+import com.fs.his.mapper.FsPhysicalReportTemplateMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.his.mapper.FsPhysicalReportTemplateFieldMapper;
+import com.fs.his.domain.FsPhysicalReportTemplateField;
+import com.fs.his.service.IFsPhysicalReportTemplateFieldService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 体检报告模板字段Service业务层处理
+ *
+ * @author fs
+ * @date 2025-07-24
+ */
+@Service
+public class FsPhysicalReportTemplateFieldServiceImpl extends ServiceImpl<FsPhysicalReportTemplateFieldMapper, FsPhysicalReportTemplateField> implements IFsPhysicalReportTemplateFieldService {
+
+    @Autowired
+    private FsPhysicalReportTemplateMapper physicalReportTemplateMapper;
+
+
+    /**
+     * 查询体检报告模板字段
+     *
+     * @param id 体检报告模板字段主键
+     * @return 体检报告模板字段
+     */
+    @Override
+    public FsPhysicalReportTemplateField selectFsPhysicalReportTemplateFieldById(String id) {
+        return baseMapper.selectFsPhysicalReportTemplateFieldById(id);
+    }
+
+    /**
+     * 查询体检报告模板字段列表
+     *
+     * @param fsPhysicalReportTemplateField 体检报告模板字段
+     * @return 体检报告模板字段
+     */
+    @Override
+    public List<FsPhysicalReportTemplateField> selectFsPhysicalReportTemplateFieldList(FsPhysicalReportTemplateField fsPhysicalReportTemplateField) {
+        return baseMapper.selectFsPhysicalReportTemplateFieldList(fsPhysicalReportTemplateField);
+    }
+
+    /**
+     * 新增体检报告模板字段
+     *
+     * @param fsPhysicalReportTemplateField 体检报告模板字段
+     * @return 结果
+     */
+    @Override
+    public int insertFsPhysicalReportTemplateField(FsPhysicalReportTemplateField fsPhysicalReportTemplateField) {
+        fsPhysicalReportTemplateField.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsPhysicalReportTemplateField(fsPhysicalReportTemplateField);
+    }
+
+    /**
+     * 修改体检报告模板字段
+     *
+     * @param fsPhysicalReportTemplateField 体检报告模板字段
+     * @return 结果
+     */
+    @Override
+    public int updateFsPhysicalReportTemplateField(FsPhysicalReportTemplateField fsPhysicalReportTemplateField) {
+        fsPhysicalReportTemplateField.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsPhysicalReportTemplateField(fsPhysicalReportTemplateField);
+    }
+
+    /**
+     * 批量删除体检报告模板字段
+     *
+     * @param ids 需要删除的体检报告模板字段主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsPhysicalReportTemplateFieldByIds(String[] ids) {
+        return baseMapper.deleteFsPhysicalReportTemplateFieldByIds(ids);
+    }
+
+    /**
+     * 删除体检报告模板字段信息
+     *
+     * @param id 体检报告模板字段主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsPhysicalReportTemplateFieldById(String id) {
+        return baseMapper.deleteFsPhysicalReportTemplateFieldById(id);
+    }
+
+    @Override
+    public R getTemplateField(String templateId) {
+        //查询模板信息是否存在
+        FsPhysicalReportTemplate reportTemplate = physicalReportTemplateMapper.selectById(templateId);
+        if (StringUtils.isNull(reportTemplate)) {
+            return R.failed("操作失败,模板信息不存在!");
+        } else if (!reportTemplate.getStatus().equals("1")) {
+            return R.failed("操作失败,当前模板已禁用!");
+        }
+
+        //查询模板下自定义数据信息
+        return R.ok(baseMapper.selectList(new LambdaQueryWrapper<FsPhysicalReportTemplateField>().eq(FsPhysicalReportTemplateField::getTemplateId, templateId).orderByAsc(FsPhysicalReportTemplateField::getSort)));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int saveFsPhysicalReportTemplateField(FsPhysicalReportTemplateFieldDTO fieldDTO) {
+        //查询模板信息是否存在
+        FsPhysicalReportTemplate reportTemplate = physicalReportTemplateMapper.selectById(fieldDTO.getTemplateId());
+        if (StringUtils.isNull(reportTemplate)) {
+            throw new ServiceException("操作失败,模板信息不存在!");
+        } else if (!reportTemplate.getStatus().equals("1")) {
+            throw new ServiceException("操作失败,当前模板已禁用!");
+        }
+
+        //验证数据主要数据是否存在
+        AtomicInteger num = new AtomicInteger();
+        Date date=new Date();
+        fieldDTO.getTemplateFieldList().forEach(t -> {
+            num.getAndIncrement();
+            if (StringUtils.isNull(t.getComponentId())) {
+                throw new ServiceException("操作失败,模板ID不能为空!");
+            } else if (StringUtils.isNull(t.getLabel())) {
+                throw new ServiceException("操作失败,组件名称不能为空!");
+            } else if (StringUtils.isNull(t.getType())) {
+                throw new ServiceException("操作失败,字段类型不能为空!");
+            }
+            t.setCreateBy(fieldDTO.getCreateBy());
+            t.setTemplateId(reportTemplate.getId());
+            t.setCreateTime(date);
+            t.setSort(num.get());
+        });
+
+        //删除相关数据
+        baseMapper.deleteTemplateFieldByTemplateId(reportTemplate.getId());
+        //批量插入
+        baseMapper.batchInsertFsPhysicalReportTemplateField(fieldDTO.getTemplateFieldList());
+        return 1;
+    }
+}

+ 125 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsPhysicalReportTemplateServiceImpl.java

@@ -0,0 +1,125 @@
+package com.fs.his.service.impl;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
+import com.fs.common.exception.ServiceException;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.StringUtils;
+import com.fs.huifuPay.sdk.opps.core.utils.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.his.mapper.FsPhysicalReportTemplateMapper;
+import com.fs.his.domain.FsPhysicalReportTemplate;
+import com.fs.his.service.IFsPhysicalReportTemplateService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 体检报告模板Service业务层处理
+ *
+ * @author fs
+ * @date 2025-07-23
+ */
+@Service
+public class FsPhysicalReportTemplateServiceImpl extends ServiceImpl<FsPhysicalReportTemplateMapper, FsPhysicalReportTemplate> implements IFsPhysicalReportTemplateService {
+
+    /**
+     * 查询体检报告模板
+     *
+     * @param id 体检报告模板主键
+     * @return 体检报告模板
+     */
+    @Override
+    public FsPhysicalReportTemplate selectFsPhysicalReportTemplateById(String id) {
+        return baseMapper.selectFsPhysicalReportTemplateById(id);
+    }
+
+    /**
+     * 查询体检报告模板列表
+     *
+     * @param fsPhysicalReportTemplate 体检报告模板
+     * @return 体检报告模板
+     */
+    @Override
+    public List<FsPhysicalReportTemplate> selectFsPhysicalReportTemplateList(FsPhysicalReportTemplate fsPhysicalReportTemplate) {
+        return baseMapper.selectFsPhysicalReportTemplateList(fsPhysicalReportTemplate);
+    }
+
+    /**
+     * 新增体检报告模板
+     *
+     * @param fsPhysicalReportTemplate 体检报告模板
+     * @return 结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int insertFsPhysicalReportTemplate(FsPhysicalReportTemplate fsPhysicalReportTemplate) {
+        //验证模板是否存在
+        if (baseMapper.selectCount(new LambdaQueryWrapper<FsPhysicalReportTemplate>().eq(FsPhysicalReportTemplate::getTemplateName, fsPhysicalReportTemplate.getTemplateName()).eq(FsPhysicalReportTemplate::getStatus, "1")) > 0) {
+            throw new ServiceException("操作失败,当前模板:" + fsPhysicalReportTemplate.getTemplateName() + "名称已存在!");
+        }
+
+        fsPhysicalReportTemplate.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsPhysicalReportTemplate(fsPhysicalReportTemplate);
+    }
+
+    /**
+     * 修改体检报告模板
+     *
+     * @param fsPhysicalReportTemplate 体检报告模板
+     * @return 结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int updateFsPhysicalReportTemplate(FsPhysicalReportTemplate fsPhysicalReportTemplate) {
+        //验证修改数据是否存在
+        FsPhysicalReportTemplate reportTemplate = baseMapper.selectById(fsPhysicalReportTemplate.getId());
+        if (StringUtils.isNull(reportTemplate)) {
+            throw new ServiceException("操作失败,修改数据不存在!");
+        }
+
+        //验证模板是否存在
+        if (baseMapper.selectCount(new LambdaQueryWrapper<FsPhysicalReportTemplate>().eq(FsPhysicalReportTemplate::getTemplateName, fsPhysicalReportTemplate.getTemplateName()).eq(FsPhysicalReportTemplate::getStatus, "1").ne(FsPhysicalReportTemplate::getId, fsPhysicalReportTemplate.getId())) > 0) {
+            throw new ServiceException("操作失败,当前模板:" + fsPhysicalReportTemplate.getTemplateName() + "名称已存在!");
+        }
+
+        fsPhysicalReportTemplate.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsPhysicalReportTemplate(fsPhysicalReportTemplate);
+    }
+
+    /**
+     * 批量删除体检报告模板
+     *
+     * @param ids 需要删除的体检报告模板主键
+     * @return 结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deleteFsPhysicalReportTemplateByIds(String[] ids) {
+        //验证删除数据是否存在启用数据
+        List<FsPhysicalReportTemplate> reportTemplateList = baseMapper.selectList(new LambdaQueryWrapper<FsPhysicalReportTemplate>().in(FsPhysicalReportTemplate::getId, ids));
+        if (reportTemplateList.isEmpty() || reportTemplateList.size() != ids.length) {
+            throw new ServiceException("操作失败,删除数据不匹配!");
+        }
+        //校验数据数据状态是否
+        String templateName = reportTemplateList.stream().filter(r -> r.getStatus().equals("1")).findFirst().map(FsPhysicalReportTemplate::getTemplateName).orElse(null);
+        if (StringUtils.isNotEmpty(templateName)) {
+            throw new ServiceException("操作失败,当前模板:" + templateName + "正在启用中,无法删除!");
+        }
+
+        return baseMapper.deleteFsPhysicalReportTemplateByIds(ids);
+    }
+
+    /**
+     * 删除体检报告模板信息
+     *
+     * @param id 体检报告模板主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsPhysicalReportTemplateById(String id) {
+        return baseMapper.deleteFsPhysicalReportTemplateById(id);
+    }
+}

+ 93 - 39
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java

@@ -1596,6 +1596,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             return;
         }
         IErpOrderService erpOrderService = null;
+        ErpOrder erpOrder = new ErpOrder();
+        erpOrder.setShop_code(sysConfig.getErpShopCode());
         if (erpType == 1) {
             //管易
             erpOrderService = gyOrderService;
@@ -1611,6 +1613,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         } else if (erpType == 5){
             //聚水潭
             erpOrderService =  jSTOrderService;
+            erpOrder.setShop_code(sysConfig.getErpJstShopCode());
         }else {
             return;
         }
@@ -1621,7 +1624,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         if (order == null) {
             return;
         }
-        ErpOrder erpOrder = new ErpOrder();
+
         if (order.getCompanyId() != null) {
             erpOrder.setVip_code(order.getUserId().toString() + order.getCompanyId().toString());
         } else {
@@ -1629,7 +1632,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         }
         erpOrder.setPlatform_code(order.getOrderCode());
 
-        erpOrder.setShop_code(sysConfig.getErpShopCode());
+        erpOrder.setBuyer_account(order.getUserName());
         erpOrder.setSeller_memo(order.getRemark());
         List<ErpOrderPayment> payments = new ArrayList<>();
         ErpOrderPayment payment = new ErpOrderPayment();
@@ -3176,38 +3179,60 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
 
         } else {
             BspOrderResponseWrapper addParam = JSON.parseObject(body, BspOrderResponseWrapper.class);
+            if (addParam == null) {
+                return R.ok("接收成功").put("code", "ok");
+            }
+            String failMsg = addParam.getFailMsg();
+            if (com.hc.openapi.tool.util.StringUtils.isNotBlank(failMsg)) {
+                if (failMsg.equals("暂未结果, 请稍后再查")){
+                    return R.ok("接收成功").put("code", "ok");
+                }
+                //下单失败 返回未推送状态
+                String  orderNumber = addParam.getOrderNumber();
+                FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
+                FsStoreOrder tempOrder = new FsStoreOrder();
+                tempOrder.setOrderId(fsStoreOrder.getOrderId());
+                tempOrder.setExtendOrderId("");
+                fsStoreOrderMapper.updateFsStoreOrder(tempOrder);
+                FsStoreOrderDf df = new FsStoreOrderDf();
+                df.setOrderId(fsStoreOrder.getOrderId());
+                df.setStatus(0); //回到默认
+                df.setFailMsg(failMsg); //失败消息
+                df.setUpdateTime(new Date());
+                fsStoreOrderDfMapper.updateFsStoreOrderDf(df);
+                //推送失败消息
+                return R.ok("接收成功").put("code", "ok");
+            }
             if (addParam.getBspResponse() != null) {
                 //更新物流
-                if (addParam != null) {
-                    log.info("代服管家创建订单回调,{}", JSON.toJSONString(addParam));
-                    List<OrderResponse> list = addParam.getBspResponse().getBody();
-                    if (list != null && !list.isEmpty()) {
-                        for (OrderResponse orderResponse : list) {
-                            List<RlsInfo> rlsInfos = orderResponse.getRlsInfo();
-                            String orderNumber = orderResponse.getOrderNumber();
-                            String mailNumber = orderResponse.getMailNumber();
-                            if (rlsInfos != null && rlsInfos.size() > 0) {
-                                RlsInfo rlsInfo = rlsInfos.get(0);
-                                List<RlsDetail> rlsDetails = rlsInfo.getRlsDetail();
-                                if (rlsDetails != null && !rlsDetails.isEmpty()) {
-                                    RlsDetail rlsDetail = rlsDetails.get(0);
-                                    String proName = rlsDetail.getProName();
-                                    if (com.hc.openapi.tool.util.StringUtils.isNotBlank(proName)) {
-                                        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
-                                        if (order != null && order.getStatus() == 2) {
-                                            order.setDeliverySn(mailNumber);
-                                            order.setDeliveryName(proName);
-                                            order.setDeliveryCode("SF");
-                                            order.setStatus(3);
-                                            order.setDeliverySendTime(DateUtils.getNowDate());
-                                            fsStoreOrderMapper.updateFsStoreOrder(order);
-                                            fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
-                                            if (order.getCompanyId() != null && order.getCompanyId() > 0) {
-                                                companyService.subtractCompanyMoney(order);
-                                            }
+                log.info("代服管家创建订单回调,{}", JSON.toJSONString(addParam));
+                List<OrderResponse> list = addParam.getBspResponse().getBody();
+                if (list != null && !list.isEmpty()) {
+                    for (OrderResponse orderResponse : list) {
+                        List<RlsInfo> rlsInfos = orderResponse.getRlsInfo();
+                        String orderNumber = orderResponse.getOrderNumber();
+                        String mailNumber = orderResponse.getMailNumber();
+                        if (rlsInfos != null && rlsInfos.size() > 0) {
+                            RlsInfo rlsInfo = rlsInfos.get(0);
+                            List<RlsDetail> rlsDetails = rlsInfo.getRlsDetail();
+                            if (rlsDetails != null && !rlsDetails.isEmpty()) {
+                                RlsDetail rlsDetail = rlsDetails.get(0);
+                                String proName = rlsDetail.getProName();
+                                if (com.hc.openapi.tool.util.StringUtils.isNotBlank(proName)) {
+                                    FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderNumber);
+                                    if (order != null && order.getStatus() == 2) {
+                                        order.setDeliverySn(mailNumber);
+                                        order.setDeliveryName(proName);
+                                        order.setDeliveryCode("SF");
+                                        order.setStatus(3);
+                                        order.setDeliverySendTime(DateUtils.getNowDate());
+                                        fsStoreOrderMapper.updateFsStoreOrder(order);
+                                        fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
+                                        if (order.getCompanyId() != null && order.getCompanyId() > 0) {
+                                            companyService.subtractCompanyMoney(order);
                                         }
-                                        break;
                                     }
+                                    break;
                                 }
                             }
                         }
@@ -3229,13 +3254,16 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             return R.error(dto.getReason());
         }
         FsStoreOrder map = new FsStoreOrder();
-        map.setDeliveryStatus(Integer.parseInt(dto.getState()));
-        map.setOrderId(order.getOrderId());
-        map.setDeliveryType(dto.getStateEx());
-        fsStoreOrderMapper.updateFsStoreOrder(map);
-        //如果是正常签收,更新订单状态
-        if (dto.getState().equals("3") && (dto.getStateEx().equals("301") || dto.getStateEx().equals("302") || dto.getStateEx().equals("304") || dto.getStateEx().equals("311"))) {
-            this.getGoods(order.getOrderId());
+        if(dto != null && dto.getState() != null){
+            map.setDeliveryStatus(Integer.parseInt(dto.getState()));
+            map.setOrderId(order.getOrderId());
+            map.setDeliveryType(dto.getStateEx());
+            fsStoreOrderMapper.updateFsStoreOrder(map);
+            //如果是正常签收,更新订单状态
+            if (dto.getState().equals("3")) {
+                this.getGoods(order.getOrderId());
+            }
+
         }
         return R.ok();
     }
@@ -3243,6 +3271,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     @Override
     public ExpressInfoDTO getDfExpressInfoDTO(FsStoreOrder order) {
         ExpressInfoDTO expressInfoDTO = new ExpressInfoDTO();
+        expressInfoDTO.setOrderCode(order.getOrderCode());
+        expressInfoDTO.setSuccess(true);
         ErpDeliverysRequest erpDeliverysRequest = new ErpDeliverysRequest();
         erpDeliverysRequest.setCode(order.getOrderCode());
         ErpDeliverysResponse deliver = null;
@@ -3258,14 +3288,33 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
                 List<TracesDTO> tracesDTOS = new ArrayList<>();
                 for (ErpDeliverys item : deliverys) {
                     TracesDTO dto = new TracesDTO();
-//                        dto.setAction();
                     dto.setLocation(item.getAcceptAddress());
                     dto.setAcceptStation(item.getRemark());
                     dto.setAcceptTime(item.getAcceptTime());
+                    tracesDTOS.add(dto);
+
                 }
                 expressInfoDTO.setTraces(tracesDTOS);
-                expressInfoDTO.setOrderCode(order.getOrderCode());
+                //匹配原代码物流编码
+                ErpDeliverys item = deliverys.get(deliverys.size()-1);
+                String opCode = item.getOpCode();
+                if ("54".equals(opCode)) {
+                    //54 取件
+                    expressInfoDTO.setState("1");
+                    expressInfoDTO.setStateEx("1");
+                } else if (opCode.startsWith("3")) {
+                    //30 分拣,36 31
+                    expressInfoDTO.setState("2");
+                    expressInfoDTO.setStateEx("2");
+                } else if ("80".equals(opCode)) {
+                    //80:您的快件已派送至本人
+                    expressInfoDTO.setState("3");
+                    expressInfoDTO.setStateEx("301");
+                }
             }
+        } else {
+            expressInfoDTO.setState("0");
+            expressInfoDTO.setStateEx("0");
         }
         return expressInfoDTO;
     }
@@ -3317,6 +3366,11 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         return null;
     }
 
+    @Override
+    public List<FsStoreOrderListVO> selectFsStoreOrderListVOByErpAccount(FsStoreOrderParam fsStoreOrder) {
+        return fsStoreOrderMapper.selectFsStoreOrderListVOByErpAccount(fsStoreOrder);
+    }
+
     private IErpOrderService getErpService() {
         FsSysConfig sysConfig = configUtil.getSysConfig();
         Integer erpOpen = sysConfig.getErpOpen();

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

@@ -113,4 +113,9 @@ public class FsStoreProductAttrValueServiceImpl implements IFsStoreProductAttrVa
     public List<FsStoreProductAttrValue> selectFsStoreProductAttrValueListByProductId( Long productId){
         return fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueListByProductId(productId);
     }
+
+    @Override
+    public List<FsStoreProductAttrValue> getFsStoreProductAttrValueListInProductId(List<Long> productIds) {
+        return fsStoreProductAttrValueMapper.getFsStoreProductAttrValueListInProductId(productIds);
+    }
 }

+ 50 - 6
fs-service/src/main/java/com/fs/his/service/impl/FsStoreProductServiceImpl.java

@@ -19,6 +19,7 @@ import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.DateUtils;
 import com.fs.erp.domain.ErpGoods;
 import com.fs.erp.service.IErpGoodsService;
+import com.fs.erp.service.IErpOrderService;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
 import com.fs.his.dto.FsPackagePruductDTO;
@@ -71,6 +72,12 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
     @Qualifier("hzOMSErpGoodsServiceImpl")
     private IErpGoodsService hzOMSErpGoodsService;
 
+    @Autowired
+    @Qualifier("JSTErpGoodsServiceImpl")
+    private IErpGoodsService jSTErpGoodsService;
+
+
+
     /**
      * 查询商品
      *
@@ -451,7 +458,9 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
     @Transactional
     public R addOrEdit(FsStoreProductAddEditParam param) {
         ProductAttrCountDTO countDto = computedProductCount(param.getValues());
-
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        Integer erpOpen = sysConfig.getErpOpen();
+        ErpGoods params = new ErpGoods();
         if (param.getProductId() != null) {
             FsStoreProduct product = new FsStoreProduct();
             BeanUtils.copyProperties(param, product);
@@ -504,7 +513,22 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
                     pack.setProductJson(JSON.toJSONString(products));
                     fsPackageService.updateFsPackage(pack);
                 }
+            }
 
+            //todo 添加商品HzOMSerp调用
+            //判断是否开启erp
+            if (erpOpen == null || erpOpen == 0) {
+                //不作操作
+            } else {
+                //判断erp类型
+                Integer erpType = sysConfig.getErpType();
+                if (erpType == null) {
+                    //不作操作
+                } else if (erpType == 5){
+                    //聚水潭商品同步
+                    params.setProductIdList(Arrays.asList(product.getProductId()));
+                    jSTErpGoodsService.addGoods(params);
+                }
             }
         } else {
             FsStoreProduct product = new FsStoreProduct();
@@ -512,6 +536,7 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
             product.setPrice(countDto.getMinPrice());
             product.setOtPrice(countDto.getMinOtPrice());
             product.setCostPrice(countDto.getMinCost());
+            product.setBarCode(param.getValues().get(0).getBarCode());
             product.setGiveIntegral(new BigDecimal(countDto.getMinIntegral()));
             product.setStock(countDto.getStock());
             fsStoreProductMapper.insertFsStoreProduct(product);
@@ -527,10 +552,9 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
             } else {
                 addProductAttr(product.getProductId(), param.getItems(), param.getValues());
             }
+
             //todo 添加商品HzOMSerp调用
             //判断是否开启erp
-            FsSysConfig sysConfig = configUtil.getSysConfig();
-            Integer erpOpen = sysConfig.getErpOpen();
             if (erpOpen == null || erpOpen == 0) {
                 //不作操作
             } else {
@@ -539,14 +563,15 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
                 if (erpType == null) {
                     //不作操作
                 } else if (erpType == 3) {
-                    ErpGoods params = new ErpGoods();
                     params.setStoreProductId(product.getProductId());
                     //瀚智OMS 维护添加商品
                     hzOMSErpGoodsService.addGoods(params);
+                }else if (erpType == 5){
+                    //聚水潭商品同步
+                    params.setProductIdList(Arrays.asList(product.getProductId()));
+                    jSTErpGoodsService.addGoods(params);
                 }
             }
-
-
         }
         return R.ok();
     }
@@ -652,6 +677,8 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
         StringBuilder successMsg = new StringBuilder();
         StringBuilder failureMsg = new StringBuilder();
 
+        //存储商品Id
+        List<Long> jstProductIds=new LinkedList<>();
         for (FsStoreProductExcelVO productVO : productList) {
             try {
 
@@ -738,6 +765,7 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
                 fsStoreProductAttrMapper.insertFsStoreProductAttr(attr);
                 successNum++;
                 successMsg.append("<br/>" + successNum + "、商品 " + product.getProductName() + " 导入成功");
+
                 //todo 添加商品HzOMSerp调用
                 //判断是否开启erp
                 FsSysConfig sysConfig = configUtil.getSysConfig();
@@ -754,6 +782,8 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
                         params.setStoreProductId(product.getProductId());
                         //瀚智OMS 维护添加商品
                         hzOMSErpGoodsService.addGoods(params);
+                    }else if(erpType == 5){
+                        jstProductIds.add(product.getProductId());
                     }
                 }
             } catch (Exception e) {
@@ -763,6 +793,16 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
                 failureMsg.append(msg + e.getMessage());
             }
         }
+
+        //验证聚水潭商品Id
+        if(!jstProductIds.isEmpty()){
+            //同步聚水潭商品
+            ErpGoods params = new ErpGoods();
+            params.setProductIdList(jstProductIds);
+            jSTErpGoodsService.addGoods(params);
+        }
+
+
         if (failureNum > 0) {
             failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
             throw new ServiceException(failureMsg.toString());
@@ -826,4 +866,8 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
         return fsStoreProductMapper.updateStoreProductStock(productId, num);
     }
 
+    @Override
+    public List<FsStoreProduct> getStoreProductInProductIds(List<Long> productIds) {
+        return fsStoreProductMapper.getStoreProductInProductIds(productIds);
+    }
 }

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

@@ -63,4 +63,7 @@ public class FsStoreOrderListVO {
 
     //erp推送号码
     private String erpPhone;
+
+    //erp推送账号
+    private String erpAccount;
 }

+ 3 - 2
fs-service/src/main/java/com/fs/huifuPay/service/test.java

@@ -11,14 +11,15 @@ import java.util.Map;
 public class test {
     static HuiFuServiceImpl huiFuService = new HuiFuServiceImpl();
     public static void main(String[] args)throws Exception {
-        onlinePay();
+//        onlinePay();
+        createOrder();
     }
     public static void  createOrder()throws Exception {
         HuiFuCreateOrder order = new HuiFuCreateOrder();
         //    T_MINIAPP: 微信小程序
         //    A_NATIVE: 支付宝正扫
         order.setTradeType("A_NATIVE");
-       order.setOpenid("oeDjB69hXRKeiX7xfeOQv86VWYU0");
+       order.setOpenid("oCtcH7pwOWlPMBJJyQQQz32qq2og");
         order.setReqSeqId("inquiry-117");
         order.setTransAmt("0.01");
         // 商品描述

+ 1 - 0
fs-service/src/main/java/com/fs/qw/domain/QwExternalContact.java

@@ -69,6 +69,7 @@ public class QwExternalContact extends BaseEntity
     /** oper用户id */
     @Excel(name = "oper用户id")
     private String operUserid;
+    private Date registerTime;
 
     /** 企业id */
     @Excel(name = "企业id")

+ 11 - 2
fs-service/src/main/java/com/fs/qw/domain/QwMaterial.java

@@ -1,5 +1,7 @@
 package com.fs.qw.domain;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
@@ -14,11 +16,12 @@ import java.util.Date;
  * @date 2024-06-20
  */
 @Data
-public class QwMaterial extends BaseEntity
+public class QwMaterial
 {
     private static final long serialVersionUID = 1L;
 
     /** 素材库id */
+    @TableId(type = IdType.AUTO)
     private Long materialId;
 
     /** 媒体文件类型,分别有图片(image),语音(voice),视频(video),普通文件(file) */
@@ -31,7 +34,7 @@ public class QwMaterial extends BaseEntity
 
     /** 媒体文件上传时间戳 */
     @Excel(name = "媒体文件上传时间戳")
-    private String createdAt;
+    private Long createdAt;
 
     /** 文件地址,图片可以上传永久的,其他类型的3天有效 */
     @Excel(name = "文件地址,图片可以上传永久的,其他类型的3天有效")
@@ -74,6 +77,12 @@ public class QwMaterial extends BaseEntity
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
 
+    /**
+     *  更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
 
     /**
      *  素材分类 1 普通素材组 2 朋友圈素材组

+ 1 - 1
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java

@@ -275,7 +275,7 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
                 "and (cu.nick_name like concat('%', #{companyUser}, '%') or cu.phonenumber= #{companyUser})"+
             "</if> " +
             "        </where>"+
-            "order by ec.create_time desc,ec.id desc"+
+            "order by ec.register_time desc,ec.create_time desc,ec.id desc"+
             "</script>"})
     List<QwExternalContactVO> selectQwExternalContactListVO(QwExternalContactParam qwExternalContact);
 

+ 9 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwIpadServerLogMapper.java

@@ -2,6 +2,8 @@ package com.fs.qw.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.qw.domain.QwIpadServerLog;
+import com.fs.qw.param.IPadServerLogParam;
+import com.fs.qw.vo.QwIPadServerLogVO;
 
 import java.util.List;
 
@@ -28,6 +30,13 @@ public interface QwIpadServerLogMapper extends BaseMapper<QwIpadServerLog>{
      */
     List<QwIpadServerLog> selectQwIpadServerLogList(QwIpadServerLog qwIpadServerLog);
 
+    /**
+     * 查询iPad服务器日志列表及其公司名称用户名称
+     * @param iPadServerLogParam 查询参数
+     * @return ipad服务器日志集合
+     */
+    List<QwIPadServerLogVO> selectIpadServerLogList(IPadServerLogParam iPadServerLogParam);
+
     /**
      * 新增ipad服务器日志
      *

+ 10 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwIpadServerUserMapper.java

@@ -2,6 +2,8 @@ package com.fs.qw.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.qw.domain.QwIpadServerUser;
+import com.fs.qw.param.IPadServerUserParam;
+import com.fs.qw.vo.QwIPadServerUserVO;
 import org.apache.ibatis.annotations.Delete;
 
 import java.util.List;
@@ -29,6 +31,14 @@ public interface QwIpadServerUserMapper extends BaseMapper<QwIpadServerUser>{
      */
     List<QwIpadServerUser> selectQwIpadServerUserList(QwIpadServerUser qwIpadServerUser);
 
+    /**
+     * 查询ipad用户列表
+     *
+     * @param iPadServerUserParam ipad用户
+     * @return ipad用户集合
+     */
+    List<QwIPadServerUserVO> selectIpadServerUserList(IPadServerUserParam iPadServerUserParam);
+
     /**
      * 新增ipad用户
      *

+ 5 - 1
fs-service/src/main/java/com/fs/qw/mapper/QwMaterialMapper.java

@@ -1,6 +1,7 @@
 package com.fs.qw.mapper;
 
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.qw.domain.QwMaterial;
 import com.fs.qw.param.QwMaterialParam;
 import com.fs.qw.vo.QwMaterialVO;
@@ -15,7 +16,7 @@ import java.util.List;
  * @author fs
  * @date 2024-06-20
  */
-public interface QwMaterialMapper
+public interface QwMaterialMapper extends BaseMapper<QwMaterial>
 {
     /**
      * 查询素材库
@@ -107,4 +108,7 @@ public interface QwMaterialMapper
      * @return 结果
      */
     public int deleteQwMaterialByMaterialIds(Long[] materialIds);
+    public List<QwMaterial> selectQwMaterialListByMediaIdList();
+
+
 }

+ 21 - 0
fs-service/src/main/java/com/fs/qw/param/IPadServerLogParam.java

@@ -0,0 +1,21 @@
+package com.fs.qw.param;
+
+import lombok.Data;
+
+@Data
+public class IPadServerLogParam {
+
+    /** 类别 1 绑定 2 解绑 */
+    private Integer type;
+
+    /** 服务器名称 */
+    private String serverName;
+    /** 企微用户名称 */
+    private String qwUserName;
+    /** 企业名称 */
+    private String companyName;
+    /** 公司用户名称 */
+    private String companyUserName;
+
+
+}

+ 15 - 0
fs-service/src/main/java/com/fs/qw/param/IPadServerUserParam.java

@@ -0,0 +1,15 @@
+package com.fs.qw.param;
+
+import lombok.Data;
+
+@Data
+public class IPadServerUserParam {
+    /** 服务器名称 */
+    private String serverName;
+    /** 企微用户名称 */
+    private String qwUserName;
+    /** 企业名称 */
+    private String companyName;
+    /** 公司用户名称 */
+    private String companyUserName;
+}

+ 21 - 0
fs-service/src/main/java/com/fs/qw/param/QwExtCourseSopWatchLog.java

@@ -0,0 +1,21 @@
+package com.fs.qw.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class QwExtCourseSopWatchLog  implements Serializable {
+
+    @ApiModelProperty(value = "页码,默认为1", required = true)
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "页大小,默认为10", required = true)
+    private Integer pageSize = 10;
+
+
+    Long qwExternalContactId;
+
+
+}

+ 6 - 1
fs-service/src/main/java/com/fs/qw/param/QwMaterialParam.java

@@ -1,10 +1,12 @@
 package com.fs.qw.param;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.Date;
 
 /**
@@ -14,7 +16,7 @@ import java.util.Date;
  * @date 2024-06-20
  */
 @Data
-public class QwMaterialParam extends BaseEntity
+public class QwMaterialParam extends BaseEntity implements Serializable
 {
     private static final long serialVersionUID = 1L;
 
@@ -79,4 +81,7 @@ public class QwMaterialParam extends BaseEntity
      *  素材分类 1 普通素材组 2 朋友圈素材组
      */
     private Integer groupType;
+
+    @TableField(exist = false)
+    private String QwUserId;
 }

+ 28 - 0
fs-service/src/main/java/com/fs/qw/param/QwMaterialParamBySidebar.java

@@ -0,0 +1,28 @@
+package com.fs.qw.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class QwMaterialParamBySidebar  implements Serializable  {
+
+
+    @ApiModelProperty(value = "页码,默认为1", required = true)
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "页大小,默认为10", required = true)
+    private Integer pageSize = 10;
+
+    @ApiModelProperty(value = "模糊搜索,通过视频名称来匹配")
+    private String keyword;
+
+    @ApiModelProperty(value = "公司id")
+    private Long companyId;
+
+    private String corpId;
+
+    private String qwUserId;
+
+}

+ 9 - 0
fs-service/src/main/java/com/fs/qw/service/IQwIpadServerLogService.java

@@ -2,6 +2,8 @@ package com.fs.qw.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.qw.domain.QwIpadServerLog;
+import com.fs.qw.param.IPadServerLogParam;
+import com.fs.qw.vo.QwIPadServerLogVO;
 
 import java.util.List;
 
@@ -28,6 +30,13 @@ public interface IQwIpadServerLogService extends IService<QwIpadServerLog>{
      */
     List<QwIpadServerLog> selectQwIpadServerLogList(QwIpadServerLog qwIpadServerLog);
 
+    /**
+     * 查询iPad服务器日志列表及其公司名称用户名称
+     * @param iPadServerLogParam 查询参数
+     * @return ipad服务器日志集合
+     */
+    List<QwIPadServerLogVO> selectIpadServerLogList(IPadServerLogParam iPadServerLogParam);
+
     /**
      * 新增ipad服务器日志
      *

+ 10 - 0
fs-service/src/main/java/com/fs/qw/service/IQwIpadServerUserService.java

@@ -2,6 +2,8 @@ package com.fs.qw.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.qw.domain.QwIpadServerUser;
+import com.fs.qw.param.IPadServerUserParam;
+import com.fs.qw.vo.QwIPadServerUserVO;
 
 import java.util.List;
 
@@ -28,6 +30,14 @@ public interface IQwIpadServerUserService extends IService<QwIpadServerUser>{
      */
     List<QwIpadServerUser> selectQwIpadServerUserList(QwIpadServerUser qwIpadServerUser);
 
+    /**
+     * 查询ipad用户列表
+     *
+     * @param iPadServerUserParam ipad用户
+     * @return ipad用户集合
+     */
+    List<QwIPadServerUserVO> selectIpadServerUserList(IPadServerUserParam iPadServerUserParam);
+
     /**
      * 新增ipad用户
      *

+ 8 - 0
fs-service/src/main/java/com/fs/qw/service/IQwMaterialService.java

@@ -63,4 +63,12 @@ public interface IQwMaterialService
      * @return 结果
      */
     public int deleteQwMaterialByMaterialId(Long materialId);
+
+    /**
+    * 定时更新 上传的企业微信素材库
+    */
+    public void updateQwMaterialByQw();
+
+    public QwMaterial selectQwMaterialByMaterialIdByTime(Long materialId) throws Exception;
+    public QwMaterial selectQwMaterialByMaterialIdByTimeTwo(Long materialId) throws Exception;
 }

+ 8 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwIpadServerLogServiceImpl.java

@@ -4,9 +4,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.utils.DateUtils;
 import com.fs.qw.domain.QwIpadServerLog;
 import com.fs.qw.mapper.QwIpadServerLogMapper;
+import com.fs.qw.param.IPadServerLogParam;
 import com.fs.qw.service.IQwIpadServerLogService;
+import com.fs.qw.vo.QwIPadServerLogVO;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -42,6 +45,11 @@ public class QwIpadServerLogServiceImpl extends ServiceImpl<QwIpadServerLogMappe
         return baseMapper.selectQwIpadServerLogList(qwIpadServerLog);
     }
 
+    @Override
+    public List<QwIPadServerLogVO> selectIpadServerLogList(IPadServerLogParam iPadServerLogParam) {
+        return baseMapper.selectIpadServerLogList(iPadServerLogParam);
+    }
+
     /**
      * 新增ipad服务器日志
      *

+ 8 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwIpadServerUserServiceImpl.java

@@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.utils.DateUtils;
 import com.fs.qw.domain.QwIpadServerUser;
 import com.fs.qw.mapper.QwIpadServerUserMapper;
+import com.fs.qw.param.IPadServerUserParam;
 import com.fs.qw.service.IQwIpadServerUserService;
+import com.fs.qw.vo.QwIPadServerUserVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -45,6 +48,11 @@ public class QwIpadServerUserServiceImpl extends ServiceImpl<QwIpadServerUserMap
         return baseMapper.selectQwIpadServerUserList(qwIpadServerUser);
     }
 
+    @Override
+    public List<QwIPadServerUserVO> selectIpadServerUserList(IPadServerUserParam iPadServerUserParam) {
+        return baseMapper.selectIpadServerUserList(iPadServerUserParam);
+    }
+
     /**
      * 新增ipad用户
      *

+ 147 - 7
fs-service/src/main/java/com/fs/qw/service/impl/QwMaterialServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fs.qw.service.impl;
 
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.qw.domain.QwMaterial;
@@ -11,6 +12,7 @@ import com.fs.qw.vo.QwMaterialVO;
 import com.fs.qwApi.Result.QwUploadResult;
 import com.fs.qwApi.service.QwApiService;
 import com.fs.voice.utils.StringUtil;
+import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -19,8 +21,14 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
 
 /**
  * 素材库Service业务层处理
@@ -28,8 +36,9 @@ import java.util.List;
  * @author fs
  * @date 2024-06-20
  */
+@Log4j2
 @Service
-public class QwMaterialServiceImpl implements IQwMaterialService
+public class QwMaterialServiceImpl extends ServiceImpl<QwMaterialMapper, QwMaterial> implements IQwMaterialService
 {
     @Autowired
     private QwMaterialMapper qwMaterialMapper;
@@ -73,14 +82,62 @@ public class QwMaterialServiceImpl implements IQwMaterialService
 
         //调用企业微信接口 上次临时图片
 
-        File fileImage = urlToFile(qwMaterial.getMaterialUrl());
-        QwUploadResult imageResult = qwApiService.upload(fileImage, "image", qwMaterial.getCorpId());
-        if (imageResult.getErrCode()==0){
-            qwMaterial.setMaterialMediaId(imageResult.getMediaId());
+        if ("text".equals(qwMaterial.getMaterialType())){
             qwMaterialMapper.insertQwMaterial(qwMaterial);
             return R.ok();
-        }else {
-            return R.error("上传图片失败:"+imageResult.getErrMsg());
+        }else if ("image".equals(qwMaterial.getMaterialType())
+                ||"video".equals(qwMaterial.getMaterialType())
+                ||"file".equals(qwMaterial.getMaterialType())){
+            return uploadAndSaveQwMaterial(qwMaterial);
+        }
+
+        return R.ok();
+
+    }
+
+    public R uploadAndSaveQwMaterial(QwMaterial qwMaterial){
+        try {
+            // 将URL转换为文件
+            File materialFile = urlToFile(qwMaterial.getMaterialUrl());
+
+            // 上传素材到企业微信
+            QwUploadResult uploadResult = qwApiService.upload(materialFile, qwMaterial.getMaterialType(), qwMaterial.getCorpId());
+
+            if (uploadResult.getErrCode() == 0) {
+                // 设置素材信息并保存到数据库
+                qwMaterial.setMaterialMediaId(uploadResult.getMediaId());
+                qwMaterial.setCreatedAt(Long.valueOf(uploadResult.getCreatedAt()));
+                qwMaterialMapper.insertQwMaterial(qwMaterial);
+                return R.ok();
+            } else {
+                return R.error("上传"+qwMaterial.getMaterialType()+"失败:" + uploadResult.getErrMsg());
+            }
+        } catch (Exception e) {
+            return R.error("处理"+qwMaterial.getMaterialType()+"时发生异常:" + e.getMessage());
+        }
+    }
+
+    public QwMaterial uploadAndSaveQwMaterialByDTO(QwMaterial qwMaterial){
+        try {
+            // 将URL转换为文件
+            File materialFile = urlToFile(qwMaterial.getMaterialUrl());
+
+            // 上传素材到企业微信
+            QwUploadResult uploadResult = qwApiService.upload(materialFile, qwMaterial.getMaterialType(), qwMaterial.getCorpId());
+
+            if (uploadResult.getErrCode() == 0) {
+                // 设置素材信息并保存到数据库
+                qwMaterial.setMaterialMediaId(uploadResult.getMediaId());
+                qwMaterial.setCreatedAt(Long.valueOf(uploadResult.getCreatedAt()));
+                qwMaterialMapper.insertQwMaterial(qwMaterial);
+                return qwMaterial;
+            } else {
+                log.error("上传DTO"+qwMaterial.getMaterialType()+"失败:" + uploadResult.getErrMsg());
+                return null;
+            }
+        } catch (Exception e) {
+            log.error("处理DTO"+qwMaterial.getMaterialType()+"时发生异常:" + e.getMessage());
+            return null;
         }
     }
 
@@ -188,6 +245,89 @@ public class QwMaterialServiceImpl implements IQwMaterialService
     @Override
     public int deleteQwMaterialByMaterialId(Long materialId)
     {
+        log.info("删除素材库中信息:{}",qwMaterialMapper.selectQwMaterialByMaterialId(materialId));
         return qwMaterialMapper.deleteQwMaterialByMaterialId(materialId);
     }
+
+    @Override
+    public void updateQwMaterialByQw() {
+
+        List<QwMaterial> qwMaterials = qwMaterialMapper.selectQwMaterialListByMediaIdList();
+
+
+        // 创建线程安全的集合用于存储处理结果
+        ConcurrentLinkedQueue<QwMaterial> successQueue = new ConcurrentLinkedQueue<>();
+
+        // 创建线程池
+        int threadPoolSize = Math.min(8, Runtime.getRuntime().availableProcessors() * 2);
+        ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);
+
+        try {
+            // 创建并执行所有异步任务
+            List<CompletableFuture<Void>> futures = qwMaterials.stream()
+                    .filter(item -> "image".equals(item.getMaterialType())
+                            || "video".equals(item.getMaterialType())
+                            || "file".equals(item.getMaterialType()))
+                    .map(item -> CompletableFuture.runAsync(() -> {
+                        try {
+                            // 将URL转换为文件
+                            File materialFile = urlToFile(item.getMaterialUrl());
+
+                            // 上传素材到企业微信
+                            QwUploadResult uploadResult = qwApiService.upload(
+                                    materialFile,
+                                    item.getMaterialType(),
+                                    item.getCorpId()
+                            );
+
+                            if (uploadResult.getErrCode() == 0) {
+                                // 设置素材信息
+                                item.setMaterialMediaId(uploadResult.getMediaId());
+                                item.setCreatedAt(Long.valueOf(uploadResult.getCreatedAt()));
+                                successQueue.add(item);
+                            } else {
+                                log.error("上传失败:{},{}", uploadResult.getErrMsg(), item);
+                            }
+                        } catch (Exception e) {
+                            log.error("上传失败异常:{},{}", e.getMessage(), item);
+                        }
+                    }, executor))
+                    .collect(Collectors.toList());
+
+            // 等待所有任务完成
+            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
+
+            // 批量更新成功的记录
+            if (!successQueue.isEmpty()) {
+                super.saveOrUpdateBatch(new ArrayList<>(successQueue),300);
+            }
+
+
+        } finally {
+            // 关闭线程池
+            executor.shutdown();
+        }
+    }
+
+    @Override
+    public QwMaterial selectQwMaterialByMaterialIdByTime(Long materialId) throws Exception {
+
+        return uploadAndSaveQwMaterialByDTO(qwMaterialMapper.selectQwMaterialByMaterialId(materialId));
+    }
+
+    @Override
+    public QwMaterial selectQwMaterialByMaterialIdByTimeTwo(Long materialId) throws Exception {
+
+        QwMaterial qwMaterial = qwMaterialMapper.selectQwMaterialByMaterialId(materialId);
+
+        Long createdAt = qwMaterial.getCreatedAt();
+        boolean isOver48h = createdAt != null
+                && (System.currentTimeMillis() / 1000 - createdAt) > 172800;
+
+        if (qwMaterial.getMaterialType() != null && isOver48h) {
+            return uploadAndSaveQwMaterialByDTO(qwMaterial);
+        }
+
+        return qwMaterial;
+    }
 }

+ 2 - 0
fs-service/src/main/java/com/fs/qw/vo/QwExternalContactVO.java

@@ -104,6 +104,8 @@ public class QwExternalContactVO {
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date transferTime;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date registerTime;
     private Integer transferNum;
 
     private String state;

+ 43 - 0
fs-service/src/main/java/com/fs/qw/vo/QwIPadServerLogVO.java

@@ -0,0 +1,43 @@
+package com.fs.qw.vo;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class QwIPadServerLogVO {
+    /** $column.columnComment */
+    private Long id;
+
+    /** 服务器id */
+    private Long serverId;
+
+    /** 企微用户 */
+    private Long qwUserId;
+
+    /** 公司id */
+    private Long companyId;
+
+    /** 公司用户id */
+    private Long companyUserId;
+
+
+
+    /** 服务器名称 */
+    @Excel(name = "服务器")
+    private String serverName;
+    /** 企微用户名称 */
+    @Excel(name = "企微用户")
+    private String qwUserName;
+    /** 企业名称 */
+    @Excel(name = "公司")
+    private String companyName;
+    /** 公司用户名称 */
+    @Excel(name = "公司用户")
+    private String companyUserName;
+    /** 标题 */
+    @Excel(name = "标题")
+    private String tilie;
+    /** 类别 1 绑定 2 解绑 */
+    @Excel(name = "类别",readConverterExp = "1=绑定,2=解绑")
+    private Integer type;
+}

Some files were not shown because too many files changed in this diff