Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/master'

yh 3 giorni fa
parent
commit
dc41b37a7c
47 ha cambiato i file con 1224 aggiunte e 416 eliminazioni
  1. 2 1
      .vscode/settings.json
  2. 8 1
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  3. 23 1
      fs-company/src/main/java/com/fs/company/controller/companyWorkflow/CompanyTagTemplateBindingController.java
  4. 18 0
      fs-company/src/main/java/com/fs/company/controller/companyWorkflow/CompanyWorkflowLobsterController.java
  5. 4 1
      fs-company/src/main/java/com/fs/company/controller/course/FsCourseRedPacketLogController.java
  6. 10 3
      fs-company/src/main/java/com/fs/company/controller/course/qw/FsQwCourseWatchLogController.java
  7. 6 0
      fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java
  8. 84 9
      fs-ipad-task/src/main/java/com/fs/app/task/SendMsg.java
  9. 1 6
      fs-ipad-task/src/main/java/com/fs/framework/aspectj/SopTenantDataSourceAspect.java
  10. 2 2
      fs-ipad-task/src/main/resources/application.yml
  11. 45 0
      fs-service/src/main/java/com/fs/company/domain/CompanyLobsterTagUserRel.java
  12. 6 0
      fs-service/src/main/java/com/fs/company/domain/CompanyWorkflowLobsterNode.java
  13. 89 0
      fs-service/src/main/java/com/fs/company/domain/CompanyWorkflowLobsterTask.java
  14. 15 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyLobsterTagUserRelMapper.java
  15. 9 7
      fs-service/src/main/java/com/fs/company/mapper/CompanyTagTemplateBindingMapper.java
  16. 2 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyWorkflowLobsterEdgeMapper.java
  17. 2 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyWorkflowLobsterMapper.java
  18. 5 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyWorkflowLobsterNodeMapper.java
  19. 38 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyWorkflowLobsterTaskMapper.java
  20. 2 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyWorkflowLobsterVariableMapper.java
  21. 26 0
      fs-service/src/main/java/com/fs/company/param/BatchBindLobsterTagParam.java
  22. 2 0
      fs-service/src/main/java/com/fs/company/param/CompanyWorkflowLobsterEdgeParam.java
  23. 5 0
      fs-service/src/main/java/com/fs/company/param/CompanyWorkflowLobsterNodeParam.java
  24. 1 0
      fs-service/src/main/java/com/fs/company/param/CompanyWorkflowLobsterVariableParam.java
  25. 15 8
      fs-service/src/main/java/com/fs/company/service/ICompanyTagTemplateBindingService.java
  26. 4 0
      fs-service/src/main/java/com/fs/company/service/ICompanyWorkflowLobsterService.java
  27. 274 5
      fs-service/src/main/java/com/fs/company/service/impl/CompanyTagTemplateBindingServiceImpl.java
  28. 136 34
      fs-service/src/main/java/com/fs/company/service/impl/CompanyWorkflowLobsterServiceImpl.java
  29. 15 12
      fs-service/src/main/java/com/fs/config/saas/ProjectConfig.java
  30. 4 2
      fs-service/src/main/java/com/fs/core/config/WxMpProperties.java
  31. 4 2
      fs-service/src/main/java/com/fs/core/config/WxPayProperties.java
  32. 25 6
      fs-service/src/main/java/com/fs/ipad/IpadSendUtils.java
  33. 2 0
      fs-service/src/main/java/com/fs/ipad/vo/BaseVo.java
  34. 13 0
      fs-service/src/main/java/com/fs/ipad/vo/CorpAppBaseVo.java
  35. 29 0
      fs-service/src/main/java/com/fs/ipad/vo/CorpAppVo.java
  36. 4 2
      fs-service/src/main/java/com/fs/wx/cp/config/WxCpProperties.java
  37. 6 2
      fs-service/src/main/java/com/fs/wx/miniapp/config/WxMaProperties.java
  38. 1 0
      fs-service/src/main/java/com/fs/wxwork/dto/WxWorkUserId2VidDTO.java
  39. 6 4
      fs-service/src/main/java/com/fs/wxwork/service/WxWorkServiceNew.java
  40. 5 296
      fs-service/src/main/resources/db/tenant-initData.sql
  41. 29 0
      fs-service/src/main/resources/mapper/company/CompanyLobsterTagUserRelMapper.xml
  42. 12 3
      fs-service/src/main/resources/mapper/company/CompanyTagTemplateBindingMapper.xml
  43. 28 5
      fs-service/src/main/resources/mapper/company/CompanyWorkflowLobsterEdgeMapper.xml
  44. 9 0
      fs-service/src/main/resources/mapper/company/CompanyWorkflowLobsterMapper.xml
  45. 23 4
      fs-service/src/main/resources/mapper/company/CompanyWorkflowLobsterNodeMapper.xml
  46. 159 0
      fs-service/src/main/resources/mapper/company/CompanyWorkflowLobsterTaskMapper.xml
  47. 16 0
      fs-service/src/main/resources/mapper/company/CompanyWorkflowLobsterVariableMapper.xml

+ 2 - 1
.vscode/settings.json

@@ -2,5 +2,6 @@
   // 使用当前用户的 Maven settings.xml(其中已配置 localRepository = D:\\Tool\\repository)
   "java.configuration.maven.userSettings": "C:\\Users\\Administrator\\.m2\\settings.xml",
   // Maven 可执行文件路径,便于 IDE 与终端使用
-  "maven.executable.path": "D:\\Tool\\apache-maven-3.6.3\\bin\\mvn.cmd"
+  "maven.executable.path": "D:\\Tool\\apache-maven-3.6.3\\bin\\mvn.cmd",
+  "java.compile.nullAnalysis.mode": "automatic"
 }

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

@@ -377,9 +377,16 @@ public class CompanyUserController extends BaseController {
     private boolean isQuantityExceeded(LoginUser loginUser){
         DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
         TenantInfo tenantInfo = tenantInfoMapper.selectTenantInfoById(loginUser.getTenantId().toString());
+        if (tenantInfo == null) {
+            return false;
+        }
         tenantDataSourceManager.switchTenant(tenantInfo);
         Integer count = companyUserService.getUserCount();
-        return count >= tenantInfo.getAccountNum();
+        Integer accountNum = tenantInfo.getAccountNum();
+        if (accountNum == null || count == null) {
+            return false;
+        }
+        return count >= accountNum;
     }
 
     /**

+ 23 - 1
fs-company/src/main/java/com/fs/company/controller/tag/CompanyTagTemplateBindingController.java → fs-company/src/main/java/com/fs/company/controller/companyWorkflow/CompanyTagTemplateBindingController.java

@@ -1,9 +1,10 @@
-package com.fs.company.controller.tag;
+package com.fs.company.controller.companyWorkflow;
 
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.utils.ServletUtils;
 import com.fs.company.domain.CompanyTagTemplateBinding;
+import com.fs.company.param.BatchBindLobsterTagParam;
 import com.fs.company.service.ICompanyTagTemplateBindingService;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
@@ -37,6 +38,16 @@ public class CompanyTagTemplateBindingController extends BaseController {
             loginUser.getCompany().getCompanyId(), tagCode, templateId);
         return AjaxResult.success(list);
     }
+    /**
+     * 查询标签绑定列表
+     */
+    @GetMapping("/tag-binding/listByStatus")
+    public AjaxResult listByStatus(@RequestParam(required = false) Integer status){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        List<CompanyTagTemplateBinding> list = tagTemplateBindingService.listByStatus(
+                loginUser.getCompany().getCompanyId(), status);
+        return AjaxResult.success(list);
+    }
 
     /**
      * 获取绑定详情
@@ -103,4 +114,15 @@ public class CompanyTagTemplateBindingController extends BaseController {
         Map<String, Object> result = tagTemplateBindingService.testMatch(loginUser.getCompany().getCompanyId(), id, testTags);
         return AjaxResult.success(result);
     }
+
+    /**
+     * 批量添加龙虾标签给企微客户
+     */
+    @PostMapping("/tag-binding/batch-bind-lobster-tag")
+    public AjaxResult batchBindLobsterTag(@RequestBody BatchBindLobsterTagParam param) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        return tagTemplateBindingService.batchBindLobsterTag(
+                loginUser.getCompany().getCompanyId(), loginUser.getUsername(),
+                param.getQwCorpId(), param.getUserIds(), param.getTagCodes(),loginUser.getUser().getUserId());
+    }
 }

+ 18 - 0
fs-company/src/main/java/com/fs/company/controller/companyWorkflow/CompanyWorkflowLobsterController.java

@@ -40,6 +40,15 @@ public class CompanyWorkflowLobsterController extends BaseController {
         return AjaxResult.success(lobsterService.listTemplate(loginUser.getCompany().getCompanyId(), page, size));
     }
 
+    /**
+     * 分页查询模板列表
+     */
+    @GetMapping("/template/listTemplate")
+    public AjaxResult listTemplate(@RequestParam Integer status) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        return AjaxResult.success(lobsterService.listTemplateByStatus(loginUser.getCompany().getCompanyId(), status));
+    }
+
     /**
      * 获取模板详情(用于画布编辑)
      */
@@ -67,6 +76,15 @@ public class CompanyWorkflowLobsterController extends BaseController {
         return lobsterService.updateTemplate(loginUser.getCompany().getCompanyId(), loginUser.getUsername(), templateId, param);
     }
 
+    /**
+     * 更新模板状态
+     */
+    @PutMapping("/template/{templateId}/{status}")
+    public AjaxResult updateTemplateStatus(@PathVariable Long templateId, @PathVariable Integer status) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        return lobsterService.updateTemplateStatus(loginUser.getCompany().getCompanyId(), loginUser.getUsername(), templateId, status);
+    }
+
     /**
      * 删除模板
      */

+ 4 - 1
fs-company/src/main/java/com/fs/company/controller/course/FsCourseRedPacketLogController.java

@@ -11,6 +11,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseRedPacketLog;
 import com.fs.course.domain.FsUserCoursePeriod;
@@ -78,7 +79,9 @@ public class FsCourseRedPacketLogController extends BaseController
             fsCourseRedPacketLog.setCompanyId( loginUser.getCompany().getCompanyId());
         }
 
-        if("济南联志健康".equals(configService.getProjectConfig().getCloudHost().getCompanyName())){
+        ProjectConfig projectConfig = configService.getProjectConfig();
+        String companyName = (projectConfig != null && projectConfig.getCloudHost() != null) ? projectConfig.getCloudHost().getCompanyName() : null;
+        if("济南联志健康".equals(companyName)){
             fsCourseRedPacketLog.setCompanyId( loginUser.getCompany().getCompanyId());
         }
 

+ 10 - 3
fs-company/src/main/java/com/fs/company/controller/course/qw/FsQwCourseWatchLogController.java

@@ -7,6 +7,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.system.service.ISysConfigService;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.param.*;
@@ -110,7 +111,9 @@ public class FsQwCourseWatchLogController extends BaseController
             return getDataTable(new ArrayList<>());
         }
         //济南联志健康 数据排除转接用户
-        if ("济南联志健康".equals(sysConfigService.getProjectConfig().getCloudHost().getCompanyName())) {
+        ProjectConfig projectConfig = sysConfigService.getProjectConfig();
+        String companyName = (projectConfig != null && projectConfig.getCloudHost() != null) ? projectConfig.getCloudHost().getCompanyName() : null;
+        if ("济南联志健康".equals(companyName)) {
             return qwWatchLogService.selectQwWatchLogStatisticsListVOExcludeTransfer(param);
         } else {
             return qwWatchLogService.selectQwWatchLogStatisticsListVO(param);
@@ -126,7 +129,9 @@ public class FsQwCourseWatchLogController extends BaseController
             return getDataTable(new ArrayList<>());
         }
         //济南联志健康 数据排除转接用户
-        if ("济南联志健康".equals(sysConfigService.getProjectConfig().getCloudHost().getCompanyName())) {
+        ProjectConfig projectConfig2 = sysConfigService.getProjectConfig();
+        String companyName2 = (projectConfig2 != null && projectConfig2.getCloudHost() != null) ? projectConfig2.getCloudHost().getCompanyName() : null;
+        if ("济南联志健康".equals(companyName2)) {
             return qwWatchLogService.selectQwWatchLogStatisticsListVOExcludeTransfer(param);
         } else {
             return qwWatchLogService.selectQwWatchLogStatisticsListVO(param);
@@ -227,7 +232,9 @@ public class FsQwCourseWatchLogController extends BaseController
         param.setCompanyId( loginUser.getCompany().getCompanyId());
         List<QwWatchLogStatisticsListVO> list = new ArrayList<>();
 
-        if ("济南联志健康".equals(sysConfigService.getProjectConfig().getCloudHost().getCompanyName())) {
+        ProjectConfig projectConfig3 = sysConfigService.getProjectConfig();
+        String companyName3 = (projectConfig3 != null && projectConfig3.getCloudHost() != null) ? projectConfig3.getCloudHost().getCompanyName() : null;
+        if ("济南联志健康".equals(companyName3)) {
             list = qwWatchLogService.selectQwWatchLogStatisticsListVOExportExcludeTransfer(param);
         }else{
             list = qwWatchLogService.selectQwWatchLogStatisticsListVOExport(param);

+ 6 - 0
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -24,11 +24,13 @@ import com.fs.ipad.IpadSendUtils;
 import com.fs.ipad.vo.*;
 import com.fs.live.domain.LiveWatchLog;
 import com.fs.live.mapper.LiveWatchLogMapper;
+import com.fs.qw.domain.QwCompany;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.domain.QwUserVideo;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.mapper.QwUserMapper;
+import com.fs.qw.service.IQwCompanyService;
 import com.fs.qw.service.IQwUserService;
 import com.fs.qw.service.IQwUserVideoService;
 import com.fs.qw.vo.QwSopCourseFinishTempSetting;
@@ -52,6 +54,7 @@ import java.util.stream.Collectors;
 public class IpadSendServer {
 
     private final QwUserMapper qwUserMapper;
+    private final IQwCompanyService qwCompanyService;
     private final IQwUserService qwUserService;
     private final IpadSendUtils ipadSendUtils;
     private final IQwSopLogsService qwSopLogsService;
@@ -565,9 +568,12 @@ public class IpadSendServer {
 
     public void send(QwSopCourseFinishTempSetting.Setting content, QwUser qwUser, QwSopLogs qwSopLogs, Map<String, FsCoursePlaySourceConfig> miniMap, BaseVo parentVo) {
         BaseVo vo = new BaseVo();
+        QwCompany qwCompany = qwCompanyService.getQwCompanyByRedis(parentVo.getCorpCode());
+        log.info("获取到的企业微信信息:{}", qwCompany);
         vo.setId(Long.parseLong(qwSopLogs.getId()));
         vo.setRoom(qwSopLogs.getSendType() == 6);
         vo.setUuid(qwUser.getUid());
+        vo.setAgentId(qwCompany.getServerAgentId());
         vo.setExId(qwSopLogs.getExternalUserId());
         vo.setServerId(qwUser.getServerId());
         vo.setCorpCode(parentVo.getCorpCode());

+ 84 - 9
fs-ipad-task/src/main/java/com/fs/app/task/SendMsg.java

@@ -3,17 +3,20 @@ package com.fs.app.task;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fs.app.service.IpadSendServer;
 import com.fs.common.annotation.TenantDataScope;
-import com.fs.common.core.redis.RedisCacheT;
 import com.fs.common.core.redis.RedisCacheTenant;
+import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.PubFun;
+import com.fs.company.domain.CompanyWorkflowLobsterTask;
+import com.fs.company.mapper.CompanyWorkflowLobsterTaskMapper;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
 import com.fs.course.service.IFsCoursePlaySourceConfigService;
-import com.fs.framework.aspectj.TenantDataSourceAspect;
+import com.fs.framework.aspectj.SopTenantDataSourceAspect;
 import com.fs.ipad.vo.BaseVo;
 import com.fs.qw.domain.QwIpadServer;
 import com.fs.qw.domain.QwPushCount;
@@ -31,6 +34,8 @@ import com.fs.sop.mapper.QwSopLogsMapper;
 import com.fs.sop.service.IQwSopLogsService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
+import com.fs.wxwork.dto.*;
+import com.fs.wxwork.service.WxWorkServiceNew;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -49,6 +54,7 @@ import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
+import com.fs.wxwork.service.WxWorkService;
 
 @Component
 @Slf4j
@@ -65,7 +71,11 @@ public class SendMsg {
     private final IFsCoursePlaySourceConfigService fsCoursePlaySourceConfigService;
     private final QwPushCountMapper qwPushCountMapper;
     private final QwRestrictionPushRecordMapper qwRestrictionPushRecordMapper;
-    private final TenantDataSourceAspect tenantDataSourceAspect;
+    private final CompanyWorkflowLobsterTaskMapper companyWorkflowLobsterTaskMapper;
+    private final WxWorkService wxWorkService;
+    private final WxWorkServiceNew wxWorkServiceNew;
+
+    private final SopTenantDataSourceAspect sopTenantDataSourceAspect;
 
     @Value("${group-no}")
     private String groupNo;
@@ -101,7 +111,7 @@ public class SendMsg {
     @Qualifier("customThreadPool")
     private ThreadPoolTaskExecutor customThreadPool;
 
-    public SendMsg(QwUserMapper qwUserMapper, QwSopLogsMapper qwSopLogsMapper, IpadSendServer sendServer, SysConfigMapper sysConfigMapper, IQwSopLogsService qwSopLogsService, QwIpadServerMapper qwIpadServerMapper, RedisCacheTenant<Long> redisCache, AsyncSopTestService asyncSopTestService, IFsCoursePlaySourceConfigService fsCoursePlaySourceConfigService, QwPushCountMapper qwPushCountMapper, QwRestrictionPushRecordMapper qwRestrictionPushRecordMapper, TenantDataSourceAspect tenantDataSourceAspect) {
+    public SendMsg(QwUserMapper qwUserMapper, QwSopLogsMapper qwSopLogsMapper, IpadSendServer sendServer, SysConfigMapper sysConfigMapper, IQwSopLogsService qwSopLogsService, QwIpadServerMapper qwIpadServerMapper, RedisCacheTenant<Long> redisCache, AsyncSopTestService asyncSopTestService, IFsCoursePlaySourceConfigService fsCoursePlaySourceConfigService, QwPushCountMapper qwPushCountMapper, QwRestrictionPushRecordMapper qwRestrictionPushRecordMapper, SopTenantDataSourceAspect sopTenantDataSourceAspect, CompanyWorkflowLobsterTaskMapper companyWorkflowLobsterTaskMapper, WxWorkService wxWorkService, WxWorkServiceNew wxWorkServiceNew) {
         this.qwUserMapper = qwUserMapper;
         this.qwSopLogsMapper = qwSopLogsMapper;
         this.sendServer = sendServer;
@@ -113,7 +123,10 @@ public class SendMsg {
         this.fsCoursePlaySourceConfigService = fsCoursePlaySourceConfigService;
         this.qwPushCountMapper = qwPushCountMapper;
         this.qwRestrictionPushRecordMapper = qwRestrictionPushRecordMapper;
-        this.tenantDataSourceAspect = tenantDataSourceAspect;
+        this.companyWorkflowLobsterTaskMapper = companyWorkflowLobsterTaskMapper;
+        this.wxWorkService = wxWorkService;
+        this.wxWorkServiceNew = wxWorkServiceNew;
+        this.sopTenantDataSourceAspect = sopTenantDataSourceAspect;
     }
     private List<QwUser> getQwUserList() {
         if (qwUserList.isEmpty()) {
@@ -155,7 +168,7 @@ public class SendMsg {
         // 消息发送延迟
         int delayStart;
         int delayEnd;
-        if (config.getDelayStart() == null || config.getDelayEnd() == null) {
+        if (config == null || config.getDelayStart() == null || config.getDelayEnd() == null) {
             log.debug("消息发送延迟为空手动设置1000ms - 2000ms");
             delayStart = 500;
             delayEnd = 1000;
@@ -187,18 +200,18 @@ public class SendMsg {
                 try {
                     log.info("开始任务:{}", e.getQwUserName());
                     // 手动切换数据源到配置的租户
-                    tenantDataSourceAspect.switchTenant(tenantId);
+                    sopTenantDataSourceAspect.switchTenant(tenantId);
                     processUser(e, delayStart, delayEnd, miniMap, newCtx);
                 } catch (Exception exception) {
                     log.error("发送错误:", exception);
                 } finally {
                     log.info("删除任务:{}", e.getQwUserName());
                     // 清理数据源
-                    tenantDataSourceAspect.clear();
+                    sopTenantDataSourceAspect.clear();
                     qwMap.remove(e.getId());
                 }
             }, customThreadPool).exceptionally(ex -> {
-                log.error("任务提交失败:{}, 错误: {}", e.getQwUserName(), ex.getMessage());
+                log.error("任务提交失败:{}, 错误: {}", e.getQwUserName(), ex.getMessage(), ex);
                 qwMap.remove(e.getId());
                 return null;
             });
@@ -411,4 +424,66 @@ public class SendMsg {
         long end3 = System.currentTimeMillis();
         log.info("销售执行完成:{}, 耗时:{}", user.getQwUserName(), end3 - start3);
     }
+
+    @Scheduled(fixedDelay = 10000*60*30) // 每30min执行一次
+    public void sendLobsterQwMsg(){
+        log.info("开始龙虾发送企微消息");
+        List<CompanyWorkflowLobsterTask> companyWorkflowLobsterTasks = companyWorkflowLobsterTaskMapper.selectList(new LambdaQueryWrapper<CompanyWorkflowLobsterTask>().eq(CompanyWorkflowLobsterTask::getDelFlag, 0)
+                .between(CompanyWorkflowLobsterTask::getSendTime, LocalDateTime.now().minusMinutes(30), LocalDateTime.now())
+        );
+        for (CompanyWorkflowLobsterTask task : companyWorkflowLobsterTasks){
+            QwUser qwUser = qwUserMapper.selectQwUserById(task.getQwUserId());
+            WxLoginResp login = isLogin(qwUser.getUid(), qwUser.getServerId());
+            WxWorkSendTextMsgDTO dto = new WxWorkSendTextMsgDTO();
+            BaseVo vo = new BaseVo();
+            vo.setUuid(qwUser.getUid());
+            vo.setCorpId(qwUser.getCorpId());
+            vo.setCorpCode(login.getUser_info().getObject().getScorp_id());
+            vo.setServerId(qwUser.getServerId());
+            dto.setUuid(qwUser.getUid());
+            dto.setSend_userid(userIds(vo));//目前没接群聊
+            dto.setContent(task.getTaskContent());
+            dto.setIsRoom(false);
+            WxWorkResponseDTO<WxWorkSendTextMsgRespDTO> wxWorkSendTextMsgRespDTOWxWorkResponseDTO = wxWorkService.SendTextMsg(dto, qwUser.getServerId());
+
+            log.info("开始发送企微消息,内容:{}", wxWorkSendTextMsgRespDTOWxWorkResponseDTO);
+            //todo 发企微,
+            if (wxWorkSendTextMsgRespDTOWxWorkResponseDTO.getErrcode()==0){
+                task.setExecuteStatus(2);
+                log.info("企微发送成功:{}", task.getId());
+            }else {
+                task.setExecuteStatus(3);
+                log.info("企微发送失败:{}", task.getId());
+            }
+        }
+        companyWorkflowLobsterTaskMapper.updateTaskListExecuteStatus(companyWorkflowLobsterTasks);
+
+    }
+    /**
+     * 获取发送对象的userid
+     * @param vo 调用接口参数
+     * @return 返回的userid
+     */
+    public Long userIds(BaseVo vo){
+        WxWorkUserId2VidDTO wxWorkUserId2VidDTO = new WxWorkUserId2VidDTO();
+        wxWorkUserId2VidDTO.setOpenid(Collections.singletonList(vo.getExId()));
+        wxWorkUserId2VidDTO.setCorpid(vo.getCorpId());
+        wxWorkUserId2VidDTO.setScorpid(vo.getCorpCode());
+        wxWorkUserId2VidDTO.setUuid(vo.getUuid());
+        WxWorkResponseDTO<List<WxWorkVid2UserIdRespDTO>> WxWorkVid2UserIdRespDTO = wxWorkService.UserId2Vid(wxWorkUserId2VidDTO, vo.getServerId());
+        List<WxWorkVid2UserIdRespDTO> data = WxWorkVid2UserIdRespDTO.getData();
+        if(data.isEmpty()) {
+            log.error("未找到用户数据,基础数据:{},请求数据:{},返回数据:{}", vo, JSON.toJSONString(wxWorkUserId2VidDTO), JSON.toJSONString(WxWorkVid2UserIdRespDTO));
+            throw new BaseException("未找到用户:" + vo.getId());
+        }
+        return data.get(0).getUser_id();
+    }
+
+    public WxLoginResp isLogin(String uuid, Long serverId){
+        WxLoginDTO dto = new WxLoginDTO();
+        dto.setUuid(uuid);
+        WxWorkResponseDTO<WxLoginResp> result = wxWorkServiceNew.isLogin(dto, serverId);
+        if(result.getErrcode() != 0) throw new BaseException("验证登录失败:" + result.getErrmsg());
+        return result.getData();
+    }
 }

+ 1 - 6
fs-ipad-task/src/main/java/com/fs/framework/aspectj/TenantDataSourceAspect.java → fs-ipad-task/src/main/java/com/fs/framework/aspectj/SopTenantDataSourceAspect.java

@@ -5,10 +5,8 @@ import com.fs.common.annotation.TenantDataScope;
 import com.fs.common.core.redis.RedisCacheT;
 import com.fs.common.enums.TenantIdType;
 import com.fs.common.exception.CustomException;
-import com.fs.common.utils.StringUtils;
 import com.fs.framework.datasource.DynamicDataSource;
 import com.fs.framework.datasource.DynamicDataSourceContextHolder;
-import com.fs.huifuPay.sdk.opps.core.exception.BasePayException;
 import com.fs.tenant.domain.TenantInfo;
 import com.fs.tenant.mapper.TenantInfoMapper;
 import lombok.extern.slf4j.Slf4j;
@@ -17,9 +15,6 @@ import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Pointcut;
 import org.aspectj.lang.reflect.MethodSignature;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.annotation.AnnotationUtils;
@@ -42,7 +37,7 @@ import java.util.concurrent.ConcurrentHashMap;
 @Aspect
 @Order(1)
 @Component
-public class TenantDataSourceAspect {
+public class SopTenantDataSourceAspect {
     private static final String TENANT_KEY = "tenant:info:";
     @Resource
     private DynamicDataSource dynamicDataSource;

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

@@ -4,6 +4,6 @@ server:
 # Spring配置
 spring:
   profiles:
-    active: dev
+    active: dev-test
 group-no: 1
-tenant-id: 11
+tenant-id: 29

+ 45 - 0
fs-service/src/main/java/com/fs/company/domain/CompanyLobsterTagUserRel.java

@@ -0,0 +1,45 @@
+package com.fs.company.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 龙虾标签-企微客户关联表
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CompanyLobsterTagUserRel extends BaseEntity {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 公司ID(租户隔离) */
+    private Long companyId;
+
+    /** 标签模板绑定ID */
+    private Long bindingId;
+
+    /** 标签编码(冗余) */
+    private String tagCode;
+
+    /** 工作流模板ID(冗余) */
+    private Long templateId;
+
+    /** 企微外部联系人ID */
+    private Long externalContactId;
+
+    /** 企微主体id */
+    private String corpId;
+
+    /** 销售id */
+    private Long companyUserId;
+
+    /** 企微用户id */
+    private Long qwUserId;
+
+    /** 删除标志 */
+    private Integer delFlag;
+}

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

@@ -6,6 +6,10 @@ import com.fs.common.core.domain.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.sql.Time;
+import java.time.LocalTime;
+import java.util.Date;
+
 /**
  * 工作流龙虾节点
  */
@@ -36,5 +40,7 @@ public class CompanyWorkflowLobsterNode extends BaseEntity {
 
     private String greetingConfig;
 
+    private LocalTime sendTime;
+
     private Integer delFlag;
 }

+ 89 - 0
fs-service/src/main/java/com/fs/company/domain/CompanyWorkflowLobsterTask.java

@@ -0,0 +1,89 @@
+package com.fs.company.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 龙虾工作流模板自动任务表
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+public class CompanyWorkflowLobsterTask extends BaseEntity {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 公司ID(租户隔离) */
+    private Long companyId;
+
+    /** 工作流模板ID */
+    private Long templateId;
+
+    /** 任务名称 */
+    private String taskName;
+
+    /** 任务类型: '1开始 2消息 3判断 4等待 5结束 6API调用' */
+    private Integer taskType;
+
+    /** 任务内容(JSON格式,存储节点配置参数) */
+    private String taskContent;
+
+    /** Cron表达式(定时触发用) */
+    private String cronExpression;
+
+    /** 执行状态:0-待执行, 1-执行中, 2-执行成功, 3-执行失败, 4-已取消, 5-已过期 */
+    private Integer executeStatus;
+
+    /** 已执行次数 */
+    private Integer executeCount;
+
+    /** 最大重试次数(0表示不重试) */
+    private Integer maxRetry;
+
+    /** 已重试次数 */
+    private Integer retryCount;
+
+    /** 上次执行时间 */
+    private Date lastExecuteTime;
+
+    /** 下次执行时间 */
+    private Date nextExecuteTime;
+
+    /** 失败原因 */
+    private String failReason;
+
+    /** 排序号 */
+    private Integer sortOrder;
+
+    /** 删除标志:0-正常, 1-已删除 */
+    private Integer delFlag;
+
+    /**
+     * 企微主体
+     */
+    private String corpId;
+
+    /**
+     * 销售id
+     */
+    private Long companyUserId;
+
+    /**
+     * 节点id
+     */
+    private Long lobsterNodeId;
+
+    private LocalDateTime sendTime; // 发送时间
+
+    private Long qwUserId; // 企微用户id
+
+    private Long bindingId;
+}

+ 15 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyLobsterTagUserRelMapper.java

@@ -0,0 +1,15 @@
+package com.fs.company.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyLobsterTagUserRel;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface CompanyLobsterTagUserRelMapper extends BaseMapper<CompanyLobsterTagUserRel> {
+
+    int batchInsert(@Param("list") List<CompanyLobsterTagUserRel> list);
+
+    void updateBatchRelBybinding(@Param("id") Long id,@Param("flag") Integer unDelFlag);
+
+}

+ 9 - 7
fs-service/src/main/java/com/fs/company/mapper/CompanyTagTemplateBindingMapper.java

@@ -7,23 +7,25 @@ import org.apache.ibatis.annotations.Param;
 import java.util.List;
 
 public interface CompanyTagTemplateBindingMapper extends BaseMapper<CompanyTagTemplateBinding> {
-    
+
     List<CompanyTagTemplateBinding> selectBindingList(@Param("companyId") Long companyId,
                                                        @Param("tagCode") String tagCode,
                                                        @Param("templateId") Long templateId);
-    
+
     int insertBinding(CompanyTagTemplateBinding entity);
-    
+
     CompanyTagTemplateBinding selectBindingByIdAndCompanyId(@Param("id") Long id, @Param("companyId") Long companyId);
-    
+
     int updateBindingById(CompanyTagTemplateBinding entity);
-    
+
     int logicalDeleteById(@Param("id") Long id, @Param("companyId") Long companyId);
-    
+
     List<CompanyTagTemplateBinding> selectMatchedTemplates(@Param("companyId") Long companyId,
                                                             @Param("tagCodes") List<String> tagCodes);
-    
+
     int batchBind(@Param("companyId") Long companyId,
                   @Param("templateId") Long templateId,
                   @Param("tagCodes") List<String> tagCodes);
+
+    List<CompanyTagTemplateBinding> listByStatus(@Param("companyId") Long companyId,@Param("status") Integer status);
 }

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

@@ -12,4 +12,6 @@ public interface CompanyWorkflowLobsterEdgeMapper extends BaseMapper<CompanyWork
     int deleteByWorkflowId(@Param("workflowId") Long workflowId);
 
     List<CompanyWorkflowLobsterEdge> selectByWorkflowId(@Param("workflowId") Long workflowId);
+
+    int updateById(@Param("entity") CompanyWorkflowLobsterEdge entity);
 }

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

@@ -16,4 +16,6 @@ public interface CompanyWorkflowLobsterMapper extends BaseMapper<CompanyWorkflow
     int updateTemplateById(CompanyWorkflowLobster entity);
 
     int logicalDeleteById(@Param("id") Long id, @Param("companyId") Long companyId);
+
+    List<CompanyWorkflowLobster> selectTemplateListByStatus(@Param("companyId") Long companyId,@Param("status") Integer status);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyWorkflowLobsterNodeMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.company.domain.CompanyWorkflowLobsterNode;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public interface CompanyWorkflowLobsterNodeMapper extends BaseMapper<CompanyWorkflowLobsterNode> {
@@ -12,4 +13,8 @@ public interface CompanyWorkflowLobsterNodeMapper extends BaseMapper<CompanyWork
     int deleteByWorkflowId(@Param("workflowId") Long workflowId);
 
     List<CompanyWorkflowLobsterNode> selectByWorkflowId(@Param("workflowId") Long workflowId);
+
+    void updateBatch(@Param("list") ArrayList<CompanyWorkflowLobsterNode> nodesNew);
+
+    int checkNodeGreeting(@Param("templateId") Long templateId);
 }

+ 38 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyWorkflowLobsterTaskMapper.java

@@ -0,0 +1,38 @@
+package com.fs.company.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyWorkflowLobsterTask;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface CompanyWorkflowLobsterTaskMapper extends BaseMapper<CompanyWorkflowLobsterTask> {
+
+    CompanyWorkflowLobsterTask selectByIdAndCompanyId(@Param("id") Long id, @Param("companyId") Long companyId);
+
+    List<CompanyWorkflowLobsterTask> selectByTemplateId(@Param("templateId") Long templateId,
+                                                         @Param("companyId") Long companyId);
+
+    List<CompanyWorkflowLobsterTask> selectPendingTasks(@Param("companyId") Long companyId,
+                                                         @Param("beforeTime") Date beforeTime,
+                                                         @Param("limit") Integer limit);
+
+    int insertTask(CompanyWorkflowLobsterTask entity);
+
+    int updateTaskById(CompanyWorkflowLobsterTask entity);
+
+    int updateExecuteStatus(@Param("id") Long id,
+                            @Param("executeStatus") Integer executeStatus,
+                            @Param("failReason") String failReason,
+                            @Param("lastExecuteTime") Date lastExecuteTime,
+                            @Param("nextExecuteTime") Date nextExecuteTime);
+
+    int logicalDeleteById(@Param("id") Long id, @Param("companyId") Long companyId);
+
+    int batchInsert(@Param("list") List<CompanyWorkflowLobsterTask> list);
+
+    void updateDelFlagByBinding(@Param("id") Long id, @Param("flag") Integer unDelFlag);
+
+    void updateTaskListExecuteStatus(List<CompanyWorkflowLobsterTask> companyWorkflowLobsterTasks);
+}

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

@@ -12,4 +12,6 @@ public interface CompanyWorkflowLobsterVariableMapper extends BaseMapper<Company
     int deleteByWorkflowId(@Param("workflowId") Long workflowId);
 
     List<CompanyWorkflowLobsterVariable> selectByWorkflowId(@Param("workflowId") Long workflowId);
+
+    int updateById(@Param("entity") CompanyWorkflowLobsterVariable entity);
 }

+ 26 - 0
fs-service/src/main/java/com/fs/company/param/BatchBindLobsterTagParam.java

@@ -0,0 +1,26 @@
+package com.fs.company.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 批量添加龙虾标签给企微客户参数
+ */
+@Data
+public class BatchBindLobsterTagParam implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 企微外部联系人ID列表 */
+    private List<Long> userIds;
+
+    /** 标签编码列表 */
+    private List<String> tagCodes;
+
+    /** 企微公司ID */
+    private String qwCorpId;
+
+
+}

+ 2 - 0
fs-service/src/main/java/com/fs/company/param/CompanyWorkflowLobsterEdgeParam.java

@@ -11,6 +11,8 @@ import java.io.Serializable;
 public class CompanyWorkflowLobsterEdgeParam implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    /** 主键ID */
+    private Long id;
     /** 连线唯一标识 */
     private String edgeKey;
     

+ 5 - 0
fs-service/src/main/java/com/fs/company/param/CompanyWorkflowLobsterNodeParam.java

@@ -1,13 +1,17 @@
 package com.fs.company.param;
 
+import cn.hutool.core.date.DateTime;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.time.LocalTime;
+import java.util.Date;
 
 @Data
 public class CompanyWorkflowLobsterNodeParam implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    private Long id;
     private String nodeCode;
     private String nodeName;
     private Integer nodeType;
@@ -17,4 +21,5 @@ public class CompanyWorkflowLobsterNodeParam implements Serializable {
     private String conditionExpr;
     private String nodeConfig;
     private String greetingConfig;
+    private LocalTime sendTime;
 }

+ 1 - 0
fs-service/src/main/java/com/fs/company/param/CompanyWorkflowLobsterVariableParam.java

@@ -8,6 +8,7 @@ import java.io.Serializable;
 public class CompanyWorkflowLobsterVariableParam implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    private Long id;
     private String varCode;
     private String varName;
     private String varType;

+ 15 - 8
fs-service/src/main/java/com/fs/company/service/ICompanyTagTemplateBindingService.java

@@ -7,44 +7,51 @@ import java.util.List;
 import java.util.Map;
 
 public interface ICompanyTagTemplateBindingService {
-    
+
     /**
      * 查询标签绑定列表
      */
     List<CompanyTagTemplateBinding> listBinding(Long companyId, String tagCode, Long templateId);
-    
+
     /**
      * 根据ID查询绑定
      */
     CompanyTagTemplateBinding getBindingById(Long companyId, Long id);
-    
+
     /**
      * 新增绑定
      */
     AjaxResult addBinding(Long companyId, String userName, CompanyTagTemplateBinding binding);
-    
+
     /**
      * 修改绑定
      */
     AjaxResult updateBinding(Long companyId, String userName, CompanyTagTemplateBinding binding);
-    
+
     /**
      * 删除绑定
      */
     AjaxResult deleteBinding(Long companyId, String userName, Long id);
-    
+
     /**
      * 批量绑定
      */
     AjaxResult batchBind(Long companyId, String userName, Long templateId, List<String> tagCodes);
-    
+
     /**
      * 根据用户标签匹配模板
      */
     Map<String, Object> matchTemplate(Long companyId, List<String> userTags);
-    
+
     /**
      * 测试标签匹配
      */
     Map<String, Object> testMatch(Long companyId, Long id, Map<String, Object> testTags);
+
+    List<CompanyTagTemplateBinding> listByStatus(Long companyId, Integer status);
+
+    /**
+     * 批量添加龙虾标签给企微客户
+     */
+    AjaxResult batchBindLobsterTag(Long companyId, String userName, String qwCorpId, List<Long> externalContactIds, List<String> tagCodes,Long companyUserId);
 }

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

@@ -59,4 +59,8 @@ public interface ICompanyWorkflowLobsterService {
      * 保存画布数据(包含节点位置、连线等可视化信息)
      */
     AjaxResult saveCanvas(Long companyId, String userName, Long templateId, CompanyWorkflowLobsterCanvasParam param);
+
+    AjaxResult updateTemplateStatus(Long companyId, String username, Long templateId, Integer status);
+
+    List<CompanyWorkflowLobster> listTemplateByStatus(Long companyId, Integer status);
 }

+ 274 - 5
fs-service/src/main/java/com/fs/company/service/impl/CompanyTagTemplateBindingServiceImpl.java

@@ -1,15 +1,37 @@
 package com.fs.company.service.impl;
 
+import cn.hutool.core.map.MapUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
-import com.fs.company.domain.CompanyTagTemplateBinding;
-import com.fs.company.mapper.CompanyTagTemplateBindingMapper;
+import com.fs.company.domain.*;
+import com.fs.company.mapper.*;
 import com.fs.company.service.ICompanyTagTemplateBindingService;
+import com.fs.qw.domain.QwExternalContact;
+import com.fs.qw.mapper.QwExternalContactMapper;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 标签模板绑定Service实现
@@ -17,8 +39,23 @@ import java.util.*;
 @Service
 public class CompanyTagTemplateBindingServiceImpl implements ICompanyTagTemplateBindingService {
 
+    private static final Logger log = LoggerFactory.getLogger(CompanyTagTemplateBindingServiceImpl.class);
     @Autowired
     private CompanyTagTemplateBindingMapper tagTemplateBindingMapper;
+    @Autowired
+    private CompanyWorkflowLobsterNodeMapper companyWorkflowLobsterNodeMapper;
+    @Autowired
+    private CompanyWorkflowLobsterMapper companyWorkflowLobsterMapper;
+    @Autowired
+    private CompanyWorkflowLobsterServiceImpl workflowService;
+    @Autowired
+    private RedissonClient redissonClient;
+    @Autowired
+    private CompanyLobsterTagUserRelMapper companyLobsterTagUserRelMapper;
+    @Autowired
+    private CompanyWorkflowLobsterTaskMapper companyWorkflowLobsterTaskMapper;
+    @Autowired
+    private QwExternalContactMapper qwExternalContactMapper;
 
     @Override
     public List<CompanyTagTemplateBinding> listBinding(Long companyId, String tagCode, Long templateId) {
@@ -34,7 +71,7 @@ public class CompanyTagTemplateBindingServiceImpl implements ICompanyTagTemplate
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult addBinding(Long companyId, String userName, CompanyTagTemplateBinding binding) {
         binding.setCompanyId(companyId);
-        binding.setStatus(1);
+        binding.setStatus(0);
         binding.setDelFlag(0);
         binding.setCreateBy(userName);
         binding.setCreateTime(DateUtils.getNowDate());
@@ -45,6 +82,11 @@ public class CompanyTagTemplateBindingServiceImpl implements ICompanyTagTemplate
         return result > 0 ? AjaxResult.success("新增成功") : AjaxResult.error("新增失败");
     }
 
+    @Value("${lobster.init.node.key:fastgpt-zTwq4M6jZ6R3fZsnMPUOVRm0Mo0o0I5BqoaHA8QHYoCUT6OD6uXuimhJHBH6q2l0B}")
+    private String appKey;
+    private static final Integer UN_DEL_FLAG = 0;
+    private static final Integer DO_DEL_FLAG = 1;
+    private static final String INIT_NODE_KEY = "LOBSTER:INIT:NODE:TEMPLATE:ID:";
     @Override
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult updateBinding(Long companyId, String userName, CompanyTagTemplateBinding binding) {
@@ -55,11 +97,122 @@ public class CompanyTagTemplateBindingServiceImpl implements ICompanyTagTemplate
 
         binding.setUpdateBy(userName);
         binding.setUpdateTime(DateUtils.getNowDate());
-
+        binding.setCompanyId(companyId);
         int result = tagTemplateBindingMapper.updateBindingById(binding);
+        // 如果是状态启用,生成工作流消息节点的具体内容
+        if (exist.getStatus() == 0 && binding.getStatus() == 1) {
+            List<CompanyLobsterTagUserRel> rels = companyLobsterTagUserRelMapper.selectList(new LambdaQueryWrapper<CompanyLobsterTagUserRel>().eq(CompanyLobsterTagUserRel::getBindingId, binding.getId())
+                    .eq(CompanyLobsterTagUserRel::getDelFlag, DO_DEL_FLAG));
+            if (rels != null && !rels.isEmpty()){
+                companyLobsterTagUserRelMapper.updateBatchRelBybinding(binding.getId(), UN_DEL_FLAG);
+                companyWorkflowLobsterTaskMapper.updateDelFlagByBinding(binding.getId(), UN_DEL_FLAG);
+            }
+            String lockKey = INIT_NODE_KEY + exist.getTemplateId();
+            asyncInitMsgNodeWithLock(companyId, exist.getTemplateId(), lockKey);
+        }else if (exist.getStatus() == 1 && binding.getStatus() == 0) {
+            List<CompanyLobsterTagUserRel> rels = companyLobsterTagUserRelMapper.selectList(new LambdaQueryWrapper<CompanyLobsterTagUserRel>().eq(CompanyLobsterTagUserRel::getBindingId, binding.getId())
+                    .eq(CompanyLobsterTagUserRel::getDelFlag, UN_DEL_FLAG));
+            if (rels != null && !rels.isEmpty()){
+                companyLobsterTagUserRelMapper.updateBatchRelBybinding(binding.getId(), DO_DEL_FLAG);
+                companyWorkflowLobsterTaskMapper.updateDelFlagByBinding(binding.getId(), DO_DEL_FLAG);
+            }
+        }
         return result > 0 ? AjaxResult.success("修改成功") : AjaxResult.error("修改失败");
     }
 
+    @Async
+    public void lobsterMsgNodeInit(Long companyId, Long templateId) {
+        List<CompanyWorkflowLobsterNode> nodes = companyWorkflowLobsterNodeMapper.selectList(new LambdaQueryWrapper<CompanyWorkflowLobsterNode>()
+                .eq(CompanyWorkflowLobsterNode::getWorkflowId, templateId).eq(CompanyWorkflowLobsterNode::getDelFlag, UN_DEL_FLAG)
+                .isNull(CompanyWorkflowLobsterNode::getGreetingConfig));
+        if (nodes == null || nodes.isEmpty()) {
+            log.info("没有需要生成的节点");
+            return;
+        }
+
+        List<CompanyWorkflowLobsterNode> msgNodes = nodes.stream()
+                .filter(node -> node.getNodeType().equals(2))
+                .collect(Collectors.toList());
+
+        if (msgNodes.isEmpty()) {
+            log.info("没有消息节点需要生成");
+            return;
+        }
+
+        int threadCount = Math.min(msgNodes.size(), 8);
+        ExecutorService executor = Executors.newFixedThreadPool(threadCount);
+
+        try {
+            ArrayList<CompanyWorkflowLobsterNode> nodesNew =(new ArrayList<>());
+
+            List<CompletableFuture<Void>> futures = msgNodes.stream()
+                    .map(node -> CompletableFuture.runAsync(() -> {
+                        try {
+                            String requestStr = "{ \"userContent\": \"" + node.getMessageTemplate()
+                                    + "\", \"aiContent\": null,\"userInfo\" : null ,\"aiInfo\" : null,\"history\" : null}";
+                            R r = workflowService.callAiService(requestStr, node.getId(), appKey);
+
+                            CompanyWorkflowLobsterNode nodeNew = new CompanyWorkflowLobsterNode();
+                            nodeNew.setId(node.getId());
+                            try {
+                                ObjectMapper mapper = new ObjectMapper();
+                                JsonNode root = mapper.readTree(mapper.writeValueAsString(r));
+                                JsonNode aiContent = root.path("data")
+                                        .path("choices")
+                                        .path(0)
+                                        .path("message")
+                                        .path("content");
+                                if (aiContent.isTextual()) {
+                                    aiContent = mapper.readTree(aiContent.asText()).path("aiContent");
+                                }
+                                log.info("{}节点生成消息成功:{}", node.getId(), aiContent.asText());
+                                if (!aiContent.isNull()) {
+                                    nodeNew.setGreetingConfig(aiContent.asText());
+                                }
+                            } catch (Exception e) {
+                                log.error("提取AI返回aiContent失败, nodeId={}", node.getId(), e);
+                            }
+                            nodesNew.add(nodeNew);
+                        } catch (Exception e) {
+                            log.error("调用AI服务失败, nodeId={}", node.getId(), e);
+                        }
+                    }, executor))
+                    .collect(Collectors.toList());
+
+            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
+
+            if (!nodesNew.isEmpty()) {
+                companyWorkflowLobsterNodeMapper.updateBatch(nodesNew);
+            }
+        } finally {
+            executor.shutdown();
+        }
+    }
+
+    /**
+     * 异步初始化消息节点(带分布式锁,防重复)
+     */
+    @Async
+    public void asyncInitMsgNodeWithLock(Long companyId, Long templateId, String lockKey) {
+        RLock lock = redissonClient.getLock(lockKey);
+        boolean locked = false;
+        try {
+            locked = lock.tryLock(3, TimeUnit.SECONDS);
+            if (locked) {
+                lobsterMsgNodeInit(companyId, templateId);
+            } else {
+                log.warn("获取锁失败,跳过节点初始化, lockKey={}", lockKey);
+            }
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            log.error("获取锁被中断, lockKey={}", lockKey, e);
+        } finally {
+            if (locked && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult deleteBinding(Long companyId, String userName, Long id) {
@@ -67,7 +220,14 @@ public class CompanyTagTemplateBindingServiceImpl implements ICompanyTagTemplate
         if (exist == null) {
             return AjaxResult.error("绑定关系不存在");
         }
-
+        if (exist.getStatus() == 1) {
+            List<CompanyLobsterTagUserRel> rels = companyLobsterTagUserRelMapper.selectList(new LambdaQueryWrapper<CompanyLobsterTagUserRel>().eq(CompanyLobsterTagUserRel::getBindingId, exist.getId())
+                    .eq(CompanyLobsterTagUserRel::getDelFlag, UN_DEL_FLAG));
+            if (rels != null && !rels.isEmpty()){
+                companyLobsterTagUserRelMapper.updateBatchRelBybinding(exist.getId(), DO_DEL_FLAG);
+                companyWorkflowLobsterTaskMapper.updateDelFlagByBinding(exist.getId(), DO_DEL_FLAG);
+            }
+        }
         int result = tagTemplateBindingMapper.logicalDeleteById(id, companyId);
         return result > 0 ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
     }
@@ -145,4 +305,113 @@ public class CompanyTagTemplateBindingServiceImpl implements ICompanyTagTemplate
 
         return result;
     }
+
+    @Override
+    public List<CompanyTagTemplateBinding> listByStatus(Long companyId, Integer status) {
+        List<CompanyTagTemplateBinding> bindings = tagTemplateBindingMapper.listByStatus(companyId, status);
+        for (CompanyTagTemplateBinding binding : bindings){
+            int i = companyWorkflowLobsterNodeMapper.checkNodeGreeting(binding.getTemplateId());
+            if (i>0){
+                bindings.remove( binding);
+            }
+        }
+        return bindings;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult batchBindLobsterTag(Long companyId, String userName, String qwCorpId, List<Long> externalContactIds,
+                                           List<String> tagCodes,Long companyUserId) {
+        if (externalContactIds == null || externalContactIds.isEmpty()) {
+            return AjaxResult.error("请勾选需要添加龙虾标签的客户");
+        }
+        if (tagCodes == null || tagCodes.isEmpty()) {
+            return AjaxResult.error("请选择龙虾标签");
+        }
+
+        // 根据 tagCode 查询已启用的绑定关系
+        List<CompanyTagTemplateBinding> bindings = tagTemplateBindingMapper.listByStatus(companyId, 1);
+        if (bindings == null || bindings.isEmpty()) {
+            return AjaxResult.error("没有已启用的标签绑定关系");
+        }
+
+        // 筛选传入的 tagCodes 对应的绑定
+        List<CompanyTagTemplateBinding> targetBindings = bindings.stream()
+                .filter(b -> tagCodes.contains(b.getTagCode()))
+                .collect(Collectors.toList());
+        if (targetBindings.isEmpty()) {
+            return AjaxResult.error("所选标签没有已启用的绑定关系");
+        }
+
+        // 验证每个绑定的模板状态为启用(status=1)
+        for (CompanyTagTemplateBinding binding : targetBindings) {
+            CompanyWorkflowLobster template = companyWorkflowLobsterMapper
+                    .selectTemplateByIdAndCompanyId(binding.getTemplateId(), companyId);
+            if (template == null || template.getStatus() == null || template.getStatus() != 1) {
+                return AjaxResult.error("模板【" + binding.getTemplateName() + "】未启用,无法添加标签【" + binding.getTagCode() + "】");
+            }
+        }
+
+        List<Long> bindingIds = targetBindings.stream().map(CompanyTagTemplateBinding::getId).collect(Collectors.toList());
+        int count =  companyLobsterTagUserRelMapper.selectCount(new LambdaQueryWrapper<CompanyLobsterTagUserRel>().in(CompanyLobsterTagUserRel::getBindingId, bindingIds)
+                .in(CompanyLobsterTagUserRel::getExternalContactId, externalContactIds).eq(CompanyLobsterTagUserRel::getDelFlag, 0));
+        if (count>0){
+            return AjaxResult.error("无法重复绑定龙虾标签");
+        }
+
+        // 构建中间表数据
+        Date now = new Date();
+        List<CompanyLobsterTagUserRel> relList = new ArrayList<>();
+        ArrayList<CompanyWorkflowLobsterTask> tasks = new ArrayList<>();
+        Map<Long, Long> collect = qwExternalContactMapper.selectQwExternalContactByIds(externalContactIds)
+                .stream()
+                .collect(Collectors.toMap(
+                        QwExternalContact::getId,
+                        QwExternalContact::getQwUserId
+                ));
+        for (CompanyTagTemplateBinding binding : targetBindings) {
+            List<CompanyWorkflowLobsterNode> nodes = companyWorkflowLobsterNodeMapper.selectList(new LambdaQueryWrapper<CompanyWorkflowLobsterNode>()
+                    .eq(CompanyWorkflowLobsterNode::getWorkflowId, binding.getTemplateId()).eq(CompanyWorkflowLobsterNode::getNodeType, 2)
+                    .eq(CompanyWorkflowLobsterNode::getDelFlag, 0));
+            externalContactIds.forEach(externalContactId ->{
+                Long qwUserId = collect.get(externalContactId);
+                CompanyLobsterTagUserRel rel = new CompanyLobsterTagUserRel();
+                rel.setCompanyId(companyId);
+                rel.setBindingId(binding.getId());
+                rel.setTagCode(binding.getTagCode());
+                rel.setTemplateId(binding.getTemplateId());
+                rel.setExternalContactId(externalContactId);
+                rel.setCreateBy(userName);
+                rel.setCreateTime(now);
+                rel.setCorpId(qwCorpId);
+                rel.setCompanyUserId(companyUserId);
+                rel.setQwUserId(qwUserId);
+                relList.add(rel);
+                if (!nodes.isEmpty()){
+
+                    nodes.forEach(node ->{
+                        CompanyWorkflowLobsterTask task = new CompanyWorkflowLobsterTask();
+                        task.setCompanyId(companyId).setCompanyUserId(companyUserId).setCorpId(qwCorpId)
+                                .setTemplateId(binding.getTemplateId()).setTaskName(binding.getTemplateName())
+                                .setTaskType(2).setTaskContent(node.getGreetingConfig()).setTaskName("龙虾企微发消息")
+                                .setQwUserId(qwUserId).setBindingId(binding.getId()).setLobsterNodeId(node.getId());
+                        task.setSendTime(getSendTimeNode(node));
+                        tasks.add(task);
+                    });
+                }
+
+            });
+        }
+        companyLobsterTagUserRelMapper.batchInsert(relList);
+        companyWorkflowLobsterTaskMapper.batchInsert(tasks);
+        log.info("批量添加龙虾标签成功, companyId={}, externalContactCount={}, tagCount={}, relCount={}",
+                companyId, externalContactIds.size(), targetBindings.size(), relList.size());
+        return AjaxResult.success("已为 " + externalContactIds.size() + " 个客户添加 " + targetBindings.size() + " 个龙虾标签");
+    }
+
+    private LocalDateTime getSendTimeNode(CompanyWorkflowLobsterNode node) {
+        Integer days = Integer.valueOf(node.getNodeCode().substring(4));
+        LocalDate date = LocalDate.now().plusDays(days);
+        return LocalDateTime.of(date, node.getSendTime());
+    }
 }

+ 136 - 34
fs-service/src/main/java/com/fs/company/service/impl/CompanyWorkflowLobsterServiceImpl.java

@@ -8,6 +8,7 @@ import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.CompanyWorkflowLobster;
+import com.fs.company.domain.CompanyTagTemplateBinding;
 import com.fs.company.domain.CompanyWorkflowLobsterEdge;
 import com.fs.company.domain.CompanyWorkflowLobsterNode;
 import com.fs.company.domain.CompanyWorkflowLobsterRecord;
@@ -17,6 +18,7 @@ import com.fs.company.mapper.CompanyWorkflowLobsterMapper;
 import com.fs.company.mapper.CompanyWorkflowLobsterNodeMapper;
 import com.fs.company.mapper.CompanyWorkflowLobsterRecordMapper;
 import com.fs.company.mapper.CompanyWorkflowLobsterVariableMapper;
+import com.fs.company.mapper.CompanyTagTemplateBindingMapper;
 import com.fs.company.param.CompanyWorkflowLobsterCanvasParam;
 import com.fs.company.param.CompanyWorkflowLobsterConfirmParam;
 import com.fs.company.param.CompanyWorkflowLobsterEdgeParam;
@@ -26,18 +28,24 @@ import com.fs.company.param.CompanyWorkflowLobsterVariableParam;
 import com.fs.company.service.ICompanyWorkflowLobsterService;
 import com.fs.fastgptApi.param.ChatParam;
 import com.fs.fastgptApi.service.ChatService;
+import com.fs.wxwork.dto.WxWorkSendTextMsgDTO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 
+import java.sql.Time;
 import java.util.*;
 import java.util.stream.Collectors;
 
+
 @Service
 public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobsterService {
 
+    private static final Logger log = LoggerFactory.getLogger(CompanyWorkflowLobsterServiceImpl.class);
     @Autowired
     private CompanyWorkflowLobsterMapper lobsterMapper;
     @Autowired
@@ -48,6 +56,8 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
     private CompanyWorkflowLobsterRecordMapper recordMapper;
     @Autowired
     private CompanyWorkflowLobsterEdgeMapper edgeMapper;
+    @Autowired
+    private CompanyTagTemplateBindingMapper tagBindingMapper;
 
     @Override
     public List<CompanyWorkflowLobster> listTemplate(Long companyId, Integer page, Integer size) {
@@ -81,12 +91,13 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
         record.setDelFlag(0);
         String requestStr = "{ \"userContent\": \""+param.getRequirement()+"\", \"aiContent\": null }";
         R r = callAiService(requestStr, l, LOBSTER_KEY);
+        log.info("流程图生成成功: {}", param.getRequirement());
 //        System.out.println(r);
         record.setResultJson(buildResultJsonFromAi(r, param.getRequirement()));
         recordMapper.insertRecord(record);
         return recordNo;
     }
-    private static R callAiService(String requestParam, Long logId, String appKey) {
+    public static R callAiService(String requestParam, Long logId, String appKey) {
         try {
             ChatParam param = new ChatParam();
             param.setChatId(logId.toString());
@@ -257,7 +268,7 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
         );
 
         Map<String, Object> map = new HashMap<>();
-        map.put("status", 3);
+        map.put("status", template.getStatus());
         map.put("errorMsg", null);
         map.put("templateId", template.getId());
         map.put("templateCode", template.getTemplateCode());
@@ -281,9 +292,9 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
                 variableMap("follow_date", "跟进日期", "date", "manual", 0, "计划跟进时间")
         ));
         result.put("nodes", Arrays.asList(
-                nodeMap("START", "开始节点", 1, 1, "MSG_1", "", "", "{}"),
-                nodeMap("MSG_1", "消息节点", 2, 2, "END", "生成失败,请重新编写提示词", "", "{}"),
-                nodeMap("END", "结束节点", 5, 3, "", "", "", "{}")
+                nodeMap("START", "开始节点", 1, 1, "MSG_1", "", "", "{}", null),
+                nodeMap("MSG_1", "消息节点", 2, 2, "END", "生成失败,请重新编写提示词", "", "{}", null),
+                nodeMap("END", "结束节点", 5, 3, "", "", "", "{}", null)
         ));
         // 默认连线:START -> MSG_1 -> END
         result.put("edges", Arrays.asList(
@@ -325,7 +336,7 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
             }
 
             List<Map<String, Object>> nodes = new ArrayList<>();
-            nodes.add(nodeMap("START", "开始节点", 1, 1, "", "", "", "{}"));
+            nodes.add(nodeMap("START", "开始节点", 1, 1, "", "", "", "{}", null));
 
             int sortNo = 2;
             List<String> dayCodes = new ArrayList<>();
@@ -343,7 +354,8 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
                 String nodeCode = "DAY_" + day;
                 dayCodes.add(nodeCode);
                 String template = itemMap.get("content") == null ? "" : String.valueOf(itemMap.get("content"));
-                nodes.add(nodeMap(nodeCode, "第" + day + "天", 2, sortNo++, "", template, "", "{}"));
+                Object sendTime = itemMap.get("sendTime");
+                nodes.add(nodeMap(nodeCode, "第" + day + "天", 2, sortNo++, "", template, "", "{}", sendTime));
             }
 
             if (dayCodes.isEmpty()) {
@@ -371,7 +383,7 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
                 edges.add(edgeMap(edgeKey, currentCode, nextCode, "right", "left", "", "#999", ""));
             }
 
-            nodes.add(nodeMap("END", "结束节点", 5, sortNo, "", "", "", "{}"));
+            nodes.add(nodeMap("END", "结束节点", 5, sortNo, "", "", "", "{}", null));
 
             Map<String, Object> result = new HashMap<>();
             result.put("templateName", "AI生成工作流方案");
@@ -400,7 +412,7 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
         return m;
     }
 
-    private Map<String, Object> nodeMap(String nodeCode, String nodeName, Integer nodeType, Integer sortNo, String nextNodeCode, String messageTemplate, String conditionExpr, String nodeConfig) {
+    private Map<String, Object> nodeMap(String nodeCode, String nodeName, Integer nodeType, Integer sortNo, String nextNodeCode, String messageTemplate, String conditionExpr, String nodeConfig, Object sendTime) {
         Map<String, Object> m = new HashMap<>();
         m.put("nodeCode", nodeCode);
         m.put("nodeName", nodeName);
@@ -410,6 +422,7 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
         m.put("messageTemplate", messageTemplate);
         m.put("conditionExpr", conditionExpr);
         m.put("nodeConfig", nodeConfig);
+        m.put("sendTime", sendTime);
         return m;
     }
 
@@ -527,6 +540,12 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
             return AjaxResult.error("模板不存在");
         }
 
+        // 检查是否存在绑定的标签,有则提示先删除绑定
+        List<CompanyTagTemplateBinding> bindings = tagBindingMapper.selectBindingList(companyId, null, templateId);
+        if (bindings != null && !bindings.isEmpty()) {
+            return AjaxResult.error("已存在绑定标签,请先删除绑定关系");
+        }
+
         // 更新模板基本信息和画布数据
         template.setTemplateName(param.getTemplateName());
         template.setIndustryType(param.getIndustryType());
@@ -537,29 +556,51 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
         template.setUpdateTime(DateUtils.getNowDate());
         lobsterMapper.updateById(template);
 
-        // 先逻辑删除旧数据
-        variableMapper.deleteByWorkflowId(templateId);
-        nodeMapper.deleteByWorkflowId(templateId);
-        edgeMapper.deleteByWorkflowId(templateId);
+        // 查询旧数据
+        List<CompanyWorkflowLobsterVariable> oldVariables = variableMapper.selectByWorkflowId(templateId);
+        List<CompanyWorkflowLobsterNode> oldNodes = nodeMapper.selectByWorkflowId(templateId);
+        List<CompanyWorkflowLobsterEdge> oldEdges = edgeMapper.selectByWorkflowId(templateId);
 
-        // 保存变量
+        Date now = DateUtils.getNowDate();
+
+        // ==================== 变量:有id更新 / 无id新增 / 旧的且不在新参数中的逻辑删除 ====================
+        Set<Long> newVarIds = new HashSet<>();
         if (param.getVariables() != null && !param.getVariables().isEmpty()) {
-            variableMapper.batchInsert(param.getVariables().stream().map(v -> {
+            List<CompanyWorkflowLobsterVariable> insertVars = new ArrayList<>();
+            for (CompanyWorkflowLobsterVariable v : param.getVariables()) {
                 CompanyWorkflowLobsterVariable entity = new CompanyWorkflowLobsterVariable();
                 BeanUtils.copyProperties(v, entity);
                 entity.setWorkflowId(templateId);
                 entity.setDelFlag(0);
-                entity.setCreateBy(userName);
-                entity.setCreateTime(DateUtils.getNowDate());
                 entity.setUpdateBy(userName);
-                entity.setUpdateTime(DateUtils.getNowDate());
-                return entity;
-            }).collect(Collectors.toList()));
+                entity.setUpdateTime(now);
+                if (v.getId() != null) {
+                    entity.setId(v.getId());
+                    variableMapper.updateById(entity);
+                    newVarIds.add(v.getId());
+                } else {
+                    entity.setCreateBy(userName);
+                    entity.setCreateTime(now);
+                    insertVars.add(entity);
+                }
+            }
+            if (!insertVars.isEmpty()) {
+                variableMapper.batchInsert(insertVars);
+                insertVars.forEach(v -> newVarIds.add(v.getId()));
+            }
+        }
+        // 旧的且不在新参数中的变量 → 逻辑删除
+        for (CompanyWorkflowLobsterVariable old : oldVariables) {
+            if (!newVarIds.contains(old.getId())) {
+                variableMapper.deleteById(old.getId());
+            }
         }
 
-        // 保存节点(包含位置信息)
+        // ==================== 节点:有id更新 / 无id新增 / 旧的且不在新参数中的逻辑删除 ====================
+        Set<Long> newNodeIds = new HashSet<>();
         if (param.getNodes() != null && !param.getNodes().isEmpty()) {
-            nodeMapper.batchInsert(param.getNodes().stream().map(n -> {
+            List<CompanyWorkflowLobsterNode> insertNodes = new ArrayList<>();
+            for (CompanyWorkflowLobsterNode n : param.getNodes()) {
                 CompanyWorkflowLobsterNode entity = new CompanyWorkflowLobsterNode();
                 BeanUtils.copyProperties(n, entity);
                 entity.setWorkflowId(templateId);
@@ -567,17 +608,35 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
                     entity.setSortNo(0);
                 }
                 entity.setDelFlag(0);
-                entity.setCreateBy(userName);
-                entity.setCreateTime(DateUtils.getNowDate());
                 entity.setUpdateBy(userName);
-                entity.setUpdateTime(DateUtils.getNowDate());
-                return entity;
-            }).collect(Collectors.toList()));
+                entity.setUpdateTime(now);
+                if (n.getId() != null) {
+                    entity.setId(n.getId());
+                    nodeMapper.updateById(entity);
+                    newNodeIds.add(n.getId());
+                } else {
+                    entity.setCreateBy(userName);
+                    entity.setCreateTime(now);
+                    insertNodes.add(entity);
+                }
+            }
+            if (!insertNodes.isEmpty()) {
+                nodeMapper.batchInsert(insertNodes);
+                insertNodes.forEach(n -> newNodeIds.add(n.getId()));
+            }
+        }
+        // 旧的且不在新参数中的节点 → 逻辑删除
+        for (CompanyWorkflowLobsterNode old : oldNodes) {
+            if (!newNodeIds.contains(old.getId())) {
+                nodeMapper.deleteById(old.getId());
+            }
         }
 
-        // 保存连线
+        // ==================== 连线:有id更新 / 无id新增 / 旧的且不在新参数中的物理删除 ====================
+        Set<Long> newEdgeIds = new HashSet<>();
         if (param.getEdges() != null && !param.getEdges().isEmpty()) {
-            edgeMapper.batchInsert(param.getEdges().stream().map(e -> {
+            List<CompanyWorkflowLobsterEdge> insertEdges = new ArrayList<>();
+            for (CompanyWorkflowLobsterEdge e : param.getEdges()) {
                 CompanyWorkflowLobsterEdge entity = new CompanyWorkflowLobsterEdge();
                 BeanUtils.copyProperties(e, entity);
                 entity.setWorkflowId(templateId);
@@ -585,14 +644,57 @@ public class CompanyWorkflowLobsterServiceImpl implements ICompanyWorkflowLobste
                     entity.setSortNo(0);
                 }
                 entity.setDelFlag(0);
-                entity.setCreateBy(userName);
-                entity.setCreateTime(DateUtils.getNowDate());
                 entity.setUpdateBy(userName);
-                entity.setUpdateTime(DateUtils.getNowDate());
-                return entity;
-            }).collect(Collectors.toList()));
+                entity.setUpdateTime(now);
+                if (e.getId() != null) {
+                    entity.setId(e.getId());
+                    edgeMapper.updateById(entity);
+                    newEdgeIds.add(e.getId());
+                } else {
+                    entity.setCreateBy(userName);
+                    entity.setCreateTime(now);
+                    insertEdges.add(entity);
+                }
+            }
+            if (!insertEdges.isEmpty()) {
+                edgeMapper.batchInsert(insertEdges);
+                insertEdges.forEach(e -> newEdgeIds.add(e.getId()));
+            }
+        }
+        // 旧的且不在新参数中的连线 → 物理删除(避免唯一键冲突)
+        for (CompanyWorkflowLobsterEdge old : oldEdges) {
+            if (!newEdgeIds.contains(old.getId())) {
+                edgeMapper.deleteById(old.getId());
+            }
         }
 
         return AjaxResult.success("画布保存成功");
     }
+
+    @Override
+    public AjaxResult updateTemplateStatus(Long companyId, String username, Long templateId, Integer status) {
+        CompanyWorkflowLobster template = lobsterMapper.selectById(templateId);
+        if (template == null || !Objects.equals(template.getCompanyId(), companyId) || Objects.equals(template.getDelFlag(), 1)) {
+            return AjaxResult.error("模板不存在");
+        }
+        // 检查是否存在绑定的标签,有则提示先删除绑定
+        List<CompanyTagTemplateBinding> bindings = tagBindingMapper.selectBindingList(companyId, null, templateId);
+        if (bindings != null && !bindings.isEmpty()) {
+            return AjaxResult.error("已存在绑定标签,请先删除绑定关系");
+        }
+        template.setVersion(template.getVersion() == null ? 1 : template.getVersion() + 1);
+        template.setStatus(status);
+        template.setUpdateBy(username);
+        template.setUpdateTime(DateUtils.getNowDate());
+        lobsterMapper.updateById(template);
+
+        return AjaxResult.success("修改成功");
+    }
+
+    @Override
+    public List<CompanyWorkflowLobster> listTemplateByStatus(Long companyId, Integer status) {
+        List<CompanyWorkflowLobster> all = lobsterMapper.selectTemplateListByStatus(companyId, status);
+        return all;
+    }
+
 }

+ 15 - 12
fs-service/src/main/java/com/fs/config/saas/ProjectConfig.java

@@ -452,18 +452,21 @@ public class ProjectConfig {
         List<ProjectConfig.Wx.Mp.Config> mpConfigs = new ArrayList<>();
 
         if (tenantCfg != null) {
-            JSONObject mp = tenantCfg.getJSONObject("wx").getJSONObject("mp");
-            if (mp != null) {
-                JSONArray arr = mp.getJSONArray("configs");
-                if (arr != null) {
-                    for (int i = 0; i < arr.size(); i++) {
-                        JSONObject cfgJson = arr.getJSONObject(i);
-                        ProjectConfig.Wx.Mp.Config cfg = new ProjectConfig.Wx.Mp.Config();
-                        cfg.setAppId(cfgJson.getString("appId"));
-                        cfg.setSecret(cfgJson.getString("secret"));
-                        cfg.setToken(cfgJson.getString("token"));
-                        cfg.setAesKey(cfgJson.getString("aesKey"));
-                        mpConfigs.add(cfg);
+            JSONObject wx = tenantCfg.getJSONObject("wx");
+            if (wx != null) {
+                JSONObject mp = wx.getJSONObject("mp");
+                if (mp != null) {
+                    JSONArray arr = mp.getJSONArray("configs");
+                    if (arr != null) {
+                        for (int i = 0; i < arr.size(); i++) {
+                            JSONObject cfgJson = arr.getJSONObject(i);
+                            ProjectConfig.Wx.Mp.Config cfg = new ProjectConfig.Wx.Mp.Config();
+                            cfg.setAppId(cfgJson.getString("appId"));
+                            cfg.setSecret(cfgJson.getString("secret"));
+                            cfg.setToken(cfgJson.getString("token"));
+                            cfg.setAesKey(cfgJson.getString("aesKey"));
+                            mpConfigs.add(cfg);
+                        }
                     }
                 }
             }

+ 4 - 2
fs-service/src/main/java/com/fs/core/config/WxMpProperties.java

@@ -47,7 +47,9 @@ public class WxMpProperties {
             ProjectConfig cachedConfig = getConfigFromCache();
             if (cachedConfig != null) {
                 log.debug("从Redis缓存中获取ProjectConfig配置");
-                return cachedConfig.getWx().getMp();
+                if (cachedConfig.getWx() != null) {
+                    return cachedConfig.getWx().getMp();
+                }
             }
             ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
             if (projectConfig == null) {
@@ -55,7 +57,7 @@ public class WxMpProperties {
                 return null;
             }
 
-            if (projectConfig == null || projectConfig.getWx() == null) {
+            if (projectConfig.getWx() == null) {
                 log.warn("配置中未找到wx节点");
                 return null;
             }

+ 4 - 2
fs-service/src/main/java/com/fs/core/config/WxPayProperties.java

@@ -38,7 +38,9 @@ public class WxPayProperties {
       ProjectConfig cachedConfig = getConfigFromCache();
       if (cachedConfig != null) {
         log.debug("从Redis缓存中获取ProjectConfig配置");
-        return cachedConfig.getWx().getPay();
+        if (cachedConfig.getWx() != null) {
+          return cachedConfig.getWx().getPay();
+        }
       }
 
       ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
@@ -47,7 +49,7 @@ public class WxPayProperties {
         return null;
       }
 
-      if (projectConfig == null || projectConfig.getWx() == null) {
+      if (projectConfig.getWx() == null) {
         log.warn("配置中未找到wx节点");
         return null;
       }

+ 25 - 6
fs-service/src/main/java/com/fs/ipad/IpadSendUtils.java

@@ -37,10 +37,7 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -52,6 +49,7 @@ public class IpadSendUtils {
 
     private final WxWorkServiceNew wxWorkService;
     private final RedisCacheTenant<String> redisCache;
+    private final RedisCacheTenant<Long> redisCacheLong;
     private final QwGroupChatMapper qwGroupChatMapper;
     private final QwSopMapper qwSopMapper;
     private final QwExternalContactMapper qwExternalContactMapper;
@@ -59,6 +57,7 @@ public class IpadSendUtils {
     private final QwUserMapper qwUserMapper;
     private final String FILE_KEY = "ipad:upload:";
     private final String USER_KEY = "ipad:user:";
+    private final String APP_AGENT_KEY = "ipad:agent:";
 
     /**
      * 发送卡片消息
@@ -225,16 +224,17 @@ public class IpadSendUtils {
         if(vo.isRoom()){
             return chatIds(vo);
         }
+        Long appList = getAppList(vo);
         WxWorkUserId2VidDTO wxWorkUserId2VidDTO = new WxWorkUserId2VidDTO();
         wxWorkUserId2VidDTO.setOpenid(Collections.singletonList(vo.getExId()));
         wxWorkUserId2VidDTO.setCorpid(vo.getCorpId());
         wxWorkUserId2VidDTO.setScorpid(vo.getCorpCode());
+        wxWorkUserId2VidDTO.setAppId(appList);
         wxWorkUserId2VidDTO.setUuid(vo.getUuid());
         WxWorkResponseDTO<List<WxWorkVid2UserIdRespDTO>> WxWorkVid2UserIdRespDTO = wxWorkService.UserId2Vid(wxWorkUserId2VidDTO, vo.getServerId());
         List<WxWorkVid2UserIdRespDTO> data = WxWorkVid2UserIdRespDTO.getData();
         if(data.isEmpty()) {
-            log.error("未找到用户数据,基础数据:{},请求数据:{},返回数据:{}", vo, JSON.toJSONString(wxWorkUserId2VidDTO), JSON.toJSONString(WxWorkVid2UserIdRespDTO));
-            throw new BaseException("未找到用户:" + vo.getId());
+            log.error("未找到用户数据,基础数据:{},请求数据:{},返回数据:{}", vo, JSON.toJSONString(wxWorkUserId2VidDTO), JSON.toJSONString(WxWorkVid2UserIdRespDTO));            throw new BaseException("未找到用户:" + vo.getId());
         }
         return data.get(0).getUser_id();
     }
@@ -579,4 +579,23 @@ public class IpadSendUtils {
         log.info("发送@所有人返回数据:{}", result);
         if(result.getErrcode() != 0) throw new BaseException("发送@所有人消息错误:" + result.getErrmsg());
     }
+
+    public Long getAppList(BaseVo vo){
+        if(vo.getAgentId() == null) throw new BaseException("服务商模式应用ID必须上传请检查");
+        String key = APP_AGENT_KEY + vo.getCorpCode() + ":" + vo.getAgentId();
+        Long appId = redisCacheLong.getCacheObject(key);
+        if(appId == null){
+            WxWorkResponseDTO<CorpAppBaseVo> result = wxWorkService.getAppList(vo, vo.getServerId());
+            log.info("获取应用列表:{}", result);
+            if(result.getErrcode() != 0) throw new BaseException("获取应用列表失败:" + result.getErrmsg());
+            List<CorpAppVo> appVoList = result.getData().getWeAppList();
+            Optional<CorpAppVo> optional = appVoList.stream().filter(e -> e.getAppOpenId() != null && e.getAppOpenId().equals(Integer.parseInt(vo.getAgentId()))).findAny();
+            if(!optional.isPresent()){
+                log.info("未找到企业对应应用:corp_code:{}, corp_id:{},获取应用ID:{}, 获取到的应用列表:{}", vo.getCorpCode(), vo.getCorpId(), vo.getAgentId(), appVoList);
+                throw new BaseException("未找到对应的应用");
+            }
+            appId = optional.get().getAppId();
+        }
+        return appId;
+    }
 }

+ 2 - 0
fs-service/src/main/java/com/fs/ipad/vo/BaseVo.java

@@ -9,6 +9,7 @@ public class BaseVo{
 
     private Long id;
     private String uuid;
+    private String agentId;
     private Long serverId;
     private List<String> exIdList;
     private String exId;
@@ -19,6 +20,7 @@ public class BaseVo{
 
     public void setBase(BaseVo vo){
         this.uuid = vo.getUuid();
+        this.agentId = vo.getAgentId();
         this.serverId = vo.getServerId();
         this.corpId = vo.getCorpId();
         this.corpCode = vo.getCorpCode();

+ 13 - 0
fs-service/src/main/java/com/fs/ipad/vo/CorpAppBaseVo.java

@@ -0,0 +1,13 @@
+package com.fs.ipad.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+
+@Data
+public class CorpAppBaseVo {
+    private List<CorpAppVo> weAppList;
+}
+
+

+ 29 - 0
fs-service/src/main/java/com/fs/ipad/vo/CorpAppVo.java

@@ -0,0 +1,29 @@
+package com.fs.ipad.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+
+@Data
+public class CorpAppVo {
+
+    private Long corpId;
+    private Long appId;
+    private Integer appOpenId;
+    private Integer appType;
+    private String name;
+    private String imgId;
+    private String desc;
+    private String homeInfo;
+    private Integer lastModTime;
+    private Object reportLocFlag;
+    private Object appOpen;
+    private Integer groupId;
+    private Integer businessId;
+    private Integer appFlag;
+    private Integer stat;
+    private boolean isReportOpen;
+}
+
+

+ 4 - 2
fs-service/src/main/java/com/fs/wx/cp/config/WxCpProperties.java

@@ -42,7 +42,9 @@ public class WxCpProperties {
             ProjectConfig cachedConfig = getConfigFromCache();
             if (cachedConfig != null) {
                 log.debug("从Redis缓存中获取ProjectConfig配置");
-                return cachedConfig.getWx().getCp();
+                if (cachedConfig.getWx() != null) {
+                    return cachedConfig.getWx().getCp();
+                }
             }
             ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
             if (projectConfig == null) {
@@ -50,7 +52,7 @@ public class WxCpProperties {
                 return null;
             }
 
-            if (projectConfig == null || projectConfig.getWx() == null) {
+            if (projectConfig.getWx() == null) {
                 log.warn("配置中未找到wx节点");
                 return null;
             }

+ 6 - 2
fs-service/src/main/java/com/fs/wx/miniapp/config/WxMaProperties.java

@@ -41,7 +41,11 @@ public class WxMaProperties {
             // 1. 先从Redis缓存中获取
             ProjectConfig cachedConfig = getConfigFromCache();
             if (cachedConfig != null) {
-                return cachedConfig.getWx().getMiniapp().getConfigs();
+                if (cachedConfig.getWx() != null && cachedConfig.getWx().getMiniapp() != null) {
+                    List<ProjectConfig.Wx.Miniapp.Config> configs = cachedConfig.getWx().getMiniapp().getConfigs();
+                    return configs != null ? configs : new ArrayList<>();
+                }
+                return new ArrayList<>();
             }
 
             ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
@@ -49,7 +53,7 @@ public class WxMaProperties {
                 return new ArrayList<>();
             }
 
-            if (projectConfig == null || projectConfig.getWx() == null ||
+            if (projectConfig.getWx() == null ||
                     projectConfig.getWx().getMiniapp() == null) {
                 return new ArrayList<>();
             }

+ 1 - 0
fs-service/src/main/java/com/fs/wxwork/dto/WxWorkUserId2VidDTO.java

@@ -9,5 +9,6 @@ public class WxWorkUserId2VidDTO {
     private String uuid;
     private String scorpid;
     private String corpid;
+    private Long appId;
     private List<String> openid;
 }

+ 6 - 4
fs-service/src/main/java/com/fs/wxwork/service/WxWorkServiceNew.java

@@ -7,10 +7,7 @@ import com.fs.common.exception.CustomException;
 import com.fs.ipad.param.WxGetSessionRoomListParam;
 import com.fs.ipad.param.WxRoomUserListParam;
 import com.fs.ipad.param.WxSendAtMsgParam;
-import com.fs.ipad.vo.WxGetSessionRoomListVo;
-import com.fs.ipad.vo.WxRoomUserListVo;
-import com.fs.ipad.vo.WxSendAtMsgVo;
-import com.fs.ipad.vo.WxSendTextAtMsgVo;
+import com.fs.ipad.vo.*;
 import com.fs.qw.domain.QwIpadServer;
 import com.fs.qw.service.IQwIpadServerService;
 import com.fs.wxwork.dto.*;
@@ -240,4 +237,9 @@ public class WxWorkServiceNew {
         String url = getUrl(serverId) + "/SendTextAtMsgTwo";
         return WxWorkHttpUtil.postWithType(url, param, new TypeReference<WxWorkResponseDTO<WxSendTextAtMsgVo>>() {});
     }
+
+    public WxWorkResponseDTO<CorpAppBaseVo> getAppList(BaseVo param, Long serverId) {
+        String url = getUrl(serverId) + "/getCorpWeApp";
+        return WxWorkHttpUtil.postWithType(url, param, new TypeReference<WxWorkResponseDTO<CorpAppBaseVo>>() {});
+    }
 }

+ 5 - 296
fs-service/src/main/resources/db/tenant-initData.sql

@@ -1,4 +1,4 @@
-
+
 
 INSERT INTO `sys_dept` (`dept_id`, `parent_id`, `ancestors`, `dept_name`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1, 0, '0', '总公司', 1, 'admin', '', '', '0', '0', 'admin', '2021-11-24 23:26:40', 'admin', '2025-03-23 15:53:14');
 
@@ -35,34 +35,19 @@ INSERT INTO `sys_dict_type` VALUES (8, '通知状态', 'sys_notice_status', '0',
 INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', '0', 'admin', '2021-11-24 23:26:40', '', NULL, '操作类型列表');
 INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', '0', 'admin', '2021-11-24 23:26:40', '', NULL, '登录状态列表');
 INSERT INTO `sys_dict_type` VALUES (11, '通用状态', 'sys_company_status', '0', 'admin', '2023-06-02 09:47:21', 'admin', '2023-06-02 09:48:21', '通用正常停用');
-INSERT INTO `sys_dict_type` VALUES (12, '医院类型', 'sys_hospital_type', '0', 'admin', '2023-06-02 10:04:25', 'admin', '2023-06-02 10:05:13', NULL);
-INSERT INTO `sys_dict_type` VALUES (13, '医院等级', 'sys_hospital_level', '0', 'admin', '2023-06-02 10:24:51', 'admin', '2023-06-05 08:51:36', NULL);
-INSERT INTO `sys_dict_type` VALUES (14, '医生职位', 'sys_doc_position', '0', 'admin', '2023-06-05 11:20:52', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (15, '通用是否', 'sys_company_or', '0', 'admin', '2023-06-05 14:14:30', 'admin', '2023-06-05 14:15:08', NULL);
 INSERT INTO `sys_dict_type` VALUES (16, '通用审核状态', 'sys_company_isaudit', '0', 'admin', '2023-06-06 10:34:16', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (18, '医生文章状态', 'sys_doctor_article_status', '0', 'admin', '2023-06-06 14:12:33', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (19, '用户状态', 'sys_user_status', '0', 'admin', '2023-06-07 10:40:47', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (20, '健康档案状态', 'sys_patient_status', '0', 'admin', '2023-06-07 13:49:58', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (21, '健康档案男女', 'sys_patient_sex', '0', 'admin', '2023-06-07 14:01:05', 'admin', '2023-06-07 14:01:43', NULL);
 INSERT INTO `sys_dict_type` VALUES (22, '广告类型', 'sys_adv_type', '0', 'admin', '2023-06-08 14:33:18', 'admin', '2023-11-30 10:43:39', NULL);
 INSERT INTO `sys_dict_type` VALUES (23, '广告显示类型', 'sys_adv_show', '0', 'admin', '2023-06-08 14:38:11', 'admin', '2023-11-30 10:43:55', NULL);
-INSERT INTO `sys_dict_type` VALUES (24, '药品类型', 'sys_product_type', '0', 'admin', '2023-06-08 17:22:50', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (25, '药品规格', 'sys_spec_type', '0', 'admin', '2023-06-08 17:26:20', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (26, '上下架状态', 'sys_spec_show', '0', 'admin', '2023-06-08 17:27:59', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (27, '问诊订单图文类型', 'sys_inquiry_order_type', '0', 'admin', '2023-06-12 10:14:13', 'admin', '2023-06-12 10:14:22', NULL);
-INSERT INTO `sys_dict_type` VALUES (28, '问诊类型', 'sys_inquiry_type', '0', 'admin', '2023-06-12 10:15:09', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (29, '问诊订单状态', 'sys_inquiry_status', '0', 'admin', '2023-06-12 10:16:33', 'admin', '2023-06-12 10:17:12', NULL);
-INSERT INTO `sys_dict_type` VALUES (31, '问诊订单支付类型', 'sys_inquiry_pay', '0', 'admin', '2023-06-12 10:41:58', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (32, '药品订单状态', 'sys_order_status', '0', 'admin', '2023-06-13 11:18:15', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (33, '药品订单支付状态', 'sys_order_pay', '0', 'admin', '2023-06-13 11:47:25', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (34, '药品订单退款状态', 'sys_refund_status', '0', 'admin', '2023-06-13 11:54:48', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (35, '支付渠道', 'sys_channel', '0', 'admin', '2023-06-13 13:49:10', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (36, '推广佣金状态', 'sys_tui_money_status', '0', 'admin', '2023-06-13 13:52:39', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (37, '售后订单服务类型', 'sys_refund_type', '0', 'admin', '2023-06-14 09:05:45', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (38, '售后退款状态', 'sys_sales_status', '0', 'admin', '2023-06-14 09:08:10', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (39, '售后状态', 'sys_after_sales_status', '0', 'admin', '2023-06-14 09:12:21', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (40, '处方类型', 'sys_prescribe_type', '0', 'admin', '2023-06-14 14:24:22', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (41, '处方状态', 'sys_prescribe_status', '0', 'admin', '2023-06-14 14:25:59', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (42, '性别', 'sys_sex', '0', 'admin', '2023-06-14 14:52:29', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (43, '提现状态', 'sys_extract', '0', 'admin', '2023-06-25 09:42:29', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (44, '提现类型', 'sys_extract_type', '0', 'admin', '2023-06-25 09:45:07', '', NULL, NULL);
@@ -75,15 +60,8 @@ INSERT INTO `sys_dict_type` VALUES (50, '随访填写状态', 'sys_follow_write_
 INSERT INTO `sys_dict_type` VALUES (52, 'app类型', 'sys_app_type', '0', 'admin', '2023-08-04 10:07:39', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (53, 'app手机类型', 'sys_app_phone_type', '0', 'admin', '2023-08-04 10:08:38', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (54, '支付状态', 'sys_store_payment_status', '0', 'admin', '2023-08-21 14:27:37', 'admin', '2023-09-18 11:47:32', NULL);
-INSERT INTO `sys_dict_type` VALUES (55, '药品订单状态', 'sys_store_order_type', '0', 'admin', '2023-08-22 11:28:34', 'admin', '2023-09-18 11:47:28', NULL);
-INSERT INTO `sys_dict_type` VALUES (56, '服务包状态', 'sys_package_order_status', '0', 'admin', '2023-08-25 17:44:11', 'admin', '2023-09-18 11:47:21', NULL);
-INSERT INTO `sys_dict_type` VALUES (57, '优惠劵类型', 'sys_coupon_type', '0', 'admin', '2023-09-04 09:14:00', 'admin', '2023-09-18 11:47:17', NULL);
 INSERT INTO `sys_dict_type` VALUES (58, '优惠劵订单类型', 'sys_coupon_business_type', '0', 'admin', '2023-09-04 09:15:54', 'admin', '2023-09-18 11:47:13', NULL);
 INSERT INTO `sys_dict_type` VALUES (59, '优惠劵状态', 'sys_coupon_status', '0', 'admin', '2023-09-04 09:17:55', 'admin', '2023-09-18 11:47:09', NULL);
-INSERT INTO `sys_dict_type` VALUES (60, '问诊报告状态', 'sys_inquiry_order_report_status', '0', 'admin', '2023-09-04 17:47:22', 'admin', '2023-09-18 11:47:04', NULL);
-INSERT INTO `sys_dict_type` VALUES (61, '健康自测类别', 'sys_test_temp_item_type', '0', 'admin', '2023-09-04 17:53:32', 'admin', '2023-09-22 11:12:23', NULL);
-INSERT INTO `sys_dict_type` VALUES (62, '问诊模板类型', 'sys_inquiry_temp_type', '0', 'admin', '2023-09-05 10:02:47', 'admin', '2023-09-18 09:32:41', NULL);
-INSERT INTO `sys_dict_type` VALUES (63, '问诊子类型', 'sys_inquiry_sub_type', '0', 'admin', '2023-09-18 16:16:54', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (70, '客户是否认领', 'crm_customer_is_receive', '0', '', NULL, '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (71, '客户来源', 'crm_customer_source', '0', '', NULL, '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (72, '客户状态', 'crm_customer_status', '0', '', NULL, '', NULL, NULL);
@@ -113,30 +91,14 @@ INSERT INTO `sys_dict_type` VALUES (106, '坐席状态', 'sys_company_voice_call
 INSERT INTO `sys_dict_type` VALUES (107, '模板类型', 'sys_company_sms_temp_type', '0', 'admin', '2023-03-16 13:29:52', 'admin', '2023-09-28 13:35:37', NULL);
 INSERT INTO `sys_dict_type` VALUES (108, '名片类型', 'sys_company_user_card_type', '0', 'admin', '2023-05-16 14:11:31', 'admin', '2023-09-28 13:35:31', NULL);
 INSERT INTO `sys_dict_type` VALUES (109, '套餐包支付类型', 'sys_package_pay_type', '0', 'admin', '2023-10-11 11:22:49', 'admin', '2023-10-11 11:23:13', NULL);
-INSERT INTO `sys_dict_type` VALUES (110, '服务包类别', 'sys_package_type', '0', 'admin', '2023-10-11 13:37:16', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (111, '套餐分类', 'sys_store_product_package_cate', '0', 'admin', '2023-10-18 15:52:31', 'admin', '2023-11-08 17:05:34', NULL);
 INSERT INTO `sys_dict_type` VALUES (112, '商品支付类型', 'sys_store_pay_type', '0', 'admin', '2023-10-18 15:54:22', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (113, '经典名方类型', 'sys_famous_prescribe_type', '0', 'admin', '2023-10-23 10:19:35', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (114, '医案科普分类', 'sys_case_article_type', '0', 'admin', '2023-10-23 11:01:44', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (115, '筋络', 'sys_vessel', '0', 'admin', '2023-10-23 14:34:40', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (116, '经络部位', 'sys_vessel_region', '0', 'admin', '2023-10-23 14:35:07', 'admin', '2023-11-02 15:15:43', NULL);
-INSERT INTO `sys_dict_type` VALUES (117, '服务包子类型', 'sys_package_sub_type', '0', 'admin', '2023-11-01 16:52:32', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (118, '积分商品类别', 'sys_integral_goods_type', '0', 'admin', '2023-11-02 14:53:43', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (119, '积分商品订单状态', 'sys_integral_order_status', '0', 'admin', '2023-11-02 16:53:02', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (121, '药膳食材', 'sys_medicated_food', '0', 'admin', '2023-11-08 17:07:21', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (122, '药膳功效', 'sys_medicated_food_action', '0', 'admin', '2023-11-08 17:08:20', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (124, '经典名方疾病', 'sys_famous_prescribe_indication', '0', 'admin', '2023-11-09 09:50:42', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (125, '经典名方书籍', 'sys_famous_prescribe_book', '0', 'admin', '2023-11-09 09:51:26', 'admin', '2023-11-09 09:51:41', NULL);
-INSERT INTO `sys_dict_type` VALUES (126, '中药五味', 'sys_chinese_medicine_flavor', '0', 'admin', '2023-11-09 13:17:24', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (127, '主治疾病', 'sys_indication', '0', 'admin', '2023-11-09 13:17:53', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (129, '问答类别', 'sys_questions_type', '0', 'admin', '2023-11-10 15:13:45', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (130, '中药归经', 'sys_chinese_medicine_vessel', '0', 'admin', '2023-11-20 09:39:01', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (131, '业务类型', 'sys_store_payment_business_type', '0', 'admin', '2023-11-28 15:11:03', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (132, '优惠劵有效期类别', 'sys_coupon_limit_type', '0', 'admin', '2023-12-05 15:56:17', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (134, '物流状态 ', 'sys_store_order_delivery_status', '0', 'admin', '2023-12-11 09:58:04', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (135, '订单物流回单状态', 'sys_store_delivery_pay_status', '0', 'admin', '2023-12-11 10:03:24', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (136, '物流跟踪状态', 'sys_delivery_type', '0', 'admin', '2023-12-11 10:16:44', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (137, '中药制作类型', 'sys_recipe_type', '0', 'admin', '2023-12-14 17:49:04', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (138, '售后原因', 'sys_sales_reasons', '0', 'admin', '2023-12-27 14:48:58', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (139, '支付商户类型', 'sys_pay_mode', '0', 'admin', '2024-01-04 09:30:37', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (140, '积分日志类别', 'sys_integral_log_type', '0', 'admin', '2024-01-22 10:17:39', 'admin', '2024-01-24 15:45:02', NULL);
@@ -259,11 +221,8 @@ INSERT INTO `sys_dict_type` VALUES (307, '用户状态', 'user_status', '0', 'ad
 INSERT INTO `sys_dict_type` VALUES (308, '状态', 'common_status', '0', '', NULL, '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (309, '点播播放源类型', 'play_source_type', '0', 'admin', '2021-11-24 23:26:40', '', NULL, '点播播放源类型');
 INSERT INTO `sys_dict_type` VALUES (310, '项目会员状态', 'project_user_status', '0', 'admin', '2021-11-24 23:26:40', '', NULL, '项目会员状态');
-INSERT INTO `sys_dict_type` VALUES (311, '十二经络', 'sys_vessel_twelve', '0', 'admin', '2025-09-08 14:42:24', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (312, '转移类型', 'transfer_type', '0', 'admin', '2025-04-02 17:20:34', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (313, '审批状态', 'transfer_approval_status', '0', 'admin', '2025-04-02 17:29:09', '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (314, '医生职务', 'doctor_position', '0', '', NULL, '', NULL, NULL);
-INSERT INTO `sys_dict_type` VALUES (315, '问诊订单状态', 'doctor_order_status', '0', '', NULL, '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (316, 'AI事件文件类型', 'sys_fastgpt_keyword_file_type', '0', 'jzp', '2025-05-29 14:18:08', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (317, 'AI事件状态', 'sys_fastgpt_keyword_send_status', '0', 'jzp', '2025-05-29 14:19:24', '', NULL, NULL);
 INSERT INTO `sys_dict_type` VALUES (318, 'AI事件日志类型', 'sys_fastgpt_event_log_type', '0', 'jzp', '2025-06-25 09:58:00', '', NULL, NULL);
@@ -314,21 +273,10 @@ INSERT INTO `sys_dict_data` VALUES (27, 1, '成功', '0', 'sys_common_status', '
 INSERT INTO `sys_dict_data` VALUES (28, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2021-11-24 23:26:40', '', NULL, '停用状态');
 INSERT INTO `sys_dict_data` VALUES (29, 0, '正常', '1', 'sys_company_status', NULL, 'primary', 'N', '0', 'admin', '2023-06-02 09:57:08', 'admin', '2023-06-02 09:58:19', NULL);
 INSERT INTO `sys_dict_data` VALUES (30, 0, '停用', '0', 'sys_company_status', NULL, 'danger', 'N', '0', 'admin', '2023-06-02 09:57:40', 'admin', '2023-06-02 09:58:13', NULL);
-INSERT INTO `sys_dict_data` VALUES (31, 0, '一级医院', '1', 'sys_hospital_type', NULL, 'default', 'N', '0', 'admin', '2023-06-02 10:05:59', 'admin', '2023-06-02 10:10:30', NULL);
-INSERT INTO `sys_dict_data` VALUES (32, 0, '二级医院', '2', 'sys_hospital_type', NULL, 'default', 'N', '0', 'admin', '2023-06-02 10:06:13', 'admin', '2023-06-02 10:10:26', NULL);
-INSERT INTO `sys_dict_data` VALUES (33, 0, '一级', '1', 'sys_hospital_level', NULL, 'default', 'N', '0', 'admin', '2023-06-02 10:25:37', 'admin', '2023-06-03 20:52:19', NULL);
-INSERT INTO `sys_dict_data` VALUES (34, 0, '二级', '2', 'sys_hospital_level', NULL, 'default', 'N', '0', 'admin', '2023-06-02 10:27:31', 'admin', '2023-06-03 20:52:23', NULL);
-INSERT INTO `sys_dict_data` VALUES (35, 0, '三级', '3', 'sys_hospital_level', NULL, 'default', 'N', '0', 'admin', '2023-06-02 10:27:38', 'admin', '2023-06-03 20:52:30', NULL);
-INSERT INTO `sys_dict_data` VALUES (36, 0, '住院医师', '住院医师', 'sys_doc_position', NULL, 'default', 'N', '0', 'admin', '2023-06-05 11:21:59', 'admin', '2023-08-30 10:15:33', NULL);
-INSERT INTO `sys_dict_data` VALUES (37, 0, '主治医师', '主治医师', 'sys_doc_position', NULL, 'default', 'N', '0', 'admin', '2023-06-05 11:22:15', 'admin', '2023-08-30 10:15:38', NULL);
-INSERT INTO `sys_dict_data` VALUES (38, 0, '副主任医师', '副主任医师', 'sys_doc_position', NULL, 'default', 'N', '0', 'admin', '2023-06-05 11:22:52', 'admin', '2023-08-30 10:15:43', NULL);
-INSERT INTO `sys_dict_data` VALUES (39, 0, '主任医师', '主任医师', 'sys_doc_position', NULL, 'default', 'N', '0', 'admin', '2023-06-05 11:23:02', 'admin', '2023-08-30 10:15:47', NULL);
 INSERT INTO `sys_dict_data` VALUES (40, 0, '是', '1', 'sys_company_or', NULL, 'primary', 'N', '0', 'admin', '2023-06-05 14:15:28', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (41, 0, '否', '0', 'sys_company_or', NULL, 'warning', 'N', '0', 'admin', '2023-06-05 14:15:45', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (42, 2, '已审核', '1', 'sys_company_isaudit', NULL, 'primary', 'N', '0', 'admin', '2023-06-06 10:34:46', 'admin', '2023-06-16 11:45:04', NULL);
 INSERT INTO `sys_dict_data` VALUES (43, 0, '未审核', '0', 'sys_company_isaudit', NULL, 'danger', 'N', '0', 'admin', '2023-06-06 10:35:16', 'admin', '2023-06-06 10:42:17', NULL);
-INSERT INTO `sys_dict_data` VALUES (49, 0, '发布', '1', 'sys_doctor_article_status', NULL, 'success', 'N', '0', 'admin', '2023-06-06 14:12:58', 'admin', '2023-06-06 14:13:41', NULL);
-INSERT INTO `sys_dict_data` VALUES (50, 0, '草稿', '0', 'sys_doctor_article_status', NULL, 'info', 'N', '0', 'admin', '2023-06-06 14:13:13', 'admin', '2023-06-06 14:13:20', NULL);
 INSERT INTO `sys_dict_data` VALUES (51, 0, '正常', '1', 'sys_user_status', NULL, 'primary', 'N', '0', 'admin', '2023-06-07 10:41:07', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (52, 0, '禁止', '0', 'sys_user_status', NULL, 'danger', 'N', '0', 'admin', '2023-06-07 10:41:28', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (53, 0, '正常', '1', 'sys_patient_status', NULL, 'primary', 'N', '0', 'admin', '2023-06-07 13:50:11', '', NULL, NULL);
@@ -340,34 +288,8 @@ INSERT INTO `sys_dict_data` VALUES (58, 0, '首页底部', '2', 'sys_adv_type',
 INSERT INTO `sys_dict_data` VALUES (59, 0, '公众号链接', '1', 'sys_adv_show', NULL, 'success', 'N', '0', 'admin', '2023-06-08 14:38:33', 'admin', '2023-06-08 15:09:11', NULL);
 INSERT INTO `sys_dict_data` VALUES (60, 0, '小程序页面地址', '2', 'sys_adv_show', NULL, 'success', 'N', '0', 'admin', '2023-06-08 14:40:26', 'admin', '2023-06-08 15:09:16', NULL);
 INSERT INTO `sys_dict_data` VALUES (61, 0, '文章内容', '3', 'sys_adv_show', NULL, 'success', 'N', '0', 'admin', '2023-06-08 14:40:36', 'admin', '2023-06-08 15:09:20', NULL);
-INSERT INTO `sys_dict_data` VALUES (62, 1, '中药饮片', '2', 'sys_product_type', NULL, 'success', 'N', '0', 'admin', '2023-06-08 17:25:07', 'admin', '2024-01-26 13:58:58', NULL);
-INSERT INTO `sys_dict_data` VALUES (63, 0, '药品', '1', 'sys_product_type', NULL, 'success', 'N', '0', 'admin', '2023-06-08 17:25:15', 'admin', '2024-01-26 13:58:52', NULL);
-INSERT INTO `sys_dict_data` VALUES (64, 0, '单', '0', 'sys_spec_type', NULL, 'default', 'N', '0', 'admin', '2023-06-08 17:26:36', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (65, 0, '多', '1', 'sys_spec_type', NULL, 'default', 'N', '0', 'admin', '2023-06-08 17:26:42', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (66, 0, '上架', '1', 'sys_spec_show', NULL, 'primary', 'N', '0', 'admin', '2023-06-08 17:28:20', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (67, 0, '未上架', '0', 'sys_spec_show', NULL, 'danger', 'N', '0', 'admin', '2023-06-08 17:28:35', 'admin', '2023-06-08 17:28:40', NULL);
-INSERT INTO `sys_dict_data` VALUES (68, 0, '图文', '1', 'sys_inquiry_order_type', NULL, 'primary', 'N', '0', 'admin', '2023-06-12 10:14:30', 'admin', '2023-06-12 11:35:37', NULL);
-INSERT INTO `sys_dict_data` VALUES (69, 0, '语音', '2', 'sys_inquiry_order_type', NULL, 'success', 'N', '0', 'admin', '2023-06-12 10:14:38', 'admin', '2023-06-12 11:35:41', NULL);
-INSERT INTO `sys_dict_data` VALUES (70, 0, '专家问诊', '1', 'sys_inquiry_type', NULL, 'default', 'N', '0', 'admin', '2023-06-12 10:15:32', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (71, 0, '快速咨询', '2', 'sys_inquiry_type', NULL, 'default', 'N', '0', 'admin', '2023-06-12 10:15:42', 'zx', '2024-08-22 16:24:46', NULL);
-INSERT INTO `sys_dict_data` VALUES (72, 0, '开药咨询', '3', 'sys_inquiry_type', NULL, 'default', 'N', '0', 'admin', '2023-06-12 10:15:57', 'zx', '2024-08-22 16:24:51', NULL);
-INSERT INTO `sys_dict_data` VALUES (73, 0, '待支付', '1', 'sys_inquiry_status', NULL, 'primary', 'N', '0', 'admin', '2023-06-12 10:17:23', 'admin', '2023-06-12 11:33:28', NULL);
-INSERT INTO `sys_dict_data` VALUES (74, 0, '待咨询', '2', 'sys_inquiry_status', NULL, 'primary', 'N', '0', 'admin', '2023-06-12 10:17:32', 'zx', '2024-08-21 10:25:30', NULL);
-INSERT INTO `sys_dict_data` VALUES (75, 0, '咨询中', '3', 'sys_inquiry_status', NULL, 'primary', 'N', '0', 'admin', '2023-06-12 10:17:41', 'zx', '2024-08-21 10:28:35', NULL);
-INSERT INTO `sys_dict_data` VALUES (76, 0, '已完成', '4', 'sys_inquiry_status', NULL, 'primary', 'N', '0', 'admin', '2023-06-12 10:17:50', 'admin', '2023-08-04 09:26:50', NULL);
-INSERT INTO `sys_dict_data` VALUES (78, 0, '微信支付', '1', 'sys_inquiry_pay', NULL, 'success', 'N', '0', 'admin', '2023-06-12 10:42:08', 'admin', '2023-06-13 15:32:35', NULL);
-INSERT INTO `sys_dict_data` VALUES (79, 6, '退款中', '-1', 'sys_order_status', NULL, 'success', 'N', '0', 'admin', '2023-06-13 11:19:01', 'zyp', '2024-01-22 09:54:24', NULL);
-INSERT INTO `sys_dict_data` VALUES (80, 7, '退款成功', '-2', 'sys_order_status', NULL, 'success', 'N', '0', 'admin', '2023-06-13 11:19:30', 'admin', '2023-06-13 17:00:18', NULL);
-INSERT INTO `sys_dict_data` VALUES (81, 1, '待支付', '1', 'sys_order_status', NULL, 'success', 'N', '0', 'admin', '2023-06-13 11:19:38', 'admin', '2025-06-27 09:25:38', NULL);
-INSERT INTO `sys_dict_data` VALUES (82, 2, '待发货', '2', 'sys_order_status', NULL, 'success', 'N', '0', 'admin', '2023-06-13 11:19:48', 'admin', '2025-06-27 09:26:16', NULL);
-INSERT INTO `sys_dict_data` VALUES (83, 3, '待收货', '3', 'sys_order_status', NULL, 'success', 'N', '0', 'admin', '2023-06-13 11:20:05', 'admin', '2025-06-27 09:26:20', NULL);
-INSERT INTO `sys_dict_data` VALUES (85, 4, '已完成', '4', 'sys_order_status', NULL, 'success', 'N', '0', 'admin', '2023-06-13 11:20:24', 'admin', '2025-06-27 09:26:26', NULL);
-INSERT INTO `sys_dict_data` VALUES (86, 8, '已取消', '-3', 'sys_order_status', NULL, 'success', 'N', '0', 'admin', '2023-06-13 11:30:52', 'admin', '2023-06-13 11:35:00', NULL);
-INSERT INTO `sys_dict_data` VALUES (87, 0, '待支付', '0', 'sys_order_pay', NULL, 'success', 'N', '0', 'admin', '2023-06-13 11:47:47', 'admin', '2023-06-13 11:47:52', NULL);
-INSERT INTO `sys_dict_data` VALUES (88, 0, '已支付', '1', 'sys_order_pay', NULL, 'success', 'N', '0', 'admin', '2023-06-13 11:48:05', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (89, 0, '未退款', '0', 'sys_refund_status', NULL, 'success', 'N', '0', 'admin', '2023-06-13 11:55:16', 'admin', '2023-06-13 13:38:47', NULL);
-INSERT INTO `sys_dict_data` VALUES (91, 0, '申请中', '1', 'sys_refund_status', NULL, 'warning', 'N', '0', 'admin', '2023-06-13 13:38:29', 'admin', '2023-06-13 13:38:56', NULL);
-INSERT INTO `sys_dict_data` VALUES (92, 0, '已退款', '2', 'sys_refund_status', NULL, 'danger', 'N', '0', 'admin', '2023-06-13 13:38:41', 'admin', '2023-12-21 17:31:40', NULL);
 INSERT INTO `sys_dict_data` VALUES (93, 0, '微信小程序', '1', 'sys_channel', NULL, 'success', 'N', '0', 'admin', '2023-06-13 13:49:33', 'admin', '2023-06-13 13:49:39', NULL);
 INSERT INTO `sys_dict_data` VALUES (94, 0, '已发放', '1', 'sys_tui_money_status', NULL, 'success', 'N', '0', 'admin', '2023-06-13 13:52:59', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (95, 0, '待发放', '0', 'sys_tui_money_status', NULL, 'info', 'N', '0', 'admin', '2023-06-13 13:53:46', '', NULL, NULL);
@@ -382,10 +304,6 @@ INSERT INTO `sys_dict_data` VALUES (103, 0, '售后中', '0', 'sys_after_sales_s
 INSERT INTO `sys_dict_data` VALUES (104, 0, '用户取消', '1', 'sys_after_sales_status', NULL, 'default', 'N', '0', 'admin', '2023-06-14 09:12:48', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (105, 0, '商家拒绝', '2', 'sys_after_sales_status', NULL, 'default', 'N', '0', 'admin', '2023-06-14 09:12:58', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (106, 0, '已完成', '3', 'sys_after_sales_status', NULL, 'default', 'N', '0', 'admin', '2023-06-14 09:14:24', 'admin', '2023-06-14 09:43:51', NULL);
-INSERT INTO `sys_dict_data` VALUES (107, 0, '中成药', '1', 'sys_prescribe_type', NULL, 'success', 'N', '0', 'admin', '2023-06-14 14:24:35', 'admin', '2024-09-29 15:15:04', NULL);
-INSERT INTO `sys_dict_data` VALUES (108, 0, '中药', '2', 'sys_prescribe_type', NULL, 'success', 'N', '0', 'admin', '2023-06-14 14:24:42', 'admin', '2023-06-14 14:24:51', NULL);
-INSERT INTO `sys_dict_data` VALUES (109, 0, '未开', '0', 'sys_prescribe_status', NULL, 'success', 'N', '0', 'admin', '2023-06-14 14:27:22', 'admin', '2023-09-15 14:59:04', NULL);
-INSERT INTO `sys_dict_data` VALUES (110, 0, '已开', '1', 'sys_prescribe_status', NULL, 'primary', 'N', '0', 'admin', '2023-06-14 14:27:36', 'admin', '2023-09-15 14:59:00', NULL);
 INSERT INTO `sys_dict_data` VALUES (111, 0, '男', '1', 'sys_sex', NULL, 'default', 'N', '0', 'admin', '2023-06-14 14:52:39', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (112, 0, '女', '2', 'sys_sex', NULL, 'default', 'N', '0', 'admin', '2023-06-14 14:52:44', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (113, 0, '审核中', '0', 'sys_extract', NULL, 'primary', 'N', '0', 'admin', '2023-06-25 09:42:58', 'admin', '2023-06-26 09:12:51', NULL);
@@ -396,9 +314,6 @@ INSERT INTO `sys_dict_data` VALUES (117, 0, '支付宝', 'alipay', 'sys_extract_
 INSERT INTO `sys_dict_data` VALUES (118, 0, '微信', 'wx', 'sys_extract_type', NULL, 'primary', 'N', '0', 'admin', '2023-06-25 09:46:05', 'admin', '2023-06-26 09:13:15', NULL);
 INSERT INTO `sys_dict_data` VALUES (119, 0, '问诊订单收入', '1', 'sys_bill_type', NULL, 'primary', 'N', '0', 'admin', '2023-06-26 10:33:22', 'admin', '2023-11-07 17:25:42', NULL);
 INSERT INTO `sys_dict_data` VALUES (120, 0, '提现', '2', 'sys_bill_type', NULL, 'primary', 'N', '0', 'admin', '2023-06-26 10:33:31', 'admin', '2023-11-07 17:25:46', NULL);
-INSERT INTO `sys_dict_data` VALUES (122, 0, '已取消', '-1', 'sys_inquiry_status', NULL, 'warning', 'N', '0', '', NULL, 'admin', '2023-10-11 17:19:22', NULL);
-INSERT INTO `sys_dict_data` VALUES (123, 0, '已退款', '-2', 'sys_inquiry_status', NULL, 'danger', 'N', '0', '', NULL, 'admin', '2023-10-11 17:16:23', NULL);
-INSERT INTO `sys_dict_data` VALUES (124, 0, '已拒单', '-3', 'sys_inquiry_status', NULL, 'warning', 'N', '0', '', NULL, 'admin', '2023-10-11 17:19:27', NULL);
 INSERT INTO `sys_dict_data` VALUES (125, 0, '药房', '1', 'sys_company_type', NULL, 'default', 'N', '0', 'admin', '2023-07-12 14:32:55', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (126, 0, '诊所', '2', 'sys_company_type', NULL, 'default', 'N', '0', 'admin', '2023-07-12 14:33:12', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (127, 0, '未支付', '0', 'sys_company_recharge_status', NULL, 'primary', 'N', '0', 'admin', '2023-07-13 10:29:53', 'admin', '2023-07-13 10:30:22', NULL);
@@ -416,45 +331,16 @@ INSERT INTO `sys_dict_data` VALUES (138, 0, '医生端', '1', 'sys_app_type', NU
 INSERT INTO `sys_dict_data` VALUES (139, 0, '药师端', '2', 'sys_app_type', NULL, 'primary', 'N', '0', 'admin', '2023-08-04 10:09:07', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (140, 0, 'android', '1', 'sys_app_phone_type', NULL, 'primary', 'N', '0', 'admin', '2023-08-04 10:10:00', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (141, 0, 'ios', '2', 'sys_app_phone_type', NULL, 'primary', 'N', '0', 'admin', '2023-08-04 10:10:10', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (142, 0, '执业中医师', '执业中医师', 'sys_doc_position', NULL, 'default', 'N', '0', 'admin', '2023-08-11 09:18:30', 'admin', '2023-08-30 10:15:52', NULL);
-INSERT INTO `sys_dict_data` VALUES (143, 0, '执业医师', '执业医师', 'sys_doc_position', NULL, 'default', 'N', '0', 'admin', '2023-08-11 09:18:41', 'admin', '2023-08-30 10:15:58', NULL);
 INSERT INTO `sys_dict_data` VALUES (144, 0, '未支付', '0', 'sys_store_payment_status', NULL, 'primary', 'N', '0', 'admin', '2023-08-21 14:28:10', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (145, 0, '已支付', '1', 'sys_store_payment_status', NULL, 'primary', 'N', '0', 'admin', '2023-08-21 14:28:20', 'admin', '2023-08-21 14:28:28', NULL);
 INSERT INTO `sys_dict_data` VALUES (146, 0, '已退款', '-1', 'sys_store_payment_status', NULL, 'primary', 'N', '0', 'admin', '2023-08-21 14:28:42', 'admin', '2023-08-21 14:28:49', NULL);
 INSERT INTO `sys_dict_data` VALUES (147, 0, '西药', '1', 'sys——', NULL, 'primary', 'N', '0', 'admin', '2023-08-22 11:29:22', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (148, 0, '中药', '2', 'sys——', NULL, 'success', 'N', '0', 'admin', '2023-08-22 11:29:31', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (149, 0, '待支付', '1', 'sys_package_order_status', NULL, 'warning', 'N', '0', 'admin', '2023-08-25 17:44:29', 'admin', '2023-08-25 17:45:00', NULL);
-INSERT INTO `sys_dict_data` VALUES (150, 0, '服务中', '2', 'sys_package_order_status', NULL, 'primary', 'N', '0', 'admin', '2023-08-25 17:44:41', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (151, 0, '已完成', '3', 'sys_package_order_status', NULL, 'success', 'N', '0', 'admin', '2023-08-25 17:44:56', 'admin', '2023-11-28 11:17:54', NULL);
-INSERT INTO `sys_dict_data` VALUES (152, 0, '药品', '1', 'sys_store_order_type', NULL, 'primary', 'N', '0', 'admin', '2023-08-28 16:50:27', 'zyp', '2024-01-26 14:13:32', NULL);
-INSERT INTO `sys_dict_data` VALUES (153, 0, '中药饮片', '2', 'sys_store_order_type', NULL, 'primary', 'N', '0', 'admin', '2023-08-28 16:50:35', 'zyp', '2024-01-26 14:13:49', NULL);
 INSERT INTO `sys_dict_data` VALUES (155, 0, '问诊', '1', 'sys_coupon_business_type', NULL, 'default', 'N', '0', 'admin', '2023-09-04 09:16:18', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (156, 0, '商城', '2', 'sys_coupon_business_type', NULL, 'default', 'N', '0', 'admin', '2023-09-04 09:16:25', 'admin', '2023-09-04 09:16:31', NULL);
 INSERT INTO `sys_dict_data` VALUES (157, 0, '未使用', '0', 'sys_coupon_status', NULL, 'default', 'N', '0', 'admin', '2023-09-04 09:18:29', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (158, 0, '已使用', '1', 'sys_coupon_status', NULL, 'default', 'N', '0', 'admin', '2023-09-04 09:18:42', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (159, 0, '已过期', '2', 'sys_coupon_status', NULL, 'default', 'N', '0', 'admin', '2023-09-04 09:18:47', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (160, 0, ' 待处理', '0', 'sys_inquiry_order_report_status', NULL, 'primary', 'N', '0', 'admin', '2023-09-04 17:47:57', 'admin', '2023-09-15 10:13:46', NULL);
-INSERT INTO `sys_dict_data` VALUES (161, 0, '已处理', '1', 'sys_inquiry_order_report_status', NULL, 'success', 'N', '0', 'admin', '2023-09-04 17:48:02', 'admin', '2023-09-15 10:13:49', NULL);
-INSERT INTO `sys_dict_data` VALUES (162, 0, '平和质', '1', 'sys_test_temp_item_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-04 17:54:11', 'admin', '2023-09-05 11:42:56', NULL);
-INSERT INTO `sys_dict_data` VALUES (163, 0, '头面部', '1', 'sys_inquiry_temp_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 10:06:33', 'admin', '2023-09-05 10:39:17', NULL);
-INSERT INTO `sys_dict_data` VALUES (164, 0, '四肢肩颈', '2', 'sys_inquiry_temp_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 10:15:39', 'admin', '2023-09-05 10:39:22', NULL);
-INSERT INTO `sys_dict_data` VALUES (165, 0, '胸腹部', '3', 'sys_inquiry_temp_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 10:15:54', 'admin', '2023-09-05 10:39:26', NULL);
-INSERT INTO `sys_dict_data` VALUES (166, 0, '其他', '4', 'sys_inquiry_temp_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 10:16:19', 'admin', '2023-09-05 10:39:33', NULL);
-INSERT INTO `sys_dict_data` VALUES (167, 0, '气虚质', '2', 'sys_test_temp_item_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 11:42:20', 'admin', '2023-09-05 11:43:06', NULL);
-INSERT INTO `sys_dict_data` VALUES (168, 0, '阳虚质', '3', 'sys_test_temp_item_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 11:42:23', 'admin', '2023-09-05 11:44:35', NULL);
-INSERT INTO `sys_dict_data` VALUES (169, 0, '阴虚质', '4', 'sys_test_temp_item_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 11:42:26', 'admin', '2023-09-05 11:44:39', NULL);
-INSERT INTO `sys_dict_data` VALUES (170, 0, '痰湿质', '5', 'sys_test_temp_item_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 11:42:31', 'admin', '2023-09-05 11:44:43', NULL);
-INSERT INTO `sys_dict_data` VALUES (171, 0, '湿热质', '6', 'sys_test_temp_item_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 11:43:42', 'admin', '2023-09-05 11:44:28', NULL);
-INSERT INTO `sys_dict_data` VALUES (172, 0, '气郁质', '7', 'sys_test_temp_item_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 11:43:51', 'admin', '2023-09-05 11:44:47', NULL);
-INSERT INTO `sys_dict_data` VALUES (173, 0, '血瘀质', '8', 'sys_test_temp_item_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 11:44:03', 'admin', '2023-09-05 11:44:32', NULL);
-INSERT INTO `sys_dict_data` VALUES (174, 0, '特禀质', '9', 'sys_test_temp_item_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-05 11:44:19', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (175, 2, '中药免单券', '2', 'sys_coupon_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-06 17:27:26', 'admin', '2024-01-24 11:22:25', NULL);
-INSERT INTO `sys_dict_data` VALUES (176, 3, '问诊免单卷', '3', 'sys_coupon_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-06 17:27:39', 'admin', '2024-01-24 11:22:55', NULL);
-INSERT INTO `sys_dict_data` VALUES (181, 0, '凯蒙中医', '1', 'sys_inquiry_sub_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-18 16:17:12', 'admin', '2023-12-26 10:21:03', '翟佳滨');
-INSERT INTO `sys_dict_data` VALUES (182, 0, '健康本草', '2', 'sys_inquiry_sub_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-18 16:17:20', 'admin', '2023-12-26 10:25:37', '红彦');
-INSERT INTO `sys_dict_data` VALUES (183, 0, '御君方', '3', 'sys_inquiry_sub_type', NULL, 'primary', 'N', '0', 'admin', '2023-09-18 16:17:29', 'admin', '2023-12-26 10:24:45', '不良反应');
-INSERT INTO `sys_dict_data` VALUES (184, 0, '已完成', '2', 'sys_inquiry_order_report_status', NULL, 'success', 'N', '0', 'admin', '2023-09-20 09:15:24', 'admin', '2023-09-20 09:15:30', NULL);
-INSERT INTO `sys_dict_data` VALUES (185, 0, '营养师', '营养师', 'sys_doc_position', NULL, 'default', 'N', '0', 'admin', '2023-09-22 11:11:42', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (202, 0, 'A4', '1', 'crm_customer_source', NULL, NULL, 'N', '0', '', NULL, '17749925835', '2023-03-31 17:20:30', '瘦主角头条33表单');
 INSERT INTO `sys_dict_data` VALUES (203, 0, 'A5', '2', 'crm_customer_source', NULL, NULL, 'N', '0', '', NULL, '17749925835', '2023-03-31 17:20:33', '瘦主角头条9.9表单');
 INSERT INTO `sys_dict_data` VALUES (204, 0, '正常', '1', 'crm_customer_status', NULL, NULL, 'N', '0', '', NULL, '', NULL, NULL);
@@ -712,18 +598,6 @@ INSERT INTO `sys_dict_data` VALUES (455, 0, 'KM09', '177', 'crm_customer_source'
 INSERT INTO `sys_dict_data` VALUES (456, 0, 'KM10', '178', 'crm_customer_source', NULL, NULL, 'N', '0', '18323465069', '2023-08-29 11:51:26', '18323465069', '2023-08-29 11:59:48', NULL);
 INSERT INTO `sys_dict_data` VALUES (457, 0, 'KM11', '179', 'crm_customer_source', NULL, NULL, 'N', '0', '18323465069', '2023-08-29 11:51:34', '18323465069', '2023-08-29 11:59:53', NULL);
 INSERT INTO `sys_dict_data` VALUES (458, 0, 'KM12', '180', 'crm_customer_source', NULL, NULL, 'N', '0', '18323465069', '2023-08-29 11:51:42', '18323465069', '2023-08-29 11:59:58', NULL);
-INSERT INTO `sys_dict_data` VALUES (459, 5, '体重管理', '1', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '', NULL, '17378387550', '2023-04-24 14:34:02', NULL);
-INSERT INTO `sys_dict_data` VALUES (460, 7, '代谢管理', '2', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '', NULL, '17378387550', '2023-04-24 14:35:03', NULL);
-INSERT INTO `sys_dict_data` VALUES (461, 1, '中医养生', '6', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '17749925835', '2022-09-07 14:32:02', '17378387550', '2023-04-24 14:33:26', NULL);
-INSERT INTO `sys_dict_data` VALUES (462, 8, '赠品专区', '7', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '17749925835', '2022-09-15 09:21:35', '17378387550', '2023-04-24 14:34:19', NULL);
-INSERT INTO `sys_dict_data` VALUES (463, 6, '气血管理', '10', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '18225323085', '2022-09-30 11:49:17', '17378387550', '2023-04-24 14:34:06', NULL);
-INSERT INTO `sys_dict_data` VALUES (464, 9, '营销活动', '9', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '17749925835', '2022-11-18 13:32:57', '17378387550', '2023-04-24 14:34:24', NULL);
-INSERT INTO `sys_dict_data` VALUES (465, 4, '男性健康', '11', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '18225323085', '2022-11-22 14:16:14', '17378387550', '2023-04-24 14:33:50', NULL);
-INSERT INTO `sys_dict_data` VALUES (466, 10, '线下专区', '3', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '18225323085', '2022-12-20 10:26:05', '17378387550', '2023-04-24 14:34:30', NULL);
-INSERT INTO `sys_dict_data` VALUES (467, 12, '创业直销', '12', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '18523540474', '2022-12-28 14:46:18', '17378387550', '2023-08-14 13:40:44', NULL);
-INSERT INTO `sys_dict_data` VALUES (468, 11, 'CBA211/210', '13', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '18523540474', '2023-03-29 17:33:46', '17378387550', '2023-04-24 14:34:37', NULL);
-INSERT INTO `sys_dict_data` VALUES (469, 2, '凯蒙中医', '14', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '18523540474', '2023-04-20 13:55:11', '17378387550', '2023-04-24 14:33:37', NULL);
-INSERT INTO `sys_dict_data` VALUES (470, 3, '健康本草', '15', 'sys_store_product_package_cate', NULL, NULL, 'N', '0', '17378387550', '2023-08-07 11:19:59', '17378387550', '2023-08-14 13:40:35', NULL);
 INSERT INTO `sys_dict_data` VALUES (471, 0, '全款支付', '1', 'sys_store_pay_type', NULL, NULL, 'N', '0', '', NULL, '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (472, 0, '物流代收', '2', 'sys_store_pay_type', NULL, NULL, 'N', '0', '', NULL, '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (473, 0, '货到付款', '3', 'sys_store_pay_type', NULL, NULL, 'N', '0', '', NULL, '', NULL, NULL);
@@ -772,127 +646,12 @@ INSERT INTO `sys_dict_data` VALUES (535, 0, '企微', '1', 'sys_company_user_car
 INSERT INTO `sys_dict_data` VALUES (536, 0, '全款支付', '1', 'sys_package_pay_type', NULL, 'default', 'N', '0', 'admin', '2023-10-11 13:35:58', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (537, 0, '物流代收', '2', 'sys_package_pay_type', NULL, 'default', 'N', '0', 'admin', '2023-10-11 13:36:05', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (538, 0, '货到付款', '3', 'sys_package_pay_type', NULL, 'default', 'N', '0', 'admin', '2023-10-11 13:36:14', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (539, 0, '医生包', '1', 'sys_package_type', NULL, 'default', 'N', '0', 'admin', '2023-10-11 13:37:26', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (540, 0, '企业包', '2', 'sys_package_type', NULL, 'default', 'N', '0', 'admin', '2023-10-11 13:37:35', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (541, 0, '自测结果页底部', '3', 'sys_adv_type', NULL, 'success', 'N', '0', 'admin', '2023-10-13 13:43:23', 'admin', '2023-10-13 13:43:32', NULL);
-INSERT INTO `sys_dict_data` VALUES (542, 0, '同济现代', '4', 'sys_inquiry_sub_type', NULL, 'primary', 'N', '0', 'admin', '2023-10-20 11:08:55', '数据黄丽', '2024-09-11 16:10:11', '未做会诊入口,张然丁');
-INSERT INTO `sys_dict_data` VALUES (543, 0, '国医高手', '5', 'sys_inquiry_sub_type', NULL, 'primary', 'N', '0', 'admin', '2023-10-20 11:09:13', 'admin', '2023-12-26 10:22:00', '张然丁');
-INSERT INTO `sys_dict_data` VALUES (544, 0, '五仙传医', '6', 'sys_inquiry_sub_type', NULL, 'primary', 'N', '0', 'admin', '2023-10-20 11:10:07', 'admin', '2023-12-26 10:23:23', '史士昊');
-INSERT INTO `sys_dict_data` VALUES (546, 0, '普通科普', '1', 'sys_case_article_type', NULL, 'default', 'N', '0', 'admin', '2023-10-23 11:01:58', 'admin', '2023-10-23 11:17:25', NULL);
-INSERT INTO `sys_dict_data` VALUES (561, 0, '头部', '头部', 'sys_vessel_region', NULL, 'default', 'N', '0', 'admin', '2023-10-23 14:38:52', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (562, 0, '胸腹部', '胸腹部', 'sys_vessel_region', NULL, 'default', 'N', '0', 'admin', '2023-10-23 14:39:01', 'admin', '2023-11-02 15:15:55', NULL);
-INSERT INTO `sys_dict_data` VALUES (563, 0, '背部', '背部', 'sys_vessel_region', NULL, 'default', 'N', '0', 'admin', '2023-10-23 14:39:09', 'admin', '2023-11-02 15:16:03', NULL);
-INSERT INTO `sys_dict_data` VALUES (564, 0, '上肢', '上肢', 'sys_vessel_region', NULL, 'default', 'N', '0', 'admin', '2023-10-23 14:39:16', 'admin', '2023-11-02 15:16:11', NULL);
-INSERT INTO `sys_dict_data` VALUES (565, 0, '药膳', '2', 'sys_famous_prescribe_type', NULL, 'default', 'N', '0', 'admin', '2023-10-24 10:32:36', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (566, 0, '茶方', '3', 'sys_famous_prescribe_type', NULL, 'default', 'N', '0', 'admin', '2023-10-24 10:32:47', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (567, 0, '汤方', '4', 'sys_famous_prescribe_type', NULL, 'default', 'N', '0', 'admin', '2023-10-24 10:32:58', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (568, 0, '泡酒方', '5', 'sys_famous_prescribe_type', NULL, 'default', 'N', '0', 'admin', '2023-10-24 10:33:09', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (569, 0, '方剂', '6', 'sys_famous_prescribe_type', NULL, 'default', 'N', '0', 'admin', '2023-10-24 10:33:19', 'admin', '2023-10-24 10:33:23', NULL);
-INSERT INTO `sys_dict_data` VALUES (570, 0, '其它', '7', 'sys_famous_prescribe_type', NULL, 'default', 'N', '0', 'admin', '2023-10-24 10:33:37', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (580, 0, '手太阴肺经', '手太阴肺经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:41:42', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (581, 0, '手少阴心经', '手少阴心经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:41:58', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (582, 0, '手厥阴心包经', '手厥阴心包经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:42:05', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (583, 0, '手阳明大肠经', '手阳明大肠经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:42:13', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (584, 0, '手太阳小肠经', '手太阳小肠经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:42:26', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (585, 0, '手少阳三焦经', '手少阳三焦经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:42:32', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (586, 0, '足阳明胃经', '足阳明胃经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:42:44', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (587, 0, '足太阳膀胱经', '足太阳膀胱经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:42:55', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (588, 0, '足少阳胆经', '足少阳胆经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:43:09', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (589, 0, '足太阴脾经', '足太阴脾经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:43:18', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (590, 0, '足少阴肾经', '足少阴肾经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:43:25', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (591, 0, '足厥阴肝经', '足厥阴肝经', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-10-24 13:43:31', 'admin', '2023-11-02 15:15:07', NULL);
-INSERT INTO `sys_dict_data` VALUES (592, 0, '咨询包', '1', 'sys_package_sub_type', NULL, 'default', 'N', '0', 'admin', '2023-11-01 16:52:43', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (593, 0, '治疗包', '2', 'sys_package_sub_type', NULL, 'default', 'N', '0', 'admin', '2023-11-01 16:52:49', 'admin', '2023-11-01 16:53:05', NULL);
-INSERT INTO `sys_dict_data` VALUES (594, 0, '产品包', '3', 'sys_package_sub_type', NULL, 'default', 'N', '0', 'admin', '2023-11-01 16:52:57', 'admin', '2023-11-01 16:53:09', NULL);
 INSERT INTO `sys_dict_data` VALUES (595, 1, '生活用品', '1', 'sys_integral_goods_type', NULL, 'default', 'N', '0', 'admin', '2023-11-02 14:54:04', 'admin', '2024-11-06 09:55:57', NULL);
-INSERT INTO `sys_dict_data` VALUES (596, 0, '督脉', '督脉', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-02 15:15:13', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (597, 0, '任脉', '任脉', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-02 15:15:19', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (598, 0, '经外奇穴', '经外奇穴', 'sys_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-02 15:15:24', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (599, 0, '下肢', '下肢', 'sys_vessel_region', NULL, 'default', 'N', '0', 'admin', '2023-11-02 15:16:17', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (600, 0, '足部', '足部', 'sys_vessel_region', NULL, 'default', 'N', '0', 'admin', '2023-11-02 15:16:23', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (601, 0, '待发货', '1', 'sys_integral_order_status', NULL, 'default', 'N', '0', 'admin', '2023-11-02 17:12:51', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (602, 0, '待收货', '2', 'sys_integral_order_status', NULL, 'default', 'N', '0', 'admin', '2023-11-02 17:12:58', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (603, 0, '已完成', '3', 'sys_integral_order_status', NULL, 'default', 'N', '0', 'admin', '2023-11-02 17:13:06', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (604, 0, '提现驳回', '3', 'sys_bill_type', NULL, 'primary', 'N', '0', 'admin', '2023-11-07 17:25:36', 'admin', '2023-11-07 17:25:49', NULL);
-INSERT INTO `sys_dict_data` VALUES (607, 0, '科普', '1', 'sys_questions_type', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (608, 0, '中医', '2', 'sys_questions_type', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:17', 'admin', '2023-11-10 15:14:26', NULL);
-INSERT INTO `sys_dict_data` VALUES (613, 0, '其它', '其它', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (614, 0, '感冒', '感冒', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (615, 0, '支气管炎', '支气管炎', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (616, 0, '胃肠炎', '胃肠炎', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (617, 0, '关节炎', '关节炎', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (618, 0, '冠心病', '冠心病', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (619, 0, '高血压', '高血压', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (620, 0, '肾炎', '肾炎', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (621, 0, '水肿', '水肿', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (622, 0, '中风', '中风', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (623, 0, '脾胃虚弱', '脾胃虚弱', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (624, 0, '咳嗽', '咳嗽', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (625, 0, '跌打损伤', '跌打损伤', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (626, 0, '月经不调', '月经不调', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (627, 0, '阳痿', '阳痿', 'sys_famous_prescribe_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-10 15:14:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (660, 0, '化痰止咳', '化痰止咳', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:32:20', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (661, 0, '发散解表', '发散解表', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:32:27', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (662, 0, '宁心安神', '宁心安神', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:32:32', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (663, 0, '止呕消食', '止呕消食', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:32:37', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (664, 0, '活血止血', '活血止血', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:32:41', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (665, 0, '消肿抑癌', '消肿抑癌', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:32:47', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (666, 0, '清热解毒', '清热解毒', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:32:54', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (667, 0, '温中健脾', '温中健脾', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:33:01', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (668, 0, '滋阴壮阳', '滋阴壮阳', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:33:11', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (669, 0, '生津解暑', '生津解暑', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:33:17', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (670, 0, '疏肝养肝', '疏肝养肝', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:33:25', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (671, 0, '祛湿利水', '祛湿利水', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:33:31', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (672, 0, '祛风散寒', '祛风散寒', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:33:36', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (673, 0, '补益气血', '补益气血', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:33:41', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (674, 0, '补益诸虚', '补益诸虚', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:33:47', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (675, 0, '通便止泻', '通便止泻', 'sys_medicated_food_action', NULL, 'default', 'N', '0', 'admin', '2023-11-20 09:33:52', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (687, 0, '银耳', '银耳', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:52:44', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (688, 0, '黑木耳', '黑木耳', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:52:51', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (689, 0, '粳米', '粳米', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:52:57', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (690, 0, '羊肉', '羊肉', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (691, 0, '元鱼', '元鱼', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:08', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (692, 0, '鲤鱼', '鲤鱼', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:14', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (693, 0, '杏仁', '杏仁', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:19', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (694, 0, '鲜藕', '鲜藕', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:23', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (695, 0, '山药', '山药', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:28', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (696, 0, '莲子', '莲子', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:33', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (697, 0, '核桃仁', '核桃仁', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:37', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (698, 0, '鸡脯肉', '鸡脯肉', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:43', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (699, 0, '黑豆', '黑豆', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:47', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (700, 0, '豆腐', '豆腐', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:53', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (701, 0, '其它', '其它', 'sys_medicated_food', NULL, 'default', 'N', '0', 'admin', '2023-11-20 11:53:57', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (713, 0, '咳嗽', '咳嗽', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:10:47', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (714, 0, '阳痿早泄', '阳痿早泄', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:10:55', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (715, 0, '水肿', '水肿', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:11:00', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (716, 0, '便秘', '便秘', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:11:06', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (717, 0, '贫血', '贫血', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:11:12', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (718, 0, '高血压', '高血压', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:11:17', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (719, 0, '感冒', '感冒', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:11:25', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (720, 0, '食欲不振', '食欲不振', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:11:34', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (721, 0, '失眠', '失眠', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:11:39', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (722, 0, '呕吐', '呕吐', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:11:48', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (723, 0, '腹痛', '腹痛', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:11:53', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (724, 0, '精液异常', '精液异常', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:12:00', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (725, 0, '腹胀', '腹胀', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:12:06', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (726, 0, '痢疾', '痢疾', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:12:13', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (727, 0, '其它', '其它', 'sys_indication', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:12:21', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (738, 0, '《传统药茶方》', '《传统药茶方》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:14:46', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (739, 0, '《金匮要略》', '《金匮要略》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:14:54', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (740, 0, '《伤寒论》', '《伤寒论》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:15:02', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (741, 0, '民间验方', '民间验方', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:15:07', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (742, 0, '《太平惠民和剂局方》', '《太平惠民和剂局方》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:15:14', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (743, 0, '《药酒汇编》', '《药酒汇编》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:15:20', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (744, 0, '《普济方》', '《普济方》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:15:28', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (745, 0, '《医疗保健汤茶谱》', '《医疗保健汤茶谱》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:15:36', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (746, 0, '《本草纲目》', '《本草纲目》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:15:41', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (747, 0, '《圣济总录》', '《圣济总录》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:15:48', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (748, 0, '《御药院方》', '《御药院方》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:15:53', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (749, 0, '《备急千金要方》', '《备急千金要方》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:16:00', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (750, 0, '《景岳全书》', '《景岳全书》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:16:07', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (751, 0, '《民间方》', '《民间方》', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:16:12', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (752, 0, '其它', '其它', 'sys_famous_prescribe_book', NULL, 'default', 'N', '0', 'admin', '2023-11-20 13:16:17', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (753, 0, '已取消', '-1', 'sys_package_order_status', NULL, 'info', 'N', '0', 'admin', '2023-11-21 14:55:01', 'admin', '2023-11-28 11:18:10', NULL);
 INSERT INTO `sys_dict_data` VALUES (754, 0, '药膳', '4', 'sys_adv_type', NULL, 'success', 'N', '0', 'admin', '2023-11-24 10:07:26', 'admin', '2023-11-24 10:08:16', NULL);
 INSERT INTO `sys_dict_data` VALUES (755, 0, '经络', '5', 'sys_adv_type', NULL, 'success', 'N', '0', 'admin', '2023-11-24 10:07:39', 'admin', '2023-11-24 10:08:24', NULL);
 INSERT INTO `sys_dict_data` VALUES (756, 0, '问答', '6', 'sys_adv_type', NULL, 'success', 'N', '0', 'admin', '2023-11-24 10:07:53', 'admin', '2023-11-24 10:08:27', NULL);
@@ -900,33 +659,12 @@ INSERT INTO `sys_dict_data` VALUES (757, 0, '疾病', '7', 'sys_adv_type', NULL,
 INSERT INTO `sys_dict_data` VALUES (758, 0, '中药', '8', 'sys_adv_type', NULL, 'success', 'N', '0', 'admin', '2023-11-24 10:08:11', 'admin', '2023-11-24 10:08:36', NULL);
 INSERT INTO `sys_dict_data` VALUES (759, 0, '名方', '9', 'sys_adv_type', NULL, 'success', 'N', '0', 'admin', '2023-11-24 10:08:49', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (760, 0, '医案', '10', 'sys_adv_type', NULL, 'success', 'N', '0', 'admin', '2023-11-24 10:09:07', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (761, 0, '心', '心', 'sys_chinese_medicine_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:45:21', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (762, 0, '心包', '心包', 'sys_chinese_medicine_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:45:27', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (763, 0, '肝', '肝', 'sys_chinese_medicine_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:45:31', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (764, 0, '脾', '脾', 'sys_chinese_medicine_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:45:35', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (765, 0, '肺', '肺', 'sys_chinese_medicine_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:45:40', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (766, 0, '肾', '肾', 'sys_chinese_medicine_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:45:44', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (767, 0, '胃', '胃', 'sys_chinese_medicine_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:45:49', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (768, 0, '胆', '胆', 'sys_chinese_medicine_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:45:53', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (769, 0, '大肠', '大肠', 'sys_chinese_medicine_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:45:58', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (770, 0, '小肠', '小肠', 'sys_chinese_medicine_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:46:03', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (771, 0, '膀胱', '膀胱', 'sys_chinese_medicine_vessel', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:46:09', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (772, 0, '甘', '甘', 'sys_chinese_medicine_flavor', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:46:46', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (773, 0, '苦', '苦', 'sys_chinese_medicine_flavor', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:46:50', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (774, 0, '酸', '酸', 'sys_chinese_medicine_flavor', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:46:54', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (775, 0, '辛', '辛', 'sys_chinese_medicine_flavor', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:46:58', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (776, 0, '咸', '咸', 'sys_chinese_medicine_flavor', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:47:03', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (777, 0, '淡', '淡', 'sys_chinese_medicine_flavor', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:47:09', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (778, 0, '涩', '涩', 'sys_chinese_medicine_flavor', NULL, 'default', 'N', '0', 'admin', '2023-11-28 09:47:14', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (779, 0, '已退款', '-2', 'sys_package_order_status', NULL, 'danger', 'N', '0', 'admin', '2023-11-28 11:16:55', 'admin', '2023-11-28 11:18:16', NULL);
 INSERT INTO `sys_dict_data` VALUES (780, 0, '问诊', '1', 'sys_store_payment_business_type', NULL, 'primary', 'N', '0', 'admin', '2023-11-28 15:11:11', 'admin', '2023-11-28 15:11:41', NULL);
 INSERT INTO `sys_dict_data` VALUES (781, 0, '商品订单', '2', 'sys_store_payment_business_type', NULL, 'success', 'N', '0', 'admin', '2023-11-28 15:11:19', 'admin', '2023-11-28 15:11:44', NULL);
 INSERT INTO `sys_dict_data` VALUES (782, 0, '套餐包', '3', 'sys_store_payment_business_type', NULL, 'primary', 'N', '0', 'admin', '2023-11-28 15:11:34', 'admin', '2023-11-28 15:11:48', NULL);
 INSERT INTO `sys_dict_data` VALUES (784, 0, '销售公司', '3', 'sys_company_type', NULL, 'default', 'N', '0', 'admin', '2023-11-30 14:07:58', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (785, 4, '中药打折卷', '4', 'sys_coupon_type', NULL, 'primary', 'N', '0', 'admin', '2023-12-01 13:23:11', 'admin', '2024-01-24 11:22:52', NULL);
 INSERT INTO `sys_dict_data` VALUES (792, 0, '按照过期时间', '1', 'sys_coupon_limit_type', NULL, 'default', 'N', '0', 'admin', '2023-12-05 15:56:45', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (793, 0, '按照领取后有效期', '2', 'sys_coupon_limit_type', NULL, 'default', 'N', '0', 'admin', '2023-12-05 15:57:07', 'admin', '2023-12-05 15:57:38', NULL);
-INSERT INTO `sys_dict_data` VALUES (803, 6, '公域疗法券', '6', 'sys_coupon_type', NULL, 'primary', 'N', '0', 'admin', '2023-12-06 10:58:35', 'admin', '2024-01-24 17:33:12', NULL);
 INSERT INTO `sys_dict_data` VALUES (804, 0, '暂无轨迹信息', '0', 'sys_store_order_delivery_status', NULL, 'info', 'N', '0', 'admin', '2023-12-11 10:01:48', 'admin', '2023-12-11 10:02:10', NULL);
 INSERT INTO `sys_dict_data` VALUES (805, 0, '已揽收', '1', 'sys_store_order_delivery_status', NULL, 'primary', 'N', '0', 'admin', '2023-12-11 10:01:57', 'admin', '2023-12-11 10:02:15', NULL);
 INSERT INTO `sys_dict_data` VALUES (806, 0, '在途中', '2', 'sys_store_order_delivery_status', NULL, 'primary', 'N', '0', 'admin', '2023-12-11 10:02:03', 'admin', '2023-12-11 10:02:30', NULL);
@@ -947,10 +685,6 @@ INSERT INTO `sys_dict_data` VALUES (820, 0, '快递柜或驿站签收', '311', '
 INSERT INTO `sys_dict_data` VALUES (821, 0, '发货无信息', '401', 'sys_delivery_type', NULL, 'default', 'N', '0', 'admin', '2023-12-11 10:26:04', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (822, 0, '超时未签收', '402', 'sys_delivery_type', NULL, 'default', 'N', '0', 'admin', '2023-12-11 10:33:23', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (823, 0, '超时未更新', '403', 'sys_delivery_type', NULL, 'default', 'N', '0', 'admin', '2023-12-11 10:33:34', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (824, 0, '颗粒', '0', 'sys_recipe_type', NULL, 'default', 'N', '0', 'admin', '2023-12-14 17:49:22', 'admin', '2023-12-14 17:49:26', NULL);
-INSERT INTO `sys_dict_data` VALUES (825, 0, '膏方', '1', 'sys_recipe_type', NULL, 'default', 'N', '0', 'admin', '2023-12-14 17:49:36', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (826, 0, '部分退款', '3', 'sys_refund_status', NULL, 'info', 'N', '0', 'admin', '2023-12-21 15:04:56', 'admin', '2023-12-21 15:05:01', NULL);
-INSERT INTO `sys_dict_data` VALUES (827, 1, '肺结节专病', '7', 'sys_inquiry_sub_type', NULL, 'primary', 'N', '0', 'admin', '2023-12-26 10:19:34', 'admin', '2025-03-15 09:18:48', '陈怡剑');
 INSERT INTO `sys_dict_data` VALUES (828, 0, '取消', '5', 'sys_sales_status', NULL, 'info', 'N', '0', 'admin', '2023-12-26 14:21:04', 'admin', '2023-12-26 14:21:20', NULL);
 INSERT INTO `sys_dict_data` VALUES (829, 0, '收货地址填错了', '1', 'sys_sales_reasons', NULL, 'default', 'N', '0', 'admin', '2023-12-27 14:49:10', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (830, 0, '与描述不符', '2', 'sys_sales_reasons', NULL, 'default', 'N', '0', 'admin', '2023-12-27 14:49:19', '', NULL, NULL);
@@ -967,14 +701,12 @@ INSERT INTO `sys_dict_data` VALUES (840, 0, '易宝', 'yb', 'sys_pay_mode', NULL
 INSERT INTO `sys_dict_data` VALUES (841, 0, '微信', 'wx', 'sys_pay_mode', NULL, 'success', 'N', '0', 'admin', '2024-01-04 09:30:56', 'admin', '2024-01-04 10:21:09', NULL);
 INSERT INTO `sys_dict_data` VALUES (842, 0, '台州银行', 'tz', 'sys_pay_mode', NULL, 'primary', 'N', '0', 'admin', '2024-01-04 09:31:10', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (843, 0, '问诊费扣款', '12', 'sys_company_money_logs_type', NULL, 'primary', 'N', '0', 'admin', '2024-01-04 14:16:55', 'admin', '2024-01-12 16:57:30', NULL);
-INSERT INTO `sys_dict_data` VALUES (845, 1, '执业药师', '执业药师', 'sys_doc_position', NULL, 'default', 'N', '0', 'admin', '2024-01-09 10:20:34', 'admin', '2024-01-09 10:22:06', NULL);
 INSERT INTO `sys_dict_data` VALUES (849, 0, '签到获得积分', '1', 'sys_integral_log_type', NULL, 'default', 'N', '0', 'admin', '2024-01-22 10:18:02', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (850, 0, '消费获得积分', '2', 'sys_integral_log_type', NULL, 'default', 'N', '0', 'admin', '2024-01-22 10:18:12', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (851, 0, '分享获得积分', '3', 'sys_integral_log_type', NULL, 'default', 'N', '0', 'admin', '2024-01-22 10:18:54', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (852, 0, '退款扣除积分', '4', 'sys_integral_log_type', NULL, 'default', 'N', '0', 'admin', '2024-01-22 10:19:53', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (853, 0, '购买积分商品', '5', 'sys_integral_log_type', NULL, 'default', 'N', '0', 'admin', '2024-01-22 10:20:34', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (854, 0, '完成随访获得积分', '6', 'sys_integral_log_type', NULL, 'default', 'N', '0', 'admin', '2024-01-23 11:47:40', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (857, 5, '私域疗法券', '5', 'sys_coupon_type', NULL, 'primary', 'N', '0', 'admin', '2024-01-24 15:35:12', 'admin', '2024-01-24 17:33:19', NULL);
 INSERT INTO `sys_dict_data` VALUES (872, 16, '小转2', '14', 'sys_store_order_buy_type', NULL, NULL, 'N', '0', '17749925835', '2023-09-28 16:35:36', '18323465069', '2023-10-25 09:47:24', NULL);
 INSERT INTO `sys_dict_data` VALUES (873, 15, '小转1', '16', 'sys_store_order_buy_type', NULL, NULL, 'N', '0', '17749925835', '2023-09-28 16:36:26', '18323465069', '2023-10-25 09:47:18', NULL);
 INSERT INTO `sys_dict_data` VALUES (878, 21, '第一期', '21', 'sys_store_order_buy_type', NULL, NULL, 'N', '0', '18323465069', '2023-10-25 09:30:32', '18323465069', '2023-10-25 09:45:02', NULL);
@@ -1020,7 +752,6 @@ INSERT INTO `sys_dict_data` VALUES (921, 0, '佣金冻结', '13', 'sys_company_m
 INSERT INTO `sys_dict_data` VALUES (922, 0, '佣金解冻', '14', 'sys_company_money_logs_type', NULL, 'primary', 'N', '0', 'zx', '2024-02-21 09:26:57', 'zx', '2024-02-21 09:27:26', NULL);
 INSERT INTO `sys_dict_data` VALUES (925, 0, '积分过期', '7', 'sys_integral_log_type', NULL, 'default', 'N', '0', 'zx', '2024-03-06 16:53:32', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (926, 0, '螳螂同步积分', '8', 'sys_integral_log_type', NULL, 'default', 'N', '0', 'zx', '2024-03-07 11:19:15', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (930, 0, '明医有话说', '8', 'sys_inquiry_sub_type', NULL, 'primary', 'N', '0', 'admin', '2024-04-02 14:20:12', 'admin', '2025-03-15 09:18:43', '杜丁主任');
 INSERT INTO `sys_dict_data` VALUES (931, 39, '其他', '31', 'sys_store_order_buy_type', NULL, 'default', 'N', '0', '数据黄丽', '2024-04-09 09:52:48', 'admin', '2024-12-02 14:28:24', NULL);
 INSERT INTO `sys_dict_data` VALUES (932, 3, '安健邦昶迈', '1', 'sys_store_qw_subject', NULL, 'default', 'N', '0', 'admin', '2024-04-18 16:52:35', '数据黄丽', '2024-10-17 10:30:57', NULL);
 INSERT INTO `sys_dict_data` VALUES (933, 3, '济合昌技术', '2', 'sys_store_qw_subject', NULL, 'default', 'N', '0', 'admin', '2024-04-18 16:52:48', '数据黄丽', '2024-10-17 10:30:53', NULL);
@@ -1087,7 +818,6 @@ INSERT INTO `sys_dict_data` VALUES (1034, 0, 'XT', '39', 'sys_store_channel', NU
 INSERT INTO `sys_dict_data` VALUES (1035, 0, '智慧云医', '15', 'sys_store_qw_subject', NULL, 'default', 'N', '0', '数据黄丽', '2024-04-25 10:54:42', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1037, 0, '会话中', '1', 'sys_chat_session_status', NULL, 'default', 'N', '0', 'admin', '2024-05-14 11:10:15', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1038, 0, '已结束', '2', 'sys_chat_session_status', NULL, 'default', 'N', '0', 'admin', '2024-05-14 11:10:24', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1039, 2, '助理医师', '助理医师', 'sys_doc_position', NULL, 'default', 'N', '0', '数据黄丽', '2024-05-17 16:57:34', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1040, 0, '未查看', '0', 'sys_chat_session_look', NULL, 'default', 'N', '0', 'admin', '2024-05-20 16:59:32', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1041, 0, '已查看', '1', 'sys_chat_session_look', NULL, 'default', 'N', '0', 'admin', '2024-05-20 16:59:44', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1042, 0, '图文消息', '4', 'chat_keyword_type', NULL, 'primary', 'N', '0', 'admin', '2024-05-27 09:17:55', 'admin', '2024-05-27 09:18:01', NULL);
@@ -1099,9 +829,7 @@ INSERT INTO `sys_dict_data` VALUES (1065, 0, '五仙', '3', 'sys_course_project'
 INSERT INTO `sys_dict_data` VALUES (1066, 0, '凯蒙', '4', 'sys_course_project', NULL, 'default', 'N', '0', 'admin', '2024-05-27 17:28:08', 'admin', '2024-05-27 17:28:13', NULL);
 INSERT INTO `sys_dict_data` VALUES (1067, 0, '已提交', '1', 'sys_drug_report_status', NULL, 'default', 'N', '0', 'zx', '2024-06-07 10:18:22', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1068, 0, '已评价', '2', 'sys_drug_report_status', NULL, 'default', 'N', '0', 'zx', '2024-06-07 10:18:30', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1069, 1, '大爱好医生', '9', 'sys_inquiry_sub_type', NULL, 'primary', 'N', '0', '数据黄丽', '2024-06-13 14:37:51', '数据黄丽', '2025-03-15 14:30:17', '朱长丽');
 INSERT INTO `sys_dict_data` VALUES (1070, 0, 'APP', '3', 'sys_app_type', NULL, 'primary', 'N', '0', 'admin', '2024-06-17 15:16:35', 'admin', '2025-04-11 09:27:17', NULL);
-INSERT INTO `sys_dict_data` VALUES (1071, 1, 'VIP咨询', '10', 'sys_inquiry_sub_type', NULL, 'default', 'N', '0', '数据黄丽', '2024-06-21 13:20:35', '数据黄丽', '2024-06-24 10:54:25', '医生助理使用');
 INSERT INTO `sys_dict_data` VALUES (1072, 2, 'TS-T', '20', 'sys_store_channel', NULL, 'default', 'N', '0', '数据黄丽', '2024-06-28 11:22:59', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1073, 0, '课程订单', '4', 'sys_store_payment_business_type', NULL, 'primary', 'N', '0', 'admin', '2024-06-28 15:38:53', 'admin', '2024-07-08 11:00:53', NULL);
 INSERT INTO `sys_dict_data` VALUES (1074, 0, '开通APP会员', '5', 'sys_store_payment_business_type', NULL, 'primary', 'N', '0', 'admin', '2024-06-28 15:39:38', 'admin', '2024-07-08 11:01:05', NULL);
@@ -1289,7 +1017,6 @@ INSERT INTO `sys_dict_data` VALUES (1264, 1, '文本', '1', 'sys_qwSop_settingTy
 INSERT INTO `sys_dict_data` VALUES (1265, 3, '链接', '3', 'sys_qwSop_settingType', NULL, 'default', 'N', '0', 'sgw', '2024-11-06 10:33:30', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1267, 16, '点播看课获得积分', '16', 'sys_integral_log_type', NULL, 'default', 'N', '0', 'admin', '2024-11-09 10:21:27', 'admin', '2024-11-09 10:21:38', NULL);
 INSERT INTO `sys_dict_data` VALUES (1268, 17, '点播答题获得积分', '17', 'sys_integral_log_type', NULL, 'default', 'N', '0', 'admin', '2024-11-09 10:21:55', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1269, 1, '饮片', '2', 'sys_recipe_type', NULL, 'default', 'N', '0', 'admin', '2024-11-13 13:45:57', 'admin', '2024-11-13 13:46:02', NULL);
 INSERT INTO `sys_dict_data` VALUES (1270, 0, '百度', '1', 'sys_qw_information_type', NULL, 'default', 'N', '0', 'zx', '2024-11-13 14:39:08', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1271, 0, '抖音', '2', 'sys_qw_information_type', NULL, 'default', 'N', '0', 'zx', '2024-11-13 14:39:13', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1272, 4, '已作废', '4', 'sys_qw_groupMsg_SendStatus', NULL, 'info', 'N', '0', 'admin', '2024-11-15 09:28:55', 'admin', '2024-11-15 09:29:07', NULL);
@@ -1408,7 +1135,6 @@ INSERT INTO `sys_dict_data` VALUES (1405, 2, '降级', '2', 'sys_qw_sop_rating_u
 INSERT INTO `sys_dict_data` VALUES (1406, 3, '未变动', '3', 'sys_qw_sop_rating_upFall', NULL, 'primary', 'N', '0', 'sgw', '2025-03-12 14:11:05', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1408, 0, '爱上', '7', 'sys_course_project', NULL, 'default', 'N', '0', 'zx', '2025-03-13 21:01:22', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1409, 0, '中医', '8', 'sys_course_project', NULL, 'default', 'N', '0', 'zx', '2025-03-13 21:01:34', 'admin', '2025-11-17 16:37:23', NULL);
-INSERT INTO `sys_dict_data` VALUES (1410, 2, '无', '11', 'sys_inquiry_sub_type', NULL, 'primary', 'N', '1', 'admin', '2025-03-15 09:18:35', '数据黄丽', '2025-03-15 14:33:15', '未做会诊入口');
 INSERT INTO `sys_dict_data` VALUES (1413, 28, '电话未接通', '28', 'crm_customer_tag', NULL, 'default', 'N', '0', '数据黄丽', '2025-03-20 14:04:43', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1414, 2, '修改SOP模板', 'update_sop_temp', 'company_sop_role', NULL, NULL, 'N', '0', 'admin', '2025-04-22 11:42:49', 'admin', '2025-04-22 11:43:08', NULL);
 INSERT INTO `sys_dict_data` VALUES (1415, 1, '新增SOP模板', 'add_sop_temp', 'company_sop_role', NULL, NULL, 'N', '0', 'admin', '2025-04-22 11:43:03', 'admin', '2025-04-22 11:44:26', NULL);
@@ -1437,7 +1163,6 @@ INSERT INTO `sys_dict_data` VALUES (1449, 0, '关键词打标签', '1', 'qw_auto
 INSERT INTO `sys_dict_data` VALUES (1450, 0, '客户入群行为打标签', '2', 'qw_auto_tags_type', NULL, 'success', 'N', '0', 'admin', '2025-06-16 11:35:21', 'admin', '2025-06-16 11:37:26', NULL);
 INSERT INTO `sys_dict_data` VALUES (1451, 0, '分时段打标签', '3', 'qw_auto_tags_type', NULL, 'info', 'N', '0', 'admin', '2025-06-16 11:35:28', 'admin', '2025-06-16 11:37:32', NULL);
 INSERT INTO `sys_dict_data` VALUES (1452, 0, '自动回复打标签', '4', 'qw_auto_tags_type', NULL, 'warning', 'N', '0', 'admin', '2025-06-16 11:35:37', 'admin', '2025-06-16 11:37:37', NULL);
-INSERT INTO `sys_dict_data` VALUES (1453, 1, '待推送', '5', 'sys_order_status', NULL, 'success', 'N', '0', 'admin', '2025-06-27 09:26:07', 'admin', '2025-06-27 09:26:42', NULL);
 INSERT INTO `sys_dict_data` VALUES (1454, 0, '禁用', '00', 'qw_user_is_auto', NULL, 'warning', 'N', '0', 'admin', '2025-07-02 14:41:51', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1455, 0, '启用', '01', 'qw_user_is_auto', NULL, 'success', 'N', '0', 'admin', '2025-07-02 14:42:02', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1456, 0, '上架', '1', 'sys_live_goods_show', NULL, 'primary', 'N', '0', 'admin', '2023-06-08 17:28:20', '', NULL, NULL);
@@ -1616,29 +1341,12 @@ INSERT INTO `sys_dict_data` VALUES (1634, 2, '正常', '1', 'project_user_status
 INSERT INTO `sys_dict_data` VALUES (1635, 3, '拉黑', '2', 'project_user_status', '', '', 'Y', '0', 'admin', '2021-11-24 23:26:40', 'admin', '2025-08-26 10:53:16', '拉黑');
 INSERT INTO `sys_dict_data` VALUES (1636, 3, '器械', '4', 'store_product_type', NULL, NULL, 'N', '0', 'admin', '2025-08-26 14:25:50', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1637, 6, '待推送', '6', 'sys_live_order_status', NULL, 'primary', 'N', '0', 'admin', '2025-07-04 17:28:20', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1638, 0, '手少阳三焦经', '手少阳三焦经', 'sys_vessel_twelve', NULL, 'default', 'N', '0', 'admin', '2025-09-08 14:42:58', 'admin', '2025-09-08 14:43:04', NULL);
-INSERT INTO `sys_dict_data` VALUES (1639, 1, '手太阴肺经', '手太阴肺经', 'sys_vessel_twelve', NULL, 'default', 'N', '0', 'admin', '2025-09-08 14:43:18', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1640, 2, '手厥阴心包经', '手厥阴心包经', 'sys_vessel_twelve', NULL, 'default', 'N', '0', 'admin', '2025-09-08 14:43:31', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1641, 3, '手少阴心经', '手少阴心经', 'sys_vessel_twelve', NULL, 'default', 'N', '0', 'admin', '2025-09-08 14:43:44', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1642, 4, '手阳明大肠经', '手阳明大肠经', 'sys_vessel_twelve', NULL, 'default', 'N', '0', 'admin', '2025-09-08 14:43:57', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1643, 5, '手太阳小肠经', '手太阳小肠经', 'sys_vessel_twelve', NULL, 'default', 'N', '0', 'admin', '2025-09-08 14:45:18', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1645, 1, '离职继承', '1', 'transfer_type', NULL, NULL, 'N', '0', 'admin', '2025-04-02 17:20:34', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1646, 2, '在职转接', '2', 'transfer_type', NULL, NULL, 'N', '0', 'admin', '2025-04-02 17:20:34', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1647, 0, '待审批', '0', 'transfer_approval_status', NULL, NULL, 'N', '0', 'admin', '2025-04-02 17:29:09', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1648, 1, '审批通过', '1', 'transfer_approval_status', NULL, NULL, 'N', '0', 'admin', '2025-04-02 17:29:09', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1649, 2, '审批驳回', '2', 'transfer_approval_status', NULL, NULL, 'N', '0', 'admin', '2025-04-02 17:29:09', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1650, 3, '已撤销', '3', 'transfer_approval_status', NULL, NULL, 'N', '0', 'admin', '2025-04-02 17:29:09', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1651, 0, '主任医师', '1', 'doctor_position', NULL, NULL, 'N', '0', '', NULL, 'admin', '2022-06-23 17:40:07', NULL);
-INSERT INTO `sys_dict_data` VALUES (1652, 0, '副主任医师', '2', 'doctor_position', NULL, NULL, 'N', '0', '', NULL, 'admin', '2022-06-23 17:40:15', NULL);
-INSERT INTO `sys_dict_data` VALUES (1653, 0, '主治医师', '3', 'doctor_position', NULL, NULL, 'N', '0', '', NULL, 'admin', '2022-06-23 17:40:24', NULL);
-INSERT INTO `sys_dict_data` VALUES (1654, 0, '执业药师', '4', 'doctor_position', NULL, NULL, 'N', '0', 'admin', '2022-06-01 16:04:53', 'admin', '2022-06-01 16:05:12', NULL);
-INSERT INTO `sys_dict_data` VALUES (1655, 0, '金牌营养师', '5', 'doctor_position', NULL, NULL, 'N', '0', 'admin', '2022-06-01 16:05:04', 'admin', '2022-06-24 12:01:15', NULL);
-INSERT INTO `sys_dict_data` VALUES (1656, 0, '资深营养师', '6', 'doctor_position', NULL, NULL, 'N', '0', 'admin', '2022-06-24 12:01:27', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1657, 0, '首席营养师', '7', 'doctor_position', NULL, NULL, 'N', '0', 'admin', '2022-06-24 12:01:46', '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1658, 0, '待支付', '0', 'doctor_order_status', NULL, NULL, 'N', '0', '', NULL, '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1659, 0, '进行中', '1', 'doctor_order_status', NULL, NULL, 'N', '0', '', NULL, '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1660, 0, '已完成', '2', 'doctor_order_status', NULL, NULL, 'N', '0', '', NULL, '', NULL, NULL);
-INSERT INTO `sys_dict_data` VALUES (1661, 0, '已关闭', '-1', 'doctor_order_status', NULL, NULL, 'N', '0', '', NULL, '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1662, 0, '无', '0', 'sys_fastgpt_keyword_file_type', NULL, 'info', 'N', '0', 'jzp', '2025-05-29 14:18:37', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1663, 0, '图片', '1', 'sys_fastgpt_keyword_file_type', NULL, 'primary', 'N', '0', 'jzp', '2025-05-29 14:18:55', '', NULL, NULL);
 INSERT INTO `sys_dict_data` VALUES (1664, 0, '停用', '1', 'sys_fastgpt_keyword_send_status', NULL, 'warning', 'N', '0', 'jzp', '2025-05-29 14:19:51', '', NULL, NULL);
@@ -1766,7 +1474,9 @@ INSERT INTO `sys_config` VALUES (6, '积分配置', 'his.integral', null, 'N', '
 INSERT INTO `sys_config` VALUES (7, '签到配置', 'his.sign', null, 'N', '', NULL, '', NULL, NULL);
 INSERT INTO `sys_config` VALUES (8, '用户协议', 'store.agreement', null, 'N', '', NULL, '', '2024-10-09 17:06:05', NULL);
 INSERT INTO `sys_config` VALUES (9, '支付配置', 'his.pay', null, 'N', '', NULL, '', '2025-09-08 17:13:32', NULL);
-INSERT INTO `sys_config` VALUES (10, '课堂配置', 'course.config', null, 'N', 'admin', '2024-09-10 15:46:49', 'admin', '2025-12-04 14:56:46', NULL);
+INSERT INTO sys_config
+(config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark)
+VALUES(25, '课堂配置', 'course.config', '{"answerRate":null,"videoLinkExpireDate":null,"answerErrorCount":null,"maxBufferLength":null,"videoIntegral":null,"answerIntegral":null,"defaultLine":null,"realLinkDomainName":null,"realLinkH5DomainName":null,"licenseURL":null,"licenseKey":null,"rewardType":null,"openCommentStatus":null,"completionMode":null,"isAllowUserPause":null,"miniprogramAppid":null,"miniprogramPage":null,"sidebarImageUrl":null,"miniAppAuthType":null,"userCourseAuthDomain":null,"defaultGrandGift":null,"smsDomainName":null,"smsDomain":null}', 'N', 'admin', NOW(), 'admin', NOW(), NULL);
 INSERT INTO `sys_config` VALUES (11, '红包配置', 'redPacket.config', null, 'N', '', NULL, '', '2025-08-13 13:46:53', NULL);
 INSERT INTO `sys_config` VALUES (12, '企业理念配置', 'store.concept', null, 'N', '', NULL, '', '2025-09-08 10:49:28', NULL);
 INSERT INTO `sys_config` VALUES (13, '布局配置', 'his.appShow', null, 'N', '', NULL, '', '2025-02-25 16:23:16', NULL);
@@ -1781,7 +1491,7 @@ INSERT INTO `sys_config` VALUES (39, '红包流量配置', 'redPacket.Traffic.co
 INSERT INTO `sys_config` VALUES (40, '点播播放源配置', 'courseMa.config', null, 'N', '', NULL, '', '2025-08-19 13:41:24', NULL);
 INSERT INTO `sys_config` VALUES (41, '协议配置', 'his.agreementConfig', null, 'N', '', NULL, '', '2025-08-10 09:56:41', NULL);
 INSERT INTO `sys_config` VALUES (43, '品牌介绍', 'his.brand', null, 'N', '', NULL, '', '2025-10-31 17:35:50', NULL);
-INSERT INTO `sys_config` VALUES (44, '佣金配置', 'his.brokerage', null, 'N', '', NULL, '', NULL, NULL);
+
 INSERT INTO `sys_config` VALUES (45, '优惠券', 'his.coupon', null, 'N', '', NULL, '', NULL, NULL);
 INSERT INTO `sys_config` VALUES (46, '资质证明', 'his.certs', null, 'N', '', NULL, '', '2025-11-01 11:46:48', NULL);
 INSERT INTO `sys_config` VALUES (47, '套餐包配置', 'his.package', null, 'N', '', NULL, '', NULL, NULL);
@@ -1793,7 +1503,6 @@ INSERT INTO `sys_config` VALUES (52, '注册配置', 'his.login', null, 'N', '',
 INSERT INTO `sys_config` VALUES (53, '积分配置', 'store.integral', null, 'N', '', NULL, '', '2025-09-04 16:48:40', NULL);
 INSERT INTO `sys_config` VALUES (54, 'APP推广配置', 'app.config', null, 'N', '', '2025-09-08 11:09:46', '', '2025-09-08 15:49:50', NULL);
 INSERT INTO `sys_config` VALUES (55, '支付配置', 'store.pay', null, 'N', '', NULL, '', '2025-03-12 09:47:16', NULL);
-INSERT INTO `sys_config` VALUES (71, '药品商城开关配置', 'medicalMall.func.switch', null, 'N', 'admin', '2025-09-12 09:39:31', 'admin', '2025-10-14 16:54:43', '药品商城相关功能开关');
 INSERT INTO `sys_config` VALUES (72, '润天账户余额', 'company.money', null, 'N', '', NULL, '', '2025-10-09 19:00:00', '请勿手动修改');
 INSERT INTO `sys_config` VALUES (73, '资质证书展示', 'his.zzzs', null, 'N', '', '2025-10-14 14:57:25', '', '2025-10-14 17:03:26', NULL);
 INSERT INTO `sys_config` VALUES (74, '企微活码', 'qwContactWay.config', null, 'N', '', '2025-11-24 14:51:31', '', NULL, NULL);

+ 29 - 0
fs-service/src/main/resources/mapper/company/CompanyLobsterTagUserRelMapper.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.company.mapper.CompanyLobsterTagUserRelMapper">
+
+    <resultMap id="CompanyLobsterTagUserRelResult" type="CompanyLobsterTagUserRel">
+        <result property="id"                column="id"/>
+        <result property="companyId"         column="company_id"/>
+        <result property="bindingId"         column="binding_id"/>
+        <result property="tagCode"           column="tag_code"/>
+        <result property="templateId"        column="template_id"/>
+        <result property="externalContactId" column="external_contact_id"/>
+        <result property="createBy"          column="create_by"/>
+        <result property="createTime"        column="create_time"/>
+    </resultMap>
+
+    <insert id="batchInsert">
+        insert into company_lobster_tag_user_rel
+        (company_id, binding_id, tag_code, template_id, external_contact_id, create_by, create_time,corp_id,company_user_id,qw_user_id)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.companyId}, #{item.bindingId}, #{item.tagCode}, #{item.templateId},
+             #{item.externalContactId}, #{item.createBy}, #{item.createTime},#{item.corpId},#{item.companyUserId},#{item.qwUserId})
+        </foreach>
+    </insert>
+    <update id="updateBatchRelBybinding">
+        update company_lobster_tag_user_rel set del_flag = #{flag} where binding_id = #{id}
+    </update>
+
+</mapper>

+ 12 - 3
fs-service/src/main/resources/mapper/company/CompanyTagTemplateBindingMapper.xml

@@ -36,7 +36,7 @@
 
     <insert id="insertBinding" parameterType="CompanyTagTemplateBinding" useGeneratedKeys="true" keyProperty="id">
         insert into company_tag_template_binding
-        (company_id, tag_code, tag_name, template_id, template_name, priority, match_condition, 
+        (company_id, tag_code, tag_name, template_id, template_name, priority, match_condition,
          status, del_flag, create_by, create_time, update_by, update_time)
         values
         (#{companyId}, #{tagCode}, #{tagName}, #{templateId}, #{templateName}, #{priority}, #{matchCondition},
@@ -92,14 +92,23 @@
         </foreach>
         order by priority desc
     </select>
+    <select id="listByStatus" resultType="com.fs.company.domain.CompanyTagTemplateBinding">
+        select id, company_id, tag_code, tag_name, template_id, template_name, priority,
+        match_condition, status, del_flag, create_by, create_time, update_by, update_time
+        from company_tag_template_binding
+        where del_flag = 0
+        and company_id = #{companyId}
+        and status = #{status}
+        order by priority desc, create_time desc
+    </select>
 
     <insert id="batchBind">
         insert into company_tag_template_binding
-        (company_id, tag_code, tag_name, template_id, template_name, priority, status, 
+        (company_id, tag_code, tag_name, template_id, template_name, priority, status,
          del_flag, create_by, create_time, update_by, update_time)
         values
         <foreach collection="tagCodes" item="tagCode" separator=",">
-            (#{companyId}, #{tagCode}, #{tagCode}, #{templateId}, '', 0, 1, 0, 
+            (#{companyId}, #{tagCode}, #{tagCode}, #{templateId}, '', 0, 1, 0,
              #{createBy}, #{createTime}, #{updateBy}, #{updateTime})
         </foreach>
     </insert>

+ 28 - 5
fs-service/src/main/resources/mapper/company/CompanyWorkflowLobsterEdgeMapper.xml

@@ -33,11 +33,16 @@
         </foreach>
     </insert>
 
-    <update id="deleteByWorkflowId">
-        update company_workflow_lobster_edge
-        set del_flag = 1
-        where workflow_id = #{workflowId} and del_flag = 0
-    </update>
+    <!--
+      这里使用物理删除而不是逻辑删除:
+      因为存在唯一索引 (workflow_id, edge_key, del_flag),当历史上已存在 del_flag=1 的同 edge_key 记录时,
+      再将 del_flag=0 更新为 1 会触发唯一键冲突(Duplicate entry)。
+      画布保存场景下连线是可重建数据,直接按 workflow_id 清理后重插最稳妥。
+    -->
+    <delete id="deleteByWorkflowId">
+        delete from company_workflow_lobster_edge
+        where workflow_id = #{workflowId}
+    </delete>
 
     <select id="selectByWorkflowId" resultMap="CompanyWorkflowLobsterEdgeResult">
         select id, workflow_id, edge_key, source_node_code, target_node_code, source_port, target_port,
@@ -47,4 +52,22 @@
         order by sort_no asc
     </select>
 
+    <update id="updateById">
+        update company_workflow_lobster_edge
+        <trim prefix="set" suffixOverrides=",">
+            <if test="entity.edgeKey != null">edge_key = #{entity.edgeKey},</if>
+            <if test="entity.sourceNodeCode != null">source_node_code = #{entity.sourceNodeCode},</if>
+            <if test="entity.targetNodeCode != null">target_node_code = #{entity.targetNodeCode},</if>
+            <if test="entity.sourcePort != null">source_port = #{entity.sourcePort},</if>
+            <if test="entity.targetPort != null">target_port = #{entity.targetPort},</if>
+            <if test="entity.edgeLabel != null">edge_label = #{entity.edgeLabel},</if>
+            <if test="entity.edgeColor != null">edge_color = #{entity.edgeColor},</if>
+            <if test="entity.conditionExpr != null">condition_expr = #{entity.conditionExpr},</if>
+            <if test="entity.sortNo != null">sort_no = #{entity.sortNo},</if>
+            <if test="entity.updateBy != null">update_by = #{entity.updateBy},</if>
+            <if test="entity.updateTime != null">update_time = #{entity.updateTime},</if>
+        </trim>
+        where id = #{entity.id}
+    </update>
+
 </mapper>

+ 9 - 0
fs-service/src/main/resources/mapper/company/CompanyWorkflowLobsterMapper.xml

@@ -43,6 +43,15 @@
           and del_flag = 0
         limit 1
     </select>
+    <select id="selectTemplateListByStatus" resultType="com.fs.company.domain.CompanyWorkflowLobster">
+        select id, company_id, template_code, template_name, industry_type, description, status, version,
+               create_by, create_time, update_by, update_time, del_flag
+        from company_workflow_lobster
+        where del_flag = 0
+          and company_id = #{companyId}
+          and status = #{status}
+        order by create_time desc
+    </select>
 
     <update id="updateTemplateById" parameterType="CompanyWorkflowLobster">
         update company_workflow_lobster

+ 23 - 4
fs-service/src/main/resources/mapper/company/CompanyWorkflowLobsterNodeMapper.xml

@@ -4,27 +4,46 @@
 
     <insert id="batchInsert">
         insert into company_workflow_lobster_node
-        (workflow_id, node_code, node_name, node_type, sort_no, next_node_code, message_template, condition_expr, node_config, greeting_config, create_by, create_time, update_by, update_time, del_flag)
+        (workflow_id, node_code, node_name, node_type, sort_no, next_node_code, message_template, condition_expr, node_config, greeting_config, send_time, create_by, create_time, update_by, update_time, del_flag)
         values
         <foreach collection="list" item="item" separator=",">
             (#{item.workflowId}, #{item.nodeCode}, #{item.nodeName}, #{item.nodeType}, #{item.sortNo}, #{item.nextNodeCode},
-            #{item.messageTemplate}, #{item.conditionExpr}, #{item.nodeConfig}, #{item.greetingConfig}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime}, #{item.delFlag})
+            #{item.messageTemplate}, #{item.conditionExpr}, #{item.nodeConfig}, #{item.greetingConfig}, #{item.sendTime}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime}, #{item.delFlag})
         </foreach>
     </insert>
 
     <update id="deleteByWorkflowId">
         update company_workflow_lobster_node
         set del_flag = 1
-        where workflow_id = #{workflowId}
+        where workflow_id = #{workflowId} and del_flag = 0
+    </update>
+    <update id="updateBatch">
+        update company_workflow_lobster_node
+        set greeting_config = case id
+        <foreach collection="list" item="item">
+            when #{item.id} then #{item.greetingConfig}
+        </foreach>
+        end
+        where id in
+        <foreach collection="list" item="item" separator="," open="(" close=")">
+            #{item.id}
+        </foreach>
     </update>
 
     <select id="selectByWorkflowId" resultType="CompanyWorkflowLobsterNode">
         select id, workflow_id, node_code, node_name, node_type, sort_no, next_node_code, message_template,
-               condition_expr, node_config, greeting_config, create_by, create_time, update_by, update_time, del_flag
+               condition_expr, node_config, greeting_config, send_time, create_by, create_time, update_by, update_time, del_flag
         from company_workflow_lobster_node
         where workflow_id = #{workflowId}
           and del_flag = 0
         order by sort_no asc, id asc
     </select>
+    <select id="checkNodeGreeting" resultType="java.lang.Integer">
+        select count(1) from company_workflow_lobster_node
+        where workflow_id = #{templateId}
+          and greeting_config is null
+        and del_flag = 0
+        and node_type = 2
+    </select>
 
 </mapper>

+ 159 - 0
fs-service/src/main/resources/mapper/company/CompanyWorkflowLobsterTaskMapper.xml

@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.company.mapper.CompanyWorkflowLobsterTaskMapper">
+
+    <resultMap id="CompanyWorkflowLobsterTaskResult" type="CompanyWorkflowLobsterTask">
+        <result property="id"              column="id"/>
+        <result property="companyId"       column="company_id"/>
+        <result property="templateId"      column="template_id"/>
+        <result property="taskName"        column="task_name"/>
+        <result property="taskType"        column="task_type"/>
+        <result property="taskContent"     column="task_content"/>
+        <result property="cronExpression"  column="cron_expression"/>
+        <result property="executeStatus"   column="execute_status"/>
+        <result property="executeCount"    column="execute_count"/>
+        <result property="maxRetry"        column="max_retry"/>
+        <result property="retryCount"      column="retry_count"/>
+        <result property="lastExecuteTime" column="last_execute_time"/>
+        <result property="nextExecuteTime" column="next_execute_time"/>
+        <result property="failReason"      column="fail_reason"/>
+        <result property="sortOrder"       column="sort_order"/>
+        <result property="delFlag"         column="del_flag"/>
+        <result property="corpId"          column="corp_id"/>
+        <result property="companyUserId"   column="company_user_id"/>
+        <result property="lobsterNodeId"   column="lobster_node_id"/>
+        <result property="remark"          column="remark"/>
+        <result property="createBy"        column="create_by"/>
+        <result property="createTime"      column="create_time"/>
+        <result property="updateBy"        column="update_by"/>
+        <result property="updateTime"      column="update_time"/>
+    </resultMap>
+
+    <select id="selectByIdAndCompanyId" resultMap="CompanyWorkflowLobsterTaskResult">
+        select id, company_id, template_id, task_name, task_type, task_content,
+               cron_expression, execute_status, execute_count, max_retry, retry_count,
+               last_execute_time, next_execute_time, fail_reason, sort_order, del_flag,
+               corp_id, company_user_id, lobster_node_id, remark,
+               create_by, create_time, update_by, update_time
+        from company_workflow_lobster_task
+        where id = #{id}
+          and company_id = #{companyId}
+          and del_flag = 0
+        limit 1
+    </select>
+
+    <select id="selectByTemplateId" resultMap="CompanyWorkflowLobsterTaskResult">
+        select id, company_id, template_id, task_name, task_type, task_content,
+               cron_expression, execute_status, execute_count, max_retry, retry_count,
+               last_execute_time, next_execute_time, fail_reason, sort_order, del_flag,
+               corp_id, company_user_id, lobster_node_id, remark,
+               create_by, create_time, update_by, update_time
+        from company_workflow_lobster_task
+        where template_id = #{templateId}
+          and company_id = #{companyId}
+          and del_flag = 0
+        order by sort_order asc, id asc
+    </select>
+
+    <select id="selectPendingTasks" resultMap="CompanyWorkflowLobsterTaskResult">
+        select id, company_id, template_id, task_name, task_type, task_content,
+               cron_expression, execute_status, execute_count, max_retry, retry_count,
+               last_execute_time, next_execute_time, fail_reason, sort_order, del_flag,
+               corp_id, company_user_id, lobster_node_id, remark,
+               create_by, create_time, update_by, update_time
+        from company_workflow_lobster_task
+        where company_id = #{companyId}
+          and del_flag = 0
+          and execute_status = 0
+          and next_execute_time &lt;= #{beforeTime}
+        order by next_execute_time asc, sort_order asc
+        limit #{limit}
+    </select>
+
+    <insert id="insertTask" parameterType="CompanyWorkflowLobsterTask" useGeneratedKeys="true" keyProperty="id">
+        insert into company_workflow_lobster_task
+        (company_id, template_id, task_name, task_type, task_content, cron_expression,
+         execute_status, execute_count, max_retry, retry_count,
+         last_execute_time, next_execute_time, fail_reason, sort_order, del_flag,
+         corp_id, company_user_id, lobster_node_id, remark,
+         create_by, create_time, update_by, update_time)
+        values
+        (#{companyId}, #{templateId}, #{taskName}, #{taskType}, #{taskContent}, #{cronExpression},
+         #{executeStatus}, #{executeCount}, #{maxRetry}, #{retryCount},
+         #{lastExecuteTime}, #{nextExecuteTime}, #{failReason}, #{sortOrder}, #{delFlag},
+         #{corpId}, #{companyUserId}, #{lobsterNodeId}, #{remark},
+         #{createBy}, #{createTime}, #{updateBy}, #{updateTime})
+    </insert>
+
+    <update id="updateTaskById" parameterType="CompanyWorkflowLobsterTask">
+        update company_workflow_lobster_task
+        <trim prefix="set" suffixOverrides=",">
+            <if test="taskName != null">task_name = #{taskName},</if>
+            <if test="taskType != null">task_type = #{taskType},</if>
+            <if test="taskContent != null">task_content = #{taskContent},</if>
+            <if test="cronExpression != null">cron_expression = #{cronExpression},</if>
+            <if test="executeStatus != null">execute_status = #{executeStatus},</if>
+            <if test="executeCount != null">execute_count = #{executeCount},</if>
+            <if test="maxRetry != null">max_retry = #{maxRetry},</if>
+            <if test="retryCount != null">retry_count = #{retryCount},</if>
+            <if test="lastExecuteTime != null">last_execute_time = #{lastExecuteTime},</if>
+            <if test="nextExecuteTime != null">next_execute_time = #{nextExecuteTime},</if>
+            <if test="failReason != null">fail_reason = #{failReason},</if>
+            <if test="sortOrder != null">sort_order = #{sortOrder},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+          and del_flag = 0
+    </update>
+
+    <update id="updateExecuteStatus">
+        update company_workflow_lobster_task
+        set execute_status = #{executeStatus},
+            execute_count = execute_count + 1,
+            last_execute_time = #{lastExecuteTime},
+            next_execute_time = #{nextExecuteTime}
+        <if test="failReason != null">
+            , fail_reason = #{failReason}
+        </if>
+        where id = #{id}
+          and del_flag = 0
+    </update>
+
+    <update id="logicalDeleteById">
+        update company_workflow_lobster_task
+        set del_flag = 1
+        where id = #{id}
+          and company_id = #{companyId}
+          and del_flag = 0
+    </update>
+    <update id="updateDelFlagByBinding">
+        update company_workflow_lobster_task
+        set del_flag = #{flag}
+        where binding_id = #{id}
+    </update>
+    <update id="updateTaskListExecuteStatus">
+        update company_workflow_lobster_task
+        <foreach item="item" collection="list" separator="," open="(" close=")" index="index">
+            set execute_status = #{item.executeStatus}
+            where
+                id =
+            #{item.id}
+        </foreach>
+    </update>
+
+    <insert id="batchInsert">
+        insert into company_workflow_lobster_task
+        (company_id, template_id, task_name, task_type, task_content,
+         corp_id,create_by, create_time, company_user_id, lobster_node_id, send_time,qw_user_id,binding_id)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.companyId}, #{item.templateId}, #{item.taskName}, #{item.taskType}, #{item.taskContent},
+             #{item.corpId},#{item.createBy}, #{item.createTime},
+            #{item.companyUserId}, #{item.lobsterNodeId},#{item.sendTime},#{item.qwUserId},#{item.bindingId}
+             )
+        </foreach>
+    </insert>
+
+</mapper>

+ 16 - 0
fs-service/src/main/resources/mapper/company/CompanyWorkflowLobsterVariableMapper.xml

@@ -27,4 +27,20 @@
         order by id asc
     </select>
 
+    <update id="updateById">
+        update company_workflow_lobster_variable
+        <trim prefix="set" suffixOverrides=",">
+            <if test="entity.varCode != null">var_code = #{entity.varCode},</if>
+            <if test="entity.varName != null">var_name = #{entity.varName},</if>
+            <if test="entity.varType != null">var_type = #{entity.varType},</if>
+            <if test="entity.sourceType != null">source_type = #{entity.sourceType},</if>
+            <if test="entity.required != null">required = #{entity.required},</if>
+            <if test="entity.defaultValue != null">default_value = #{entity.defaultValue},</if>
+            <if test="entity.description != null">description = #{entity.description},</if>
+            <if test="entity.updateBy != null">update_by = #{entity.updateBy},</if>
+            <if test="entity.updateTime != null">update_time = #{entity.updateTime},</if>
+        </trim>
+        where id = #{entity.id}
+    </update>
+
 </mapper>