Selaa lähdekoodia

Merge branch '红德堂-test' into 红德堂

wangxy 2 viikkoa sitten
vanhempi
commit
371553452d
34 muutettua tiedostoa jossa 593 lisäystä ja 157 poistoa
  1. 62 0
      fs-admin/src/main/java/com/fs/course/controller/FsCourseWatchCommentController.java
  2. 8 0
      fs-admin/src/main/java/com/fs/course/controller/FsUserCourseController.java
  3. 4 0
      fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java
  4. 6 0
      fs-company-app/src/main/resources/logback.xml
  5. 4 1
      fs-company/src/main/java/com/fs/user/FsUserAdminController.java
  6. 12 2
      fs-service/src/main/java/com/fs/company/domain/CompanyRedPacketBalanceLogs.java
  7. 10 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyUserUserMapper.java
  8. 10 0
      fs-service/src/main/java/com/fs/company/param/HelpAddPatientParam.java
  9. 10 1
      fs-service/src/main/java/com/fs/company/service/impl/CompanyRedPacketBalanceLogsServiceImpl.java
  10. 11 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseMapper.java
  11. 5 0
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchCommentPageParam.java
  12. 9 0
      fs-service/src/main/java/com/fs/course/service/IFsCourseWatchCommentService.java
  13. 5 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseService.java
  14. 51 18
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchCommentServiceImpl.java
  15. 6 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java
  16. 40 0
      fs-service/src/main/java/com/fs/course/vo/CommentImportTemplate.java
  17. 3 0
      fs-service/src/main/java/com/fs/his/domain/FsPackage.java
  18. 26 0
      fs-service/src/main/java/com/fs/his/domain/FsPatient.java
  19. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsPackageMapper.java
  20. 5 0
      fs-service/src/main/java/com/fs/his/service/IFsUserService.java
  21. 60 37
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageServiceImpl.java
  22. 11 1
      fs-service/src/main/java/com/fs/his/service/impl/FsUserAddressServiceImpl.java
  23. 49 4
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  24. 4 0
      fs-service/src/main/java/com/fs/his/vo/FsPackageListVO.java
  25. 10 0
      fs-service/src/main/java/com/fs/store/param/h5/FsUserPageListParam.java
  26. 1 1
      fs-service/src/main/resources/mapper/company/CompanyRedPacketBalanceLogsMapper.xml
  27. 12 0
      fs-service/src/main/resources/mapper/company/CompanyUserUserMapper.xml
  28. 2 5
      fs-service/src/main/resources/mapper/course/FsCourseTrafficLogMapper.xml
  29. 11 0
      fs-service/src/main/resources/mapper/course/FsCourseWatchCommentMapper.xml
  30. 3 0
      fs-service/src/main/resources/mapper/his/FsPackageMapper.xml
  31. 7 1
      fs-service/src/main/resources/mapper/his/FsPatientMapper.xml
  32. 20 8
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  33. 103 78
      fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  34. 9 0
      fs-user-app/src/main/java/com/fs/app/param/FsPatientAddEditParam.java

+ 62 - 0
fs-admin/src/main/java/com/fs/course/controller/FsCourseWatchCommentController.java

@@ -1,13 +1,18 @@
 package com.fs.course.controller;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import com.fs.common.core.domain.R;
 import com.fs.course.param.FsCourseWatchCommentPageParam;
+import com.fs.course.vo.CommentImportTemplate;
 import com.fs.course.vo.FsCourseWatchCommentListVO;
 import com.fs.qw.service.IQwExternalContactService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -26,6 +31,9 @@ import com.fs.course.domain.FsCourseWatchComment;
 import com.fs.course.service.IFsCourseWatchCommentService;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
 
 /**
  * 看课评论Controller
@@ -145,4 +153,58 @@ public class FsCourseWatchCommentController extends BaseController
         }
     }
 
+    /**
+     * 下载导入模板
+     */
+    @Log(title = "评论导入模板", businessType = BusinessType.EXPORT)
+    @GetMapping("/template")
+    public AjaxResult downloadTemplate(Integer type) {
+        try {
+            ExcelUtil<CommentImportTemplate> util = new ExcelUtil<>(CommentImportTemplate.class);
+            List<CommentImportTemplate> templateData = new ArrayList<>();
+            CommentImportTemplate example = createExampleRow();
+            templateData.add(example);
+            // 根据type参数确定需要导出的字段
+            List<String> selectedFields = new ArrayList<>();
+            if (type != null && type == 1) {
+                // 视频类型,不包含课程列
+                selectedFields.addAll(Arrays.asList("userId", "userType", "videoId", "type", "parentId", "content", "fontSize", "mode", "color"));
+            } else {
+                // 默认课程类型,不包含视频列
+                selectedFields.addAll(Arrays.asList("userId", "userType", "courseId", "type", "parentId", "content", "fontSize", "mode", "color"));
+            }
+
+            return util.exportExcelSelectedColumns(templateData, "评论导入模板", selectedFields);
+        } catch (Exception e) {
+            logger.error("下载评论导入模板失败", e);
+        }
+        return AjaxResult.error();
+    }
+
+    /**
+     * 创建示例数据行(用于模板参考)
+     */
+    private CommentImportTemplate createExampleRow() {
+        CommentImportTemplate example = new CommentImportTemplate();
+        example.setUserId(50L);
+        example.setCourseId(20001L);
+        example.setVideoId(30001L);
+        example.setType(1);
+        example.setUserType(2);
+        example.setContent("请输入您的评论内容...");
+        example.setFontSize("14px");
+        example.setMode("normal");
+        example.setColor("#333333");
+        return example;
+    }
+
+    @PostMapping("/import")
+    @Log(title = "导入看课评论", businessType = BusinessType.IMPORT)
+    public  R importData(MultipartFile file,Integer type) throws Exception {
+        ExcelUtil<CommentImportTemplate> util = new ExcelUtil<>(CommentImportTemplate.class);
+        List<CommentImportTemplate> commentImportTemplates = util.importExcel(file.getInputStream());
+        int i = fsCourseWatchCommentService.insertBatch(commentImportTemplates,type);
+        return R.ok().put("data", i);
+    }
+
 }

+ 8 - 0
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseController.java

@@ -357,4 +357,12 @@ public class FsUserCourseController extends BaseController
         redisCacheUtil.delRedisKey("cache:video");
         return R.ok();
     }
+     /**
+     * 查询项目下的课程名称
+     */
+    @GetMapping("/getCourseByProject/{projectId}")
+    public R getCourseByProject(@PathVariable Long projectId){
+        List<FsUserCourse> courseNames = fsUserCourseService.selectCourseNameByProjectId(projectId);
+        return R.ok().put("data", courseNames);
+    }
 }

+ 4 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -4,6 +4,7 @@ package com.fs.app.controller;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.app.annotation.Login;
+import com.fs.app.annotation.LoginUser;
 import com.fs.app.config.ImageStorageConfig;
 import com.fs.app.param.FsUserProjectUpdateParam;
 import com.fs.app.param.FsUserTagUpdateParam;
@@ -83,6 +84,7 @@ public class FsUserController extends AppBaseController {
     @Autowired
     private IFsUserProjectTagService userProjectTagService;
 
+
     @Login
     @PostMapping("/pageList")
     @ApiOperation("用户会员分页列表")
@@ -204,6 +206,8 @@ public class FsUserController extends AppBaseController {
         return ResponseResult.ok(fsUserStatisticsVO);
     }
 
+
+
     @Login
     @GetMapping("/firstPage/userRanking")
     @ApiOperation("首页数据/详情-销售排行榜统计")

+ 6 - 0
fs-company-app/src/main/resources/logback.xml

@@ -80,6 +80,12 @@
 		<appender-ref ref="console" />
 	</root>
 
+    <Logger name="com.fs.his.mapper" level="debug"/>
+    <Logger name="com.fs.course.mapper" level="debug"/>
+    <Logger name="com.fs.company.mapper" level="debug"/>
+    <Logger name="com.fs.hisStore.mapper" level="debug"/>
+    <Logger name="org.apache.ibatis" level="debug"/>
+
 	<!--系统操作日志-->
     <root level="info">
         <appender-ref ref="file_info" />

+ 4 - 1
fs-company/src/main/java/com/fs/user/FsUserAdminController.java

@@ -73,7 +73,7 @@ public class FsUserAdminController extends BaseController {
     @PostMapping("/list")
     @ApiOperation("会员列表(与移动端使用的相同查询)")
     public TableDataInfo pageList(@RequestBody FsUserPageListParam param) {
-        //startPage();
+        startPage();
 
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
        /* if (param.getIsMyFsUser()){
@@ -83,6 +83,9 @@ public class FsUserAdminController extends BaseController {
             param.setCompanyId(loginUser.getCompany().getCompanyId());
         }*/
         param.setCompanyId(loginUser.getCompany().getCompanyId());
+        param.setSaleUserId(String.valueOf(loginUser.getUser().getUserId()));
+        param.setIsAdmin(loginUser.getUser().isAdmin());
+        param.setDeptId(loginUser.getUser().getDeptId());
         if(param.getPhone()!=null && !"".equals(param.getPhone())){
             param.setPhone(PhoneUtil.encryptPhone(param.getPhone()));
         }

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

@@ -1,6 +1,9 @@
 package com.fs.company.domain;
 
 import java.math.BigDecimal;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fs.common.annotation.Excel;
 import lombok.Data;
@@ -28,7 +31,7 @@ public class CompanyRedPacketBalanceLogs extends BaseEntity{
     private String companyName;
 
     /** 金额 */
-    @Excel(name = "金额")
+    @Excel(name = "消耗金额")
     private BigDecimal money;
 
     /** 余额 */
@@ -36,11 +39,18 @@ public class CompanyRedPacketBalanceLogs extends BaseEntity{
     private BigDecimal balance;
 
     /** 类型 字典字段 */
-    @Excel(name = "类型")
+
     private Integer logsType;
 
     /** 是否处理状态(0-初始化,1-已同步) */
     private Long status;
 
+    @Excel(name = "类型")
+    @TableField(exist = false)
+    private  String statusName;
+
+    @Excel(name = "时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @TableField(exist = false)
+    private Date logTime;
 
 }

+ 10 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyUserUserMapper.java

@@ -65,4 +65,14 @@ public interface CompanyUserUserMapper
      * 查询销售关联会员
      */
     List<MyMemberVO> selectFsUserByCompanyUserId(@Param("companyUserId") Long companyUserId, @Param("keyword") String keyword);
+
+    /**
+     * 销售是否存在会员
+     */
+    int countFsUserByCompanyUserId(@Param("companyUserId") Long companyUserId,@Param("userId") Long userId,@Param("companyId") Long companyId);
+
+    /**
+     * 查询销售下已存在的用户ID列表
+     */
+    List<Long> selectExistingUserIdsByCompanyUserId(@Param("companyUserId") Long companyUserId, @Param("companyId") Long companyId, @Param("userIds") List<Long> userIds);
 }

+ 10 - 0
fs-service/src/main/java/com/fs/company/param/HelpAddPatientParam.java

@@ -54,4 +54,14 @@ public class HelpAddPatientParam implements Serializable {
     private Integer isFurther;
     private String primaryHospital;
     private String primaryImages;
+
+    /**
+     * 是否是否因慢病在线下就诊?且对该处方内的产品无过敏或不良反应?0:是,我线下就诊过;  1: 否
+     */
+    private Integer isOfflineConsultation;
+
+    /**
+     * 是否已详细阅读疗法说明,确认自己符合疗法产品的适用人群,并了解使用方法,使用禁忌等?0:是 1:否
+     */
+    private Integer isReadTherapy;
 }

+ 10 - 1
fs-service/src/main/java/com/fs/company/service/impl/CompanyRedPacketBalanceLogsServiceImpl.java

@@ -3,6 +3,7 @@ package com.fs.company.service.impl;
 import java.util.List;
 import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DictUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.company.mapper.CompanyRedPacketBalanceLogsMapper;
@@ -39,7 +40,15 @@ public class CompanyRedPacketBalanceLogsServiceImpl extends ServiceImpl<CompanyR
     @Override
     public List<CompanyRedPacketBalanceLogs> selectCompanyRedPacketBalanceLogsList(CompanyRedPacketBalanceLogs companyRedPacketBalanceLogs)
     {
-        return baseMapper.selectCompanyRedPacketBalanceLogsList(companyRedPacketBalanceLogs);
+        List<CompanyRedPacketBalanceLogs> packetBalanceLogsList = baseMapper.selectCompanyRedPacketBalanceLogsList(companyRedPacketBalanceLogs);
+        //获取字段名称
+
+        if(packetBalanceLogsList != null && !packetBalanceLogsList.isEmpty()){
+            packetBalanceLogsList.forEach(item -> {
+                item.setStatusName(DictUtils.getDictLabel("sys_company_money_logs_type", String.valueOf(item.getStatus())));
+            });
+        }
+        return  packetBalanceLogsList;
     }
 
     /**

+ 11 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseMapper.java

@@ -335,4 +335,15 @@ public interface FsUserCourseMapper
      */
     @Update("update fs_user_course set config_json = #{configJson} where course_id = #{id}")
     void editConfig(@Param("id") Long id, @Param("configJson") String configJson);
+
+    /**
+     * 查询项目下的课程名称
+     */
+    @Select("select course_id,course_name from fs_user_course where project = #{projectId} and is_del = 0")
+    List<FsUserCourse> selectCourseNameByProjectId(@Param("projectId") Long projectId);
+    /**
+     * 查询所有课程
+     */
+    @Select("select * from fs_user_course where is_del = 0")
+    List<FsUserCourse> selectAllCourse();
 }

+ 5 - 0
fs-service/src/main/java/com/fs/course/param/FsCourseWatchCommentPageParam.java

@@ -39,4 +39,9 @@ public class FsCourseWatchCommentPageParam extends BaseEntity{
     @Excel(name = "视频id")
     private Long videoId;
 
+    /**
+     * 类型 0 课程 1 视频
+     */
+    private Long type;
+
 }

+ 9 - 0
fs-service/src/main/java/com/fs/course/service/IFsCourseWatchCommentService.java

@@ -7,6 +7,7 @@ import com.fs.course.domain.FsCourseWatchComment;
 import com.fs.course.param.FsCourseWatchCommentListParam;
 import com.fs.course.param.FsCourseWatchCommentPageParam;
 import com.fs.course.param.FsCourseWatchCommentSaveParam;
+import com.fs.course.vo.CommentImportTemplate;
 import com.fs.course.vo.FsCourseWatchCommentListVO;
 import com.fs.course.vo.FsCourseWatchCommentVO;
 
@@ -41,6 +42,14 @@ public interface IFsCourseWatchCommentService extends IService<FsCourseWatchComm
      */
     int insertFsCourseWatchComment(FsCourseWatchComment fsCourseWatchComment);
 
+    /**
+     * 批量新增看课评论
+     *
+     * @param list 新增看课评论列表
+     * @return 结果
+     */
+    int insertBatch(List<CommentImportTemplate> list,Integer type);
+
     /**
      * 修改看课评论
      *

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

@@ -140,4 +140,9 @@ public interface IFsUserCourseService
      * 修改课堂配置
      */
     void editConfig(Long id, String configJson);
+
+    /**
+     * 查询项目下的课程名称
+     */
+    List<FsUserCourse> selectCourseNameByProjectId(Long projectId);
 }

+ 51 - 18
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchCommentServiceImpl.java

@@ -2,20 +2,24 @@ package com.fs.course.service.impl;
 
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.course.param.FsCourseWatchCommentListParam;
 import com.fs.course.param.FsCourseWatchCommentPageParam;
 import com.fs.course.param.FsCourseWatchCommentSaveParam;
+import com.fs.course.vo.CommentImportTemplate;
 import com.fs.course.vo.FsCourseWatchCommentListVO;
 import com.fs.course.vo.FsCourseWatchCommentVO;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.system.domain.SysKeyword;
 import com.fs.system.mapper.SysKeywordMapper;
+import jodd.util.CollectionUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -23,6 +27,7 @@ import org.springframework.stereotype.Service;
 import com.fs.course.mapper.FsCourseWatchCommentMapper;
 import com.fs.course.domain.FsCourseWatchComment;
 import com.fs.course.service.IFsCourseWatchCommentService;
+import org.springframework.util.CollectionUtils;
 
 /**
  * 看课评论Service业务层处理
@@ -42,7 +47,7 @@ public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCo
     private QwExternalContactMapper qwExternalContactMapper;
 
     @Autowired
-    public RedisTemplate<String,String> redisTemplate;
+    public RedisTemplate<String, String> redisTemplate;
 
     @Autowired
     private SysKeywordMapper mapper;
@@ -54,8 +59,7 @@ public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCo
      * @return 看课评论
      */
     @Override
-    public FsCourseWatchComment selectFsCourseWatchCommentByCommentId(Long commentId)
-    {
+    public FsCourseWatchComment selectFsCourseWatchCommentByCommentId(Long commentId) {
         return baseMapper.selectFsCourseWatchCommentByCommentId(commentId);
     }
 
@@ -66,8 +70,7 @@ public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCo
      * @return 看课评论
      */
     @Override
-    public List<FsCourseWatchCommentListVO> selectFsCourseWatchCommentList(FsCourseWatchCommentPageParam fsCourseWatchCommentPageParam)
-    {
+    public List<FsCourseWatchCommentListVO> selectFsCourseWatchCommentList(FsCourseWatchCommentPageParam fsCourseWatchCommentPageParam) {
         return baseMapper.selectFsCourseWatchCommentList(fsCourseWatchCommentPageParam);
     }
 
@@ -78,12 +81,45 @@ public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCo
      * @return 结果
      */
     @Override
-    public int insertFsCourseWatchComment(FsCourseWatchComment fsCourseWatchComment)
-    {
+    public int insertFsCourseWatchComment(FsCourseWatchComment fsCourseWatchComment) {
         fsCourseWatchComment.setCreateTime(DateUtils.getNowDate());
         return baseMapper.insertFsCourseWatchComment(fsCourseWatchComment);
     }
 
+    @Override
+    public int insertBatch(List<CommentImportTemplate> list, Integer type) {
+        if (CollectionUtils.isEmpty(list)) {
+            throw new ServiceException("导入数据不能为空!");
+        }
+        if (type != null) {
+            if (type == 1) {
+                // 视频类型,检查是否包含视频ID
+                boolean hasValidVideo = list.stream()
+                        .anyMatch(template -> template.getVideoId() != null && template.getVideoId() > 0);
+
+                if (!hasValidVideo) {
+                    throw new ServiceException("请选择课程类型导入课程");
+                }
+            } else {
+                // 课程类型,检查是否包含课程ID
+                boolean hasValidCourse = list.stream()
+                        .anyMatch(template -> template.getCourseId() != null && template.getCourseId() > 0);
+
+                if (!hasValidCourse) {
+                    throw new ServiceException("请选择视频课程导入视频");
+                }
+            }
+        }
+        AtomicInteger i = new AtomicInteger(0);
+        list.forEach(item -> {
+            FsCourseWatchComment fsCourseWatchComment = new FsCourseWatchComment();
+            BeanUtils.copyProperties(item, fsCourseWatchComment);
+            fsCourseWatchComment.setCreateTime(DateUtils.getNowDate());
+            i.addAndGet(baseMapper.insertFsCourseWatchComment(fsCourseWatchComment));
+        });
+        return i.get();
+    }
+
     /**
      * 修改看课评论
      *
@@ -91,8 +127,7 @@ public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCo
      * @return 结果
      */
     @Override
-    public int updateFsCourseWatchComment(FsCourseWatchComment fsCourseWatchComment)
-    {
+    public int updateFsCourseWatchComment(FsCourseWatchComment fsCourseWatchComment) {
         fsCourseWatchComment.setUpdateTime(DateUtils.getNowDate());
         return baseMapper.updateFsCourseWatchComment(fsCourseWatchComment);
     }
@@ -104,8 +139,7 @@ public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCo
      * @return 结果
      */
     @Override
-    public int deleteFsCourseWatchCommentByCommentIds(Long[] commentIds)
-    {
+    public int deleteFsCourseWatchCommentByCommentIds(Long[] commentIds) {
         return baseMapper.deleteFsCourseWatchCommentByCommentIds(commentIds);
     }
 
@@ -116,21 +150,20 @@ public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCo
      * @return 结果
      */
     @Override
-    public int deleteFsCourseWatchCommentByCommentId(Long commentId)
-    {
+    public int deleteFsCourseWatchCommentByCommentId(Long commentId) {
         return baseMapper.deleteFsCourseWatchCommentByCommentId(commentId);
     }
 
     @Override
     public R saveH5CourseWatchComment(FsCourseWatchCommentSaveParam param) {
         // 需求:查询是否包含关键字,包含则不保存,并且需要将用户标记为黑名单;
-        Set<String>  keywords = redisTemplate.opsForSet().members(REDIS_KEY);
-        if(keywords == null || keywords.isEmpty()){
+        Set<String> keywords = redisTemplate.opsForSet().members(REDIS_KEY);
+        if (keywords == null || keywords.isEmpty()) {
             SysKeyword sysKeywordParam = new SysKeyword();
             List<SysKeyword> sysKeywords = mapper.selectSysKeywordList(sysKeywordParam);
             keywords = sysKeywords.stream().map(SysKeyword::getKeyword).collect(Collectors.toSet());
         }
-        if(!keywords.isEmpty()){
+        if (!keywords.isEmpty()) {
             for (String keyword : keywords) {
                 if (param.getContent().contains(keyword)) {
                     //标记用户为黑名单,并且不保存数据
@@ -153,7 +186,7 @@ public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCo
     @Override
     public R revokeH5CourseWatchComment(Long commentId) {
         int i = baseMapper.revokeH5CourseWatchComment(commentId);
-        if (i > 0){
+        if (i > 0) {
             return R.ok();
         } else {
             return R.error();
@@ -162,7 +195,7 @@ public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCo
 
     @Override
     public List<FsCourseWatchCommentVO> selectH5CourseWatchComments(FsCourseWatchCommentListParam param) {
-        if(param.getOpenCommentStatus() != null && 2 == param.getOpenCommentStatus()){
+        if (param.getOpenCommentStatus() != null && 2 == param.getOpenCommentStatus()) {
             return baseMapper.selectH5CourseWatchCommentsRound(param);
         } else {
             return baseMapper.selectH5CourseWatchComments(param);

+ 6 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -770,6 +770,12 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         fsUserCourseMapper.editConfig(id, configJson);
     }
 
+    @Override
+    public List<FsUserCourse> selectCourseNameByProjectId(Long projectId) {
+        List<FsUserCourse> courseNames = fsUserCourseMapper.selectCourseNameByProjectId(projectId);
+        return courseNames != null ? courseNames : Collections.emptyList();
+    }
+
 
     private Graphics2D initializeGraphics(BufferedImage combined) {
         Graphics2D graphics = combined.createGraphics();

+ 40 - 0
fs-service/src/main/java/com/fs/course/vo/CommentImportTemplate.java

@@ -0,0 +1,40 @@
+package com.fs.course.vo;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class CommentImportTemplate {
+
+    @Excel(name = "用户id", cellType = Excel.ColumnType.NUMERIC)
+    private Long userId;
+
+    @Excel(name = "用户类型")
+    private Integer userType;
+
+    @Excel(name = "课程id", cellType = Excel.ColumnType.NUMERIC)
+    private Long courseId;
+
+    @Excel(name = "视频id", cellType = Excel.ColumnType.NUMERIC)
+    private Long videoId;
+
+    @Excel(name = "评论类型")
+    private Integer type;
+
+    @Excel(name = "父评论id", cellType = Excel.ColumnType.NUMERIC, prompt = "回复时必填,评论时留空")
+    private Long parentId;
+
+    @Excel(name = "评论内容", prompt = "最多500字")
+    private String content;
+
+
+    @Excel(name = "字体大小", prompt = "选填,如:14px")
+    private String fontSize;
+
+    @Excel(name = "展示模式", prompt = "选填")
+    private String mode;
+
+    @Excel(name = "字体颜色", prompt = "选填,如:#333333")
+    private String color;
+
+}

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

@@ -104,4 +104,7 @@ public class FsPackage extends BaseEntity
     /** 节气 */
     private Long solarTerm;
     private String appIds;
+
+    /** 课程id */
+    private  Long  courseId;
 }

+ 26 - 0
fs-service/src/main/java/com/fs/his/domain/FsPatient.java

@@ -71,6 +71,32 @@ public class FsPatient extends BaseEntity
     private Integer isConfirm;
     private Long helpCompanyUserId;
 
+    /**
+     * 是否是否因慢病在线下就诊?且对该处方内的产品无过敏或不良反应?0:是,我线下就诊过;  1: 否
+     */
+    private Integer isOfflineConsultation;
+
+    /**
+     * 是否已详细阅读疗法说明,确认自己符合疗法产品的适用人群,并了解使用方法,使用禁忌等?0:是 1:否
+     */
+    private Integer isReadTherapy;
+
+    public Integer getIsOfflineConsultation() {
+        return isOfflineConsultation;
+    }
+
+    public Integer getIsReadTherapy() {
+        return isReadTherapy;
+    }
+
+    public void setIsOfflineConsultation(Integer isOfflineConsultation) {
+        this.isOfflineConsultation = isOfflineConsultation;
+    }
+
+    public void setIsReadTherapy(Integer isReadTherapy) {
+        this.isReadTherapy = isReadTherapy;
+    }
+
     public Integer getIsConfirm() {
         return isConfirm;
     }

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

@@ -44,6 +44,10 @@ public interface FsPackageMapper
      */
     public int insertFsPackage(FsPackage fsPackage);
 
+    //检查课程是否已被绑定
+    @Select("SELECT COUNT(*) FROM fs_package WHERE course_id = #{courseId}")
+    boolean existsByCourseId(@Param("courseId") Long courseId);
+
     /**
      * 修改套餐包
      *

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

@@ -216,6 +216,11 @@ public interface IFsUserService
      */
     R updateStatus(Long userId);
 
+    /**
+     * 同步销售下的会员
+     */
+    R syncCompanyUser(Long companyUserId,Long companyId);
+
     List<FsCompanyUserListQueryVO> selectFsCompanyUserListQuery(FsUser fsUser);
 
     List<FsUser> getUserListLimit(FsUser fsUser);

+ 60 - 37
fs-service/src/main/java/com/fs/his/service/impl/FsPackageServiceImpl.java

@@ -5,11 +5,10 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.net.URL;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
@@ -17,6 +16,8 @@ import com.fs.common.core.domain.CustomMultipartFile;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
+import com.fs.course.domain.FsUserCourse;
+import com.fs.course.mapper.FsUserCourseMapper;
 import com.fs.his.dto.FsPackagePruductDTO;
 import com.fs.his.param.FsPackageListUParam;
 import com.fs.his.param.FsPackageParam;
@@ -50,6 +51,9 @@ public class FsPackageServiceImpl implements IFsPackageService {
     @Autowired
     private ISysConfigService sysConfigService;
 
+    @Autowired
+    private FsUserCourseMapper fsUserCourseMapper;
+
     /**
      * 查询套餐包
      *
@@ -79,27 +83,31 @@ public class FsPackageServiceImpl implements IFsPackageService {
      * @return 结果
      */
     @Override
-    @CacheEvict(value = "getPackageList",allEntries = true)
+    @CacheEvict(value = "getPackageList", allEntries = true)
     public int insertFsPackage(FsPackage fsPackage) {
 
         fsPackage.setCreateTime(DateUtils.getNowDate());
 //        if (fsPackage.getPackageSubType() != 1) {
-            if (fsPackage.getProductJson() != null) {
-                JSONArray objects = JSONUtil.parseArray(fsPackage.getProductJson());
-                List<FsPackagePruductDTO> products = JSONUtil.toList(objects, FsPackagePruductDTO.class);
-                BigDecimal toal = new BigDecimal(0);
-                for (FsPackagePruductDTO product : products) {
-                    toal = toal.add(product.getCostPrice().multiply(new BigDecimal(product.getCount())));
-                }
-                fsPackage.setProductCostPrice(toal);
-                SysConfig sysConfig = sysConfigService.selectConfigByConfigKey("his.store");
-                Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
-                Integer followRate = (Integer) config.get("followRate");
-                BigDecimal in = new BigDecimal((fsPackage.getCycle() / followRate) * 300);
-                fsPackage.setInquiryCostPrice(in);
-                fsPackage.setTotalCostPrice(toal.add(in));
+        if (fsPackage.getProductJson() != null) {
+            JSONArray objects = JSONUtil.parseArray(fsPackage.getProductJson());
+            List<FsPackagePruductDTO> products = JSONUtil.toList(objects, FsPackagePruductDTO.class);
+            BigDecimal toal = new BigDecimal(0);
+            for (FsPackagePruductDTO product : products) {
+                toal = toal.add(product.getCostPrice().multiply(new BigDecimal(product.getCount())));
             }
+            fsPackage.setProductCostPrice(toal);
+            SysConfig sysConfig = sysConfigService.selectConfigByConfigKey("his.store");
+            Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
+            Integer followRate = (Integer) config.get("followRate");
+            BigDecimal in = new BigDecimal((fsPackage.getCycle() / followRate) * 300);
+            fsPackage.setInquiryCostPrice(in);
+            fsPackage.setTotalCostPrice(toal.add(in));
+        }
 //        }
+        //检查课程是否已被绑定
+        if (fsPackageMapper.existsByCourseId(fsPackage.getCourseId())) {
+            throw new ServiceException("该课程已被绑定到其他套餐包");
+        }
         return fsPackageMapper.insertFsPackage(fsPackage);
     }
 
@@ -111,22 +119,22 @@ public class FsPackageServiceImpl implements IFsPackageService {
      */
     @Transactional(rollbackFor = Exception.class)
     @Override
-    @CacheEvict(value = "getPackageList",allEntries = true)
+    @CacheEvict(value = "getPackageList", allEntries = true)
     public int updateFsPackage(FsPackage fsPackage) {
         fsPackage.setUpdateTime(DateUtils.getNowDate());
 //        if (fsPackage.getPackageSubType() != null && fsPackage.getPackageSubType() != 1) {
-            if (fsPackage.getProductJson() != null) {
-                JSONArray objects = JSONUtil.parseArray(fsPackage.getProductJson());
-                List<FsPackagePruductDTO> products = JSONUtil.toList(objects, FsPackagePruductDTO.class);
-                BigDecimal toal = new BigDecimal(0);
-                for (FsPackagePruductDTO product : products) {
-                    toal = toal.add(product.getCostPrice().multiply(new BigDecimal(product.getCount())));
-                }
-                fsPackage.setProductCostPrice(toal);
-                BigDecimal in = new BigDecimal((fsPackage.getCycle() / 6) * 300);
-                fsPackage.setInquiryCostPrice(in);
-                fsPackage.setTotalCostPrice(toal.add(in));
+        if (fsPackage.getProductJson() != null) {
+            JSONArray objects = JSONUtil.parseArray(fsPackage.getProductJson());
+            List<FsPackagePruductDTO> products = JSONUtil.toList(objects, FsPackagePruductDTO.class);
+            BigDecimal toal = new BigDecimal(0);
+            for (FsPackagePruductDTO product : products) {
+                toal = toal.add(product.getCostPrice().multiply(new BigDecimal(product.getCount())));
             }
+            fsPackage.setProductCostPrice(toal);
+            BigDecimal in = new BigDecimal((fsPackage.getCycle() / 6) * 300);
+            fsPackage.setInquiryCostPrice(in);
+            fsPackage.setTotalCostPrice(toal.add(in));
+        }
 //        }
         //如果公域改私域 需要去掉disease_type值
         Integer isShow = fsPackage.getIsShow();
@@ -148,7 +156,7 @@ public class FsPackageServiceImpl implements IFsPackageService {
      * @return 结果
      */
     @Override
-    @CacheEvict(value = "getPackageList",allEntries = true)
+    @CacheEvict(value = "getPackageList", allEntries = true)
     public int deleteFsPackageByPackageIds(Long[] packageIds) {
 
         return fsPackageMapper.deleteFsPackageByPackageIds(packageIds);
@@ -176,7 +184,22 @@ public class FsPackageServiceImpl implements IFsPackageService {
         if (privateType != null) {
             fsPackage.setIsShow(0);
         }
-        return fsPackageMapper.selectFsPackageListVO(fsPackage);
+        //课程信息
+        List<FsUserCourse> fsUserCourses = fsUserCourseMapper.selectAllCourse();
+        Map<Long, FsUserCourse> map = CollectionUtil.isEmpty(fsUserCourses)
+                ? Collections.emptyMap()  // 返回不可变的空Map,更高效
+                : fsUserCourses.stream()
+                .collect(Collectors.toMap(FsUserCourse::getCourseId, a -> a));
+        List<FsPackageListVO> fsPackageListVOS = fsPackageMapper.selectFsPackageListVO(fsPackage);
+        if (!CollectionUtil.isEmpty(fsPackageListVOS)) {
+            for (FsPackageListVO fsPackageListVO : fsPackageListVOS) {
+                FsUserCourse fsUserCourse = map.getOrDefault(fsPackageListVO.getCourseId(), null);
+                if (fsUserCourse != null) {
+                    fsPackageListVO.setCourseName(fsUserCourse.getCourseName());
+                }
+            }
+        }
+        return fsPackageListVOS;
     }
 
     @Override
@@ -261,13 +284,13 @@ public class FsPackageServiceImpl implements IFsPackageService {
     }
 
     @Override
-    @CacheEvict(value = "getPackageList",allEntries = true)
+    @CacheEvict(value = "getPackageList", allEntries = true)
     public int updatePackagesStatus(Long[] packageIds, Long status) {
         return fsPackageMapper.updatePackagesStatus(packageIds, status);
     }
 
     @Override
-    public String convertImageToJpg(String imgUrl,Long packageId) {
+    public String convertImageToJpg(String imgUrl, Long packageId) {
         if (StringUtils.isBlank(imgUrl)) {
             throw new IllegalArgumentException("图片 URL 不能为空");
         }
@@ -308,7 +331,7 @@ public class FsPackageServiceImpl implements IFsPackageService {
             throw new RuntimeException(e);
         }
 
-        if (!imgUrl.equals(url) && packageId !=null) {
+        if (!imgUrl.equals(url) && packageId != null) {
             //更新数据库
             FsPackage temp = new FsPackage();
             temp.setPackageId(packageId);
@@ -333,7 +356,7 @@ public class FsPackageServiceImpl implements IFsPackageService {
     @Transactional
     public int bulkCopyFsPackageByPackage(Long[] packageIds) {
         List<FsPackage> list = fsPackageMapper.selectFsPackageListByIds(packageIds);
-        if(list != null && !list.isEmpty()){
+        if (list != null && !list.isEmpty()) {
             try {
                 for (FsPackage fsPackage : list) {
                     fsPackageMapper.insertFsPackage(fsPackage);

+ 11 - 1
fs-service/src/main/java/com/fs/his/service/impl/FsUserAddressServiceImpl.java

@@ -149,7 +149,17 @@ public class FsUserAddressServiceImpl implements IFsUserAddressService
 
     @Override
     public FsUserAddress selectFsUserAddressByDefault(long userId) {
-        return fsUserAddressMapper.selectFsUserAddressByDefault(userId);
+        FsUserAddress fsUserAddress = fsUserAddressMapper.selectFsUserAddressByDefault(userId);
+        if(fsUserAddress==null){
+            // 没有默认地址 则返回第一个地址
+            FsUserAddress fsUserAddress1 = new FsUserAddress();
+            fsUserAddress1.setUserId(userId);
+            List<FsUserAddress> list = fsUserAddressMapper.selectFsUserAddressList(fsUserAddress1);
+            if(list!=null&& !list.isEmpty()){
+                fsUserAddress=list.get(0);
+            }
+        }
+        return fsUserAddress;
     }
 
     @Override

+ 49 - 4
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -27,6 +27,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.exception.CustomException;
+import com.fs.common.exception.base.BaseException;
 import com.fs.common.param.LoginMaWxParam;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.DictUtils;
@@ -40,6 +41,7 @@ import com.fs.company.mapper.*;
 import com.fs.company.service.ICompanyTagService;
 import com.fs.course.domain.FsUserCompanyUser;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
+import com.fs.course.mapper.FsUserCompanyUserMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.param.CourseAnalysisParam;
 import com.fs.course.param.newfs.FsUserCourseBeMemberParam;
@@ -202,6 +204,12 @@ public class FsUserServiceImpl implements IFsUserService {
     @Autowired
     FsExportTaskMapper fsExportTaskMapper;
 
+    @Autowired
+    private FsUserCompanyUserMapper fsUserCompanyUserMapper;
+
+    @Autowired
+    private CompanyUserUserMapper companyUserUserMapper;
+
 
     /**
      * 查询用户
@@ -700,11 +708,18 @@ public class FsUserServiceImpl implements IFsUserService {
     @Override
     public TableDataInfo selectFsUserPageListNew(FsUserPageListParam param) {
         // 找出下级销售
-        String companyUserId = param.getCompanyUserId();
+        String companyUserId = param.getSaleUserId();
         if (StringUtils.isNotBlank(companyUserId)) {
             Long companyUser = Long.parseLong(companyUserId);
             Set<Long> userIds = companyUserCacheService.selectUserAllCompanyUserId(companyUser);
             if (userIds != null || userIds.size() <= 1) {
+                List<Integer> roles = fsUserCompanyUserMapper.selectCountByUserId(companyUser);
+                if (param.getDeptId() != null) {
+                    if (roles.contains(1)) {
+                        //部门经理需要查询对应部门下的销售
+                        userIds = (Set<Long>) fsUserCompanyUserMapper.selectUserIdByDeptId(param.getDeptId());
+                    }
+                }
                 if (param.getIsAdmin() != null && param.getIsAdmin()) {
                     List<CompanyUser> companyUsers = companyUserMapper.selectCompanyUserByCompanyId(param.getCompanyId());
                     userIds = companyUsers.stream().map(CompanyUser::getUserId).collect(Collectors.toSet());
@@ -712,7 +727,10 @@ public class FsUserServiceImpl implements IFsUserService {
             }
             param.setCompanyUserIds(userIds);
         }
-
+        // 如果有单个销售ID,就不传ID列表
+        if (param.getCompanyUserId() != null && !param.getCompanyUserId().isEmpty()) {
+            param.setCompanyUserIds(null); // 清空列表参数
+        }
         List<FsUserPageListVO> fsUserPageListVOS = fsUserMapper.selectFsUserPageListNew(param);
         Map<Long, CompanyTag> tagMap = companyTagCacheService.queryAllTagMap();
         //获取会员的最新的看课状态和最后看课时间
@@ -727,7 +745,7 @@ public class FsUserServiceImpl implements IFsUserService {
                 .map(user -> new UserProjectPair(user.getUserId(), user.getProjectId()))
                 .collect(Collectors.toList());
         Map<Object, Date> watchTimeMap = new HashMap<>();
-        if(CollectionUtils.isNotEmpty(pairs)){
+        if (CollectionUtils.isNotEmpty(pairs)) {
             List<Map<String, Object>> mapList = fsUserMapper.selectLastWatchTimeByUserAndProject(pairs);
             if (!CollectionUtils.isEmpty(mapList)) {
                 watchTimeMap = mapList.stream()
@@ -768,7 +786,7 @@ public class FsUserServiceImpl implements IFsUserService {
 //                    item.setCourseCountStatus(byUserId.getStatus());
                     item.setStopWatchDays(byUserId.getStopWatchDays());
                     item.setCompleteWatchDate(byUserId.getCompleteWatchDate());
-                    item.setLastWatchDate(watchTimeMap.getOrDefault(item.getUserId() + "_" + item.getProjectId(),null));
+                    item.setLastWatchDate(watchTimeMap.getOrDefault(item.getUserId() + "_" + item.getProjectId(), null));
                 }
                 FsUserLastCount fsUserCourseCount = countMap.get(item.getUserId());
                 if (fsUserCourseCount != null) {
@@ -1270,6 +1288,33 @@ public class FsUserServiceImpl implements IFsUserService {
         return R.ok();
     }
 
+    @Override
+    public R syncCompanyUser(Long companyUserId, Long companyId) {
+        FsUserCompanyUser fsUserCompanyUser = new FsUserCompanyUser();
+        fsUserCompanyUser.setCompanyUserId(companyUserId);
+        fsUserCompanyUser.setCompanyId(companyId);
+        List<FsUserCompanyUser> list = fsUserCompanyUserMapper.selectFsUserCompanyUserList(fsUserCompanyUser);
+        if (!CollectionUtils.isEmpty(list)) {
+            List<Long> uniqueUserIds = list.stream()
+                    .map(FsUserCompanyUser::getUserId)
+                    .distinct()
+                    .collect(Collectors.toList());
+            List<Long> existingUserIds = companyUserUserMapper.selectExistingUserIdsByCompanyUserId(companyUserId, companyId, uniqueUserIds);
+            Set<Long> existingUserIdSet = new HashSet<>(existingUserIds);
+            uniqueUserIds.forEach(u -> {
+                if (!existingUserIdSet.contains(u)) {
+                    CompanyUserUser companyUserUser = new CompanyUserUser();
+                    companyUserUser.setCompanyId(companyId);
+                    companyUserUser.setCompanyUserId(companyUserId);
+                    companyUserUser.setUserId(u);
+                    companyUserUser.setCreateTime(new Date());
+                    companyUserUserMapper.insertCompanyUserUser(companyUserUser);
+                }
+            });
+        }
+        return R.ok();
+    }
+
     @Override
     public List<FsUserVO> selectFsUserVOListByProject(FsUser fsUser) {
         return fsUserMapper.selectFsUserVOListByProject(fsUser);

+ 4 - 0
fs-service/src/main/java/com/fs/his/vo/FsPackageListVO.java

@@ -67,4 +67,8 @@ public class FsPackageListVO extends BaseEntity {
     private BigDecimal totalPrice;
 
     private Long solarTerm;
+
+    private Long courseId;
+
+    private  String courseName;
 }

+ 10 - 0
fs-service/src/main/java/com/fs/store/param/h5/FsUserPageListParam.java

@@ -89,6 +89,16 @@ public class FsUserPageListParam implements Serializable {
      */
     private Boolean isHidePhoneMiddle = Boolean.TRUE;
 
+     /**
+     * 部门id
+     */
+    private Long deptId;
+
+    /**
+     * 当前销售id
+     */
+    private  String  saleUserId;
+
 
 }
 

+ 1 - 1
fs-service/src/main/resources/mapper/company/CompanyRedPacketBalanceLogsMapper.xml

@@ -20,7 +20,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </sql>
 
     <select id="selectCompanyRedPacketBalanceLogsList" parameterType="CompanyRedPacketBalanceLogs" resultMap="CompanyRedPacketBalanceLogsResult">
-        select l.logs_id, l.company_id, l.money, l.remark, l.create_time, l.balance, l.logs_type, l.status,c.company_name
+        select l.logs_id, l.company_id, l.money, l.remark,l.create_time,l.create_time as logTime, l.balance, l.logs_type, l.status,c.company_name
         from
         company_red_packet_balance_logs l
         left join company c on c.company_id = l.company_id

+ 12 - 0
fs-service/src/main/resources/mapper/company/CompanyUserUserMapper.xml

@@ -48,6 +48,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and fu.nick_name like concat('%', #{keyword}, '%')
         </if>
     </select>
+     <select id="countFsUserByCompanyUserId" resultType="java.lang.Integer">
+            select count(id) from company_user_user where company_user_id=#{companyUserId} and user_id=#{userId} and company_id=#{companyId}
+    </select>
+    <select id="selectExistingUserIdsByCompanyUserId" resultType="java.lang.Long">
+        select user_id from company_user_user
+        where company_user_id = #{companyUserId}
+        and company_id = #{companyId}
+        and user_id in
+        <foreach item="userId" collection="userIds" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </select>
 
     <insert id="insertCompanyUserUser" parameterType="CompanyUserUser">
         insert into company_user_user

+ 2 - 5
fs-service/src/main/resources/mapper/course/FsCourseTrafficLogMapper.xml

@@ -296,13 +296,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             group by company_id,`month`,course_id,project
         </if>
         <if test="tabType!=null and tabType=='project'">
-            group by project,`month`
+            group by company_id,project,`month`
         </if>
         <if test="tabType!=null and tabType=='course'">
-            group by course_id,`month`
-        </if>
-        <if test="tabType!=null and tabType=='company'">
-            group by company_id,`month`
+            group by company_id,course_id,`month`
         </if>
         <if test="tabType!=null and tabType=='common'">
             group by course_id,`month`

+ 11 - 0
fs-service/src/main/resources/mapper/course/FsCourseWatchCommentMapper.xml

@@ -65,7 +65,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 or  fs_user_course_video.title LIKE concat('%',#{keywords},'%')
                 )
             </if>
+            <if test="type != null and type == 0">
+                and fs_course_watch_comment.course_id is not null
+            </if>
+            <if test="type != null and type == 1">
+                and fs_course_watch_comment.video_id is not null
+            </if>
         </where>
+        ORDER BY
+        CASE
+        WHEN fs_course_watch_comment.update_time IS NOT NULL THEN fs_course_watch_comment.update_time
+        ELSE fs_course_watch_comment.create_time
+        END DESC
     </select>
 
     <select id="selectFsCourseWatchCommentByCommentId" parameterType="Long" resultMap="FsCourseWatchCommentResult">

+ 3 - 0
fs-service/src/main/resources/mapper/his/FsPackageMapper.xml

@@ -179,6 +179,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="description != null">description,</if>
             <if test="solarTerm != null">solar_term,</if>
             <if test="appIds != null">app_ids,</if>
+            <if test="courseId != null">course_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="packageName != null">#{packageName},</if>
@@ -224,6 +225,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="description != null">#{description},</if>
             <if test="solarTerm != null">#{solarTerm},</if>
             <if test="appIds != null">#{appIds},</if>
+            <if test="courseId != null">#{courseId},</if>
         </trim>
     </insert>
 
@@ -273,6 +275,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="description != null">description = #{description},</if>
             <if test="solarTerm != null">solar_term = #{solarTerm},</if>
             <if test="appIds != null ">app_ids = #{appIds},</if>
+            <if test="courseId != null">course_id = #{courseId},</if>
         </trim>
         where package_id = #{packageId}
     </update>

+ 7 - 1
fs-service/src/main/resources/mapper/his/FsPatientMapper.xml

@@ -34,7 +34,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <sql id="selectFsPatientVo">
         select patient_id,is_further,primary_hospital,primary_images,renal_unusual,liver_unusual,is_default,relation,
                patient_name,self_med_history,family_med_history,history_allergic, user_id, id_card, birthday, sex,
-               weight, mobile, is_del, status, create_time, update_time, is_confirm, help_company_user_id from fs_patient
+               weight, mobile, is_del, status, create_time, update_time, is_confirm, help_company_user_id, is_offline_consultation, is_read_therapy from fs_patient
     </sql>
 
     <select id="selectFsPatientList" parameterType="FsPatient" resultMap="FsPatientResult">
@@ -86,6 +86,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="primaryImages != null">primary_images,</if>
             <if test="isConfirm != null">is_confirm,</if>
             <if test="helpCompanyUserId != null">help_company_user_id,</if>
+            <if test="isOfflineConsultation != null">is_offline_consultation,</if>
+            <if test="isReadTherapy != null">is_read_therapy,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="patientName != null">#{patientName},</if>
@@ -111,6 +113,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="primaryImages != null">#{primaryImages},</if>
             <if test="isConfirm != null">#{isConfirm},</if>
             <if test="helpCompanyUserId != null">#{helpCompanyUserId},</if>
+            <if test="isOfflineConsultation != null">#{isOfflineConsultation},</if>
+            <if test="isReadTherapy != null">#{isReadTherapy},</if>
         </trim>
     </insert>
 
@@ -140,6 +144,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="primaryImages != null">primary_images = #{primaryImages},</if>
             <if test="isConfirm != null">is_confirm = #{isConfirm},</if>
             <if test="helpCompanyUserId != null">help_company_user_id = #{helpCompanyUserId},</if>
+            <if test="isOfflineConsultation != null">is_offline_consultation = #{isOfflineConsultation},</if>
+            <if test="isReadTherapy != null">is_read_therapy = #{isReadTherapy},</if>
         </trim>
         where patient_id = #{patientId}
     </update>

+ 20 - 8
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -383,12 +383,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userId != null">
                 AND fs_user.user_id = #{userId}
             </if>
+
             <if test="companyId != null">
                 AND ucu.company_id = #{companyId}
             </if>
-            <if test="companyUserId != null and companyUserId != '' ">
+        <choose>
+            <when test="companyUserIds != null and companyUserIds.size > 0">
+                AND ucu.company_user_id in
+                <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">
+                    ${item}
+                </foreach>
+            </when>
+            <when test="companyUserId != null and companyUserId != '' ">
                 AND ucu.company_user_id = #{companyUserId}
-            </if>
+            </when>
+        </choose>
+<!--            <if test="companyUserId != null and companyUserId != '' ">-->
+<!--                AND ucu.company_user_id = #{companyUserId}-->
+<!--            </if>-->
             <if test="registerStartTime != null and registerStartTime !='' ">
                 AND ucu.update_time &gt;= #{registerStartTime}
             </if>
@@ -397,12 +409,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND ucu.update_time < date_add(#{registerEndTime}, interval 1 day)
             ]]>
             </if>
-            <if test="companyUserIds != null and companyUserIds.size > 0">
-                AND ucu.company_user_id in
-                <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">
-                    ${item}
-                </foreach>
-            </if>
+<!--            <if test="companyUserIds != null and companyUserIds.size > 0">-->
+<!--                AND ucu.company_user_id in-->
+<!--                <foreach collection="companyUserIds" item="item" index="index" open="(" separator="," close=")">-->
+<!--                    ${item}-->
+<!--                </foreach>-->
+<!--            </if>-->
             <if test="nickname != null and nickname != ''">
                 AND fs_user.nick_name like concat('%', #{nickname},'%')
             </if>

+ 103 - 78
fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -28,6 +28,7 @@ import com.fs.fastgptApi.util.AudioUtils;
 import com.fs.fastgptApi.vo.AudioVO;
 import com.fs.his.param.*;
 import com.fs.his.service.IFsPrescribeService;
+import com.fs.his.service.IFsUserService;
 import com.fs.his.vo.FsPrescribeListDVO;
 import com.fs.his.vo.FsUserVO;
 import com.fs.his.vo.MyMemberVO;
@@ -59,8 +60,8 @@ import java.util.stream.Collectors;
 
 @Api("销售接口")
 @RestController
-@RequestMapping(value="/app/companyUser")
-public class CompanyUserController extends  AppBaseController {
+@RequestMapping(value = "/app/companyUser")
+public class CompanyUserController extends AppBaseController {
 
 
     @Autowired
@@ -80,25 +81,30 @@ public class CompanyUserController extends  AppBaseController {
     @Autowired
     AiHostProper aiHostProper;
 
+    @Autowired
+    private IFsUserService fsUserService;
+
+
     public static final String SOP_TEMP_VOICE_KEY = "sop:tempVoice";
+
     @PostMapping("/login")
-    public R Login(@RequestBody CompanyUserLoginParam param, HttpServletRequest request){
+    public R Login(@RequestBody CompanyUserLoginParam param, HttpServletRequest request) {
         try {
-            CompanyUser companyUser=companyUserService.selectUserByUserName(param.getUserName());
-            if(companyUser==null||companyUser.getDelFlag().equals("1")){
+            CompanyUser companyUser = companyUserService.selectUserByUserName(param.getUserName());
+            if (companyUser == null || companyUser.getDelFlag().equals("1")) {
                 return R.error("用户不存在");
             }
-            if(!companyUser.getStatus().equals("0")){
+            if (!companyUser.getStatus().equals("0")) {
                 return R.error("用户已禁用");
 
             }
-            String pwd= SecurityUtils.encryptPassword(param.getPassword());
-            if(!SecurityUtils.matchesPassword(param.getPassword(),companyUser.getPassword())){
+            String pwd = SecurityUtils.encryptPassword(param.getPassword());
+            if (!SecurityUtils.matchesPassword(param.getPassword(), companyUser.getPassword())) {
                 return R.error("密码不正确");
             }
-            redisCache.setCacheObject("company-user-token:"+Md5Utils.hash(companyUser.getUserId().toString()),companyUser.getUserId(),100, TimeUnit.DAYS);
-            return R.ok().put("companyUserToken", Md5Utils.hash(companyUser.getUserId().toString())).put("user",companyUser);
-        } catch (Exception e){
+            redisCache.setCacheObject("company-user-token:" + Md5Utils.hash(companyUser.getUserId().toString()), companyUser.getUserId(), 100, TimeUnit.DAYS);
+            return R.ok().put("companyUserToken", Md5Utils.hash(companyUser.getUserId().toString())).put("user", companyUser);
+        } catch (Exception e) {
 
             return R.error("操作异常");
         }
@@ -106,33 +112,33 @@ public class CompanyUserController extends  AppBaseController {
 
     @ApiOperation("获取销售信息")
     @GetMapping("/getUserInfo")
-    public R getUserInfo(HttpServletRequest request){
+    public R getUserInfo(HttpServletRequest request) {
 
-        Long userId=getCompanyUserId();
-        if(userId==null){
-            return R.error(403,"用户失效");
+        Long userId = getCompanyUserId();
+        if (userId == null) {
+            return R.error(403, "用户失效");
         }
-        CompanyUser companyUser=companyUserService.selectCompanyUserById(userId);
-        if(companyUser==null||companyUser.getDelFlag().equals("1")){
+        CompanyUser companyUser = companyUserService.selectCompanyUserById(userId);
+        if (companyUser == null || companyUser.getDelFlag().equals("1")) {
             return R.error("用户不存在");
         }
-        if(!companyUser.getStatus().equals("0")){
+        if (!companyUser.getStatus().equals("0")) {
             return R.error("用户已禁用");
         }
-        return R.ok().put("data",companyUser);
+        return R.ok().put("data", companyUser);
     }
 
     @Login
     @ApiOperation("绑定销售")
     @PostMapping("/bindCompanyUser")
-    public R bindCompanyUser(@Validated @RequestBody FsBindCompanyUserParam param, HttpServletRequest request){
-        CompanyUserUser map=new CompanyUserUser();
+    public R bindCompanyUser(@Validated @RequestBody FsBindCompanyUserParam param, HttpServletRequest request) {
+        CompanyUserUser map = new CompanyUserUser();
         map.setCompanyUserId(param.getCompanyUserId());
         map.setUserId(Long.parseLong(getUserId()));
-        List<CompanyUserUser> list= companyUserUserService.selectCompanyUserUserList(map);
-        if(list==null||list.size()==0){
-            CompanyUser companyUser=companyUserService.selectCompanyUserById(param.getCompanyUserId());
-            if(companyUser!=null&&companyUser.getStatus().equals("0")){
+        List<CompanyUserUser> list = companyUserUserService.selectCompanyUserUserList(map);
+        if (list == null || list.size() == 0) {
+            CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
+            if (companyUser != null && companyUser.getStatus().equals("0")) {
                 map.setCompanyId(companyUser.getCompanyId());
                 companyUserUserService.insertCompanyUserUser(map);
             }
@@ -145,9 +151,9 @@ public class CompanyUserController extends  AppBaseController {
     @ApiOperation("上传声纹")
     @PostMapping("/addVoicePrintUrl")
     public R addVoicePrintUrl(@RequestBody companyUserAddPrintParam param) throws Exception {
-        Long userId=getCompanyUserId();
-        if(userId==null){
-            return R.error(403,"用户失效");
+        Long userId = getCompanyUserId();
+        if (userId == null) {
+            return R.error(403, "用户失效");
         }
         CompanyUser companyUser = new CompanyUser();
         companyUser.setUserId(userId);
@@ -169,8 +175,8 @@ public class CompanyUserController extends  AppBaseController {
 
         try {
             CloseableHttpClient httpClient = HttpClients.createDefault();
-            HttpPost httpPost = new HttpPost(aiHostProper.getCommonApi()+"/app/common/addCompanyAudio");
-            String json = "{\"url\":\""+wavUrl+"\",\"id\":\""+userId+"\"}";
+            HttpPost httpPost = new HttpPost(aiHostProper.getCommonApi() + "/app/common/addCompanyAudio");
+            String json = "{\"url\":\"" + wavUrl + "\",\"id\":\"" + userId + "\"}";
             StringEntity entity = new StringEntity(json);
             httpPost.setEntity(entity);
             httpPost.setHeader("Content-type", "application/json");
@@ -179,8 +185,8 @@ public class CompanyUserController extends  AppBaseController {
             if (response.getStatusLine().getStatusCode() == 200) {
                 String responseBody = EntityUtils.toString(response.getEntity());
                 JSONObject jsonObject = JSON.parseObject(responseBody);
-                Integer code = (Integer)jsonObject.get("code");
-                if (code==200){
+                Integer code = (Integer) jsonObject.get("code");
+                if (code == 200) {
                     voiceService.insertQwSopTempVoiceModel(userId);
                     return R.ok();
                 }
@@ -196,37 +202,40 @@ public class CompanyUserController extends  AppBaseController {
         return R.error();
 
     }
+
     @ApiOperation("小程序销售绑定医生")
     @Log(title = "小程序销售绑定医生", businessType = BusinessType.UPDATE)
     @PostMapping("/bindDoctorId")
-    public R binDoctor(@RequestBody CompanyUser companyUser){
+    public R binDoctor(@RequestBody CompanyUser companyUser) {
         return companyUserService.bindDoctor(companyUser);
     }
+
     @ApiOperation("小程序销售解除绑定医生")
     @Log(title = "小程序销售解除绑定医生", businessType = BusinessType.UPDATE)
     @GetMapping("/unBindDoctorId/{userId}")
-    public R unBinDoctor(@PathVariable("userId") Long userId){
+    public R unBinDoctor(@PathVariable("userId") Long userId) {
         return companyUserService.unBindDoctor(userId);
     }
 
     @ApiOperation("获取公司收款码")
     @GetMapping("/getCompanyWxaCodeByPayment")
-    public R getCompanyWxaCodeByPayment(@RequestParam("companyId")Long companyId,@RequestParam("appId")String appId,HttpServletRequest request){
+    public R getCompanyWxaCodeByPayment(@RequestParam("companyId") Long companyId, @RequestParam("appId") String appId, HttpServletRequest request) {
         //获取用户码
-        String WxaCode = redisCache.getCacheObject("company-wxa-code:"+companyId+":"+appId);
-        return R.ok().put("data",WxaCode);
+        String WxaCode = redisCache.getCacheObject("company-wxa-code:" + companyId + ":" + appId);
+        return R.ok().put("data", WxaCode);
     }
 
     /**
      * 生成绑定连接或者绑定码
+     *
      * @return
      */
     @Login
     @ApiOperation("获取绑定链接或者绑定码(唯一绑定)")
     @GetMapping("/getBindInfo")
-    public R getBindInfo(){
+    public R getBindInfo() {
         Long companyUserId = getCompanyUserId();
-        if(companyUserId==null){
+        if (companyUserId == null) {
             return R.error("该销售不存在");
         }
         return companyUserService.getBindInfo(companyUserId);
@@ -235,33 +244,34 @@ public class CompanyUserController extends  AppBaseController {
 
     /**
      * 当只有模板文字text时,生成表中对应条的voice_url和user_voice_url
-     * @param id            qw_sop_temp_voice的id
+     *
+     * @param id qw_sop_temp_voice的id
      * @return
      */
     @GetMapping("/companyUserVoice")
-    public R companyUserVoice(@RequestParam("id") Long id){
+    public R companyUserVoice(@RequestParam("id") Long id) {
         AudioVO audioVO = new AudioVO();
         Long companyUserId = getCompanyUserId();
         List<QwSopTempVoice> sopTempVoices = redisCache.getVoiceAllList(SOP_TEMP_VOICE_KEY + ":" + companyUserId);
-        if(sopTempVoices != null && !sopTempVoices.isEmpty()){
+        if (sopTempVoices != null && !sopTempVoices.isEmpty()) {
             List<Long> collect = sopTempVoices.stream().map(QwSopTempVoice::getId).collect(Collectors.toList());
-            if (collect.contains(id)){
-                return R.ok().put("code",202).put("msg","该语音已进入转换,请完成后再试。");
+            if (collect.contains(id)) {
+                return R.ok().put("code", 202).put("msg", "该语音已进入转换,请完成后再试。");
             }
         }
 
-        if(companyUserId != null){
+        if (companyUserId != null) {
             CompanyUser companyUser = companyUserMapper.selectCompanyUserByCompanyUserId(companyUserId);
-            if(companyUser != null && companyUser.getVoicePrintUrl() == null){
-                return R.ok().put("code",201).put("msg","账号未录制声纹,请录制后再试!");
+            if (companyUser != null && companyUser.getVoicePrintUrl() == null) {
+                return R.ok().put("code", 201).put("msg", "账号未录制声纹,请录制后再试!");
             }
         }
 
         QwSopTempVoice qwSopTempVoice = voiceService.selectQwSopTempVoiceById(id);
-        if(qwSopTempVoice != null && qwSopTempVoice.getCompanyUserId() != null){
+        if (qwSopTempVoice != null && qwSopTempVoice.getCompanyUserId() != null) {
             List<FastgptChatVoiceHomo> homos = fastgptChatVoiceHomoMapper.selectFastgptChatVoiceHomoList(new FastgptChatVoiceHomo());
-            audioVO = AudioUtils.createUserUrlAndUrl(homos,qwSopTempVoice.getCompanyUserId(), qwSopTempVoice.getVoiceTxt().replace(" ",""));
-            if(audioVO != null && audioVO.getWavUrl() != null &&  audioVO.getUrl() != null){
+            audioVO = AudioUtils.createUserUrlAndUrl(homos, qwSopTempVoice.getCompanyUserId(), qwSopTempVoice.getVoiceTxt().replace(" ", ""));
+            if (audioVO != null && audioVO.getWavUrl() != null && audioVO.getUrl() != null) {
                 qwSopTempVoice.setVoiceUrl(audioVO.getUrl());
                 qwSopTempVoice.setUserVoiceUrl(audioVO.getWavUrl());
                 qwSopTempVoice.setDuration(audioVO.getDuration());
@@ -274,27 +284,28 @@ public class CompanyUserController extends  AppBaseController {
 
     /**
      * 当只有user_voice_url时,生成表中对应条的voice_url
-     * @param userVoiceUrl  wav格式的语音文件
-     * @param id            qw_sop_temp_voice的id
+     *
+     * @param userVoiceUrl wav格式的语音文件
+     * @param id           qw_sop_temp_voice的id
      * @return
      */
     @GetMapping("/companyUserVoiceNew")
-    public R companyUserVoiceNew( @RequestParam("id") Long id,@RequestParam("userVoiceUrl") String userVoiceUrl){
+    public R companyUserVoiceNew(@RequestParam("id") Long id, @RequestParam("userVoiceUrl") String userVoiceUrl) {
 
         AudioVO audioVO = new AudioVO();
         Long companyUserId = getCompanyUserId();
         List<QwSopTempVoice> sopTempVoices = redisCache.getVoiceAllList(SOP_TEMP_VOICE_KEY + ":" + companyUserId);
-        if(sopTempVoices != null && !sopTempVoices.isEmpty()){
+        if (sopTempVoices != null && !sopTempVoices.isEmpty()) {
             List<Long> collect = sopTempVoices.stream().map(QwSopTempVoice::getId).collect(Collectors.toList());
-            if (collect.contains(id)){
-                return R.ok().put("code",202).put("msg","该语音已进入转换,请完成后再试。");
+            if (collect.contains(id)) {
+                return R.ok().put("code", 202).put("msg", "该语音已进入转换,请完成后再试。");
             }
         }
 
         QwSopTempVoice qwSopTempVoice = voiceService.selectQwSopTempVoiceByIdAndUserVoiceUrl(id);
-        if(qwSopTempVoice != null && qwSopTempVoice.getId() != null){
+        if (qwSopTempVoice != null && qwSopTempVoice.getId() != null) {
             audioVO = AudioUtils.createVoiceUrl(qwSopTempVoice.getCompanyUserId(), userVoiceUrl);
-            if(audioVO != null && audioVO.getUrl() != null){
+            if (audioVO != null && audioVO.getUrl() != null) {
                 qwSopTempVoice.setVoiceUrl(audioVO.getUrl());
                 qwSopTempVoice.setUserVoiceUrl(userVoiceUrl);
                 qwSopTempVoice.setDuration(audioVO.getDuration());
@@ -306,12 +317,11 @@ public class CompanyUserController extends  AppBaseController {
     }
 
 
-
     @GetMapping("/query/{id}")
-    public R querySopVoiceById(@PathVariable("id") Long id){
+    public R querySopVoiceById(@PathVariable("id") Long id) {
         QwSopTempVoice tempVoice = voiceService.selectQwSopTempVoiceById(id);
         AudioVO audioVO = new AudioVO();
-        if(tempVoice != null){
+        if (tempVoice != null) {
             audioVO.setId(tempVoice.getId());
             audioVO.setVoiceTxt(tempVoice.getVoiceTxt());
             audioVO.setUrl(tempVoice.getVoiceUrl());
@@ -323,7 +333,7 @@ public class CompanyUserController extends  AppBaseController {
     }
 
     @GetMapping("/querySopVoiceList")
-    public TableDataInfo querySopVoiceList(@RequestParam("recordType") Integer recordType){
+    public TableDataInfo querySopVoiceList(@RequestParam("recordType") Integer recordType) {
         startPage();
         QwSopTempVoice sopTempVoice = new QwSopTempVoice();
         sopTempVoice.setRecordType(recordType);
@@ -334,47 +344,48 @@ public class CompanyUserController extends  AppBaseController {
 
     /**
      * 一键转换
+     *
      * @return
      */
     @GetMapping("/createUserAllVoice")
-    public R createUserAllVoice(){
+    public R createUserAllVoice() {
         QwSopTempVoice sopTempVoice = new QwSopTempVoice();
         sopTempVoice.setRecordType(0);
         Long companyUserId = getCompanyUserId();
 
 
-        if(companyUserId != null){
+        if (companyUserId != null) {
             CompanyUser companyUser = companyUserMapper.selectCompanyUserByCompanyUserId(companyUserId);
-            if(companyUser != null && companyUser.getVoicePrintUrl() == null){
-                return R.ok().put("code",201).put("msg","账号未录制声纹,请录制后再试!");
+            if (companyUser != null && companyUser.getVoicePrintUrl() == null) {
+                return R.ok().put("code", 201).put("msg", "账号未录制声纹,请录制后再试!");
             }
         }
 
         sopTempVoice.setCompanyUserId(companyUserId);
         List<QwSopTempVoice> sopTempVoices = voiceService.selectQwSopTempVoiceNewList(sopTempVoice);
-        if(sopTempVoices != null && !sopTempVoices.isEmpty()){
+        if (sopTempVoices != null && !sopTempVoices.isEmpty()) {
             List<Long> newCompanyUserId = redisCache.getVoiceAllList(SOP_TEMP_VOICE_KEY);
-            if(newCompanyUserId != null && newCompanyUserId.contains(companyUserId)){
-                return R.error().put("code",202).put("msg","语音还未转换完成,请完成后再添加!");
-            }else{
-                redisCache.setVoice(SOP_TEMP_VOICE_KEY,companyUserId);
-                sopTempVoices.forEach(m -> m.setVoiceTxt(m.getVoiceTxt().replace(" ","")));
+            if (newCompanyUserId != null && newCompanyUserId.contains(companyUserId)) {
+                return R.error().put("code", 202).put("msg", "语音还未转换完成,请完成后再添加!");
+            } else {
+                redisCache.setVoice(SOP_TEMP_VOICE_KEY, companyUserId);
+                sopTempVoices.forEach(m -> m.setVoiceTxt(m.getVoiceTxt().replace(" ", "")));
                 redisCache.setVoiceList(SOP_TEMP_VOICE_KEY + ":" + companyUserId, sopTempVoices);
-                return R.ok().put("msg","语音已加入队列进行转换,请耐心等待!");
+                return R.ok().put("msg", "语音已加入队列进行转换,请耐心等待!");
             }
         }
         return null;
     }
+
     @Login
     @GetMapping("/getPrescribeList")
-    public R getPrescribeList(FsPrescribeListDCompanyParam param)
-    {
+    public R getPrescribeList(FsPrescribeListDCompanyParam param) {
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
         param.setCompanyUserId(getCompanyUserId());
         param.setStatus(1);
-        List<FsPrescribeListDVO> list=fsPrescribeService.selectFsPrescribeListDVOByCompanyUser(param);
-        PageInfo<FsPrescribeListDVO> listPageInfo=new PageInfo<>(list);
-        return R.ok().put("data",listPageInfo);
+        List<FsPrescribeListDVO> list = fsPrescribeService.selectFsPrescribeListDVOByCompanyUser(param);
+        PageInfo<FsPrescribeListDVO> listPageInfo = new PageInfo<>(list);
+        return R.ok().put("data", listPageInfo);
     }
 
     @Login
@@ -403,4 +414,18 @@ public class CompanyUserController extends  AppBaseController {
         return R.ok().put("data", companyUserService.getHelpPatientAndAddress(getCompanyUserId(), userId));
     }
 
+    @Login
+    @PostMapping("/syncCompanyUser")
+    public R syncCompanyUser() {
+        Long companyUserId = getCompanyUserId();
+        long companyId = 0;
+        if (companyUserId != null) {
+            CompanyUser companyUser = companyUserMapper.selectCompanyUserByCompanyUserId(companyUserId);
+            if (companyUser != null) {
+                companyId = companyUser.getCompanyId();
+            }
+        }
+        return R.ok(fsUserService.syncCompanyUser(companyUserId, companyId));
+    }
+
 }

+ 9 - 0
fs-user-app/src/main/java/com/fs/app/param/FsPatientAddEditParam.java

@@ -55,4 +55,13 @@ public class FsPatientAddEditParam implements Serializable {
     private Integer isFurther;
     private String primaryHospital;
     private String primaryImages;
+    /**
+     * 是否是否因慢病在线下就诊?且对该处方内的产品无过敏或不良反应?0:是,我线下就诊过;  1: 否
+     */
+    private Integer isOfflineConsultation;
+
+    /**
+     * 是否已详细阅读疗法说明,确认自己符合疗法产品的适用人群,并了解使用方法,使用禁忌等?0:是 1:否
+     */
+    private Integer isReadTherapy;
 }