ct 1 тиждень тому
батько
коміт
2f20c37fe4
37 змінених файлів з 3696 додано та 0 видалено
  1. 108 0
      fs-admin/src/main/java/com/fs/his/controller/FsQuestionAndAnswerController.java
  2. 139 0
      fs-company/src/main/java/com/fs/company/controller/store/FsUserInformationCollectionController.java
  3. 120 0
      fs-company/src/main/java/com/fs/company/controller/store/FsUserInformationCollectionScheduleController.java
  4. 42 0
      fs-service/src/main/java/com/fs/his/domain/DoctorMsg.java
  5. 47 0
      fs-service/src/main/java/com/fs/his/domain/FsDoctorConfirm.java
  6. 28 0
      fs-service/src/main/java/com/fs/his/domain/FsQuestionAndAnswer.java
  7. 96 0
      fs-service/src/main/java/com/fs/his/domain/FsUserInformationCollection.java
  8. 71 0
      fs-service/src/main/java/com/fs/his/domain/FsUserInformationCollectionSchedule.java
  9. 79 0
      fs-service/src/main/java/com/fs/his/enums/PrescriptionTaskStepEnum.java
  10. 75 0
      fs-service/src/main/java/com/fs/his/mapper/DoctorMsgMapper.java
  11. 62 0
      fs-service/src/main/java/com/fs/his/mapper/FsDoctorConfirmMapper.java
  12. 67 0
      fs-service/src/main/java/com/fs/his/mapper/FsQuestionAndAnswerMapper.java
  13. 95 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserInformationCollectionMapper.java
  14. 69 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserInformationCollectionScheduleMapper.java
  15. 13 0
      fs-service/src/main/java/com/fs/his/param/CollectionInfoConfirmParam.java
  16. 16 0
      fs-service/src/main/java/com/fs/his/param/FsUserInformationCollectionListDParam.java
  17. 48 0
      fs-service/src/main/java/com/fs/his/param/FsUserInformationCollectionParam.java
  18. 64 0
      fs-service/src/main/java/com/fs/his/service/IFsDoctorConfirmService.java
  19. 66 0
      fs-service/src/main/java/com/fs/his/service/IFsQuestionAndAnswerService.java
  20. 70 0
      fs-service/src/main/java/com/fs/his/service/IFsUserInformationCollectionScheduleService.java
  21. 94 0
      fs-service/src/main/java/com/fs/his/service/IFsUserInformationCollectionService.java
  22. 95 0
      fs-service/src/main/java/com/fs/his/service/impl/FsDoctorConfirmServiceImpl.java
  23. 113 0
      fs-service/src/main/java/com/fs/his/service/impl/FsQuestionAndAnswerServiceImpl.java
  24. 105 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserInformationCollectionScheduleServiceImpl.java
  25. 902 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserInformationCollectionServiceImpl.java
  26. 32 0
      fs-service/src/main/java/com/fs/his/vo/AnswerVO.java
  27. 15 0
      fs-service/src/main/java/com/fs/his/vo/FsQuestionAndAnswerVO.java
  28. 79 0
      fs-service/src/main/java/com/fs/his/vo/FsUserInfoCollectionUVO.java
  29. 23 0
      fs-service/src/main/java/com/fs/his/vo/FsUserInformationCollectionListDVO.java
  30. 47 0
      fs-service/src/main/java/com/fs/his/vo/FsUserInformationCollectionVO.java
  31. 85 0
      fs-service/src/main/resources/mapper/his/DoctorMsgMapper.xml
  32. 84 0
      fs-service/src/main/resources/mapper/his/FsDoctorConfirmMapper.xml
  33. 70 0
      fs-service/src/main/resources/mapper/his/FsQuestionAndAnswerMapper.xml
  34. 175 0
      fs-service/src/main/resources/mapper/his/FsUserInformationCollectionMapper.xml
  35. 224 0
      fs-service/src/main/resources/mapper/his/FsUserInformationCollectionScheduleMapper.xml
  36. 100 0
      fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  37. 78 0
      fs-user-app/src/main/java/com/fs/app/controller/FsUserInformationCollectionController.java

+ 108 - 0
fs-admin/src/main/java/com/fs/his/controller/FsQuestionAndAnswerController.java

@@ -0,0 +1,108 @@
+package com.fs.his.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.his.domain.FsQuestionAndAnswer;
+import com.fs.his.service.IFsQuestionAndAnswerService;
+import com.fs.his.vo.OptionsVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 问答Controller
+ *
+ * @author fs
+ * @date 2025-09-29
+ */
+@RestController
+@RequestMapping("/his/answer")
+public class FsQuestionAndAnswerController extends BaseController
+{
+    @Autowired
+    private IFsQuestionAndAnswerService fsQuestionAndAnswerService;
+
+    /**
+     * 查询问答列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:answer:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsQuestionAndAnswer fsQuestionAndAnswer)
+    {
+        startPage();
+        List<FsQuestionAndAnswer> list = fsQuestionAndAnswerService.selectFsQuestionAndAnswerList(fsQuestionAndAnswer);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出问答列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:answer:export')")
+    @Log(title = "问答", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsQuestionAndAnswer fsQuestionAndAnswer)
+    {
+        List<FsQuestionAndAnswer> list = fsQuestionAndAnswerService.selectFsQuestionAndAnswerList(fsQuestionAndAnswer);
+        ExcelUtil<FsQuestionAndAnswer> util = new ExcelUtil<FsQuestionAndAnswer>(FsQuestionAndAnswer.class);
+        return util.exportExcel(list, "问答数据");
+    }
+
+    /**
+     * 获取问答详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:answer:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fsQuestionAndAnswerService.selectFsQuestionAndAnswerById(id));
+    }
+
+    /**
+     * 新增问答
+     */
+    @PreAuthorize("@ss.hasPermi('his:answer:add')")
+    @Log(title = "问答", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsQuestionAndAnswer fsQuestionAndAnswer)
+    {
+        return toAjax(fsQuestionAndAnswerService.insertFsQuestionAndAnswer(fsQuestionAndAnswer));
+    }
+
+    /**
+     * 修改问答
+     */
+    @PreAuthorize("@ss.hasPermi('his:answer:edit')")
+    @Log(title = "问答", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsQuestionAndAnswer fsQuestionAndAnswer)
+    {
+        return toAjax(fsQuestionAndAnswerService.updateFsQuestionAndAnswer(fsQuestionAndAnswer));
+    }
+
+    /**
+     * 删除问答
+     */
+    @PreAuthorize("@ss.hasPermi('his:answer:remove')")
+    @Log(title = "问答", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsQuestionAndAnswerService.deleteFsQuestionAndAnswerByIds(ids));
+    }
+
+    /**
+     * 查询问答列表
+     */
+    @GetMapping("/allList")
+    public TableDataInfo getHospital()
+    {
+        List<OptionsVO> list = fsQuestionAndAnswerService.selectAllQuestionOptions();
+        return getDataTable(list);
+    }
+}

+ 139 - 0
fs-company/src/main/java/com/fs/company/controller/store/FsUserInformationCollectionController.java

@@ -0,0 +1,139 @@
+package com.fs.company.controller.store;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.CompanyUserUser;
+import com.fs.company.service.ICompanyUserUserService;
+import com.fs.framework.security.LoginUser;
+import com.fs.framework.security.SecurityUtils;
+import com.fs.his.domain.FsUserInformationCollection;
+import com.fs.his.param.FsUserInformationCollectionParam;
+import com.fs.his.service.IFsUserInformationCollectionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 用户信息采集Controller
+ *
+ * @author fs
+ * @date 2025-10-14
+ */
+@RestController
+@RequestMapping("/store/collection")
+public class FsUserInformationCollectionController extends BaseController
+{
+    @Autowired
+    private IFsUserInformationCollectionService fsUserInformationCollectionService;
+    @Autowired
+    private ICompanyUserUserService companyUserUserService;
+
+    /**
+     * 查询用户信息采集列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:collection:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsUserInformationCollection fsUserInformationCollection)
+    {
+        startPage();
+        List<FsUserInformationCollection> list = fsUserInformationCollectionService.selectFsUserInformationCollectionList(fsUserInformationCollection);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出用户信息采集列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:collection:export')")
+    @Log(title = "用户信息采集", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsUserInformationCollection fsUserInformationCollection)
+    {
+        List<FsUserInformationCollection> list = fsUserInformationCollectionService.selectFsUserInformationCollectionList(fsUserInformationCollection);
+        ExcelUtil<FsUserInformationCollection> util = new ExcelUtil<FsUserInformationCollection>(FsUserInformationCollection.class);
+        return util.exportExcel(list, "用户信息采集数据");
+    }
+
+    /**
+     * 获取用户信息采集详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:collection:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fsUserInformationCollectionService.selectFsUserInformationCollectionById(id));
+    }
+
+    /**
+     * 新增用户信息采集
+     */
+    @PreAuthorize("@ss.hasPermi('his:collection:add')")
+    @Log(title = "用户信息采集", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsUserInformationCollectionParam fsUserInformationCollection)
+    {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        Long companyUserId = loginUser.getUser().getUserId();
+        //查询用户是否绑定销售
+        Long userId = fsUserInformationCollection.getUserId();
+        if (userId == null || userId < 0){
+            return AjaxResult.error("请选择绑定用户");
+        }
+        CompanyUserUser companyUserUser = new CompanyUserUser();
+        companyUserUser.setCompanyUserId(companyUserId);
+        companyUserUser.setUserId(userId);
+        List<CompanyUserUser> companyUserUsers = companyUserUserService.selectCompanyUserUserList(companyUserUser);
+        if (companyUserUsers == null || companyUserUsers.isEmpty()){
+            return AjaxResult.error("用户未绑定该销售");
+        }
+        fsUserInformationCollection.setCompanyUserId(companyUserId);
+        return AjaxResult.success(fsUserInformationCollectionService.insertFsUserInformationCollection(fsUserInformationCollection));
+    }
+
+    /**
+     * 修改用户信息采集
+     */
+    @PreAuthorize("@ss.hasPermi('his:collection:edit')")
+    @Log(title = "用户信息采集", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsUserInformationCollectionParam fsUserInformationCollection)
+    {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        fsUserInformationCollection.setCompanyUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(fsUserInformationCollectionService.updateFsUserInformationCollection(fsUserInformationCollection));
+    }
+
+    /**
+     * 删除用户信息采集
+     */
+    @PreAuthorize("@ss.hasPermi('his:collection:remove')")
+    @Log(title = "用户信息采集", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsUserInformationCollectionService.deleteFsUserInformationCollectionByIds(ids));
+    }
+
+    @GetMapping("/getInfo")
+    public AjaxResult getInfo(FsUserInformationCollection fsUserInformationCollection){
+        return AjaxResult.success(fsUserInformationCollectionService.getInfo(fsUserInformationCollection));
+    }
+
+    /**
+     * 生成套餐包付款二维码
+     */
+    @PreAuthorize("@ss.hasPermi('his:collection:WxaCodeCollectionUnLimit')")
+    @GetMapping("/getWxaCodeCollectionUnLimit/{collectionId}")
+    public R getWxaCodeCollectionUnLimit(@PathVariable("collectionId") Long orderId)
+    {
+
+        return fsUserInformationCollectionService.getWxaCodePackageOrderUnLimit(orderId);
+
+    }
+}

+ 120 - 0
fs-company/src/main/java/com/fs/company/controller/store/FsUserInformationCollectionScheduleController.java

@@ -0,0 +1,120 @@
+package com.fs.company.controller.store;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.his.domain.FsUserInformationCollectionSchedule;
+import com.fs.his.enums.PrescriptionTaskStepEnum;
+import com.fs.his.service.IFsUserInformationCollectionScheduleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+/**
+ * 用户信息采集进度Controller
+ *
+ * @author cgp
+ * @date 2025-11-18
+ */
+@RestController
+@RequestMapping("/store/collectionSchedule")
+public class FsUserInformationCollectionScheduleController extends BaseController
+{
+    @Autowired
+    private IFsUserInformationCollectionScheduleService fsUserInformationCollectionScheduleService;
+
+    /**
+     * 对于每条用户信息采集记录,只获取其最新的任务流程
+     */
+    @PreAuthorize("@ss.hasPermi('his:collectionSchedule:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule)
+    {
+        startPage();
+        List<FsUserInformationCollectionSchedule> list = fsUserInformationCollectionScheduleService.getUserRecordLatestTaskProcess(fsUserInformationCollectionSchedule);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出用户信息采集进度列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:collectionSchedule:export')")
+    @Log(title = "用户信息采集进度", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule)
+    {
+        List<FsUserInformationCollectionSchedule> list = fsUserInformationCollectionScheduleService.selectFsUserInformationCollectionScheduleList(fsUserInformationCollectionSchedule);
+        ExcelUtil<FsUserInformationCollectionSchedule> util = new ExcelUtil<FsUserInformationCollectionSchedule>(FsUserInformationCollectionSchedule.class);
+        return util.exportExcel(list, "用户信息采集进度数据");
+    }
+
+    /**
+     * 获取用户信息采集进度详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:collectionSchedule:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fsUserInformationCollectionScheduleService.selectFsUserInformationCollectionScheduleById(id));
+    }
+
+    /**
+     * 新增用户信息采集进度
+     */
+    @PreAuthorize("@ss.hasPermi('his:collectionSchedule:add')")
+    @Log(title = "用户信息采集进度", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule)
+    {
+        return toAjax(fsUserInformationCollectionScheduleService.insertFsUserInformationCollectionSchedule(fsUserInformationCollectionSchedule));
+    }
+
+    /**
+     * 修改用户信息采集进度
+     */
+    @PreAuthorize("@ss.hasPermi('his:collectionSchedule:edit')")
+    @Log(title = "用户信息采集进度", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule)
+    {
+        return toAjax(fsUserInformationCollectionScheduleService.updateFsUserInformationCollectionSchedule(fsUserInformationCollectionSchedule));
+    }
+
+    /**
+     * 删除用户信息采集进度
+     */
+    @PreAuthorize("@ss.hasPermi('his:collectionSchedule:remove')")
+    @Log(title = "用户信息采集进度", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsUserInformationCollectionScheduleService.deleteFsUserInformationCollectionScheduleByIds(ids));
+    }
+
+    /**
+     * 获取用户信息采集任务流程步骤枚举列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:collectionSchedule:list')")
+    @GetMapping("/steps")
+    public AjaxResult getTaskSteps() {
+        List<Map<String, Object>> steps = Arrays.stream(PrescriptionTaskStepEnum.values())
+                .map(enumItem -> {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("dictValue", enumItem.getCode());
+                    map.put("dictLabel", enumItem.getDesc());
+                    return map;
+                })
+                .collect(Collectors.toList());
+        return AjaxResult.success(steps);
+    }
+}

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

@@ -0,0 +1,42 @@
+package com.fs.his.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 医生消息对象 doctor_msg
+ *
+ * @author fs
+ * @date 2025-11-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DoctorMsg extends BaseEntity{
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 类型:1医生开方 2药师处方审核 3信息采集建议 */
+    @Excel(name = "类型:1医生开方 2药师处方审核 3信息采集建议")
+    private Integer type;
+
+    /** 标题 */
+    @Excel(name = "标题")
+    private String title;
+
+    /** 内容 */
+    @Excel(name = "内容")
+    private String content;
+
+    /** 0未读 1已读 */
+    @Excel(name = "0未读 1已读")
+    private Integer isRead;
+
+    /** 医生id */
+    @Excel(name = "医生id")
+    private Long doctorId;
+
+
+}

+ 47 - 0
fs-service/src/main/java/com/fs/his/domain/FsDoctorConfirm.java

@@ -0,0 +1,47 @@
+package com.fs.his.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 【请填写功能名称】对象 fs_doctor_confirm
+ *
+ * @author fs
+ * @date 2025-10-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsDoctorConfirm extends BaseEntity{
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 用户信息采集id */
+    @Excel(name = "用户信息采集id")
+    private Long collectionId;
+
+    /** 开始时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date startTime;
+
+    /** 结束时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date doctorEndTime;
+
+    /** 医生id */
+    @Excel(name = "医生id")
+    private Long doctorId;
+
+    /** 确认秒数 */
+    @Excel(name = "确认秒数")
+    private Long confirmSecond;
+
+
+}

+ 28 - 0
fs-service/src/main/java/com/fs/his/domain/FsQuestionAndAnswer.java

@@ -0,0 +1,28 @@
+package com.fs.his.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 问答对象 fs_question_and_answer
+ *
+ * @author fs
+ * @date 2025-09-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsQuestionAndAnswer extends BaseEntity{
+
+    /** $column.columnComment */
+    private Long id;
+
+    private String questionName;
+
+    /** 问答数据 */
+    @Excel(name = "问答数据")
+    private String jsonInfo;
+
+
+}

+ 96 - 0
fs-service/src/main/java/com/fs/his/domain/FsUserInformationCollection.java

@@ -0,0 +1,96 @@
+package com.fs.his.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户信息采集对象 fs_user_information_collection
+ *
+ * @author fs
+ * @date 2025-10-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserInformationCollection extends BaseEntity{
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 问答id */
+    @Excel(name = "问答id")
+    private Long questionId;
+
+    /** 用户id */
+    @Excel(name = "用户id")
+    private Long userId;
+
+    /** 信息采集json数据 */
+    @Excel(name = "信息采集json数据")
+    private String jsonInfo;
+
+    /** 用户确认状态 0-未确认 1-已确认 */
+    @Excel(name = "用户确认状态 0-未确认 1-已确认")
+    private Integer userConfirm;
+
+    /** 医生确认状态 0-未确认 2-已确认 */
+    @Excel(name = "医生确认状态 0-未确认 2-已确认")
+    private Integer doctorConfirm;
+
+    // 医生id
+    private Long doctorId;
+
+    //销售id
+    private Long companyUserId;
+
+    //套餐包id
+    private Long packageId;
+
+    //支付类型 0-全款 1-物流代收
+    private Integer payType;
+
+    //代收金额
+    private BigDecimal amount;
+
+    //用户补充说明
+    private String userAdvice;
+
+    //医生建议
+    private String doctorAdvice;
+
+    //是否关联套餐包 0-不关联 1-关联
+    private Integer isPackage;
+
+    //套餐包订单号
+    private String packageOrderCode;
+
+    //用户第二次确认状态
+    private Integer userConfirm2;
+
+    //确认状态 1第一次确认 2第二次确认
+    private Integer status;
+
+    //医生确认时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date doctorConfirmTime;
+
+    //用户性别 0女 1男
+    private Integer sex;
+    //用户姓名
+    private String userName;
+    //用户电话后四位
+    private String userPhoneFour;
+
+    //是否过敏
+    private String allergy;
+    //备注
+    private String remark;
+
+    private Long patientId;
+
+}

+ 71 - 0
fs-service/src/main/java/com/fs/his/domain/FsUserInformationCollectionSchedule.java

@@ -0,0 +1,71 @@
+package com.fs.his.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 用户信息采集进度对象 fs_user_information_collection_schedule
+ *
+ * @author fs
+ * @date 2025-11-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserInformationCollectionSchedule extends BaseEntity{
+
+    /** 主键 */
+    private Long id;
+
+    /** 用户信息采集表id */
+    private Long collectionId;
+
+    /** 用户id */
+    private Long userId;
+
+    /** 客户姓名 */
+    private String userName;
+
+    /** 医生id */
+    private Long doctorId;
+
+    /** 约诊医生 */
+    private String doctorName;
+
+    /** 套餐包Id */
+    private Long packageId;
+
+    /** 挂载商品名称 */
+    private String packageName;
+
+    /** 当前流程节点:(1:待用户第一次确认、2:待开方、3:待药师审核、4:待建议、5:待用户二次确认、6:完成);其中带疗法模式有1,2,3,5,6;无疗法模式只有1,4,5,6 */
+    private Integer currentStep;
+
+    /** 整体任务状态:1-进行中,2-已完成,3-已中止 */
+    private Integer status;
+
+    /** 创建时间 */
+    private Date createTime;
+
+    /** 完成时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date completedTime;
+
+    /** 中止时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "中止时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date terminatedTime;
+
+    /** 中止操作人id */
+    private Long terminatedBy;
+
+    /** 订单号 */
+    private String orderCode;
+
+
+}

+ 79 - 0
fs-service/src/main/java/com/fs/his/enums/PrescriptionTaskStepEnum.java

@@ -0,0 +1,79 @@
+package com.fs.his.enums;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+/**
+ * 用户信息采集任务流程步骤枚举
+ *
+ * 1 - 待用户第一次确认
+ * 2 - 待开方
+ * 3 - 待药师审核
+ * 4 - 待建议
+ * 5 - 待用户二次确认
+ */
+@Getter
+public enum PrescriptionTaskStepEnum {
+
+    WAITING_FIRST_CONFIRM(1, "待用户第一次确认"),
+    WAITING_PRESCRIBE(2, "待开方"),
+    WAITING_PHARMACIST_REVIEW(3, "待药师审核"),
+    WAITING_SUGGESTION(4, "待建议"),
+    WAITING_SECOND_CONFIRM(5, "待用户二次确认"),
+    WAITING_COMPLETED(6, "完成");
+
+    /** 步骤码(存入数据库的值) */
+    private final Integer code;
+
+    /** 步骤描述 */
+    private final String desc;
+
+    PrescriptionTaskStepEnum(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 根据 code 获取枚举(用于从数据库值转为枚举)
+     *
+     * @param code 步骤码
+     * @return 对应的枚举,若无匹配则返回 null
+     */
+    public static PrescriptionTaskStepEnum fromCode(Integer code) {
+        if (code == null) {
+            return null;
+        }
+        for (PrescriptionTaskStepEnum step : values()) {
+            if (step.code.equals(code)) {
+                return step;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Jackson 反序列化时使用(支持 JSON 中直接传数字如 1 -> WAITING_FIRST_CONFIRM)
+     */
+    @JsonCreator
+    public static PrescriptionTaskStepEnum fromJsonValue(Object value) {
+        if (value instanceof Number) {
+            return fromCode(((Number) value).intValue());
+        } else if (value instanceof String) {
+            try {
+                return fromCode(Integer.parseInt((String) value));
+            } catch (NumberFormatException ignored) {
+                // ignore
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Jackson 序列化时输出 code 而不是 name(如输出 1 而不是 "WAITING_FIRST_CONFIRM")
+     */
+    @JsonValue
+    public Integer getCode() {
+        return this.code;
+    }
+}

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

@@ -0,0 +1,75 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.DoctorMsg;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * 医生消息Mapper接口
+ *
+ * @author fs
+ * @date 2025-11-04
+ */
+public interface DoctorMsgMapper extends BaseMapper<DoctorMsg>{
+    /**
+     * 查询医生消息
+     *
+     * @param id 医生消息主键
+     * @return 医生消息
+     */
+    DoctorMsg selectDoctorMsgById(Long id);
+
+    /**
+     * 查询医生消息列表
+     *
+     * @param doctorMsg 医生消息
+     * @return 医生消息集合
+     */
+    List<DoctorMsg> selectDoctorMsgList(DoctorMsg doctorMsg);
+
+    /**
+     * 新增医生消息
+     *
+     * @param doctorMsg 医生消息
+     * @return 结果
+     */
+    int insertDoctorMsg(DoctorMsg doctorMsg);
+
+    /**
+     * 修改医生消息
+     *
+     * @param doctorMsg 医生消息
+     * @return 结果
+     */
+    int updateDoctorMsg(DoctorMsg doctorMsg);
+
+    /**
+     * 删除医生消息
+     *
+     * @param id 医生消息主键
+     * @return 结果
+     */
+    int deleteDoctorMsgById(Long id);
+
+    /**
+     * 批量删除医生消息
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteDoctorMsgByIds(Long[] ids);
+
+    //获取医生未读消息总数
+    @Select("select IFNULL(count( 0),0) from doctor_msg where doctor_id = #{doctorId} and is_read = 0 ")
+    Long selectDoctorMsgCountsByDoctorId(Long doctorId);
+
+    @Select("select IFNULL(count( type),0) from doctor_msg where doctor_id = #{doctorId} and is_read = 0 and type = #{type}")
+    Long selectDoctorMsgCountsByDoctorIdAndType(@Param("doctorId") Long doctorId, @Param("type") int type);
+
+    @Update("update  doctor_msg set is_read=1 where doctor_id = #{doctorId} ")
+    int setAllRead(Long doctorId);
+}

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

@@ -0,0 +1,62 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsDoctorConfirm;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author fs
+ * @date 2025-10-18
+ */
+public interface FsDoctorConfirmMapper extends BaseMapper<FsDoctorConfirm>{
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param id 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    FsDoctorConfirm selectFsDoctorConfirmById(Long id);
+
+    /**
+     * 查询【请填写功能名称】列表
+     *
+     * @param fsDoctorConfirm 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    List<FsDoctorConfirm> selectFsDoctorConfirmList(FsDoctorConfirm fsDoctorConfirm);
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param fsDoctorConfirm 【请填写功能名称】
+     * @return 结果
+     */
+    int insertFsDoctorConfirm(FsDoctorConfirm fsDoctorConfirm);
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param fsDoctorConfirm 【请填写功能名称】
+     * @return 结果
+     */
+    int updateFsDoctorConfirm(FsDoctorConfirm fsDoctorConfirm);
+
+    /**
+     * 删除【请填写功能名称】
+     *
+     * @param id 【请填写功能名称】主键
+     * @return 结果
+     */
+    int deleteFsDoctorConfirmById(Long id);
+
+    /**
+     * 批量删除【请填写功能名称】
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsDoctorConfirmByIds(Long[] ids);
+}

+ 67 - 0
fs-service/src/main/java/com/fs/his/mapper/FsQuestionAndAnswerMapper.java

@@ -0,0 +1,67 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsQuestionAndAnswer;
+import com.fs.his.vo.OptionsVO;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * 问答Mapper接口
+ *
+ * @author fs
+ * @date 2025-09-29
+ */
+public interface FsQuestionAndAnswerMapper extends BaseMapper<FsQuestionAndAnswer>{
+    /**
+     * 查询问答
+     *
+     * @param id 问答主键
+     * @return 问答
+     */
+    FsQuestionAndAnswer selectFsQuestionAndAnswerById(Long id);
+
+    /**
+     * 查询问答列表
+     *
+     * @param fsQuestionAndAnswer 问答
+     * @return 问答集合
+     */
+    List<FsQuestionAndAnswer> selectFsQuestionAndAnswerList(FsQuestionAndAnswer fsQuestionAndAnswer);
+
+    /**
+     * 新增问答
+     *
+     * @param fsQuestionAndAnswer 问答
+     * @return 结果
+     */
+    int insertFsQuestionAndAnswer(FsQuestionAndAnswer fsQuestionAndAnswer);
+
+    /**
+     * 修改问答
+     *
+     * @param fsQuestionAndAnswer 问答
+     * @return 结果
+     */
+    int updateFsQuestionAndAnswer(FsQuestionAndAnswer fsQuestionAndAnswer);
+
+    /**
+     * 删除问答
+     *
+     * @param id 问答主键
+     * @return 结果
+     */
+    int deleteFsQuestionAndAnswerById(Long id);
+
+    /**
+     * 批量删除问答
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsQuestionAndAnswerByIds(Long[] ids);
+
+    @Select("select id dictValue,question_name dictLabel from fs_question_and_answer  ")
+    List<OptionsVO> selectAllQuestionOptions();
+}

+ 95 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserInformationCollectionMapper.java

@@ -0,0 +1,95 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsUserInformationCollection;
+import com.fs.his.param.FsUserInformationCollectionListDParam;
+import com.fs.his.vo.FsUserInformationCollectionListDVO;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * 用户信息采集Mapper接口
+ *
+ * @author fs
+ * @date 2025-10-14
+ */
+public interface FsUserInformationCollectionMapper extends BaseMapper<FsUserInformationCollection>{
+    /**
+     * 查询用户信息采集
+     *
+     * @param id 用户信息采集主键
+     * @return 用户信息采集
+     */
+    FsUserInformationCollection selectFsUserInformationCollectionById(Long id);
+
+    FsUserInformationCollection selectFsUserInformationCollectionByUserId(Long userId);
+
+    /**
+     * 查询用户信息采集列表
+     *
+     * @param fsUserInformationCollection 用户信息采集
+     * @return 用户信息采集集合
+     */
+    List<FsUserInformationCollection> selectFsUserInformationCollectionList(FsUserInformationCollection fsUserInformationCollection);
+
+    /**
+     * 新增用户信息采集
+     *
+     * @param fsUserInformationCollection 用户信息采集
+     * @return 结果
+     */
+    int insertFsUserInformationCollection(FsUserInformationCollection fsUserInformationCollection);
+
+    /**
+     * 修改用户信息采集
+     *
+     * @param fsUserInformationCollection 用户信息采集
+     * @return 结果
+     */
+    int updateFsUserInformationCollection(FsUserInformationCollection fsUserInformationCollection);
+
+    @Select("UPDATE fs_user_information_collection SET package_order_code = NULL WHERE id = #{id}")
+    void collectionOderCodeNULL(@Param("id") Long id);
+    /**
+     * 删除用户信息采集
+     *
+     * @param id 用户信息采集主键
+     * @return 结果
+     */
+    int deleteFsUserInformationCollectionById(Long id);
+
+    /**
+     * 批量删除用户信息采集
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsUserInformationCollectionByIds(Long[] ids);
+
+    FsUserInformationCollection selectByUserId(Long userId);
+    FsUserInformationCollection selectByOrderCode(String orderCode);
+
+    @Select({"<script> " +
+            " SELECT uic.*,u.nickname userName FROM fs_user_information_collection uic LEFT JOIN fs_user u ON uic.user_id = u.user_id " +
+            "WHERE doctor_id = #{maps.doctorId} and is_package = 0  and user_confirm = 1 " +
+            "<if test='maps.doctorConfirm != null' > and uic.doctor_confirm = #{maps.doctorConfirm}  </if>" +
+            "<if test='maps.userConfirm != null' > and uic.user_confirm = #{maps.userConfirm}  </if>" +
+            "<if test='maps.userName != null ' > and u.nickname like concat('%',#{maps.userName},'%')</if>" +
+            "ORDER BY create_time desc" +
+            "</script>"})
+    List<FsUserInformationCollectionListDVO> selectFsUserInformationCollectionListDVO(@Param("maps") FsUserInformationCollectionListDParam param);
+
+    /**
+     * 查询需要自动退款订单(用户支付超过24小时,未第二次确认的订单号)
+     */
+    @Select("SELECT id,package_order_code FROM fs_user_information_collection uic LEFT JOIN fs_package_order po ON uic.package_order_code = po.order_sn  WHERE uic.doctor_confirm_time <= DATE_SUB(NOW(), INTERVAL 24 HOUR) and  uic.package_order_code IS NOT NULL   AND  uic.user_confirm2 = 0 AND po.is_pay = 1")
+    List<FsUserInformationCollection> selectAutoRefundOrderCode();
+
+    /**
+     * 查询需要自动确认订单(医生确认超过2小时,未第二次确认的信息采集)
+     */
+    @Select("SELECT * FROM fs_user_information_collection WHERE is_package = 0 AND user_confirm = 1 AND doctor_confirm = 1 AND user_confirm2 = 0 AND doctor_confirm_time <= DATE_SUB(NOW(), INTERVAL 2 HOUR)")
+    List<FsUserInformationCollection> selectAutoConfirm();
+}

+ 69 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserInformationCollectionScheduleMapper.java

@@ -0,0 +1,69 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsUserInformationCollectionSchedule;
+
+import java.util.List;
+
+/**
+ * 用户信息采集进度Mapper接口
+ *
+ * @author fs
+ * @date 2025-11-18
+ */
+public interface FsUserInformationCollectionScheduleMapper extends BaseMapper<FsUserInformationCollectionSchedule>{
+    /**
+     * 查询用户信息采集进度
+     *
+     * @param id 用户信息采集进度主键
+     * @return 用户信息采集进度
+     */
+    FsUserInformationCollectionSchedule selectFsUserInformationCollectionScheduleById(Long id);
+
+    /**
+     * 查询用户信息采集进度列表
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 用户信息采集进度集合
+     */
+    List<FsUserInformationCollectionSchedule> selectFsUserInformationCollectionScheduleList(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule);
+
+    /**
+     * 对于每条用户信息采集记录,只获取其最新的任务流程
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 用户信息采集进度集合
+     */
+    List<FsUserInformationCollectionSchedule> getUserRecordLatestTaskProcess(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule);
+    /**
+     * 新增用户信息采集进度
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 结果
+     */
+    int insertFsUserInformationCollectionSchedule(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule);
+
+    /**
+     * 修改用户信息采集进度
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 结果
+     */
+    int updateFsUserInformationCollectionSchedule(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule);
+
+    /**
+     * 删除用户信息采集进度
+     *
+     * @param id 用户信息采集进度主键
+     * @return 结果
+     */
+    int deleteFsUserInformationCollectionScheduleById(Long id);
+
+    /**
+     * 批量删除用户信息采集进度
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsUserInformationCollectionScheduleByIds(Long[] ids);
+}

+ 13 - 0
fs-service/src/main/java/com/fs/his/param/CollectionInfoConfirmParam.java

@@ -0,0 +1,13 @@
+package com.fs.his.param;
+
+import lombok.Data;
+
+@Data
+public class CollectionInfoConfirmParam {
+    private Long id;
+
+    private Long userId;
+
+    //用户建议
+    private String userAdvice;
+}

+ 16 - 0
fs-service/src/main/java/com/fs/his/param/FsUserInformationCollectionListDParam.java

@@ -0,0 +1,16 @@
+package com.fs.his.param;
+
+import com.fs.hisStore.param.BaseParam;
+import lombok.Data;
+
+@Data
+public class FsUserInformationCollectionListDParam extends BaseParam {
+    private String userName;
+
+    private Long doctorId;
+
+    //医生确认状态 0未确认 1已确认
+    private Integer doctorConfirm;
+
+    private Integer userConfirm;
+}

+ 48 - 0
fs-service/src/main/java/com/fs/his/param/FsUserInformationCollectionParam.java

@@ -0,0 +1,48 @@
+package com.fs.his.param;
+
+import com.fs.his.vo.AnswerVO;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class FsUserInformationCollectionParam {
+
+    private Long id;
+
+    private Long questionId;
+
+    private List<AnswerVO> answers;
+
+    private Long userId;
+
+    //销售id
+    private Long companyUserId;
+
+    //是否关联套餐包 0-不关联 1-关联
+    private Integer isPackage;
+
+    //套餐包id
+    private Long packageId;
+
+    //支付类型 0-全款 1-物流代收
+    private Integer payType;
+
+    //代收金额
+    private BigDecimal amount;
+
+    //用户性别 0女 1男
+    private Integer sex;
+    //用户姓名
+    private String userName;
+    //用户电话后四位
+    private String userPhoneFour;
+
+    //是否过敏
+    private String allergy;
+    //备注
+    private String remark;
+
+    private Long patientId;
+}

+ 64 - 0
fs-service/src/main/java/com/fs/his/service/IFsDoctorConfirmService.java

@@ -0,0 +1,64 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsDoctorConfirm;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author fs
+ * @date 2025-10-18
+ */
+@Service
+public interface IFsDoctorConfirmService extends IService<FsDoctorConfirm>{
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param id 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    FsDoctorConfirm selectFsDoctorConfirmById(Long id);
+
+    /**
+     * 查询【请填写功能名称】列表
+     *
+     * @param fsDoctorConfirm 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    List<FsDoctorConfirm> selectFsDoctorConfirmList(FsDoctorConfirm fsDoctorConfirm);
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param fsDoctorConfirm 【请填写功能名称】
+     * @return 结果
+     */
+    int insertFsDoctorConfirm(FsDoctorConfirm fsDoctorConfirm);
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param fsDoctorConfirm 【请填写功能名称】
+     * @return 结果
+     */
+    int updateFsDoctorConfirm(FsDoctorConfirm fsDoctorConfirm);
+
+    /**
+     * 批量删除【请填写功能名称】
+     *
+     * @param ids 需要删除的【请填写功能名称】主键集合
+     * @return 结果
+     */
+    int deleteFsDoctorConfirmByIds(Long[] ids);
+
+    /**
+     * 删除【请填写功能名称】信息
+     *
+     * @param id 【请填写功能名称】主键
+     * @return 结果
+     */
+    int deleteFsDoctorConfirmById(Long id);
+}

+ 66 - 0
fs-service/src/main/java/com/fs/his/service/IFsQuestionAndAnswerService.java

@@ -0,0 +1,66 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsQuestionAndAnswer;
+import com.fs.his.vo.FsQuestionAndAnswerVO;
+import com.fs.his.vo.OptionsVO;
+
+import java.util.List;
+
+/**
+ * 问答Service接口
+ *
+ * @author fs
+ * @date 2025-09-29
+ */
+public interface IFsQuestionAndAnswerService extends IService<FsQuestionAndAnswer>{
+    /**
+     * 查询问答
+     *
+     * @param id 问答主键
+     * @return 问答
+     */
+    FsQuestionAndAnswerVO selectFsQuestionAndAnswerById(Long id);
+
+    /**
+     * 查询问答列表
+     *
+     * @param fsQuestionAndAnswer 问答
+     * @return 问答集合
+     */
+    List<FsQuestionAndAnswer> selectFsQuestionAndAnswerList(FsQuestionAndAnswer fsQuestionAndAnswer);
+
+    /**
+     * 新增问答
+     *
+     * @param fsQuestionAndAnswer 问答
+     * @return 结果
+     */
+    int insertFsQuestionAndAnswer(FsQuestionAndAnswer fsQuestionAndAnswer);
+
+    /**
+     * 修改问答
+     *
+     * @param fsQuestionAndAnswer 问答
+     * @return 结果
+     */
+    int updateFsQuestionAndAnswer(FsQuestionAndAnswer fsQuestionAndAnswer);
+
+    /**
+     * 批量删除问答
+     *
+     * @param ids 需要删除的问答主键集合
+     * @return 结果
+     */
+    int deleteFsQuestionAndAnswerByIds(Long[] ids);
+
+    /**
+     * 删除问答信息
+     *
+     * @param id 问答主键
+     * @return 结果
+     */
+    int deleteFsQuestionAndAnswerById(Long id);
+
+    List<OptionsVO> selectAllQuestionOptions();
+}

+ 70 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserInformationCollectionScheduleService.java

@@ -0,0 +1,70 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsUserInformationCollectionSchedule;
+
+import java.util.List;
+
+/**
+ * 用户信息采集进度Service接口
+ *
+ * @author fs
+ * @date 2025-11-18
+ */
+public interface IFsUserInformationCollectionScheduleService extends IService<FsUserInformationCollectionSchedule>{
+    /**
+     * 查询用户信息采集进度
+     *
+     * @param id 用户信息采集进度主键
+     * @return 用户信息采集进度
+     */
+    FsUserInformationCollectionSchedule selectFsUserInformationCollectionScheduleById(Long id);
+
+    /**
+     * 查询用户信息采集进度列表
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 用户信息采集进度集合
+     */
+    List<FsUserInformationCollectionSchedule> getUserRecordLatestTaskProcess(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule);
+
+    /**
+     * 查询用户信息采集进度列表
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 用户信息采集进度集合
+     */
+    List<FsUserInformationCollectionSchedule> selectFsUserInformationCollectionScheduleList(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule);
+
+    /**
+     * 新增用户信息采集进度
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 结果
+     */
+    int insertFsUserInformationCollectionSchedule(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule);
+
+    /**
+     * 修改用户信息采集进度
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 结果
+     */
+    int updateFsUserInformationCollectionSchedule(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule);
+
+    /**
+     * 批量删除用户信息采集进度
+     *
+     * @param ids 需要删除的用户信息采集进度主键集合
+     * @return 结果
+     */
+    int deleteFsUserInformationCollectionScheduleByIds(Long[] ids);
+
+    /**
+     * 删除用户信息采集进度信息
+     *
+     * @param id 用户信息采集进度主键
+     * @return 结果
+     */
+    int deleteFsUserInformationCollectionScheduleById(Long id);
+}

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

@@ -0,0 +1,94 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.common.core.domain.R;
+import com.fs.his.domain.FsUserInformationCollection;
+import com.fs.his.param.CollectionInfoConfirmParam;
+import com.fs.his.param.FsUserInformationCollectionListDParam;
+import com.fs.his.param.FsUserInformationCollectionParam;
+import com.fs.his.vo.FsUserInfoCollectionUVO;
+import com.fs.his.vo.FsUserInformationCollectionListDVO;
+import com.fs.his.vo.FsUserInformationCollectionVO;
+
+import java.util.List;
+
+/**
+ * 用户信息采集Service接口
+ *
+ * @author fs
+ * @date 2025-10-14
+ */
+public interface IFsUserInformationCollectionService extends IService<FsUserInformationCollection>{
+    /**
+     * 查询用户信息采集
+     *
+     * @param id 用户信息采集主键
+     * @return 用户信息采集
+     */
+    FsUserInformationCollection selectFsUserInformationCollectionById(Long id);
+
+    /**
+     * 查询用户信息采集列表
+     *
+     * @param fsUserInformationCollection 用户信息采集
+     * @return 用户信息采集集合
+     */
+    List<FsUserInformationCollection> selectFsUserInformationCollectionList(FsUserInformationCollection fsUserInformationCollection);
+
+    /**
+     * 新增用户信息采集
+     *
+     * @param fsUserInformationCollection 用户信息采集
+     * @return 结果
+     */
+    Long insertFsUserInformationCollection(FsUserInformationCollectionParam fsUserInformationCollection);
+
+    /**
+     * 修改用户信息采集
+     *
+     * @param fsUserInformationCollection 用户信息采集
+     * @return 结果
+     */
+    Long updateFsUserInformationCollection(FsUserInformationCollectionParam fsUserInformationCollection);
+
+    /**
+     * 批量删除用户信息采集
+     *
+     * @param ids 需要删除的用户信息采集主键集合
+     * @return 结果
+     */
+    int deleteFsUserInformationCollectionByIds(Long[] ids);
+
+    /**
+     * 删除用户信息采集信息
+     *
+     * @param id 用户信息采集主键
+     * @return 结果
+     */
+    int deleteFsUserInformationCollectionById(Long id);
+
+
+    FsUserInformationCollectionVO getInfo(FsUserInformationCollection fsUserInformationCollection);
+
+    /**
+     * 查询医生端用户信息采集列表(只查询未关联套餐包的信息采集)
+     * @param param
+     * @return
+     */
+    List<FsUserInformationCollectionListDVO> selectFsUserInformationCollectionListDVO(FsUserInformationCollectionListDParam param);
+
+    FsUserInformationCollectionVO detail(Long id);
+
+    R getWxaCodePackageOrderUnLimit(Long collectionId);
+
+    R doctorConfirm(FsUserInformationCollection collection);
+
+    FsUserInfoCollectionUVO info(Long id, Long userId);
+
+    R userConfirm(CollectionInfoConfirmParam param);
+
+    //自动退款
+    void autoRefund(FsUserInformationCollection collection);
+
+    FsUserInformationCollectionVO getCollectionByUserId(Long userId);
+}

+ 95 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsDoctorConfirmServiceImpl.java

@@ -0,0 +1,95 @@
+package com.fs.his.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsDoctorConfirm;
+import com.fs.his.mapper.FsDoctorConfirmMapper;
+import com.fs.his.service.IFsDoctorConfirmService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author fs
+ * @date 2025-10-18
+ */
+@Service
+public class FsDoctorConfirmServiceImpl extends ServiceImpl<FsDoctorConfirmMapper, FsDoctorConfirm> implements IFsDoctorConfirmService {
+
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param id 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public FsDoctorConfirm selectFsDoctorConfirmById(Long id)
+    {
+        return baseMapper.selectFsDoctorConfirmById(id);
+    }
+
+    /**
+     * 查询【请填写功能名称】列表
+     *
+     * @param fsDoctorConfirm 【请填写功能名称】
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public List<FsDoctorConfirm> selectFsDoctorConfirmList(FsDoctorConfirm fsDoctorConfirm)
+    {
+        return baseMapper.selectFsDoctorConfirmList(fsDoctorConfirm);
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param fsDoctorConfirm 【请填写功能名称】
+     * @return 结果
+     */
+    @Override
+    public int insertFsDoctorConfirm(FsDoctorConfirm fsDoctorConfirm)
+    {
+        fsDoctorConfirm.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsDoctorConfirm(fsDoctorConfirm);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param fsDoctorConfirm 【请填写功能名称】
+     * @return 结果
+     */
+    @Override
+    public int updateFsDoctorConfirm(FsDoctorConfirm fsDoctorConfirm)
+    {
+        fsDoctorConfirm.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsDoctorConfirm(fsDoctorConfirm);
+    }
+
+    /**
+     * 批量删除【请填写功能名称】
+     *
+     * @param ids 需要删除的【请填写功能名称】主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsDoctorConfirmByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsDoctorConfirmByIds(ids);
+    }
+
+    /**
+     * 删除【请填写功能名称】信息
+     *
+     * @param id 【请填写功能名称】主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsDoctorConfirmById(Long id)
+    {
+        return baseMapper.deleteFsDoctorConfirmById(id);
+    }
+}

+ 113 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsQuestionAndAnswerServiceImpl.java

@@ -0,0 +1,113 @@
+package com.fs.his.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsQuestionAndAnswer;
+import com.fs.his.mapper.FsQuestionAndAnswerMapper;
+import com.fs.his.service.IFsQuestionAndAnswerService;
+import com.fs.his.vo.AnswerVO;
+import com.fs.his.vo.FsQuestionAndAnswerVO;
+import com.fs.his.vo.OptionsVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 问答Service业务层处理
+ *
+ * @author fs
+ * @date 2025-09-29
+ */
+@Service
+public class FsQuestionAndAnswerServiceImpl extends ServiceImpl<FsQuestionAndAnswerMapper, FsQuestionAndAnswer> implements IFsQuestionAndAnswerService {
+
+
+    @Autowired
+    private FsQuestionAndAnswerMapper fsQuestionAndAnswerMapper;
+    /**
+     * 查询问答
+     *
+     * @param id 问答主键
+     * @return 问答
+     */
+    @Override
+    public FsQuestionAndAnswerVO selectFsQuestionAndAnswerById(Long id)
+    {
+        FsQuestionAndAnswer fsQuestionAndAnswer = baseMapper.selectFsQuestionAndAnswerById(id);
+        FsQuestionAndAnswerVO vo = new FsQuestionAndAnswerVO();
+        vo.setQuestionName(fsQuestionAndAnswer.getQuestionName());
+        List<AnswerVO> answerVOS = JSON.parseArray(fsQuestionAndAnswer.getJsonInfo(), AnswerVO.class);
+        vo.setAnswers(answerVOS);
+        vo.setId(fsQuestionAndAnswer.getId());
+        return vo;
+    }
+
+    /**
+     * 查询问答列表
+     *
+     * @param fsQuestionAndAnswer 问答
+     * @return 问答
+     */
+    @Override
+    public List<FsQuestionAndAnswer> selectFsQuestionAndAnswerList(FsQuestionAndAnswer fsQuestionAndAnswer)
+    {
+        return baseMapper.selectFsQuestionAndAnswerList(fsQuestionAndAnswer);
+    }
+
+    /**
+     * 新增问答
+     *
+     * @param fsQuestionAndAnswer 问答
+     * @return 结果
+     */
+    @Override
+    public int insertFsQuestionAndAnswer(FsQuestionAndAnswer fsQuestionAndAnswer)
+    {
+        fsQuestionAndAnswer.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsQuestionAndAnswer(fsQuestionAndAnswer);
+    }
+
+    /**
+     * 修改问答
+     *
+     * @param fsQuestionAndAnswer 问答
+     * @return 结果
+     */
+    @Override
+    public int updateFsQuestionAndAnswer(FsQuestionAndAnswer fsQuestionAndAnswer)
+    {
+        fsQuestionAndAnswer.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsQuestionAndAnswer(fsQuestionAndAnswer);
+    }
+
+    /**
+     * 批量删除问答
+     *
+     * @param ids 需要删除的问答主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsQuestionAndAnswerByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsQuestionAndAnswerByIds(ids);
+    }
+
+    /**
+     * 删除问答信息
+     *
+     * @param id 问答主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsQuestionAndAnswerById(Long id)
+    {
+        return baseMapper.deleteFsQuestionAndAnswerById(id);
+    }
+
+    @Override
+    public List<OptionsVO> selectAllQuestionOptions() {
+        return fsQuestionAndAnswerMapper.selectAllQuestionOptions();
+    }
+}

+ 105 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserInformationCollectionScheduleServiceImpl.java

@@ -0,0 +1,105 @@
+package com.fs.his.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsUserInformationCollectionSchedule;
+import com.fs.his.mapper.FsUserInformationCollectionScheduleMapper;
+import com.fs.his.service.IFsUserInformationCollectionScheduleService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 用户信息采集进度Service业务层处理
+ *
+ * @author fs
+ * @date 2025-11-18
+ */
+@Service
+public class FsUserInformationCollectionScheduleServiceImpl extends ServiceImpl<FsUserInformationCollectionScheduleMapper, FsUserInformationCollectionSchedule> implements IFsUserInformationCollectionScheduleService {
+
+    /**
+     * 查询用户信息采集进度
+     *
+     * @param id 用户信息采集进度主键
+     * @return 用户信息采集进度
+     */
+    @Override
+    public FsUserInformationCollectionSchedule selectFsUserInformationCollectionScheduleById(Long id)
+    {
+        return baseMapper.selectFsUserInformationCollectionScheduleById(id);
+    }
+
+    /**
+     * 对于每条用户信息采集记录,只获取其最新的任务流程
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 用户信息采集进度
+     */
+    @Override
+    public List<FsUserInformationCollectionSchedule> getUserRecordLatestTaskProcess(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule)
+    {
+        return baseMapper.getUserRecordLatestTaskProcess(fsUserInformationCollectionSchedule);
+    }
+
+    /**
+     * 查询用户信息采集进度列表
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 用户信息采集进度
+     */
+    @Override
+    public List<FsUserInformationCollectionSchedule> selectFsUserInformationCollectionScheduleList(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule)
+    {
+        return baseMapper.getUserRecordLatestTaskProcess(fsUserInformationCollectionSchedule);
+    }
+
+    /**
+     * 新增用户信息采集进度
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 结果
+     */
+    @Override
+    public int insertFsUserInformationCollectionSchedule(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule)
+    {
+        fsUserInformationCollectionSchedule.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsUserInformationCollectionSchedule(fsUserInformationCollectionSchedule);
+    }
+
+    /**
+     * 修改用户信息采集进度
+     *
+     * @param fsUserInformationCollectionSchedule 用户信息采集进度
+     * @return 结果
+     */
+    @Override
+    public int updateFsUserInformationCollectionSchedule(FsUserInformationCollectionSchedule fsUserInformationCollectionSchedule)
+    {
+        return baseMapper.updateFsUserInformationCollectionSchedule(fsUserInformationCollectionSchedule);
+    }
+
+    /**
+     * 批量删除用户信息采集进度
+     *
+     * @param ids 需要删除的用户信息采集进度主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserInformationCollectionScheduleByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsUserInformationCollectionScheduleByIds(ids);
+    }
+
+    /**
+     * 删除用户信息采集进度信息
+     *
+     * @param id 用户信息采集进度主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserInformationCollectionScheduleById(Long id)
+    {
+        return baseMapper.deleteFsUserInformationCollectionScheduleById(id);
+    }
+}

+ 902 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserInformationCollectionServiceImpl.java

@@ -0,0 +1,902 @@
+package com.fs.his.service.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.common.exception.CustomException;
+import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.company.service.ICompanyService;
+import com.fs.core.config.WxMaConfiguration;
+import com.fs.core.config.WxPayProperties;
+import com.fs.core.utils.OrderCodeUtils;
+import com.fs.his.config.FsSysConfig;
+import com.fs.his.domain.*;
+import com.fs.his.enums.FsStoreOrderStatusEnum;
+import com.fs.his.mapper.*;
+import com.fs.his.param.CollectionInfoConfirmParam;
+import com.fs.his.param.FsUserInformationCollectionListDParam;
+import com.fs.his.param.FsUserInformationCollectionParam;
+import com.fs.his.service.*;
+import com.fs.his.utils.ConfigUtil;
+import com.fs.his.vo.*;
+import com.fs.huifuPay.domain.HuiFuRefundResult;
+import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentDelaytransConfirmrefundRequest;
+import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
+import com.fs.huifuPay.service.HuiFuService;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
+import com.fs.system.oss.CloudStorageService;
+import com.fs.system.oss.OSSFactory;
+import com.fs.system.service.ISysConfigService;
+import com.fs.tzBankPay.TzBankService.TzBankService;
+import com.fs.tzBankPay.doman.RefundParam;
+import com.fs.tzBankPay.doman.RefundResult;
+import com.fs.tzBankPay.doman.TzBankResult;
+import com.fs.ybPay.dto.RefundDTO;
+import com.fs.ybPay.service.IPayService;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.google.common.collect.Lists;
+import com.google.gson.Gson;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 用户信息采集Service业务层处理
+ *
+ * @author fs
+ * @date 2025-10-14
+ */
+@Service
+public class FsUserInformationCollectionServiceImpl extends ServiceImpl<FsUserInformationCollectionMapper, FsUserInformationCollection> implements IFsUserInformationCollectionService {
+    Logger logger= LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private ISysConfigService configService;
+
+    @Autowired
+    SysConfigMapper sysConfigMapper;
+
+    @Autowired
+    private WxPayProperties wxPayProperties;
+
+    @Autowired
+    private WxPayService wxPayService;
+
+    @Autowired
+    IPayService payService;
+
+    @Autowired
+    private TzBankService tzBankService;
+
+    @Autowired
+    private HuiFuService huiFuService;
+
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+
+    @Autowired
+    private FsDoctorMapper doctorMapper;
+
+    @Autowired
+    private IFsDoctorService iFsDoctorService;
+
+    @Autowired
+    private IFsQuestionAndAnswerService questionAndAnswerService;
+
+    @Autowired
+    private FsUserInformationCollectionMapper fsUserInformationCollectionMapper;
+
+    @Autowired
+    private ConfigUtil configUtil;
+
+    @Autowired
+    private IFsDoctorConfirmService doctorConfirmService;
+
+    @Autowired
+    RedisCache redisCache;
+
+    @Autowired
+    private FsPackageMapper packageMapper;
+
+    @Autowired
+    private IFsStoreOrderService storeOrderService;
+
+    @Autowired
+    private FsPackageOrderMapper packageOrderMapper;
+
+    @Autowired
+    private FsPrescribeMapper fsPrescribeMapper;
+
+    @Autowired
+    private IFsPrescribeService prescribeService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private FsStorePaymentMapper fsStorePaymentMapper;
+
+    @Autowired
+    private FsStoreOrderLogsMapper fsStoreOrderLogsMapper;
+    @Autowired
+    private DoctorMsgMapper doctorMsgMapper;
+    /**
+     * 查询用户信息采集
+     *
+     * @param id 用户信息采集主键
+     * @return 用户信息采集
+     */
+    @Override
+    public FsUserInformationCollection selectFsUserInformationCollectionById(Long id)
+    {
+        return baseMapper.selectFsUserInformationCollectionById(id);
+    }
+
+    /**
+     * 查询用户信息采集列表
+     *
+     * @param fsUserInformationCollection 用户信息采集
+     * @return 用户信息采集
+     */
+    @Override
+    public List<FsUserInformationCollection> selectFsUserInformationCollectionList(FsUserInformationCollection fsUserInformationCollection)
+    {
+        return baseMapper.selectFsUserInformationCollectionList(fsUserInformationCollection);
+    }
+
+    /**
+     * 新增用户信息采集
+     *
+     * @param param 用户信息采集
+     * @return 结果
+     */
+    @Override
+    public Long insertFsUserInformationCollection(FsUserInformationCollectionParam param)
+    {
+
+        FsUserInformationCollection fsUserInformationCollection = getFsUserInformationCollection(param);
+        fsUserInformationCollection.setCreateTime(DateUtils.getNowDate());
+        baseMapper.insertFsUserInformationCollection(fsUserInformationCollection);
+        return fsUserInformationCollection.getId();
+    }
+
+    /**
+     * 修改用户信息采集
+     *
+     * @param param 用户信息采集
+     * @return 结果
+     */
+    @Override
+    public Long updateFsUserInformationCollection(FsUserInformationCollectionParam param)
+    {
+        if (param.getId() == null || param.getId() < 1) {
+            throw new CustomException("参数错误");
+        }
+        FsUserInformationCollection collection = fsUserInformationCollectionMapper.selectFsUserInformationCollectionById(param.getId());
+        if (collection == null) {
+            throw new CustomException("没有用户采集信息");
+        }
+        if (collection.getUserConfirm() == 1 && collection.getUserConfirm2() == 0) {
+            throw new CustomException("确认中,暂无法修改");
+        }
+        //清空订单号
+        fsUserInformationCollectionMapper.collectionOderCodeNULL(param.getId());
+        FsUserInformationCollection fsUserInformationCollection = getFsUserInformationCollection(param);
+        fsUserInformationCollection.setUserConfirm2(0);
+        fsUserInformationCollection.setUserConfirm(0);
+        fsUserInformationCollection.setDoctorConfirm(0);
+        fsUserInformationCollection.setStatus(1);
+        fsUserInformationCollection.setUpdateTime(DateUtils.getNowDate());
+        baseMapper.updateFsUserInformationCollection(fsUserInformationCollection);
+        return fsUserInformationCollection.getId();
+    }
+
+    /**
+     * 批量删除用户信息采集
+     *
+     * @param ids 需要删除的用户信息采集主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserInformationCollectionByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsUserInformationCollectionByIds(ids);
+    }
+
+    /**
+     * 删除用户信息采集信息
+     *
+     * @param id 用户信息采集主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserInformationCollectionById(Long id)
+    {
+        return baseMapper.deleteFsUserInformationCollectionById(id);
+    }
+
+    @Override
+    public FsUserInformationCollectionVO getInfo(FsUserInformationCollection map) {
+        FsUserInformationCollectionVO vo = new FsUserInformationCollectionVO();
+        Long userId = map.getUserId();
+        Long questionId = map.getQuestionId();
+//        FsUserInformationCollection fsUserInformationCollection = baseMapper.selectByUserId(userId);
+        FsUserInformationCollection fsUserInformationCollection = null;
+        if (map.getId() != null){
+            fsUserInformationCollection = baseMapper.selectFsUserInformationCollectionById(map.getId());
+        }
+        if (fsUserInformationCollection != null) {
+            //组装返回数据
+            vo.setQuestionId(fsUserInformationCollection.getQuestionId());
+            vo.setId(fsUserInformationCollection.getId());
+            vo.setAmount(fsUserInformationCollection.getAmount());
+            vo.setPackageId(fsUserInformationCollection.getPackageId());
+            vo.setPayType(fsUserInformationCollection.getPayType());
+            vo.setIsPackage(fsUserInformationCollection.getIsPackage());
+            vo.setSex(fsUserInformationCollection.getSex());
+            vo.setUserPhoneFour(fsUserInformationCollection.getUserPhoneFour());
+            vo.setUserName(fsUserInformationCollection.getUserName());
+            vo.setRemark(fsUserInformationCollection.getRemark());
+            vo.setAllergy(fsUserInformationCollection.getAllergy());
+            if (map.getQuestionId() == null) {
+                FsQuestionAndAnswerVO questionAndAnswerVO = questionAndAnswerService.selectFsQuestionAndAnswerById(fsUserInformationCollection.getQuestionId());
+                List<AnswerVO> answerVOS = JSON.parseArray(fsUserInformationCollection.getJsonInfo(), AnswerVO.class);
+                List<AnswerVO> collect = getAnswerVOs(answerVOS, questionAndAnswerVO.getAnswers());
+                vo.setAnswers(collect);
+            } else {
+                vo.setAnswers(JSON.parseArray(fsUserInformationCollection.getJsonInfo(), AnswerVO.class));
+            }
+        }
+        if (questionId != null) {
+            vo.setQuestionId(questionId);
+            //问答数据
+            FsQuestionAndAnswerVO questionAndAnswerVO = questionAndAnswerService.selectFsQuestionAndAnswerById(questionId);
+            if (questionAndAnswerVO != null) {
+                questionAndAnswerVO.getAnswers().forEach(answerVO -> {
+                    answerVO.setFlag(false);
+                });
+                if (fsUserInformationCollection != null) {
+                    vo.getAnswers().addAll(questionAndAnswerVO.getAnswers());
+                    vo.setAnswers(getAnswerVOs(vo.getAnswers(),questionAndAnswerVO.getAnswers()));
+                } else {
+                    //返回问答
+                    vo.setAnswers(questionAndAnswerVO.getAnswers());
+                }
+            }
+        }
+        if (ObjectUtil.isNotEmpty(vo.getAnswers())){
+            vo.getAnswers().forEach(answerVO -> {
+                if (answerVO.getSort() == null) {
+                    if (answerVO.getTitle().contains("糖尿病")) {
+                        answerVO.setSort(1);
+                    } else if (answerVO.getTitle().contains("心脑血管")) {
+                        answerVO.setSort(2);
+                    } else if (answerVO.getTitle().contains("风湿骨病")) {
+                        answerVO.setSort(3);
+                    } else if (answerVO.getTitle().contains("肝胆")) {
+                        answerVO.setSort(4);
+                    } else if (answerVO.getTitle().contains("其他")) {
+                        answerVO.setSort(5);
+                    } else if (answerVO.getTitle().contains("特殊")) {
+                        answerVO.setSort(6);
+                    }
+                }
+                if(answerVO.getFlag() == null) {
+                    answerVO.setFlag(false);
+                }
+                if (answerVO.getValue() == null) {
+                    answerVO.setValue(new ArrayList<>());
+                }
+            });
+            //有值且为true排前面
+//            List<AnswerVO> collect = vo.getAnswers().stream()
+//                    .sorted(Comparator.comparing(AnswerVO::getValue, Comparator.nullsFirst(Integer::compareTo)).reversed()).collect(Collectors.toList())
+//                    .stream()
+//                    .sorted((a,b)-> Boolean.compare(b.getFlag(),a.getFlag())).collect(Collectors.toList());
+            //List<AnswerVO> collect = vo.getAnswers().stream()
+            //        .sorted(Comparator.comparing(AnswerVO::getValue, Comparator.nullsFirst(List::indexOf)).reversed()).collect(Collectors.toList())
+            //        .stream()
+            //        .sorted((a,b)-> Boolean.compare(b.getFlag(),a.getFlag())).collect(Collectors.toList());
+            List<AnswerVO> collect = vo.getAnswers().stream()
+                    .sorted(Comparator.comparing(AnswerVO::getSort)).collect(Collectors.toList());
+
+            vo.setAnswers(collect);
+        }
+        return vo;
+    }
+
+    @Override
+    public List<FsUserInformationCollectionListDVO> selectFsUserInformationCollectionListDVO(FsUserInformationCollectionListDParam param) {
+        return fsUserInformationCollectionMapper.selectFsUserInformationCollectionListDVO(param);
+    }
+
+    @Override
+    public FsUserInformationCollectionVO detail(Long id) {
+        FsUserInformationCollectionVO vo = new FsUserInformationCollectionVO();
+        FsUserInformationCollection collection = fsUserInformationCollectionMapper.selectFsUserInformationCollectionById(id);
+        if (collection != null) {
+            vo.setAllergy(collection.getAllergy());
+            vo.setRemark(collection.getRemark());
+            vo.setAnswers(JSON.parseArray(collection.getJsonInfo(), AnswerVO.class));
+            List<AnswerVO> answers = vo.getAnswers();
+            if (!CollectionUtils.isEmpty(answers)){
+                List<AnswerVO> collect = answers
+                        .stream()
+                        .filter(answerVO -> !answerVO.getValue().isEmpty())
+                        .collect(Collectors.toList());
+                if (!CollectionUtils.isEmpty(collect)) {
+                    collect.forEach(answerVO -> {
+                        List<Integer> value = answerVO.getValue();
+                        List<AnswerVO.Options> options = answerVO.getOptions();
+                        List<AnswerVO.Options> filterOptions = Lists.newArrayList();
+                        for (AnswerVO.Options option : options) {
+                            if (value.contains(option.getValue())) {
+                                filterOptions.add(option);
+                            }
+                        }
+                        answerVO.setOptions(filterOptions);
+                    });
+                }
+                vo.setAnswers(collect);
+            }
+        }
+        return vo;
+    }
+
+    @Override
+    public R getWxaCodePackageOrderUnLimit(Long collectionId) {
+        logger.info("生成用户信息采集二维码");
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+
+        final WxMaService wxMaService = WxMaConfiguration.getMaService(sysConfig.getAppid());
+
+        String scene="collectionId="+ collectionId ;
+        byte[] file;
+        try {
+            file = wxMaService.getQrcodeService().createWxaCodeUnlimitBytes(
+                    scene,
+                    "pages_order/confirmUserinfo",
+                    true,
+                    "release",//release trial
+                    430,
+                    true,
+                    null,
+                    false);
+
+            // 上传图片到存储桶
+            String suffix = ".png";
+            CloudStorageService storage = OSSFactory.build();
+            String url;
+            try {
+                url = storage.uploadSuffix(file, suffix);
+            }  catch (Exception e) {
+                // 记录错误日志
+                logger.error("生成图片失败:{}",e.getMessage(),e);
+                return R.error("生成图片失败");
+            }
+            // 返回成功信息
+            return R.ok().put("url",url);
+
+        } catch (WxErrorException e) {
+            logger.error(e.getMessage(), e);
+            return R.error("微信接口调用失败: " + e.getMessage());
+        }
+    }
+
+    @Override
+    @Transactional
+    public R doctorConfirm(FsUserInformationCollection collection) {
+        FsUserInformationCollection fsUserInformationCollection = fsUserInformationCollectionMapper.selectFsUserInformationCollectionById(collection.getId());
+        if (fsUserInformationCollection == null) {
+            return R.error("没有用户采集信息");
+        }
+        if (fsUserInformationCollection.getUserConfirm() == 0){
+            return R.error("用户未确认");
+        }
+        if (fsUserInformationCollection.getDoctorConfirm() == 1){
+            return R.error("医生已确认");
+        }
+        List<AnswerVO> answerVOS = null;
+        //医生确认确认状态为true(用于封档)
+        if (StringUtils.isNotEmpty(fsUserInformationCollection.getJsonInfo()) ){
+            answerVOS = JSONArray.parseArray(fsUserInformationCollection.getJsonInfo(), AnswerVO.class);
+            answerVOS.forEach(answerVO -> {
+                answerVO.setFlag(true);
+            });
+        }
+        FsUserInformationCollection map = new FsUserInformationCollection();
+        map.setId(collection.getId());
+        map.setDoctorAdvice(collection.getDoctorAdvice());
+        map.setDoctorConfirm(1);
+        //医生确认时间
+        map.setDoctorConfirmTime(DateUtils.getNowDate());
+        if (answerVOS != null && !answerVOS.isEmpty()) {
+            map.setJsonInfo(JSON.toJSONString(answerVOS));
+        }
+//        if (fsUserInformationCollection.getIsPackage() == 1) {
+//            //插入生成处方签定时任务数据
+//            if(fsUserInformationCollection.getPackageOrderCode() != null) {
+//                //套餐包订单
+//                FsPackageOrder fsPackageOrder = packageOrderMapper.selectByOderCode(fsUserInformationCollection.getPackageOrderCode());
+//                if (fsPackageOrder != null && fsPackageOrder.getIsPay() == 1) {
+//                    //套餐包信息
+//                    FsPackage fsPackage = JSON.parseObject(fsPackageOrder.getPackageJson(), FsPackage.class);
+//
+//                    //套餐包为药品生成处方信息
+//                    if(fsPackage != null && (fsPackage.getProductType() == 1 || fsPackage.getProductType() == 2 || fsPackage.getProductType() == 3)) {
+//                        FsStoreOrder fsStoreOrder = storeOrderService.selectFsStoreOrderByOrderCode(fsUserInformationCollection.getPackageOrderCode());
+//                        if (fsStoreOrder != null && fsStoreOrder.getIsPay() == 1 ) {
+//                            if (fsStoreOrder.getPrescribeId() != null) {
+////                                FsPrescribeParam fsPrescribeParam = new FsPrescribeParam();
+////                                fsPrescribeParam.setPrescribeId(fsStoreOrder.getPrescribeId());
+////                                prescribeService.confirmPrescribe(fsPrescribeParam);
+//                                prescribeService.collectionPrescribe(fsStoreOrder.getPrescribeId());
+//                            }
+//                        } else {
+//                            throw new CustomException("生成处方信息中......");
+//                        }
+//                    }
+//                }
+//            }
+//        } else {
+//            //没有关联套餐包医生确认清空所有状态
+//            map.setUserConfirm2(1);
+//        }
+
+        if (fsUserInformationCollectionMapper.updateFsUserInformationCollection(map) > 0) {
+
+            //更新医生确认信息
+            FsDoctorConfirm doctorConfirm = redisCache.getCacheObject("doctorConfirm:" + collection.getId());
+            if(doctorConfirm == null) {
+                return R.error("没有医生确认信息");
+            }
+            doctorConfirm.setDoctorEndTime(DateUtils.getNowDate());
+            Long seconds = DateUtil.between(doctorConfirm.getStartTime(), doctorConfirm.getDoctorEndTime(), DateUnit.SECOND);
+            doctorConfirm.setConfirmSecond(seconds);
+            doctorConfirmService.updateFsDoctorConfirm(doctorConfirm);
+            redisCache.deleteObject("doctorConfirm:" + collection.getId());
+
+
+            return R.ok();
+        }
+        return R.error("医生确认失败");
+    }
+
+    @Override
+    public FsUserInfoCollectionUVO info(Long id, Long userId) {
+        FsUserInfoCollectionUVO vo = new FsUserInfoCollectionUVO();
+        FsUserInformationCollection collection = fsUserInformationCollectionMapper.selectFsUserInformationCollectionById(id);
+
+        if (collection != null) {
+
+//            if (!Objects.equals(collection.getUserId(), userId)) {
+//                return vo;
+//            }
+            if (collection.getIsPackage() == 1) {
+                vo.setPackageId(collection.getPackageId());
+                vo.setPayType(collection.getPayType());
+                vo.setAmount(collection.getAmount());
+                FsPackage fsPackage = new FsPackage();
+                FsPackage fsPackage1 = packageMapper.selectFsPackageByPackageId(collection.getPackageId());
+                if (fsPackage1 != null) {
+                    fsPackage = fsPackage1;
+                }
+                vo.setFsPackage(fsPackage);
+                CompanyUser companyUser = companyUserMapper.selectCompanyUserById(collection.getCompanyUserId());
+                if (companyUser == null) {
+                    throw new CustomException("销售不存在");
+                }
+                vo.setCompanyUserId(collection.getCompanyUserId());
+                vo.setCompanyId(companyUser.getCompanyId());
+                vo.setPackageOrderCode(collection.getPackageOrderCode());
+                FsPackageOrder fsPackageOrder = packageOrderMapper.selectFsPackageOrderByOrderSn(collection.getPackageOrderCode());
+                if(fsPackageOrder!=null) {
+                    vo.setOrderStatus(fsPackageOrder.getIsPay());
+                    vo.setOrderId(fsPackageOrder.getOrderId());
+                    vo.setPatientJson(fsPackageOrder.getPatientJson());
+                    if((fsPackage.getProductType() == 1 || fsPackage.getProductType() == 2 || fsPackage.getProductType() == 3) && fsPackageOrder.getIsPay() == 1) {
+                        //套餐包为药品且已支付的查询处方订单拿到处方签
+                        FsStoreOrder fsStoreOrder = storeOrderService.selectFsStoreOrderByOrderCode(collection.getPackageOrderCode());
+                        if (fsStoreOrder != null) {
+                            Long prescribeId = fsStoreOrder.getPrescribeId();
+                            FsPrescribe fsPrescribe = fsPrescribeMapper.selectFsPrescribeByPrescribeId(prescribeId);
+                            if (fsPrescribe != null) {
+                                vo.setPrescribeImgUrl(fsPrescribe.getPrescribeImgUrl());
+                                vo.setPrescribeStatus(fsPrescribe.getStatus());
+                            }
+                        } else {
+                            throw new CustomException("没有处方订单");
+                        }
+                    }
+                }
+            }
+            vo.setIsPackage(collection.getIsPackage());
+            vo.setId(collection.getId());
+            vo.setAnswers(JSON.parseArray(collection.getJsonInfo(), AnswerVO.class));
+            vo.setStatus(collection.getStatus());
+            vo.setUserConfirm(collection.getUserConfirm());
+            vo.setUserConfirm2(collection.getUserConfirm2());
+            vo.setDoctorConfirm(collection.getDoctorConfirm());
+            vo.setUserAdvice(collection.getUserAdvice());
+            vo.setDoctorAdvice(collection.getDoctorAdvice());
+            vo.setDoctor(doctorMapper.selectFsDoctorByDoctorId(collection.getDoctorId()));
+            vo.setAllergy(collection.getAllergy());
+            vo.setRemark(collection.getRemark());
+            vo.setSex(collection.getSex());
+            vo.setUserPhoneFour(collection.getUserPhoneFour());
+            vo.setUserName(collection.getUserName());
+        }
+        return vo;
+    }
+
+    @Override
+    @Transactional
+    public R userConfirm(CollectionInfoConfirmParam param) {
+
+        if (param.getId() == null) {
+            return R.error("参数错误");
+        }
+        FsUserInformationCollection collection = fsUserInformationCollectionMapper.selectFsUserInformationCollectionById(param.getId());
+        if (collection == null) {
+            return R.error("没有用户采集信息");
+        }
+        if (collection.getStatus() == 1 ){
+            if (collection.getUserConfirm() == 1){
+                return R.error("用户已确认");
+            }
+        }
+        if (!Objects.equals(collection.getUserId(), param.getUserId())) {
+            return R.error("用户信息不匹配,无法确认");
+        }
+        FsUserInformationCollection map = new FsUserInformationCollection();
+        map.setId(param.getId());
+        map.setUserConfirm(1);
+        map.setUserAdvice(param.getUserAdvice());
+        if (collection.getStatus() == 1) {
+            //用户第一次确认添加医生消息
+            DoctorMsg msg = new DoctorMsg();
+            String name = collection.getUserName() != null ? collection.getUserName() : "-";
+            //没套餐包的添加医生信息采集建议消息
+            msg.setTitle("用户采集信息建议");
+            msg.setType(3);
+            msg.setContent("患者:" + name + "的信息采集,前往建议");
+            msg.setDoctorId(collection.getDoctorId());
+            msg.setCreateTime(DateUtils.getNowDate());
+            //插入医生消息
+            doctorMsgMapper.insertDoctorMsg(msg);
+            //第一次确认
+            map.setStatus(2);
+        } else if (collection.getStatus() == 2) {
+            //第二次确认
+            map.setUserConfirm2(1);
+            if (collection.getUserConfirm2() == 0 && collection.getIsPackage() == 1) {
+                FsStoreOrder fsStoreOrder = storeOrderService.selectFsStoreOrderByOrderCode(collection.getPackageOrderCode());
+                if (fsStoreOrder != null) {
+                    FsStoreOrder editOrder   = new FsStoreOrder();
+                    editOrder.setOrderId(fsStoreOrder.getOrderId());
+//                    editOrder.setIsConfirm(1); todo
+                    storeOrderService.updateFsStoreOrder(editOrder);
+                } else {
+                    return R.error("没有找到订单");
+                }
+            }
+        }
+        if (fsUserInformationCollectionMapper.updateFsUserInformationCollection(map) > 0) {
+            //存入医生确认统计时间数据
+            FsDoctorConfirm doctorConfirm = new FsDoctorConfirm();
+            doctorConfirm.setCollectionId(collection.getId());
+            doctorConfirm.setDoctorId(collection.getDoctorId());
+            doctorConfirm.setStartTime(DateUtils.getNowDate());
+            doctorConfirmService.insertFsDoctorConfirm(doctorConfirm);
+            //医生确认时间存入缓存 医生确认后删除
+            redisCache.setCacheObject("doctorConfirm:" + collection.getId(), doctorConfirm);
+            return R.ok();
+        }
+        return R.error("用户确认失败");
+    }
+
+
+    @Override
+    @Transactional
+    public void autoRefund(FsUserInformationCollection collection) {
+
+        //清空订单号
+        fsUserInformationCollectionMapper.collectionOderCodeNULL(collection.getId());
+
+        //更新采集信息状态
+        FsUserInformationCollection map = new FsUserInformationCollection();
+        map.setId(collection.getId());
+        map.setUserConfirm2(0);
+        map.setStatus(1);
+        map.setUserConfirm(0);
+        map.setDoctorConfirm(0);
+        //更新用户信息采集状态
+        fsUserInformationCollectionMapper.updateFsUserInformationCollection(map);
+
+        //退款操作
+        FsStoreOrder fsStoreOrder = storeOrderService.selectFsStoreOrderByOrderCode(collection.getPackageOrderCode());
+        if (fsStoreOrder == null) {
+            throw new CustomException("没有处方订单");
+        }
+
+        //更新处方单信息
+        FsStoreOrder mapStoreOrder = new FsStoreOrder();
+        mapStoreOrder.setOrderId(fsStoreOrder.getOrderId());
+        mapStoreOrder.setStatus(-2);
+        mapStoreOrder.setRefundTime(DateUtils.getNowDate());
+        storeOrderService.updateFsStoreOrder(mapStoreOrder);
+
+        //订单日志
+        FsStoreOrderLogs Logs = new FsStoreOrderLogs();
+        Logs.setChangeMessage(FsStoreOrderStatusEnum.REFUND_STATUS_2.getDesc());
+        Logs.setOrderId(fsStoreOrder.getOrderId());
+        Logs.setChangeTime(new DateTime());
+        Logs.setChangeType(FsStoreOrderStatusEnum.REFUND_STATUS_2.getValue().toString());
+        fsStoreOrderLogsMapper.insertFsStoreOrderLogs(Logs);
+
+        String orderType = "store";
+        Long orderId = fsStoreOrder.getOrderId();
+        if (fsStoreOrder.getPackageOrderId() != null) {
+            orderType = "package";
+
+            FsPackageOrder fsPackageOrder = packageOrderMapper.selectFsPackageOrderByOrderSn(collection.getPackageOrderCode());
+            if (fsPackageOrder == null) {
+                throw new CustomException("没有套餐订单");
+            }
+            orderId = fsStoreOrder.getPackageOrderId();
+
+            //更新套餐单信息
+            FsPackageOrder mapPackageOrder = new FsPackageOrder();
+            mapPackageOrder.setOrderId(fsPackageOrder.getOrderId());
+            mapPackageOrder.setStatus(-2);
+            mapPackageOrder.setRefundStatus(2);
+            packageOrderMapper.updateFsPackageOrder(fsPackageOrder);
+        }
+
+        if (fsStoreOrder.getCompanyId() != null) {
+            companyService.refundCompanyMoney(fsStoreOrder);
+        }
+
+        //获取支付明细
+        List<FsStorePayment> payments = fsStorePaymentMapper.selectFsStorePaymentByPay(2, fsStoreOrder.getOrderId());
+        if (fsStoreOrder.getPackageOrderId() != null) {
+
+            payments = fsStorePaymentMapper.selectFsStorePaymentByPay(3, fsStoreOrder.getPackageOrderId());
+        }
+
+        if (payments != null && !payments.isEmpty()) {
+            FsStorePayment payment = payments.get(0);
+            String json = configService.selectConfigByKey("his.pay");
+            if (payment.getPayMode().equals("wx")) {
+                WxPayConfig payConfig = new WxPayConfig();
+                SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.pay");
+                FsPayConfig fsPayConfig = new Gson().fromJson(sysConfig.getConfigValue(), FsPayConfig.class);
+                payConfig.setAppId(fsPayConfig.getAppId());
+                payConfig.setMchId(fsPayConfig.getWxMchId());
+                payConfig.setMchKey(fsPayConfig.getWxMchKey());
+                payConfig.setKeyPath(wxPayProperties.getKeyPath());
+                payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                wxPayService.setConfig(payConfig);
+                WxPayRefundRequest refundRequest = new WxPayRefundRequest();
+                refundRequest.setOutTradeNo(orderType + "-" + payment.getPayCode());
+                refundRequest.setOutRefundNo(orderType + "-" + payment.getPayCode());
+                refundRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(payment.getPayMoney().toString()));
+                refundRequest.setRefundFee(WxPayUnifiedOrderRequest.yuanToFen(payment.getPayMoney().toString()));
+                try {
+                    WxPayRefundResult refundResult = wxPayService.refund(refundRequest);
+                    WxPayRefundQueryResult refundQueryResult = wxPayService.refundQuery("", refundResult.getOutTradeNo(), refundResult.getOutRefundNo(), refundResult.getRefundId());
+                    if (refundQueryResult != null && refundQueryResult.getResultCode().equals("SUCCESS")) {
+                        FsStorePayment paymentMap = new FsStorePayment();
+                        paymentMap.setPaymentId(payment.getPaymentId());
+                        paymentMap.setStatus(-1);
+                        paymentMap.setRefundTime(DateUtils.getNowDate());
+                        paymentMap.setRefundMoney(payment.getPayMoney());
+                        fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+                    } else {
+                        throw new CustomException("退款请求失败" + refundQueryResult.getReturnMsg());
+                    }
+                } catch (WxPayException e) {
+                    throw new CustomException("退款请求失败" + e.getReturnMsg());
+                }
+            } else if (payment.getPayMode().equals("yb")) {
+                //易宝
+                RefundDTO refundDTO = new RefundDTO();
+                refundDTO.setRefundMoney(payment.getPayMoney().toString());
+                refundDTO.setLowRefundNo(orderType + "-" + payment.getPayCode());
+                refundDTO.setUpOrderId(payment.getTradeNo());
+                com.fs.ybPay.domain.RefundResult result = payService.refund(refundDTO);
+                logger.info("订单退款返回结果:退款订单id:" + orderId + result);
+                if (result.getState().equals("5")) {
+                    FsStorePayment paymentMap = new FsStorePayment();
+                    paymentMap.setPaymentId(payment.getPaymentId());
+                    paymentMap.setStatus(-1);
+                    paymentMap.setRefundTime(DateUtils.getNowDate());
+                    paymentMap.setRefundMoney(payment.getPayMoney());
+                    fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+                } else {
+                    throw new CustomException("退款请求失败" + result.getMessage());
+                }
+            } else if (payment.getPayMode().equals("tz")) {
+                RefundParam tzBankResult = new RefundParam();
+                // 使用set方法为对象的字段赋值
+                //商户原支付订单号
+                tzBankResult.setOldPayOutOrderNo(orderType + payment.getPayCode());
+                // 商户退款订单号 对接平台系统里自己生成的退款订单号
+                tzBankResult.setRefundOrderNo(orderType + payment.getPayCode());
+                // 交易发送时间 yyyyMMddHHmmss
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+                tzBankResult.setTrxSendTime(sdf.format(new Date()));
+                // 退款金额
+                tzBankResult.setRefundOrdTransAmt(payment.getPayMoney().doubleValue());
+                TzBankResult<RefundResult> result = tzBankService.refund(tzBankResult);
+                logger.info("订单退款返回结果:退款订单id:" + orderId + result);
+                if (result.getBody().getRefundOrdStatus().equals("90") || result.getBody().getRefundOrdStatus().equals("60")) {
+                    FsStorePayment paymentMap = new FsStorePayment();
+                    paymentMap.setPaymentId(payment.getPaymentId());
+                    paymentMap.setStatus(-1);
+                    paymentMap.setRefundTime(DateUtils.getNowDate());
+                    paymentMap.setRefundMoney(payment.getPayMoney());
+                    fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+                } else {
+                    throw new CustomException("退款请求失败" + result.getRetMsg());
+                }
+            } else if (payment.getPayMode().equals("hf")) {
+                if (payment.getIsShare() == 1 && payment.getShareStatus() == 1) {
+                    V2TradePaymentDelaytransConfirmrefundRequest confirmRefundRequest = new V2TradePaymentDelaytransConfirmrefundRequest();
+                    //Map<String, Object> extendInfoMap = new HashMap<>();
+                    String orderCode = OrderCodeUtils.getOrderSn();
+                    if (StringUtils.isEmpty(orderCode)) {
+                        throw new CustomException("订单生成失败,请重试");
+                    }
+                    confirmRefundRequest.setReqSeqId(orderCode);
+                    confirmRefundRequest.setOrgReqSeqId(payment.getShareCode());
+//                    confirmRefundRequest.setOrgReqDate(payment.getShareDate());
+                    //多汇付使用appID todo
+//                    HuifuConfirmrefundResult result = huiFuService.confirmRefund(confirmRefundRequest, null);
+//                    if (result.getResp_code().equals("00000000") && (result.getTrans_stat().equals("S") || result.getTrans_stat().equals("P"))) {
+//                        refund(payment, orderType, orderId);
+//                    } else {
+//                        throw new CustomException("交易确认退款请求失败" + result.getResp_desc());
+//                    }
+                } else {
+                    refund(payment, orderType, orderId);
+                }
+            }
+        } else {
+            throw new CustomException("未找的支付明细");
+        }
+
+
+    }
+    private void refund(FsStorePayment payment, String orderType, Long orderId) {
+        V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
+        request.setOrdAmt(payment.getPayMoney().toString());
+        request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
+        request.setReqSeqId("refund-" + payment.getPayCode());
+        Map<String, Object> extendInfoMap = new HashMap<>();
+        extendInfoMap.put("org_req_seq_id", orderType + "-" + payment.getPayCode());
+        request.setExtendInfo(extendInfoMap);
+        HuiFuRefundResult refund = huiFuService.refund(request);
+        logger.info("订单退款返回结果:退款订单id:" + orderId + refund);
+        if ((refund.getResp_code().equals("00000000") || refund.getResp_code().equals("00000100")) && (refund.getTrans_stat().equals("S") || refund.getTrans_stat().equals("P"))) {
+            FsStorePayment paymentMap = new FsStorePayment();
+            paymentMap.setPaymentId(payment.getPaymentId());
+            paymentMap.setStatus(-1);
+            paymentMap.setRefundTime(DateUtils.getNowDate());
+            paymentMap.setRefundMoney(payment.getPayMoney());
+            fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+        } else {
+            throw new CustomException("退款请求失败" + refund.getResp_desc());
+        }
+    }
+    @Override
+    public FsUserInformationCollectionVO getCollectionByUserId(Long userId) {
+        FsUserInformationCollectionVO vo = new FsUserInformationCollectionVO();
+        FsUserInformationCollection collection = fsUserInformationCollectionMapper.selectFsUserInformationCollectionByUserId(userId);
+        if (collection != null) {
+            vo.setAnswers(JSON.parseArray(collection.getJsonInfo(), AnswerVO.class));
+            //医生建议
+            if (collection.getDoctorAdvice() != null){
+                vo.setDoctorAdvice(collection.getDoctorAdvice());
+            }
+        }
+        return vo;
+    }
+
+    private List<AnswerVO> getAnswerVOs(List<AnswerVO> target,List<AnswerVO> source) {
+        target.addAll(source);
+        return target.stream()
+                .collect(Collectors.groupingBy(AnswerVO::getTitle))
+                .values().stream()
+                .map(group -> group.stream().reduce((a, b) -> a).orElse(null))
+                .collect(Collectors.toList());
+    }
+
+    private FsUserInformationCollection getFsUserInformationCollection(FsUserInformationCollectionParam param) {
+        FsUserInformationCollection fsUserInformationCollection = new FsUserInformationCollection();
+        if (!CollectionUtils.isEmpty(param.getAnswers())) {
+            param.getAnswers().forEach(answer -> {
+                if (answer.getFlag() == null) {
+                    answer.setFlag(false);
+                }
+            });
+        }
+        fsUserInformationCollection.setJsonInfo(JSON.toJSONString(param.getAnswers()));
+        fsUserInformationCollection.setUserId(param.getUserId());
+        fsUserInformationCollection.setCompanyUserId(param.getCompanyUserId());
+        fsUserInformationCollection.setQuestionId(param.getQuestionId());
+        fsUserInformationCollection.setId(param.getId());
+        fsUserInformationCollection.setPackageId(param.getPackageId());
+        fsUserInformationCollection.setPayType(param.getPayType());
+        fsUserInformationCollection.setAmount(param.getAmount());
+        fsUserInformationCollection.setIsPackage(param.getIsPackage());
+        fsUserInformationCollection.setUserName(param.getUserName());
+        fsUserInformationCollection.setUserPhoneFour(param.getUserPhoneFour());
+        fsUserInformationCollection.setSex(param.getSex());
+        fsUserInformationCollection.setAllergy(param.getAllergy());
+        fsUserInformationCollection.setRemark(param.getRemark());
+        //获取医生信息
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
+        if (companyUser == null) {
+            throw new CustomException("销售不存在");
+        }
+        Long doctorId = null;
+        if (companyUser.getDoctorId() != null) {
+            FsDoctor doctor = doctorMapper.selectFsDoctorByDoctorId(companyUser.getDoctorId());
+            if (doctor != null) {
+                doctorId = doctor.getDoctorId();
+            }
+        } else {
+            //随机获取医生id
+            doctorId = iFsDoctorService.selectFsDoctorDoctorByPackage();
+        }
+        fsUserInformationCollection.setDoctorId(doctorId);
+
+        return fsUserInformationCollection;
+    }
+
+    public static void main(String[] args) {
+//        String str1 = "[{\"options\":[{\"flag\":false,\"name\":\"通天\",\"value\":0},{\"flag\":false,\"name\":\"哈哈\",\"value\":1}],\"title\":\"测试标题1\",\"value\":1},{\"options\":[{\"flag\":false,\"name\":\"呼呼\",\"value\":0},{\"flag\":false,\"name\":\"嘻嘻\",\"value\":1}],\"title\":\"测试标题2\",\"value\":1},{\"options\":[{\"flag\":false,\"name\":\"胸痛\",\"value\":0},{\"flag\":false,\"name\":\"胸闷\",\"value\":1},{\"flag\":false,\"name\":\"头晕\",\"value\":2},{\"flag\":false,\"name\":\"肢体麻木\",\"value\":3},{\"flag\":false,\"name\":\"无\",\"value\":4}],\"title\":\"您目前是否有心脑血管相关症状,如胸痛、胸闷、头晕、肢体麻木等?\",\"value\":1}]";
+//        String str2 = "[{\"options\":[{\"flag\":true,\"name\":\"胸痛\",\"value\":0},{\"flag\":true,\"name\":\"胸闷\",\"value\":1},{\"flag\":true,\"name\":\"头晕\",\"value\":2},{\"flag\":true,\"name\":\"肢体麻木\",\"value\":3},{\"flag\":true,\"name\":\"无\",\"value\":4}],\"title\":\"您目前是否有心脑血管相关症状,如胸痛、胸闷、头晕、肢体麻木等?\",\"value\":1},{\"options\":[{\"flag\":false,\"name\":\"胃疼\",\"value\":0},{\"flag\":false,\"name\":\"反酸\",\"value\":1},{\"flag\":false,\"name\":\"恶心\",\"value\":2},{\"flag\":false,\"name\":\"呕吐\",\"value\":3},{\"flag\":false,\"name\":\"黑便\",\"value\":4},{\"flag\":false,\"name\":\"无\",\"value\":5}],\"title\":\"您近期是否出现胃部不适症状,如胃痛、反酸、恶心、呕吐或黑便?\",\"value\":1}]";
+//        List<AnswerVO> vo1 = null;
+//        List<AnswerVO> vo2 = JSON.parseArray(str2, AnswerVO.class);
+//        System.out.println(vo1);
+//        System.out.println(vo2);
+//        vo2.addAll(vo1);
+//        Map<String, List<AnswerVO>> collect = vo2.stream()
+//                .collect(Collectors.groupingBy(AnswerVO::getTitle));
+//        List<AnswerVO> collect1 = vo2.stream()
+//                .collect(Collectors.groupingBy(AnswerVO::getTitle))
+//                .values().stream()
+//                .map(group -> group.stream().reduce((a, b) -> a).orElse(null)).collect(Collectors.toList());
+//        System.out.println(JSON.toJSONString(collect));
+//        System.out.println(JSON.toJSONString(collect1));
+        boolean contains = "是否有糖尿病相关疾病?".contains("糖尿病");
+    }
+}

+ 32 - 0
fs-service/src/main/java/com/fs/his/vo/AnswerVO.java

@@ -0,0 +1,32 @@
+package com.fs.his.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class AnswerVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String title;
+
+    private List<Options> options;
+
+    //已选择数据(多选)
+    private List<Integer> value;
+
+    //排序
+    private Integer sort;
+    //private Integer value;
+
+
+    //是否医生已确认
+    private Boolean flag;
+
+   @Data
+    public static class Options implements Serializable{
+        private String name;
+        private Integer value;
+    }
+}

+ 15 - 0
fs-service/src/main/java/com/fs/his/vo/FsQuestionAndAnswerVO.java

@@ -0,0 +1,15 @@
+package com.fs.his.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FsQuestionAndAnswerVO {
+
+    private Long id;
+
+    private String questionName;
+
+    private List<AnswerVO> answers;
+}

+ 79 - 0
fs-service/src/main/java/com/fs/his/vo/FsUserInfoCollectionUVO.java

@@ -0,0 +1,79 @@
+package com.fs.his.vo;
+
+import com.fs.his.domain.FsDoctor;
+import com.fs.his.domain.FsPackage;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class FsUserInfoCollectionUVO {
+    private Long id;
+
+    //套餐包id
+    private Long packageId;
+
+    //支付类型 0-全款 1-物流代收
+    private Integer payType;
+
+    //代收金额
+    private BigDecimal amount;
+
+    private List<AnswerVO> answers;
+
+    //是否关联套餐包 0-不关联 1-关联
+    private Integer isPackage;
+
+    //确认状态 1第一次确认 2第二次确认
+    private Integer status;
+
+    private Integer doctorConfirm;
+
+    private Integer userConfirm;
+
+    private Integer userConfirm2;
+
+    private FsPackage fsPackage;
+
+    //销售id
+    private Long companyUserId;
+
+    //销售公司id
+    private Long companyId;
+
+    //套餐包订单号
+    private String packageOrderCode;
+
+    //订单状态 0-待支付 1-待发货 2-待收货 3-已完成 4-已取消
+    private Integer orderStatus;
+
+    private Long orderId;
+
+    private String userAdvice;
+
+    private String doctorAdvice;
+
+
+    private String patientJson;
+
+    //处方图片
+    private String prescribeImgUrl;
+
+    private FsDoctor doctor;
+
+    //处方审核状态 0待审核 1通过 2拒绝
+    private Integer prescribeStatus;
+
+    //是否过敏
+    private String allergy;
+    //备注
+    private String remark;
+
+    //用户性别 0女 1男
+    private Integer sex;
+    //用户姓名
+    private String userName;
+    //用户电话后四位
+    private String userPhoneFour;
+}

+ 23 - 0
fs-service/src/main/java/com/fs/his/vo/FsUserInformationCollectionListDVO.java

@@ -0,0 +1,23 @@
+package com.fs.his.vo;
+
+import lombok.Data;
+
+@Data
+public class FsUserInformationCollectionListDVO {
+
+    private Long id;
+
+    //用户信息
+    private String userName;
+
+    //医生确认状态 0未确认 1已确认
+    private Integer doctorConfirm;
+
+
+    private Integer userConfirm;
+
+    //用户补充说明
+    private String userAdvice;
+
+    private String doctorAdvice;
+}

+ 47 - 0
fs-service/src/main/java/com/fs/his/vo/FsUserInformationCollectionVO.java

@@ -0,0 +1,47 @@
+package com.fs.his.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class FsUserInformationCollectionVO {
+
+    private Long id;
+
+    private Long questionId;
+
+    //套餐包id
+    private Long packageId;
+
+    //支付类型 0-全款 1-物流代收
+    private Integer payType;
+
+    //代收金额
+    private BigDecimal amount;
+
+    private List<AnswerVO> answers;
+
+    //是否关联套餐包 0-不关联 1-关联
+    private Integer isPackage;
+
+    //用户性别 0女 1男
+    private Integer sex;
+    //用户姓名
+    private String userName;
+    //用户电话后四位
+    private String userPhoneFour;
+
+    //是否过敏
+    private String allergy;
+
+    //备注
+    private String remark;
+
+    //医生建议
+    private String doctorAdvice;
+
+    private Long patientId;
+
+}

+ 85 - 0
fs-service/src/main/resources/mapper/his/DoctorMsgMapper.xml

@@ -0,0 +1,85 @@
+<?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.doctor.mapper.DoctorMsgMapper">
+
+    <resultMap type="DoctorMsg" id="DoctorMsgResult">
+        <result property="id"    column="id"    />
+        <result property="type"    column="type"    />
+        <result property="title"    column="title"    />
+        <result property="content"    column="content"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="isRead"    column="is_read"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="doctorId"    column="doctor_id"    />
+    </resultMap>
+
+    <sql id="selectDoctorMsgVo">
+        select id, type, title, content, create_time, is_read, update_time, doctor_id from doctor_msg
+    </sql>
+
+    <select id="selectDoctorMsgList" parameterType="DoctorMsg" resultMap="DoctorMsgResult">
+        <include refid="selectDoctorMsgVo"/>
+        <where>
+            <if test="type != null "> and type = #{type}</if>
+            <if test="title != null  and title != ''"> and title = #{title}</if>
+            <if test="content != null  and content != ''"> and content = #{content}</if>
+            <if test="isRead != null "> and is_read = #{isRead}</if>
+            <if test="doctorId != null "> and doctor_id = #{doctorId}</if>
+        </where>
+        order by is_read asc, id desc
+    </select>
+
+    <select id="selectDoctorMsgById" parameterType="Long" resultMap="DoctorMsgResult">
+        <include refid="selectDoctorMsgVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertDoctorMsg" parameterType="DoctorMsg" useGeneratedKeys="true" keyProperty="id">
+        insert into doctor_msg
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="type != null">type,</if>
+            <if test="title != null">title,</if>
+            <if test="content != null">content,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="isRead != null">is_read,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="doctorId != null">doctor_id,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="type != null">#{type},</if>
+            <if test="title != null">#{title},</if>
+            <if test="content != null">#{content},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="isRead != null">#{isRead},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="doctorId != null">#{doctorId},</if>
+         </trim>
+    </insert>
+
+    <update id="updateDoctorMsg" parameterType="DoctorMsg">
+        update doctor_msg
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="type != null">type = #{type},</if>
+            <if test="title != null">title = #{title},</if>
+            <if test="content != null">content = #{content},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="isRead != null">is_read = #{isRead},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="doctorId != null">doctor_id = #{doctorId},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteDoctorMsgById" parameterType="Long">
+        delete from doctor_msg where id = #{id}
+    </delete>
+
+    <delete id="deleteDoctorMsgByIds" parameterType="String">
+        delete from doctor_msg where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 84 - 0
fs-service/src/main/resources/mapper/his/FsDoctorConfirmMapper.xml

@@ -0,0 +1,84 @@
+<?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.his.mapper.FsDoctorConfirmMapper">
+
+    <resultMap type="FsDoctorConfirm" id="FsDoctorConfirmResult">
+        <result property="id"    column="id"    />
+        <result property="collectionId"    column="collection_id"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="doctorEndTime"    column="doctor_end_time"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="doctorId"    column="doctor_id"    />
+        <result property="confirmSecond"    column="confirm_second"    />
+    </resultMap>
+
+    <sql id="selectFsDoctorConfirmVo">
+        select id, collection_id, start_time, doctor_end_time, create_time, update_time, doctor_id, confirm_second from fs_doctor_confirm
+    </sql>
+
+    <select id="selectFsDoctorConfirmList" parameterType="FsDoctorConfirm" resultMap="FsDoctorConfirmResult">
+        <include refid="selectFsDoctorConfirmVo"/>
+        <where>
+            <if test="collectionId != null "> and collection_id = #{collectionId}</if>
+            <if test="startTime != null "> and start_time = #{startTime}</if>
+            <if test="endTime != null "> and end_time = #{endTime}</if>
+            <if test="doctorId != null "> and doctor_id = #{doctorId}</if>
+            <if test="confirmSecond != null "> and confirm_second = #{confirmSecond}</if>
+        </where>
+    </select>
+
+    <select id="selectFsDoctorConfirmById" parameterType="Long" resultMap="FsDoctorConfirmResult">
+        <include refid="selectFsDoctorConfirmVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertFsDoctorConfirm" parameterType="FsDoctorConfirm" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_doctor_confirm
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="collectionId != null">collection_id,</if>
+            <if test="startTime != null">start_time,</if>
+            <if test="doctorEndTime != null">doctor_end_time,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="doctorId != null">doctor_id,</if>
+            <if test="confirmSecond != null">confirm_second,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="collectionId != null">#{collectionId},</if>
+            <if test="startTime != null">#{startTime},</if>
+            <if test="doctorEndTime != null">#{doctorEndTime},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="doctorId != null">#{doctorId},</if>
+            <if test="confirmSecond != null">#{confirmSecond},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsDoctorConfirm" parameterType="FsDoctorConfirm">
+        update fs_doctor_confirm
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="collectionId != null">collection_id = #{collectionId},</if>
+            <if test="startTime != null">start_time = #{startTime},</if>
+            <if test="doctorEndTime != null">doctor_end_time = #{doctorEndTime},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="doctorId != null">doctor_id = #{doctorId},</if>
+            <if test="confirmSecond != null">confirm_second = #{confirmSecond},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsDoctorConfirmById" parameterType="Long">
+        delete from fs_doctor_confirm where id = #{id}
+    </delete>
+
+    <delete id="deleteFsDoctorConfirmByIds" parameterType="String">
+        delete from fs_doctor_confirm where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 70 - 0
fs-service/src/main/resources/mapper/his/FsQuestionAndAnswerMapper.xml

@@ -0,0 +1,70 @@
+<?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.his.mapper.FsQuestionAndAnswerMapper">
+
+    <resultMap type="FsQuestionAndAnswer" id="FsQuestionAndAnswerResult">
+        <result property="id"    column="id"    />
+        <result property="jsonInfo"    column="json_info"    />
+        <result property="questionName"    column="question_name"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectFsQuestionAndAnswerVo">
+        select id,question_name ,json_info, create_time, update_time from fs_question_and_answer
+    </sql>
+
+    <select id="selectFsQuestionAndAnswerList" parameterType="FsQuestionAndAnswer" resultMap="FsQuestionAndAnswerResult">
+        <include refid="selectFsQuestionAndAnswerVo"/>
+        <where>
+            <if test="jsonInfo != null  and jsonInfo != ''"> and json_info = #{jsonInfo}</if>
+        </where>
+    </select>
+
+    <select id="selectFsQuestionAndAnswerById" parameterType="Long" resultMap="FsQuestionAndAnswerResult">
+        <include refid="selectFsQuestionAndAnswerVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertFsQuestionAndAnswer" parameterType="FsQuestionAndAnswer">
+        insert into fs_question_and_answer
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="jsonInfo != null">json_info,</if>
+            <if test="questionName != null">question_name,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="jsonInfo != null">#{jsonInfo},</if>
+            <if test="questionName != null">#{questionName},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsQuestionAndAnswer" parameterType="FsQuestionAndAnswer">
+        update fs_question_and_answer
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="jsonInfo != null">json_info = #{jsonInfo},</if>
+            <if test="questionName != null">question_name = #{questionName},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsQuestionAndAnswerById" parameterType="Long">
+        delete from fs_question_and_answer where id = #{id}
+    </delete>
+
+    <delete id="deleteFsQuestionAndAnswerByIds" parameterType="String">
+        delete from fs_question_and_answer where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 175 - 0
fs-service/src/main/resources/mapper/his/FsUserInformationCollectionMapper.xml

@@ -0,0 +1,175 @@
+<?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.his.mapper.FsUserInformationCollectionMapper">
+
+    <resultMap type="FsUserInformationCollection" id="FsUserInformationCollectionResult">
+        <result property="id"    column="id"    />
+        <result property="questionId"    column="question_id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="jsonInfo"    column="json_info"    />
+        <result property="userConfirm"    column="user_confirm"    />
+        <result property="doctorConfirm"    column="doctor_confirm"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="doctorId"    column="doctor_id"    />
+        <result property="companyUserId"    column="company_user_id"    />
+        <result property="packageId"    column="package_id"    />
+        <result property="payType"    column="pay_type"    />
+        <result property="amount"    column="amount"    />
+        <result property="isPackage"    column="is_package"    />
+        <result property="userConfirm2"    column="user_confirm2"    />
+        <result property="packageOrderCode"    column="package_order_code"    />
+        <result property="status"    column="status"    />
+        <result property="userAdvice"    column="user_advice"    />
+        <result property="doctorAdvice"    column="doctor_advice"    />
+        <result property="doctorConfirmTime"    column="doctor_confirm_time"    />
+        <result property="sex"    column="sex"    />
+        <result property="userName"    column="user_name"    />
+        <result property="userPhoneFour"    column="user_phone_four"    />
+        <result property="allergy"    column="allergy"    />
+        <result property="remark"    column="remark"    />
+        <result property="patientId"    column="patient_id"    />
+    </resultMap>
+
+    <sql id="selectFsUserInformationCollectionVo">
+        select id, question_id, user_id, json_info, user_confirm
+             , doctor_confirm, create_time, update_time,doctor_id,company_user_id
+             ,package_id,pay_type,amount,is_package,user_confirm2,package_order_code
+             ,status,user_advice,doctor_advice,doctor_confirm_time,sex,user_name,user_phone_four
+             ,allergy,remark,patient_id  from fs_user_information_collection
+    </sql>
+
+    <select id="selectFsUserInformationCollectionList" parameterType="FsUserInformationCollection" resultMap="FsUserInformationCollectionResult">
+        <include refid="selectFsUserInformationCollectionVo"/>
+        <where>
+            <if test="questionId != null "> and question_id = #{questionId}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="jsonInfo != null  and jsonInfo != ''"> and json_info = #{jsonInfo}</if>
+            <if test="userConfirm != null "> and user_confirm = #{userConfirm}</if>
+            <if test="doctorConfirm != null "> and doctor_confirm = #{doctorConfirm}</if>
+        </where>
+    </select>
+
+    <select id="selectFsUserInformationCollectionById" parameterType="Long" resultMap="FsUserInformationCollectionResult">
+        <include refid="selectFsUserInformationCollectionVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectFsUserInformationCollectionByUserId" parameterType="Long" resultMap="FsUserInformationCollectionResult">
+        <include refid="selectFsUserInformationCollectionVo"/>
+        where user_id = #{userId}
+    </select>
+
+    <select id="selectByUserId" parameterType="Long" resultMap="FsUserInformationCollectionResult">
+        <include refid="selectFsUserInformationCollectionVo"/>
+        where user_id = #{userId}
+    </select>
+
+    <select id="selectByOrderCode" parameterType="String" resultMap="FsUserInformationCollectionResult">
+        <include refid="selectFsUserInformationCollectionVo"/>
+        where package_order_code = #{orderCode}
+    </select>
+
+    <insert id="insertFsUserInformationCollection" parameterType="FsUserInformationCollection" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_user_information_collection
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="questionId != null">question_id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="jsonInfo != null">json_info,</if>
+            <if test="userConfirm != null">user_confirm,</if>
+            <if test="doctorConfirm != null">doctor_confirm,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="doctorId != null">doctor_id,</if>
+            <if test="companyUserId != null">company_user_id,</if>
+            <if test="packageId != null">package_id,</if>
+            <if test="payType != null">pay_type,</if>
+            <if test="amount != null">amount,</if>
+            <if test="userAdvice != null">user_advice,</if>
+            <if test="doctorAdvice != null">doctor_advice,</if>
+            <if test="isPackage != null">is_package,</if>
+            <if test="userConfirm2 != null">user_confirm2,</if>
+            <if test="packageOrderCode != null">package_order_code,</if>
+            <if test="status != null">status,</if>
+            <if test="doctorConfirmTime != null">doctor_confirm_time,</if>
+            <if test="userPhoneFour != null">user_phone_four,</if>
+            <if test="userName != null">user_name,</if>
+            <if test="sex != null">sex,</if>
+            <if test="allergy != null">allergy,</if>
+            <if test="remark != null">remark,</if>
+            <if test="patientId != null">patient_id,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="questionId != null">#{questionId},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="jsonInfo != null">#{jsonInfo},</if>
+            <if test="userConfirm != null">#{userConfirm},</if>
+            <if test="doctorConfirm != null">#{doctorConfirm},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="doctorId != null">#{doctorId},</if>
+            <if test="companyUserId != null">#{companyUserId},</if>
+            <if test="packageId != null">#{packageId},</if>
+            <if test="payType != null">#{payType},</if>
+            <if test="amount != null">#{amount},</if>
+            <if test="userAdvice != null">#{userAdvice},</if>
+            <if test="doctorAdvice != null">#{doctorAdvice},</if>
+            <if test="isPackage != null">#{isPackage},</if>
+            <if test="userConfirm2 != null">#{userConfirm2},</if>
+            <if test="packageOrderCode != null">#{packageOrderCode},</if>
+            <if test="status != null">#{status},</if>
+            <if test="doctorConfirmTime != null">#{doctorConfirmTime},</if>
+            <if test="sex != null">#{sex},</if>
+            <if test="userName != null">#{userName},</if>
+            <if test="userPhoneFour != null">#{userPhoneFour},</if>
+            <if test="allergy != null">#{allergy},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="patientId != null">#{patientId},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsUserInformationCollection" parameterType="FsUserInformationCollection">
+        update fs_user_information_collection
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="questionId != null">question_id = #{questionId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="jsonInfo != null">json_info = #{jsonInfo},</if>
+            <if test="userConfirm != null">user_confirm = #{userConfirm},</if>
+            <if test="doctorConfirm != null">doctor_confirm = #{doctorConfirm},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="doctorId != null">doctor_id = #{doctorId},</if>
+            <if test="companyUserId != null">company_user_id = #{companyUserId},</if>
+            <if test="packageId != null">package_id = #{packageId},</if>
+            <if test="payType != null">pay_type = #{payType},</if>
+            <if test="amount != null">amount = #{amount},</if>
+            <if test="userAdvice != null">user_advice = #{userAdvice},</if>
+            <if test="doctorAdvice != null">doctor_advice = #{doctorAdvice},</if>
+            <if test="userConfirm2 != null">user_confirm2 = #{userConfirm2},</if>
+            <if test="isPackage != null">is_package = #{isPackage},</if>
+            <if test="packageOrderCode != null">package_order_code = #{packageOrderCode},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="doctorConfirmTime != null">doctor_confirm_time = #{doctorConfirmTime},</if>
+            <if test="sex != null">sex = #{sex},</if>
+            <if test="userName != null">user_name = #{userName},</if>
+            <if test="userPhoneFour != null">user_phone_four = #{userPhoneFour},</if>
+            <if test="allergy != null">allergy = #{allergy},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="patientId != null">patient_id = #{patientId},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsUserInformationCollectionById" parameterType="Long">
+        delete from fs_user_information_collection where id = #{id}
+    </delete>
+
+    <delete id="deleteFsUserInformationCollectionByIds" parameterType="String">
+        delete from fs_user_information_collection where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 224 - 0
fs-service/src/main/resources/mapper/his/FsUserInformationCollectionScheduleMapper.xml

@@ -0,0 +1,224 @@
+<?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.his.mapper.FsUserInformationCollectionScheduleMapper">
+
+    <resultMap type="FsUserInformationCollectionSchedule" id="FsUserInformationCollectionScheduleResult">
+        <result property="id"    column="id"    />
+        <result property="collectionId"    column="collection_id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="doctorId"    column="doctor_id"    />
+        <result property="packageId"    column="package_id"    />
+        <result property="packageName"    column="package_name"    />
+        <result property="currentStep"    column="current_step"    />
+        <result property="status"    column="status"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="completedTime"    column="completed_time"    />
+        <result property="terminatedTime"    column="terminated_time"    />
+        <result property="terminatedBy"    column="terminated_by"    />
+        <result property="remark"    column="remark"    />
+        <result property="orderCode"    column="order_code"    />
+    </resultMap>
+
+    <sql id="selectFsUserInformationCollectionScheduleVo">
+        select id, collection_id, user_id, doctor_id, package_id, package_name, current_step, status, create_time, completed_time, terminated_time, terminated_by, remark,order_code from fs_user_information_collection_schedule
+    </sql>
+
+    <select id="selectFsUserInformationCollectionScheduleList" parameterType="FsUserInformationCollectionSchedule" resultMap="FsUserInformationCollectionScheduleResult">
+        SELECT
+        s.id,
+        s.collection_id,
+        s.user_id,
+        c.user_name,
+        s.doctor_id,
+        d.doctor_name,
+        s.package_id,
+        s.package_name,
+        s.current_step,
+        s.status,
+        s.create_time,
+        s.completed_time,
+        s.terminated_time,
+        s.terminated_by,
+        s.remark,
+        s.order_code
+        FROM
+        fs_user_information_collection_schedule s
+        LEFT JOIN fs_user_information_collection c ON s.collection_id = c.id
+        LEFT JOIN fs_doctor d ON s.doctor_id = d.doctor_id
+        <where>
+            <if test="collectionId != null "> and s.collection_id = #{collectionId}</if>
+            <if test="userId != null "> and s.user_id = #{userId}</if>
+            <if test="userName != null and userName != ''"> AND c.user_name LIKE CONCAT('%', #{userName}, '%')</if>
+            <if test="doctorId != null"> AND s.doctor_id = #{doctorId}</if>
+            <if test="doctorName != null and doctorName != ''"> AND d.doctor_name LIKE CONCAT('%', #{doctorName}, '%')</if>
+            <if test="packageId != null "> and s.package_id = #{packageId}</if>
+            <if test="packageName != null  and packageName != ''"> and s.package_name like concat('%', #{packageName}, '%')</if>
+            <if test="currentStep != null "> and s.current_step = #{currentStep}</if>
+            <if test="status != null "> and s.status = #{status}</if>
+            <if test="completedTime != null "> and s.completed_time = #{completedTime}</if>
+            <if test="terminatedTime != null "> and s.terminated_time = #{terminatedTime}</if>
+            <if test="terminatedBy != null  and terminatedBy != ''"> and s.terminated_by = #{terminatedBy}</if>
+            <if test="orderCode != null and orderCode != ''"> AND s.order_code = #{orderCode}</if>
+        </where>
+    </select>
+
+    <select id="getUserRecordLatestTaskProcess"
+            parameterType="FsUserInformationCollectionSchedule"
+            resultMap="FsUserInformationCollectionScheduleResult">
+        SELECT
+        s.id,
+        s.collection_id,
+        s.user_id,
+        c.user_name,
+        s.doctor_id,
+        d.doctor_name,
+        s.package_id,
+        s.package_name,
+        s.current_step,
+        s.status,
+        s.create_time,
+        s.completed_time,
+        s.terminated_time,
+        s.terminated_by,
+        s.remark,
+        s.order_code
+        FROM
+        fs_user_information_collection_schedule s
+        LEFT JOIN fs_user_information_collection c ON s.collection_id = c.id
+        LEFT JOIN fs_doctor d ON s.doctor_id = d.doctor_id
+        <where>
+            <!-- 动态过滤条件 -->
+            <if test="collectionId != null"> AND s.collection_id = #{collectionId}</if>
+            <if test="userId != null"> AND s.user_id = #{userId}</if>
+            <if test="userName != null and userName != ''"> AND c.user_name LIKE CONCAT('%', #{userName}, '%')</if>
+            <if test="doctorId != null"> AND s.doctor_id = #{doctorId}</if>
+            <if test="doctorName != null and doctorName != ''"> AND d.doctor_name LIKE CONCAT('%', #{doctorName}, '%')</if>
+            <if test="packageId != null"> AND s.package_id = #{packageId}</if>
+            <if test="packageName != null and packageName != ''"> AND s.package_name LIKE CONCAT('%', #{packageName}, '%')</if>
+            <if test="currentStep != null"> AND s.current_step = #{currentStep}</if>
+            <if test="status != null"> AND s.status = #{status}</if>
+            <if test="completedTime != null"> AND s.completed_time = #{completedTime}</if>
+            <if test="terminatedTime != null"> AND s.terminated_time = #{terminatedTime}</if>
+            <if test="terminatedBy != null and terminatedBy != ''"> AND s.terminated_by = #{terminatedBy}</if>
+            <if test="orderCode != null and orderCode != ''"> AND s.order_code = #{orderCode}</if>
+            AND s.id = (
+            SELECT MAX(s2.id)
+            FROM fs_user_information_collection_schedule s2
+            WHERE s2.collection_id = s.collection_id
+            <if test="collectionId != null"> AND s2.collection_id = #{collectionId}</if>
+            <if test="userId != null"> AND s2.user_id = #{userId}</if>
+            <if test="userName != null and userName != ''"> AND c.user_name LIKE CONCAT('%', #{userName}, '%')</if>
+            <if test="doctorId != null"> AND s2.doctor_id = #{doctorId}</if>
+            <if test="doctorName != null and doctorName != ''"> AND d.doctor_name LIKE CONCAT('%', #{doctorName}, '%')</if>
+            <if test="packageId != null"> AND s2.package_id = #{packageId}</if>
+            <if test="packageName != null and packageName != ''"> AND s2.package_name LIKE CONCAT('%', #{packageName}, '%')</if>
+            <if test="currentStep != null"> AND s2.current_step = #{currentStep}</if>
+            <if test="status != null"> AND s2.status = #{status}</if>
+            <if test="completedTime != null"> AND s2.completed_time = #{completedTime}</if>
+            <if test="terminatedTime != null"> AND s2.terminated_time = #{terminatedTime}</if>
+            <if test="terminatedBy != null and terminatedBy != ''"> AND s2.terminated_by = #{terminatedBy}</if>
+            <if test="orderCode != null and orderCode != ''"> AND s2.order_code = #{orderCode}</if>
+            )
+        </where>
+    </select>
+
+    <select id="selectFsUserInformationCollectionScheduleById" parameterType="Long" resultMap="FsUserInformationCollectionScheduleResult">
+        <include refid="selectFsUserInformationCollectionScheduleVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectCollectionScheduleByCollectionId" parameterType="Long" resultMap="FsUserInformationCollectionScheduleResult">
+        SELECT
+            id, collection_id, user_id, doctor_id,
+            package_id, package_name, current_step, status, create_time,
+            completed_time, terminated_time, terminated_by, remark,order_code
+        FROM fs_user_information_collection_schedule
+        WHERE collection_id = #{collectionId}
+        ORDER BY id DESC
+            LIMIT 1
+    </select>
+    <select id="selectFsUserInformationCollectionByOrderCode" parameterType="String" resultMap="FsUserInformationCollectionScheduleResult">
+        <include refid="selectFsUserInformationCollectionScheduleVo"/>
+        where order_code = #{orderCode}
+    </select>
+
+    <select id="selectCollectionScheduleRunningByCollectionId" parameterType="Long" resultMap="FsUserInformationCollectionScheduleResult">
+        SELECT
+            id, collection_id, user_id, doctor_id,
+            package_id, package_name, current_step, status, create_time,
+            completed_time, terminated_time, terminated_by, remark,order_code
+        FROM fs_user_information_collection_schedule
+        WHERE collection_id = #{collectionId}
+          AND status = 1
+        ORDER BY id DESC
+            LIMIT 1
+    </select>
+
+
+    <insert id="insertFsUserInformationCollectionSchedule" parameterType="FsUserInformationCollectionSchedule" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_user_information_collection_schedule
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="collectionId != null">collection_id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="doctorId != null">doctor_id,</if>
+            <if test="packageId != null">package_id,</if>
+            <if test="packageName != null">package_name,</if>
+            <if test="currentStep != null">current_step,</if>
+            <if test="status != null">status,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="completedTime != null">completed_time,</if>
+            <if test="terminatedTime != null">terminated_time,</if>
+            <if test="terminatedBy != null">terminated_by,</if>
+            <if test="remark != null">remark,</if>
+            <if test="orderCode != null">order_code,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="collectionId != null">#{collectionId},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="doctorId != null">#{doctorId},</if>
+            <if test="packageId != null">#{packageId},</if>
+            <if test="packageName != null">#{packageName},</if>
+            <if test="currentStep != null">#{currentStep},</if>
+            <if test="status != null">#{status},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="completedTime != null">#{completedTime},</if>
+            <if test="terminatedTime != null">#{terminatedTime},</if>
+            <if test="terminatedBy != null">#{terminatedBy},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="orderCode != null">#{orderCode},</if>
+        </trim>
+    </insert>
+
+    <update id="updateFsUserInformationCollectionSchedule" parameterType="FsUserInformationCollectionSchedule">
+        update fs_user_information_collection_schedule
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="collectionId != null">collection_id = #{collectionId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="doctorId != null">doctor_id = #{doctorId},</if>
+            <if test="packageId != null">package_id = #{packageId},</if>
+            <if test="packageName != null">package_name = #{packageName},</if>
+            <if test="currentStep != null">current_step = #{currentStep},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="completedTime != null">completed_time = #{completedTime},</if>
+            <if test="terminatedTime != null">terminated_time = #{terminatedTime},</if>
+            <if test="terminatedBy != null">terminated_by = #{terminatedBy},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="orderCode != null">order_code = #{orderCode},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsUserInformationCollectionScheduleById" parameterType="Long">
+        delete from fs_user_information_collection_schedule where id = #{id}
+    </delete>
+
+    <delete id="deleteFsUserInformationCollectionScheduleByIds" parameterType="String">
+        delete from fs_user_information_collection_schedule where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 100 - 0
fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -10,6 +10,7 @@ import com.fs.app.annotation.Login;
 import com.fs.app.param.FsBindCompanyUserParam;
 import com.fs.common.annotation.Log;
 import com.fs.common.config.FSConfig;
+import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.redis.RedisCache;
@@ -17,6 +18,7 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.exception.CustomException;
 import com.fs.common.exception.file.OssException;
 import com.fs.common.utils.SecurityUtils;
+import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.domain.CompanyUserCard;
@@ -32,11 +34,15 @@ import com.fs.fastGpt.domain.FastgptChatVoiceHomo;
 import com.fs.fastGpt.mapper.FastgptChatVoiceHomoMapper;
 import com.fs.fastgptApi.util.AudioUtils;
 import com.fs.fastgptApi.vo.AudioVO;
+import com.fs.his.domain.FsUserInformationCollection;
 import com.fs.his.param.*;
 import com.fs.his.service.IFsPrescribeService;
+import com.fs.his.service.IFsQuestionAndAnswerService;
+import com.fs.his.service.IFsUserInformationCollectionService;
 import com.fs.his.vo.FsPrescribeListDVO;
 import com.fs.his.vo.FsPrescribeListUVO;
 import com.fs.his.vo.FsPrescribeListVO;
+import com.fs.his.vo.OptionsVO;
 import com.fs.sop.domain.QwSopTempVoice;
 import com.fs.sop.service.IQwSopTempVoiceService;
 import com.fs.system.oss.CloudStorageService;
@@ -54,6 +60,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.commons.CommonsMultipartFile;
@@ -87,6 +94,10 @@ public class CompanyUserController extends  AppBaseController {
     private FastgptChatVoiceHomoMapper fastgptChatVoiceHomoMapper;
     @Autowired
     AiHostProper aiHostProper;
+    @Autowired
+    private IFsUserInformationCollectionService fsUserInformationCollectionService;
+    @Autowired
+    private IFsQuestionAndAnswerService fsQuestionAndAnswerService;
 
     public static final String SOP_TEMP_VOICE_KEY = "sop:tempVoice";
     @PostMapping("/login")
@@ -385,5 +396,94 @@ public class CompanyUserController extends  AppBaseController {
         return R.ok().put("data",listPageInfo);
     }
 
+    /**
+     * 查询用户信息采集列表问答列表
+     */
+    @GetMapping("/questionAndAnswer/allList")
+    public TableDataInfo getQuestionAndAnswer()
+    {
+        List<OptionsVO> list = fsQuestionAndAnswerService.selectAllQuestionOptions();
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 查询用户信息采集列表
+     */
+    @GetMapping("/informationCollection/list")
+    @Login
+    public TableDataInfo list(FsUserInformationCollection fsUserInformationCollection)
+    {
+        startPage();
+        Long companyUserId = getCompanyUserId();
+        fsUserInformationCollection.setCompanyUserId(companyUserId);
+        List<FsUserInformationCollection> list = fsUserInformationCollectionService.selectFsUserInformationCollectionList(fsUserInformationCollection);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 获取用户信息采集详细信息
+     */
+    @GetMapping(value = "/informationCollection/{id}")
+    public R getInformationCollectionInfo(@PathVariable("id") Long id)
+    {
+        return R.ok().put("data",fsUserInformationCollectionService.selectFsUserInformationCollectionById(id));
+    }
+
+    /**
+     * 新增用户信息采集
+     */
+    @Login
+    @PostMapping("/informationCollection")
+    public R add(@RequestBody FsUserInformationCollectionParam fsUserInformationCollection)
+    {
+        Long companyUserId = getCompanyUserId();
+        //查询用户是否绑定销售
+        Long userId = fsUserInformationCollection.getUserId();
+        if (userId == null || userId < 0){
+            return R.error("请选择绑定用户");
+        }
+        CompanyUserUser companyUserUser = new CompanyUserUser();
+        companyUserUser.setCompanyUserId(companyUserId);
+        companyUserUser.setUserId(userId);
+        List<CompanyUserUser> companyUserUsers = companyUserUserService.selectCompanyUserUserList(companyUserUser);
+        if (companyUserUsers == null || companyUserUsers.isEmpty()){
+            return R.error("用户未绑定该销售");
+        }
+
+        fsUserInformationCollection.setCompanyUserId(companyUserId);
+        Long id = fsUserInformationCollectionService.insertFsUserInformationCollection(fsUserInformationCollection);
+        return id == null?R.error("新增失败"):R.ok().put("data",id);
+    }
+
+    /**
+     * 修改用户信息采集
+     */
+    @PutMapping("/informationCollection")
+    @Login
+    public R edit(@RequestBody FsUserInformationCollectionParam fsUserInformationCollection)
+    {
+        Long companyUserId = getCompanyUserId();
+        fsUserInformationCollection.setCompanyUserId(companyUserId);
+        fsUserInformationCollectionService.updateFsUserInformationCollection(fsUserInformationCollection);
+        return R.ok();
+    }
+
+    /**
+     * 删除用户信息采集
+     */
+    @DeleteMapping("/informationCollection/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsUserInformationCollectionService.deleteFsUserInformationCollectionByIds(ids));
+    }
+
+    @GetMapping("/informationCollection/getInfo")
+    public AjaxResult getInformationCollection(FsUserInformationCollection fsUserInformationCollection){
+        return AjaxResult.success(fsUserInformationCollectionService.getInfo(fsUserInformationCollection));
+    }
+
+
 
 }

+ 78 - 0
fs-user-app/src/main/java/com/fs/app/controller/FsUserInformationCollectionController.java

@@ -0,0 +1,78 @@
+package com.fs.app.controller;
+
+import com.fs.app.annotation.Login;
+import com.fs.common.core.domain.R;
+import com.fs.company.service.ICompanyUserUserService;
+import com.fs.his.domain.FsUserInformationCollection;
+import com.fs.his.param.FsUserInformationCollectionParam;
+import com.fs.his.service.IFsUserInformationCollectionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * 用户信息采集Controller
+ *
+ * @author fs
+ * @date 2025-10-14
+ */
+@RestController
+@RequestMapping("/user/collection")
+public class FsUserInformationCollectionController extends AppBaseController
+{
+    @Autowired
+    private IFsUserInformationCollectionService fsUserInformationCollectionService;
+
+
+
+    /**
+     * 获取用户信息采集详细信息
+     */
+    @GetMapping(value = "/{id}")
+    @Login
+    public R getInfo(@PathVariable("id") Long id)
+    {
+
+        FsUserInformationCollection info = fsUserInformationCollectionService.selectFsUserInformationCollectionById(id);
+        if (info == null){
+            return R.error("未查询到信息!");
+        }
+        String userId = getUserId();
+        if (info.getUserId() != Long.parseLong(userId)){
+            return R.error("未查询您的采集信息!");
+        }
+        if (info.getDoctorConfirm() == 0){
+            info.setPackageId(null);
+        }
+        return R.ok().put("data", info);
+    }
+
+
+    /**
+     * 修改用户信息采集
+     */
+    @Login
+    @PutMapping
+    public R edit(@RequestBody FsUserInformationCollectionParam fsUserInformationCollection)
+    {
+        Long id = fsUserInformationCollection.getId();
+        if (id == null){
+            return R.error("未查询到信息!");
+        }
+        FsUserInformationCollection info = fsUserInformationCollectionService.selectFsUserInformationCollectionById(id);
+        if (info == null){
+            return R.error("未查询到信息!");
+        }
+        String userId = getUserId();
+        if (info.getUserId() != Long.parseLong(userId)){
+            return R.error("您没有修改信息的权限");
+        }
+        if (!info.getUserId().equals(fsUserInformationCollection.getUserId())){
+            return R.error("用户id不能修改");
+        }
+        fsUserInformationCollectionService.updateFsUserInformationCollection(fsUserInformationCollection);
+        return R.ok();
+    }
+
+
+}