Ver Fonte

Merge remote-tracking branch 'origin/ScrmStores' into ScrmStores

吴树波 há 2 semanas atrás
pai
commit
4b24605a46
86 ficheiros alterados com 3652 adições e 3 exclusões
  1. 53 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHospital580PrescriptionScrmController.java
  2. 20 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java
  3. 16 0
      fs-admin/src/main/java/com/fs/hisStore/facade/FsStore580FacadeService.java
  4. 90 0
      fs-admin/src/main/java/com/fs/hisStore/facade/impl/FsStore580FacadeServiceImpl.java
  5. 52 0
      fs-common/src/main/java/com/fs/common/core/domain/PageResponse.java
  6. 8 0
      fs-common/src/main/java/com/fs/common/core/domain/R.java
  7. 32 0
      fs-common/src/main/java/com/fs/common/core/domain/ResponseCode.java
  8. 54 0
      fs-common/src/main/java/com/fs/common/core/domain/Result.java
  9. 18 0
      fs-common/src/main/java/com/fs/common/core/page/PageRequest.java
  10. 4 0
      fs-common/src/main/java/com/fs/common/enums/BusinessType.java
  11. 4 0
      fs-service/src/main/java/com/fs/his/utils/PhoneUtil.java
  12. 12 2
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  13. 2 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductScrmService.java
  14. 5 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  15. 2 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreProductListVO.java
  16. 15 0
      fs-service/src/main/java/com/fs/hospital580/dto/BeforeAiData.java
  17. 22 0
      fs-service/src/main/java/com/fs/hospital580/dto/CommonDto.java
  18. 20 0
      fs-service/src/main/java/com/fs/hospital580/dto/DiseaseDto.java
  19. 26 0
      fs-service/src/main/java/com/fs/hospital580/dto/Medicine.java
  20. 16 0
      fs-service/src/main/java/com/fs/hospital580/dto/MedicineDto.java
  21. 37 0
      fs-service/src/main/java/com/fs/hospital580/dto/PreDemandDto.java
  22. 21 0
      fs-service/src/main/java/com/fs/hospital580/dto/Result580.java
  23. 19 0
      fs-service/src/main/java/com/fs/hospital580/dto/TextRecordDto.java
  24. 60 0
      fs-service/src/main/java/com/fs/hospital580/entity/Hospital580PrescriptionAnswerScrmEntity.java
  25. 48 0
      fs-service/src/main/java/com/fs/hospital580/entity/Hospital580PrescriptionChatScrmEntity.java
  26. 80 0
      fs-service/src/main/java/com/fs/hospital580/entity/Hospital580PrescriptionMedicineScrmEntity.java
  27. 201 0
      fs-service/src/main/java/com/fs/hospital580/entity/Hospital580PrescriptionScrmEntity.java
  28. 63 0
      fs-service/src/main/java/com/fs/hospital580/entity/Hospital580ProductPushScrmEntity.java
  29. 63 0
      fs-service/src/main/java/com/fs/hospital580/entity/Hospital580ScrmEntity.java
  30. 18 0
      fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580PrescriptionAnswerScrmMapper.java
  31. 18 0
      fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580PrescriptionChatScrmMapper.java
  32. 18 0
      fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580PrescriptionMedicineScrmMapper.java
  33. 18 0
      fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580PrescriptionScrmMapper.java
  34. 18 0
      fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580ProductPushScrmMapper.java
  35. 18 0
      fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580ScrmMapper.java
  36. 45 0
      fs-service/src/main/java/com/fs/hospital580/mapper/MedicineMapper.java
  37. 16 0
      fs-service/src/main/java/com/fs/hospital580/service/Hospital580PrescriptionAnswerScrmService.java
  38. 16 0
      fs-service/src/main/java/com/fs/hospital580/service/Hospital580PrescriptionChatScrmService.java
  39. 16 0
      fs-service/src/main/java/com/fs/hospital580/service/Hospital580PrescriptionMedicineScrmService.java
  40. 19 0
      fs-service/src/main/java/com/fs/hospital580/service/Hospital580PrescriptionScrmService.java
  41. 16 0
      fs-service/src/main/java/com/fs/hospital580/service/Hospital580ProductPushScrmService.java
  42. 20 0
      fs-service/src/main/java/com/fs/hospital580/service/Hospital580ScrmService.java
  43. 26 0
      fs-service/src/main/java/com/fs/hospital580/service/Hospital580Service.java
  44. 20 0
      fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580PrescriptionAnswerScrmServiceImpl.java
  45. 20 0
      fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580PrescriptionChatScrmServiceImpl.java
  46. 20 0
      fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580PrescriptionMedicineScrmServiceImpl.java
  47. 25 0
      fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580PrescriptionScrmServiceImpl.java
  48. 20 0
      fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580ProductPushScrmServiceImpl.java
  49. 83 0
      fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580ScrmServiceImpl.java
  50. 146 0
      fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580ServiceImpl.java
  51. 43 0
      fs-service/src/main/java/com/fs/hospital580/util/MD5Util.java
  52. 225 0
      fs-service/src/main/java/com/fs/hospital580/util/ObjectApiSignUtil.java
  53. 43 0
      fs-service/src/main/java/com/fs/hospital580/vo/AnswerDataVo.java
  54. 12 0
      fs-service/src/main/java/com/fs/hospital580/vo/CommonVo.java
  55. 14 0
      fs-service/src/main/java/com/fs/hospital580/vo/MedicineSyncVo.java
  56. 30 0
      fs-service/src/main/java/com/fs/hospital580/vo/OrderChatScrmVo.java
  57. 81 0
      fs-service/src/main/java/com/fs/hospital580/vo/OrderScrmVo.java
  58. 25 0
      fs-service/src/main/java/com/fs/hospital580/vo/PrescriptionAdminQueryVo.java
  59. 146 0
      fs-service/src/main/java/com/fs/hospital580/vo/PrescriptionAdminScrmVo.java
  60. 53 0
      fs-service/src/main/java/com/fs/hospital580/vo/PrescriptionMedicineScrmVo.java
  61. 17 0
      fs-service/src/main/java/com/fs/hospital580/vo/RefusePrescriptionVo.java
  62. 25 0
      fs-service/src/main/java/com/fs/hospital580/vo/ReviewPrescriptionVo.java
  63. 23 0
      fs-service/src/main/java/com/fs/hospital580/vo/req/DiseaseReq.java
  64. 78 0
      fs-service/src/main/java/com/fs/hospital580/vo/req/Prescription580Req.java
  65. 79 0
      fs-service/src/main/java/com/fs/hospital580/vo/req/SaveOrderScrmReq.java
  66. 15 0
      fs-service/src/main/java/com/fs/hospital580/vo/res/DiseaseQueryRes.java
  67. 147 0
      fs-service/src/main/java/com/fs/hospital580/vo/res/PrescriptionDetailRes.java
  68. 69 0
      fs-service/src/main/java/com/fs/hospital580/vo/res/PrescriptionListRes.java
  69. 7 0
      fs-service/src/main/resources/application-config-druid-yjb.yml
  70. 7 0
      fs-service/src/main/resources/application-dev.yml
  71. 20 0
      fs-service/src/main/resources/mapper/hospital580/Hospital580PrescriptionAnswerScrmMapper.xml
  72. 17 0
      fs-service/src/main/resources/mapper/hospital580/Hospital580PrescriptionChatScrmMapper.xml
  73. 25 0
      fs-service/src/main/resources/mapper/hospital580/Hospital580PrescriptionMedicineScrmMapper.xml
  74. 55 0
      fs-service/src/main/resources/mapper/hospital580/Hospital580PrescriptionScrmMapper.xml
  75. 21 0
      fs-service/src/main/resources/mapper/hospital580/Hospital580ProductPushScrmMapper.xml
  76. 21 0
      fs-service/src/main/resources/mapper/hospital580/Hospital580ScrmMapper.xml
  77. 57 0
      fs-user-app/src/main/java/com/fs/app/controller/Hospital580CallbackController.java
  78. 58 0
      fs-user-app/src/main/java/com/fs/app/controller/Hospital580Controller.java
  79. 30 0
      fs-user-app/src/main/java/com/fs/app/facade/Hospital580FacadeService.java
  80. 267 0
      fs-user-app/src/main/java/com/fs/app/facade/impl/Hospital580FacadeServiceImpl.java
  81. 47 0
      fs-user-app/src/main/java/com/fs/framework/aspectj/Hospital580Aspect.java
  82. 58 0
      fs-user-app/src/main/java/com/fs/framework/aspectj/lock/DistributeLock.java
  83. 113 0
      fs-user-app/src/main/java/com/fs/framework/aspectj/lock/DistributeLockAspect.java
  84. 13 0
      fs-user-app/src/main/java/com/fs/framework/aspectj/lock/DistributeLockConstant.java
  85. 24 0
      fs-user-app/src/main/java/com/fs/framework/aspectj/lock/DistributeLockException.java
  86. 8 1
      fs-user-app/src/main/java/com/fs/framework/config/MyBatisConfig.java

+ 53 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHospital580PrescriptionScrmController.java

@@ -0,0 +1,53 @@
+package com.fs.hisStore.controller;
+
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.hisStore.facade.FsStore580FacadeService;
+import com.fs.hospital580.vo.PrescriptionAdminQueryVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 处方相关接口
+ */
+@Slf4j
+@RestController
+@RequestMapping("/store/prescription")
+public class FsStoreHospital580PrescriptionScrmController extends BaseController {
+    @Autowired
+    private FsStore580FacadeService facadeService;
+
+    /**
+     * 处方订单列表
+     */
+    @PreAuthorize("@ss.hasPermi('store:storePrescription:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(PrescriptionAdminQueryVo vo) {
+        startPage();
+        return getDataTable(facadeService.list(vo));
+    }
+
+    /**
+     * 处方订单详情
+     */
+    @PreAuthorize("@ss.hasPermi('store:storePrescription:prescriptionDetail')")
+    @GetMapping("/prescriptionDetail/{preId}")
+    public R prescriptionDetail(@PathVariable("preId") Long preId) {
+        return R.ok(facadeService.prescriptionDetail(preId));
+    }
+
+    /**
+     * 获取聊天记录记录
+     */
+    @PreAuthorize("@ss.hasPermi('store:storePrescription:chatDetail')")
+    @GetMapping("/chatDetail/{preId}")
+    public R chatDetail(@PathVariable("preId") Long preId) {
+        return R.ok(facadeService.chatDetail(preId));
+    }
+}

+ 20 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java

@@ -8,10 +8,12 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.hisStore.facade.FsStore580FacadeService;
 import com.fs.hisStore.vo.FsStoreProductAttrValueVO;
 import com.fs.hisStore.vo.FsStoreProductExportVO;
 import com.fs.hisStore.vo.FsStoreProductListVO;
 import com.fs.hisStore.vo.FsStoreTuiProductAttrValueVO;
+import com.fs.hospital580.service.Hospital580ScrmService;
 import com.fs.statis.dto.ModifyMoreDTO;
 import com.fs.hisStore.domain.FsStoreProductScrm;
 import com.fs.hisStore.domain.FsStoreProductAttrScrm;
@@ -56,6 +58,11 @@ public class FsStoreProductScrmController extends BaseController
 
     @Autowired
     private IFsStoreProductAttrValueScrmService attrValueService;
+    @Autowired
+    private Hospital580ScrmService fsStoreHospital580ScrmService;
+    @Autowired
+    private FsStore580FacadeService fsStore580FacadeService;
+
 
 
     /**
@@ -219,4 +226,17 @@ public class FsStoreProductScrmController extends BaseController
         return R.ok().put("data", list);
     }
 
+
+    /**
+     * 同步商品到580商城
+     */
+    @PreAuthorize("@ss.hasPermi('store:storeProduct:sync')")
+    @Log(title = "同步商品到580医院", businessType = BusinessType.DELETE,isStoreLog = true,
+            logParamExpression ="#p0.length>1?new String[]{'商品','同步商品到580医院'}: new String[]{'商品','同步商品到580医院'}" )
+    @PostMapping("/sync580/{productIds}")
+    public R sync(@PathVariable Long[] productIds)
+    {
+        fsStoreHospital580ScrmService.SynDrugToHospital580(productIds);
+        return R.ok("同步成功");
+    }
 }

+ 16 - 0
fs-admin/src/main/java/com/fs/hisStore/facade/FsStore580FacadeService.java

@@ -0,0 +1,16 @@
+package com.fs.hisStore.facade;
+
+import com.fs.hospital580.entity.Hospital580PrescriptionScrmEntity;
+import com.fs.hospital580.vo.OrderChatScrmVo;
+import com.fs.hospital580.vo.PrescriptionAdminQueryVo;
+import com.fs.hospital580.vo.PrescriptionAdminScrmVo;
+
+import java.util.List;
+
+public interface FsStore580FacadeService {
+    List<Hospital580PrescriptionScrmEntity> list(PrescriptionAdminQueryVo vo);
+
+    PrescriptionAdminScrmVo prescriptionDetail(Long preId);
+
+    List<OrderChatScrmVo> chatDetail(Long preId);
+}

+ 90 - 0
fs-admin/src/main/java/com/fs/hisStore/facade/impl/FsStore580FacadeServiceImpl.java

@@ -0,0 +1,90 @@
+package com.fs.hisStore.facade.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fs.hisStore.facade.FsStore580FacadeService;
+import com.fs.hospital580.entity.Hospital580PrescriptionAnswerScrmEntity;
+import com.fs.hospital580.entity.Hospital580PrescriptionChatScrmEntity;
+import com.fs.hospital580.entity.Hospital580PrescriptionMedicineScrmEntity;
+import com.fs.hospital580.entity.Hospital580PrescriptionScrmEntity;
+import com.fs.hospital580.service.Hospital580PrescriptionAnswerScrmService;
+import com.fs.hospital580.service.Hospital580PrescriptionChatScrmService;
+import com.fs.hospital580.service.Hospital580PrescriptionMedicineScrmService;
+import com.fs.hospital580.service.Hospital580PrescriptionScrmService;
+import com.fs.hospital580.vo.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service("fsStore580FacadeService")
+public class FsStore580FacadeServiceImpl implements FsStore580FacadeService {
+
+    @Autowired
+    private Hospital580PrescriptionScrmService prescriptionScrmService;
+    @Autowired
+    private Hospital580PrescriptionAnswerScrmService answerScrmService;
+    @Autowired
+    private Hospital580PrescriptionChatScrmService chatScrmService;
+    @Autowired
+    private Hospital580PrescriptionMedicineScrmService medicineScrmService;
+
+
+    @Override
+    public List<Hospital580PrescriptionScrmEntity> list(PrescriptionAdminQueryVo vo) {
+        return prescriptionScrmService.list(new LambdaQueryWrapper<Hospital580PrescriptionScrmEntity>()
+                .like(ObjectUtil.isNotEmpty(vo.getHospitalName()), Hospital580PrescriptionScrmEntity::getHospitalName, vo.getHospitalName())
+                .like(ObjectUtil.isNotEmpty(vo.getStoreName()), Hospital580PrescriptionScrmEntity::getStoreName, vo.getStoreName())
+                .like(ObjectUtil.isNotEmpty(vo.getUserFamilyName()), Hospital580PrescriptionScrmEntity::getUserFamilyName, vo.getUserFamilyName())
+                .eq(ObjectUtil.isNotEmpty(vo.getUserFamilyPhone()), Hospital580PrescriptionScrmEntity::getUserFamilyPhone, vo.getUserFamilyPhone())
+                .eq(ObjectUtil.isNotEmpty(vo.getAuditStatus()), Hospital580PrescriptionScrmEntity::getAuditStatus, vo.getAuditStatus())
+                .le(ObjectUtil.isNotEmpty(vo.getEndTime()), Hospital580PrescriptionScrmEntity::getCreatedTime, vo.getEndTime())
+                .ge(ObjectUtil.isNotEmpty(vo.getBeginTime()), Hospital580PrescriptionScrmEntity::getCreatedTime, vo.getBeginTime())
+                .orderByDesc(Hospital580PrescriptionScrmEntity::getCreatedTime));
+
+    }
+
+    @Override
+    public PrescriptionAdminScrmVo prescriptionDetail(Long preId) {
+        PrescriptionAdminScrmVo prescriptionScrmVo = BeanUtil.copyProperties(prescriptionScrmService.getById(preId), PrescriptionAdminScrmVo.class);
+        prescriptionScrmVo.setBeforeAiDataList(answerScrmService.list(new LambdaQueryWrapper<Hospital580PrescriptionAnswerScrmEntity>()
+                        .eq(Hospital580PrescriptionAnswerScrmEntity::getPreId, prescriptionScrmVo.getPreId()))
+                .stream()
+                .filter(Objects::nonNull)  // 过滤掉空对象
+                .map(item -> {
+                    AnswerDataVo vo = new AnswerDataVo();
+                    BeanUtil.copyProperties(item, vo);
+                    vo.setTitle();
+                    return vo;
+                })
+                .collect(Collectors.toList()));
+        prescriptionScrmVo.setDrugRspList(medicineScrmService.list(new LambdaQueryWrapper<Hospital580PrescriptionMedicineScrmEntity>()
+                        .eq(Hospital580PrescriptionMedicineScrmEntity::getPreId, prescriptionScrmVo.getPreId()))
+                .stream()
+                .filter(Objects::nonNull)  // 过滤掉空对象
+                .map(item -> {
+                    PrescriptionMedicineScrmVo vo = new PrescriptionMedicineScrmVo();
+                    BeanUtil.copyProperties(item, vo);
+                    return vo;
+                })
+                .collect(Collectors.toList()));
+        return prescriptionScrmVo;
+    }
+
+    @Override
+    public List<OrderChatScrmVo> chatDetail(Long preId) {
+        Hospital580PrescriptionChatScrmEntity one = chatScrmService.getOne(new LambdaQueryWrapper<Hospital580PrescriptionChatScrmEntity>().eq(Hospital580PrescriptionChatScrmEntity::getPreId, preId));
+        String content = one.getContent();
+        JSONArray objects = JSONUtil.parseArray(content);
+        List<OrderChatScrmVo> list = objects.stream()
+                .map(obj -> JSONUtil.toBean((JSONObject) obj, OrderChatScrmVo.class))
+                .collect(Collectors.toList());
+        return list;
+    }
+}

+ 52 - 0
fs-common/src/main/java/com/fs/common/core/domain/PageResponse.java

@@ -0,0 +1,52 @@
+package com.fs.common.core.domain;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Setter
+@Getter
+public class PageResponse<T> implements Serializable {
+    /**
+     * 状态吗
+     */
+    private String code;
+
+    /**
+     * 是否成功
+     */
+    private Boolean success;
+
+    /**
+     * 当前页
+     */
+    private int currentPage;
+    /**
+     * 每页结果数
+     */
+    private int pageSize;
+    /**
+     * 总页数
+     */
+    private int totalPage;
+    /**
+     * 总数
+     */
+    private int total;
+
+    private List<T> datas;
+
+    public static <T> PageResponse<T> of(List<T> datas, int total, int pageSize, int currentPage) {
+        PageResponse<T> pageResponse = new PageResponse<>();
+        pageResponse.setSuccess(true);
+        pageResponse.setCode("200");
+        pageResponse.setDatas(datas);
+        pageResponse.setTotal(total);
+        pageResponse.setPageSize(pageSize);
+        pageResponse.setCurrentPage(currentPage);
+        pageResponse.setTotalPage((pageSize + total - 1) / currentPage);
+        return pageResponse;
+    }
+}

+ 8 - 0
fs-common/src/main/java/com/fs/common/core/domain/R.java

@@ -50,4 +50,12 @@ public class R extends HashMap<String, Object> {
 		super.put(key, value);
 		return this;
 	}
+
+	public static R ok(Object data) {
+		R r = new R();
+		r.put("code", 200);
+		r.put("msg", "success");
+		r.put("data", data);
+		return r;
+	}
 }

+ 32 - 0
fs-common/src/main/java/com/fs/common/core/domain/ResponseCode.java

@@ -0,0 +1,32 @@
+package com.fs.common.core.domain;
+
+/**
+ * @author Hollis
+ */
+public enum ResponseCode {
+
+    /**
+     * 成功
+     */
+    SUCCESS,
+
+    /**
+     * 重复
+     */
+    DUPLICATED,
+
+    /**
+     * 非法参数
+     */
+    ILLEGAL_ARGUMENT,
+
+    /**
+     * 系统错误
+     */
+    SYSTEM_ERROR,
+
+    /**
+     * 业务错误
+     */
+    BIZ_ERROR;
+}

+ 54 - 0
fs-common/src/main/java/com/fs/common/core/domain/Result.java

@@ -0,0 +1,54 @@
+package com.fs.common.core.domain;
+
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class Result<T> {
+    /**
+     * 状态码
+     */
+    private Integer code;
+
+    /**
+     * 是否成功
+     */
+    private Boolean success;
+
+    /**
+     * 消息描述
+     */
+    private String message;
+
+    /**
+     * 数据,可以是任何类型的VO
+     */
+    private T data;
+
+    public Result() {
+    }
+
+    public Result(Boolean success, String message, T data) {
+        this.success = success;
+        this.message = message;
+        this.data = data;
+    }
+
+    public Result(Boolean success, Integer code, String message, T data) {
+        this.success = success;
+        this.message = message;
+        this.data = data;
+        this.code = code;
+    }
+
+
+    public static <T> Result<T> success(T data) {
+        return new Result<>(true, 200, ResponseCode.SUCCESS.name(), data);
+    }
+
+    public static <T> Result<T> error(String errorMsg) {
+        return new Result<>(false, 500, errorMsg, null);
+    }
+}

+ 18 - 0
fs-common/src/main/java/com/fs/common/core/page/PageRequest.java

@@ -0,0 +1,18 @@
+package com.fs.common.core.page;
+
+import lombok.Getter;
+import lombok.Setter;
+
+
+@Setter
+@Getter
+public class PageRequest {
+    /**
+     * 当前页
+     */
+    private int pageNum = 1;
+    /**
+     * 每页结果数
+     */
+    private int pageSize = 10;
+}

+ 4 - 0
fs-common/src/main/java/com/fs/common/enums/BusinessType.java

@@ -61,4 +61,8 @@ public enum BusinessType
      * 审核
      * */
     AUDIT,
+    /**
+     * 同步数据
+     * */
+    SYNC
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/utils/PhoneUtil.java

@@ -77,4 +77,8 @@ public class PhoneUtil {
 
         return text;
     }
+
+    public static void main(String[] args) {
+        System.out.println(encryptPhone("18580395185"));
+    }
 }

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

@@ -73,8 +73,9 @@ public interface FsStoreProductScrmMapper
      */
     public int deleteFsStoreProductByIds(Long[] productIds);
     @Select({"<script> " +
-            "select p.*,pc.cate_name, fs_store.store_name from fs_store_product_scrm p left join fs_store_product_category_scrm pc on p.cate_id=pc.cate_id  " +
+            "select p.*,pc.cate_name, fs_store.store_name,hs.push_status from fs_store_product_scrm p left join fs_store_product_category_scrm pc on p.cate_id=pc.cate_id  " +
             "left join fs_store on fs_store.store_id = p.store_id " +
+            "left join (select product_id, push_status from fs_store_hospital580_product_push_scrm h1 where h1.id = (select max(h2.id) from fs_store_hospital580_product_push_scrm h2 where h2.product_id = h1.product_id)) hs on hs.product_id = p.product_id " +
             "where 1=1 " +
             "<if test = 'maps.productName != null and  maps.productName !=\"\"    '> " +
             "and p.product_name like CONCAT('%',#{maps.productName},'%') " +
@@ -151,9 +152,10 @@ public interface FsStoreProductScrmMapper
     @Select({"<script> " +
             "  select p.*,pc.cate_name from (SELECT ave.bar_code as bar_code,p.product_id, p.image, p.slider_image,p.product_name, p.product_info,p.keyword, p.cate_id, p.price, p.vip_price, " +
             " p.ot_price,p.agent_price, p.postage,p.unit_name,p.sort,p.sales,p.stock,p.is_show,p.is_hot,p.is_benefit,p.is_best,p.is_new,p.description,p.create_time,p.update_time,p.is_postage,p.is_del,p.give_integral," +
-            " p.cost,p.is_good,p.browse,p.code_path,p.temp_id,p.spec_type,p.is_integral,p.integral,p.product_type,p.prescribe_code, p.prescribe_spec,p.prescribe_factory,p.prescribe_name,p.is_display,p.tui_cate_id " +
+            " p.cost,p.is_good,p.browse,p.code_path,p.temp_id,p.spec_type,p.is_integral,p.integral,p.product_type,p.prescribe_code, p.prescribe_spec,p.prescribe_factory,p.prescribe_name,p.is_display,p.tui_cate_id ,hs.push_status" +
             " FROM fs_store_product_scrm p LEFT JOIN fs_store_product_attr_value_scrm ave on p.product_id=ave.product_id  WHERE ave.bar_code != '' and p.product_id is not null" +
             ") p left join fs_store_product_category_scrm pc on p.cate_id=pc.cate_id   " +
+            "left join (select product_id, push_status from fs_store_hospital580_product_push_scrm h1 where h1.id = (select max(h2.id) from fs_store_hospital580_product_push_scrm h2 where h2.product_id = h1.product_id)) hs on hs.product_id = p.product_id " +
             " where 1=1 " +
             "<if test = 'maps.productName != null and  maps.productName !=\"\"  '> " +
             "and p.product_name like CONCAT('%',#{maps.productName},'%') " +
@@ -409,4 +411,12 @@ public interface FsStoreProductScrmMapper
             "WHERE  " +
             "    TABLE_NAME = 'fs_store_product_scrm'")
     List<Map<String, String>> getStoreProductColumns();
+
+    @Select({"<script> " +
+            "SELECT * FROM fs_store_product_scrm WHERE product_id IN " +
+            "<foreach item='item' index='index' collection='productIds' open='(' separator=',' close=')'>" +
+            "#{item}" +
+            "</foreach>" +
+            "</script>"})
+    List<FsStoreProductScrm> selectProductByIds(@Param("productIds") Long[] productIds);
 }

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

@@ -137,4 +137,6 @@ public interface IFsStoreProductScrmService
     List<FsStoreProductActivityListVO> selectFsStoreProductByIdsAudit(String productIds);
 
     List<Map<String, String>> getStoreProductColumns();
+
+    List<FsStoreProductScrm> selectProductByIds(Long[] productIds);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java

@@ -1141,4 +1141,9 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         return result;
     }
 
+
+    @Override
+    public List<FsStoreProductScrm> selectProductByIds(Long[] productIds) {
+        return fsStoreProductMapper.selectProductByIds(productIds);
+    }
 }

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreProductListVO.java

@@ -116,5 +116,7 @@ public class FsStoreProductListVO  implements Serializable
 
     private String storeId;
     private String storeName;
+    // 同步药品状态 推送状态 0推送中1成功2失
+    private Byte pushStatus;
 
 }

+ 15 - 0
fs-service/src/main/java/com/fs/hospital580/dto/BeforeAiData.java

@@ -0,0 +1,15 @@
+package com.fs.hospital580.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 问诊题目
+ */
+@Data
+public class BeforeAiData implements Serializable {
+    private Integer subjectId;              // 题目ID
+    private String answer;                  // 题目答案
+    private String answerMedicine;          // 存问诊用药信息选择
+}

+ 22 - 0
fs-service/src/main/java/com/fs/hospital580/dto/CommonDto.java

@@ -0,0 +1,22 @@
+package com.fs.hospital580.dto;
+
+import com.fs.hospital580.util.ObjectApiSignUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Setter
+@Getter
+public class CommonDto implements Serializable {
+    private String clientId;
+    private String timeStamp;
+    private String sign;
+
+    public void initCommonDto(String clientId, String secretKey) {
+        this.clientId = clientId;
+        this.timeStamp = new Date().getTime() + "";
+        this.sign = ObjectApiSignUtil.getSign(this, secretKey);
+    }
+}

+ 20 - 0
fs-service/src/main/java/com/fs/hospital580/dto/DiseaseDto.java

@@ -0,0 +1,20 @@
+package com.fs.hospital580.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class DiseaseDto extends CommonDto implements Serializable {
+
+    private Integer type;                // 诊断类型(0为西医诊断,1为中医诊断)
+    private String diagnosisName;                // 诊断名称
+    private Integer pageNum;                // 分页参数起始页1开始
+    private Integer pageSize;                // 分页参数每页条数
+
+
+}
+
+

+ 26 - 0
fs-service/src/main/java/com/fs/hospital580/dto/Medicine.java

@@ -0,0 +1,26 @@
+package com.fs.hospital580.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class Medicine implements Serializable {
+    private Integer categoryId = 0;         // 药品分类:0为西药,1为中成药,3为其他
+    private String commonName;          // 通用名
+    private String name;                // 商品名
+    private String dosage;              // 剂型
+    private String spec;                // 规格
+    private String packingSpec;         // 包装规格
+    private String manufacturer;        // 生产厂家
+    private String approvalNumber;      // 批准文号
+    private String unit;                // 最小售卖单位
+    private String medicineId;          // 第三方药品编码(唯一)
+    private String barCode;             // 商品条形码值
+    private Integer isPrescription;     // 是否处方药(0为是,1为否)
+    private String price;               // 价格
+    private Long stock;              // 库存
+    private String specialCommonName;   // 特殊通用名
+    private String specialSpec;         // 特殊规格
+}

+ 16 - 0
fs-service/src/main/java/com/fs/hospital580/dto/MedicineDto.java

@@ -0,0 +1,16 @@
+package com.fs.hospital580.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MedicineDto extends CommonDto implements Serializable {
+    private List<Medicine> medicineList;
+    // 药品同步结果通知地址
+    private String callbackUrl;
+
+}

+ 37 - 0
fs-service/src/main/java/com/fs/hospital580/dto/PreDemandDto.java

@@ -0,0 +1,37 @@
+package com.fs.hospital580.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PreDemandDto extends CommonDto implements Serializable {
+
+    private String memberId;                // 第三方系统问诊人唯一标识(一般为患者手机号)
+    private String storeId;                // 门店ID(由580提供,每个三方对应值不一样)
+    private Integer serviceType;            // 服务类型,0为图文,1为视频
+    private Integer isExamine;              // 是否需要审方(0为不需要,1为需要)
+    private Integer isPregnantWoman;        // 是否孕妇0为否,1为是
+    private Integer isLactation;            // 是否哺乳期0为否,1为是
+    private Integer souceFrom;              // 来源:0为微信小程序,1为APP,2为H5,3为支付宝小程序
+    private String userFamilyName;          // 用药人姓名
+    private String userFamilyIdCard;        // 身份证
+    private Integer userFamilyAge;          // 年龄
+    private Integer userFamilyGender;       // 性别:1-男,2-女
+    private String userFamilyPhone;         // 手机号码
+    private Integer relationship;           // 关系(1本人 2父母 3配偶 4子女 5其他)
+    private String bizOrderId;              // 第三方唯一订单号
+    private List<BeforeAiData> beforeAiDataList; // 问诊前面的题目,传固定的五道题
+    private String userFamilyAddr;          // 就诊人住址(最多30个字符)
+    private String imgList;                 // 图片附件(url形式,最多三个),多个以英文逗号,隔开
+    private String thirdReturnUrl;          // 结束问诊后跳回三方的地址
+
+    public void setThirdReturnUrl(Long orderId) {
+        this.thirdReturnUrl = "/pages_shopping/paymentOrder?orderId="+orderId;
+    }
+}
+
+

+ 21 - 0
fs-service/src/main/java/com/fs/hospital580/dto/Result580.java

@@ -0,0 +1,21 @@
+package com.fs.hospital580.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class Result580 implements Serializable {
+    // 1失败 0成功
+    private Integer err;
+    private String errmsg;
+    private String data;
+    // 请求id
+    private Long requestId;
+
+    public Result580(String errmsg) {
+        this.err = 1;
+        this.data = "";
+        this.errmsg = errmsg;
+    }
+}

+ 19 - 0
fs-service/src/main/java/com/fs/hospital580/dto/TextRecordDto.java

@@ -0,0 +1,19 @@
+package com.fs.hospital580.dto;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Builder
+public class TextRecordDto extends CommonDto implements Serializable {
+
+    private Long diagnosisId;                // 问诊单Id
+    private Integer pageNum;                // 页码(默认为1)
+    private Integer pageSize;                // 每页条数
+}
+
+

+ 60 - 0
fs-service/src/main/java/com/fs/hospital580/entity/Hospital580PrescriptionAnswerScrmEntity.java

@@ -0,0 +1,60 @@
+package com.fs.hospital580.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 问诊问答明细表
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-25
+ */
+@Getter
+@Setter
+@TableName("fs_store_hospital580_prescription_answer_scrm")
+@ApiModel(value = "FsStoreHospital580PrescriptionAnswerScrmEntity对象", description = "问诊问答明细表")
+public class Hospital580PrescriptionAnswerScrmEntity extends Model<Hospital580PrescriptionAnswerScrmEntity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("处方表id")
+    @TableField("pre_id")
+    private Long preId;
+
+    @ApiModelProperty("题目ID:1-症状,2-用药信息,3-是否使用过此类药物,4-药物过敏史,5-肝肾功能异常")
+    @TableField("subject_id")
+    private Byte subjectId;
+
+    @ApiModelProperty("题目答案")
+    @TableField("answer")
+    private String answer;
+
+    @ApiModelProperty("用药信息选择(JSON格式)")
+    @TableField("answer_medicine")
+    private String answerMedicine;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 48 - 0
fs-service/src/main/java/com/fs/hospital580/entity/Hospital580PrescriptionChatScrmEntity.java

@@ -0,0 +1,48 @@
+package com.fs.hospital580.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 问诊单聊天记录信息
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-28
+ */
+@Getter
+@Setter
+@TableName("fs_store_hospital580_prescription_chat_scrm")
+@ApiModel(value = "FsStoreHospital580PrescriptionChatScrmEntity对象", description = "问诊单聊天记录信息")
+public class Hospital580PrescriptionChatScrmEntity extends Model<Hospital580PrescriptionChatScrmEntity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("聊天表主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("聊天记录信息json数组")
+    @TableField("content")
+    private String content;
+
+
+    @ApiModelProperty("处方id")
+    @TableField("pre_id")
+    private Long preId;
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 80 - 0
fs-service/src/main/java/com/fs/hospital580/entity/Hospital580PrescriptionMedicineScrmEntity.java

@@ -0,0 +1,80 @@
+package com.fs.hospital580.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 处方药品明细表
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-26
+ */
+@Getter
+@Setter
+@TableName("fs_store_hospital580_prescription_medicine_scrm")
+@ApiModel(value = "FsStoreHospital580PrescriptionMedicineScrmEntity对象", description = "处方药品明细表")
+public class Hospital580PrescriptionMedicineScrmEntity extends Model<Hospital580PrescriptionMedicineScrmEntity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("处方订单ID")
+    @TableField("pre_id")
+    private Long preId;
+
+    @ApiModelProperty("药品通用名")
+    @TableField("drug_common_name")
+    private String drugCommonName;
+
+    @ApiModelProperty("药品名称")
+    @TableField("drug_name")
+    private String drugName;
+
+    @ApiModelProperty("药品数量")
+    @TableField("amount")
+    private Integer amount;
+
+    @ApiModelProperty("药品用法用量说明")
+    @TableField("instructions")
+    private String instructions;
+
+    @ApiModelProperty("商品规格")
+    @TableField("spec")
+    private String spec;
+
+    @ApiModelProperty("三方商品编码")
+    @TableField("commodity_code")
+    private String commodityCode;
+
+    @ApiModelProperty("580药品id")
+    @TableField("medicine_id")
+    private Long medicineId;
+
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private LocalDateTime createdTime;
+
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private LocalDateTime updatedTime;
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 201 - 0
fs-service/src/main/java/com/fs/hospital580/entity/Hospital580PrescriptionScrmEntity.java

@@ -0,0 +1,201 @@
+package com.fs.hospital580.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 问诊订单主表
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-30
+ */
+@Getter
+@Setter
+@TableName("fs_store_hospital580_prescription_scrm")
+@ApiModel(value = "FsStoreHospital580PrescriptionScrmEntity对象", description = "问诊订单主表")
+public class Hospital580PrescriptionScrmEntity extends Model<Hospital580PrescriptionScrmEntity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "pre_id", type = IdType.AUTO)
+    private Long preId;
+
+    @ApiModelProperty("用户id")
+    @TableField("user_id")
+    private Long userId;
+
+    @ApiModelProperty("服务类型:0-图文,1-视频")
+    @TableField("service_type")
+    private Byte serviceType;
+
+    @ApiModelProperty("是否需要审方:0-不需要,1-需要")
+    @TableField("is_examine")
+    private Byte isExamine;
+
+    @ApiModelProperty("是否孕妇:0-否,1-是")
+    @TableField("is_pregnant_woman")
+    private Byte isPregnantWoman;
+
+    @ApiModelProperty("是否哺乳期:0-否,1-是")
+    @TableField("is_lactation")
+    private Byte isLactation;
+
+    @ApiModelProperty("来源:0-微信小程序,1-APP,2-H5,3-支付宝小程序")
+    @TableField("souce_from")
+    private Byte souceFrom;
+
+    @ApiModelProperty("用药人姓名")
+    @TableField("user_family_name")
+    private String userFamilyName;
+
+    @ApiModelProperty("身份证")
+    @TableField("user_family_id_card")
+    private String userFamilyIdCard;
+
+    @ApiModelProperty("年龄")
+    @TableField("user_family_age")
+    private Integer userFamilyAge;
+
+    @ApiModelProperty("性别:1-男,2-女")
+    @TableField("user_family_gender")
+    private Byte userFamilyGender;
+
+    @ApiModelProperty("手机号码")
+    @TableField("user_family_phone")
+    private String userFamilyPhone;
+
+    @ApiModelProperty("关系:1-本人,2-父母,3-配偶,4-子女,5-其他")
+    @TableField("relationship")
+    private Byte relationship;
+
+    @ApiModelProperty("就诊人住址(最多30个字符)")
+    @TableField("user_family_addr")
+    private String userFamilyAddr;
+
+    @ApiModelProperty("图片附件URL,多个以英文逗号隔开")
+    @TableField("img_list")
+    private String imgList;
+
+    @ApiModelProperty("结束问诊后跳回三方的地址")
+    @TableField("third_return_url")
+    private String thirdReturnUrl;
+
+    @ApiModelProperty("创建时间")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("处方id(580)")
+    @TableField("pid")
+    private Long pid;
+
+    @ApiModelProperty("医院名称")
+    @TableField("hospital_name")
+    private String hospitalName;
+
+    @ApiModelProperty("药店ID")
+    @TableField("store_id")
+    private Long storeId;
+
+    @ApiModelProperty("药店名称")
+    @TableField("store_name")
+    private String storeName;
+
+    @ApiModelProperty("问诊单ID(580)")
+    @TableField("diagnosis_id")
+    private Long diagnosisId;
+
+    @ApiModelProperty("医生签名时间")
+    @TableField("doctor_sign_time")
+    private LocalDateTime doctorSignTime;
+
+    @ApiModelProperty("医生ID")
+    @TableField("doctor_id")
+    private Long doctorId;
+
+    @ApiModelProperty("医生科室")
+    @TableField("doctor_office")
+    private String doctorOffice;
+
+    @ApiModelProperty("医生姓名")
+    @TableField("doctor_name")
+    private String doctorName;
+
+    @ApiModelProperty("诊断标签")
+    @TableField("tags")
+    private String tags;
+
+    @ApiModelProperty("处方状态(1正常 2已作废 )")
+    @TableField("status")
+    private Byte status;
+
+    @ApiModelProperty("备注")
+    @TableField("memo")
+    private String memo;
+
+    @ApiModelProperty("说明")
+    @TableField("remarks")
+    private String remarks;
+
+    @ApiModelProperty("审核不通过的理由(可能为空)")
+    @TableField("reason")
+    private String reason;
+
+    @ApiModelProperty("处方图片地址")
+    @TableField("dst_file_path")
+    private String dstFilePath;
+
+    @ApiModelProperty("创建时间/开方时间")
+    @TableField("created_time")
+    private LocalDateTime createdTime;
+
+    @ApiModelProperty("处方编号")
+    @TableField("serial_no")
+    private String serialNo;
+
+    @ApiModelProperty("处方审核状态:1为待审核,2为审核通过,3为审核不通过")
+    @TableField("audit_status")
+    private Boolean auditStatus;
+
+    @ApiModelProperty("审方时间")
+    @TableField("audit_time")
+    private LocalDateTime auditTime;
+
+    @ApiModelProperty("审方药师名称")
+    @TableField("audit_apothecary_name")
+    private String auditApothecaryName;
+
+    @ApiModelProperty("问诊知情确认页面URL")
+    @TableField("jump_url")
+    private String jumpUrl;
+
+    @ApiModelProperty("开方情况0未开方1开方2拒绝")
+    @TableField("prescription_status")
+    private Byte prescriptionStatus;
+
+    @ApiModelProperty("商城订单id")
+    @TableField("store_order_id")
+    private Long storeOrderId;
+
+
+    @Override
+    public Serializable pkVal() {
+        return this.preId;
+    }
+}

+ 63 - 0
fs-service/src/main/java/com/fs/hospital580/entity/Hospital580ProductPushScrmEntity.java

@@ -0,0 +1,63 @@
+package com.fs.hospital580.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 商品推送记录
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-26
+ */
+@Getter
+@Setter
+@TableName("fs_store_hospital580_product_push_scrm")
+@ApiModel(value = "FsStoreHospital580ProductPushScrmEntity对象", description = "商品推送记录")
+public class Hospital580ProductPushScrmEntity extends Model<Hospital580ProductPushScrmEntity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("商品id")
+    @TableField("product_id")
+    private Long productId;
+
+    @ApiModelProperty("推送状态 0推送中1成功2失败")
+    @TableField("push_status")
+    private Byte pushStatus;
+
+    @ApiModelProperty("失败原因")
+    @TableField("err_msg")
+    private String errMsg;
+
+    @ApiModelProperty("推送时间")
+    @TableField(value = "create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("收到结果时间")
+    @TableField(value = "update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("请求id")
+    @TableField("request_id")
+    private Long requestId;
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 63 - 0
fs-service/src/main/java/com/fs/hospital580/entity/Hospital580ScrmEntity.java

@@ -0,0 +1,63 @@
+package com.fs.hospital580.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 请求580医院记录表
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-25
+ */
+@Getter
+@Setter
+@TableName("fs_store_hospital580_scrm")
+@ApiModel(value = "FsStoreHospital580ScrmEntity对象", description = "请求580医院记录表")
+@Builder
+public class Hospital580ScrmEntity extends Model<Hospital580ScrmEntity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("请求地址")
+    @TableField("request")
+    private String request;
+
+    @ApiModelProperty("请求参数")
+    @TableField("request_parm")
+    private String requestParm;
+
+    @ApiModelProperty("请求响应")
+    @TableField("response")
+    private String response;
+
+    @ApiModelProperty("请求成功状态1是0否")
+    @TableField("request_status")
+    private Boolean requestStatus;
+
+    @ApiModelProperty("创建时间")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 18 - 0
fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580PrescriptionAnswerScrmMapper.java

@@ -0,0 +1,18 @@
+package com.fs.hospital580.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.hospital580.entity.Hospital580PrescriptionAnswerScrmEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 问诊问答明细表 Mapper 接口
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-25
+ */
+@Mapper
+public interface Hospital580PrescriptionAnswerScrmMapper extends BaseMapper<Hospital580PrescriptionAnswerScrmEntity> {
+
+}

+ 18 - 0
fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580PrescriptionChatScrmMapper.java

@@ -0,0 +1,18 @@
+package com.fs.hospital580.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.hospital580.entity.Hospital580PrescriptionChatScrmEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 问诊单聊天记录信息 Mapper 接口
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-28
+ */
+@Mapper
+public interface Hospital580PrescriptionChatScrmMapper extends BaseMapper<Hospital580PrescriptionChatScrmEntity> {
+
+}

+ 18 - 0
fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580PrescriptionMedicineScrmMapper.java

@@ -0,0 +1,18 @@
+package com.fs.hospital580.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.hospital580.entity.Hospital580PrescriptionMedicineScrmEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 处方药品明细表 Mapper 接口
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-26
+ */
+@Mapper
+public interface Hospital580PrescriptionMedicineScrmMapper extends BaseMapper<Hospital580PrescriptionMedicineScrmEntity> {
+
+}

+ 18 - 0
fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580PrescriptionScrmMapper.java

@@ -0,0 +1,18 @@
+package com.fs.hospital580.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.hospital580.entity.Hospital580PrescriptionScrmEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 问诊订单主表 Mapper 接口
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-25
+ */
+@Mapper
+public interface Hospital580PrescriptionScrmMapper extends BaseMapper<Hospital580PrescriptionScrmEntity> {
+
+}

+ 18 - 0
fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580ProductPushScrmMapper.java

@@ -0,0 +1,18 @@
+package com.fs.hospital580.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.hospital580.entity.Hospital580ProductPushScrmEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 商品推送记录 Mapper 接口
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-26
+ */
+@Mapper
+public interface Hospital580ProductPushScrmMapper extends BaseMapper<Hospital580ProductPushScrmEntity> {
+
+}

+ 18 - 0
fs-service/src/main/java/com/fs/hospital580/mapper/Hospital580ScrmMapper.java

@@ -0,0 +1,18 @@
+package com.fs.hospital580.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.hospital580.entity.Hospital580ScrmEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 请求580医院记录表 Mapper 接口
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-25
+ */
+@Mapper
+public interface Hospital580ScrmMapper extends BaseMapper<Hospital580ScrmEntity> {
+
+}

+ 45 - 0
fs-service/src/main/java/com/fs/hospital580/mapper/MedicineMapper.java

@@ -0,0 +1,45 @@
+package com.fs.hospital580.mapper;
+
+import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hospital580.dto.Medicine;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Named;
+import org.mapstruct.factory.Mappers;
+
+import java.math.BigDecimal;
+
+@Mapper
+public interface MedicineMapper {
+
+    MedicineMapper INSTANCE = Mappers.getMapper(MedicineMapper.class);
+
+    // @Mapping(source = "", target = "categoryId")
+    @Mapping(source = "productName", target = "commonName")
+    @Mapping(source = "productName", target = "name")
+    @Mapping(source = "dosageForm", target = "dosage")
+    @Mapping(source = "dosage", target = "spec")
+    @Mapping(source = "prescribeSpec", target = "packingSpec")
+    @Mapping(source = "manufacturer", target = "manufacturer")
+    @Mapping(source = "drugRegCertNo", target = "approvalNumber")
+    @Mapping(source = "unitName", target = "unit")
+    @Mapping(source = "productId", target = "medicineId", qualifiedByName = "longToString")
+    @Mapping(source = "barCode", target = "barCode")
+    @Mapping(source = "productType", target = "isPrescription")
+    @Mapping(source = "price", target = "price",qualifiedByName = "bigDecimalToString")
+    @Mapping(source = "stock", target = "stock")
+    Medicine toMedicine(FsStoreProductScrm product);
+
+    /**
+     * 将Long转换为String
+     */
+    @Named("longToString")
+    default String longToString(Long value) {
+        return value != null ? String.valueOf(value) : null;
+    }
+
+    @Named("bigDecimalToString")
+    default String bigDecimalToString(BigDecimal value) {
+        return value != null ? value.toString() : null;
+    }
+}

+ 16 - 0
fs-service/src/main/java/com/fs/hospital580/service/Hospital580PrescriptionAnswerScrmService.java

@@ -0,0 +1,16 @@
+package com.fs.hospital580.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.hospital580.entity.Hospital580PrescriptionAnswerScrmEntity;
+
+/**
+ * <p>
+ * 问诊问答明细表 服务类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-25
+ */
+public interface Hospital580PrescriptionAnswerScrmService extends IService<Hospital580PrescriptionAnswerScrmEntity> {
+
+}

+ 16 - 0
fs-service/src/main/java/com/fs/hospital580/service/Hospital580PrescriptionChatScrmService.java

@@ -0,0 +1,16 @@
+package com.fs.hospital580.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.hospital580.entity.Hospital580PrescriptionChatScrmEntity;
+
+/**
+ * <p>
+ * 问诊单聊天记录信息 服务类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-28
+ */
+public interface Hospital580PrescriptionChatScrmService extends IService<Hospital580PrescriptionChatScrmEntity> {
+
+}

+ 16 - 0
fs-service/src/main/java/com/fs/hospital580/service/Hospital580PrescriptionMedicineScrmService.java

@@ -0,0 +1,16 @@
+package com.fs.hospital580.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.hospital580.entity.Hospital580PrescriptionMedicineScrmEntity;
+
+/**
+ * <p>
+ * 处方药品明细表 服务类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-26
+ */
+public interface Hospital580PrescriptionMedicineScrmService extends IService<Hospital580PrescriptionMedicineScrmEntity> {
+
+}

+ 19 - 0
fs-service/src/main/java/com/fs/hospital580/service/Hospital580PrescriptionScrmService.java

@@ -0,0 +1,19 @@
+package com.fs.hospital580.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.hospital580.entity.Hospital580PrescriptionScrmEntity;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 问诊订单主表 服务类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-25
+ */
+public interface Hospital580PrescriptionScrmService extends IService<Hospital580PrescriptionScrmEntity> {
+
+    boolean isByStoreOrder(Long storeOrderId);
+}

+ 16 - 0
fs-service/src/main/java/com/fs/hospital580/service/Hospital580ProductPushScrmService.java

@@ -0,0 +1,16 @@
+package com.fs.hospital580.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.hospital580.entity.Hospital580ProductPushScrmEntity;
+
+/**
+ * <p>
+ * 商品推送记录 服务类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-26
+ */
+public interface Hospital580ProductPushScrmService extends IService<Hospital580ProductPushScrmEntity> {
+
+}

+ 20 - 0
fs-service/src/main/java/com/fs/hospital580/service/Hospital580ScrmService.java

@@ -0,0 +1,20 @@
+package com.fs.hospital580.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.hospital580.entity.Hospital580ScrmEntity;
+
+/**
+ * <p>
+ * 请求580医院记录表 服务类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-25
+ */
+public interface Hospital580ScrmService extends IService<Hospital580ScrmEntity> {
+    /**
+     * 同步药品信息到580医院
+     */
+    void SynDrugToHospital580(Long[] productIds);
+    // void SynDrugToHospital580(List<FsStoreProductScrm> productScrms);
+}

+ 26 - 0
fs-service/src/main/java/com/fs/hospital580/service/Hospital580Service.java

@@ -0,0 +1,26 @@
+package com.fs.hospital580.service;
+
+
+import com.fs.hospital580.dto.*;
+
+public interface Hospital580Service {
+    /**
+     * 同步药品信息接口
+     */
+    Result580 syncMedicine(MedicineDto dto);
+
+    /**
+     * 新增问诊单接口
+     */
+    Result580 initPreDemand(PreDemandDto dto);
+
+    /**
+     * 查询诊断
+     */
+    Result580 disease(DiseaseDto dto);
+
+    /**
+     * 查询聊天记录
+     */
+    Result580 textRecord(TextRecordDto dto);
+}

+ 20 - 0
fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580PrescriptionAnswerScrmServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fs.hospital580.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.hospital580.entity.Hospital580PrescriptionAnswerScrmEntity;
+import com.fs.hospital580.mapper.Hospital580PrescriptionAnswerScrmMapper;
+import com.fs.hospital580.service.Hospital580PrescriptionAnswerScrmService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 问诊问答明细表 服务实现类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-25
+ */
+@Service
+public class Hospital580PrescriptionAnswerScrmServiceImpl extends ServiceImpl<Hospital580PrescriptionAnswerScrmMapper, Hospital580PrescriptionAnswerScrmEntity> implements Hospital580PrescriptionAnswerScrmService {
+
+}

+ 20 - 0
fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580PrescriptionChatScrmServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fs.hospital580.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.hospital580.entity.Hospital580PrescriptionChatScrmEntity;
+import com.fs.hospital580.mapper.Hospital580PrescriptionChatScrmMapper;
+import com.fs.hospital580.service.Hospital580PrescriptionChatScrmService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 问诊单聊天记录信息 服务实现类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-28
+ */
+@Service
+public class Hospital580PrescriptionChatScrmServiceImpl extends ServiceImpl<Hospital580PrescriptionChatScrmMapper, Hospital580PrescriptionChatScrmEntity> implements Hospital580PrescriptionChatScrmService {
+
+}

+ 20 - 0
fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580PrescriptionMedicineScrmServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fs.hospital580.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.hospital580.entity.Hospital580PrescriptionMedicineScrmEntity;
+import com.fs.hospital580.mapper.Hospital580PrescriptionMedicineScrmMapper;
+import com.fs.hospital580.service.Hospital580PrescriptionMedicineScrmService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 处方药品明细表 服务实现类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-26
+ */
+@Service
+public class Hospital580PrescriptionMedicineScrmServiceImpl extends ServiceImpl<Hospital580PrescriptionMedicineScrmMapper, Hospital580PrescriptionMedicineScrmEntity> implements Hospital580PrescriptionMedicineScrmService {
+
+}

+ 25 - 0
fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580PrescriptionScrmServiceImpl.java

@@ -0,0 +1,25 @@
+package com.fs.hospital580.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.hospital580.entity.Hospital580PrescriptionScrmEntity;
+import com.fs.hospital580.mapper.Hospital580PrescriptionScrmMapper;
+import com.fs.hospital580.service.Hospital580PrescriptionScrmService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 问诊订单主表 服务实现类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-25
+ */
+@Service
+public class Hospital580PrescriptionScrmServiceImpl extends ServiceImpl<Hospital580PrescriptionScrmMapper, Hospital580PrescriptionScrmEntity> implements Hospital580PrescriptionScrmService {
+
+    @Override
+    public boolean isByStoreOrder(Long storeOrderId) {
+        return this.count(new LambdaQueryWrapper<Hospital580PrescriptionScrmEntity>().eq(Hospital580PrescriptionScrmEntity::getStoreOrderId, storeOrderId)) > 0;
+    }
+}

+ 20 - 0
fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580ProductPushScrmServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fs.hospital580.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.hospital580.entity.Hospital580ProductPushScrmEntity;
+import com.fs.hospital580.mapper.Hospital580ProductPushScrmMapper;
+import com.fs.hospital580.service.Hospital580ProductPushScrmService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 商品推送记录 服务实现类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-26
+ */
+@Service
+public class Hospital580ProductPushScrmServiceImpl extends ServiceImpl<Hospital580ProductPushScrmMapper, Hospital580ProductPushScrmEntity> implements Hospital580ProductPushScrmService {
+
+}

+ 83 - 0
fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580ScrmServiceImpl.java

@@ -0,0 +1,83 @@
+package com.fs.hospital580.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hisStore.service.IFsStoreProductScrmService;
+import com.fs.hospital580.dto.Medicine;
+import com.fs.hospital580.dto.MedicineDto;
+import com.fs.hospital580.dto.Result580;
+import com.fs.hospital580.entity.Hospital580ProductPushScrmEntity;
+import com.fs.hospital580.entity.Hospital580ScrmEntity;
+import com.fs.hospital580.mapper.Hospital580ScrmMapper;
+import com.fs.hospital580.mapper.MedicineMapper;
+import com.fs.hospital580.service.Hospital580ProductPushScrmService;
+import com.fs.hospital580.service.Hospital580ScrmService;
+import com.fs.hospital580.service.Hospital580Service;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 请求580医院记录表 服务实现类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-09-25
+ */
+@Service
+public class Hospital580ScrmServiceImpl extends ServiceImpl<Hospital580ScrmMapper, Hospital580ScrmEntity> implements Hospital580ScrmService {
+
+    @Autowired
+    private Hospital580Service hospital580Service;
+    @Autowired
+    private Hospital580ProductPushScrmService pushScrmService;
+    @Autowired
+    private IFsStoreProductScrmService fsStoreProductScrmService;
+
+/*    @Override
+    public void SynDrugToHospital580(FsStoreProductScrm productScrm) {
+        MedicineDto medicineDto = new MedicineDto();
+        // 使用MapStruct自动映射
+        Medicine medicine = MedicineMapper.INSTANCE.toMedicine(productScrm);
+        medicineDto.setMedicineList(Arrays.asList(medicine));
+        syncMedicine(medicineDto);
+    }*/
+
+    @Override
+    public void SynDrugToHospital580(Long[] productIds) {
+        List<FsStoreProductScrm> fsStoreProductScrms = fsStoreProductScrmService.selectProductByIds(productIds);
+        MedicineDto medicineDto = new MedicineDto();
+        medicineDto.setMedicineList(convertToMedicines(fsStoreProductScrms));
+        syncMedicine(medicineDto);
+    }
+
+    private void syncMedicine(MedicineDto medicineDto) {
+        Result580 result580 = hospital580Service.syncMedicine(medicineDto);
+        if (result580.getErr() == 0) {
+            List<Hospital580ProductPushScrmEntity> collect = medicineDto.getMedicineList().stream().map(item -> {
+                Hospital580ProductPushScrmEntity productPushScrmEntity = new Hospital580ProductPushScrmEntity();
+                productPushScrmEntity.setProductId(Long.valueOf(item.getMedicineId()));
+                productPushScrmEntity.setPushStatus((byte) 0);
+                productPushScrmEntity.setCreateTime(LocalDateTime.now());
+                productPushScrmEntity.setRequestId(result580.getRequestId());
+                return productPushScrmEntity;
+            }).collect(Collectors.toList());
+            pushScrmService.saveBatch(collect);
+        }else {
+            throw new RuntimeException("同步药品失败"+result580.getErrmsg());
+        }
+    }
+
+    /**
+     * 批量转换FsStoreProductScrm列表到Medicine列表
+     */
+    public List<Medicine> convertToMedicines(List<FsStoreProductScrm> products) {
+        return products.stream()
+                .map(MedicineMapper.INSTANCE::toMedicine)
+                .collect(Collectors.toList());
+    }
+}

+ 146 - 0
fs-service/src/main/java/com/fs/hospital580/service/impl/Hospital580ServiceImpl.java

@@ -0,0 +1,146 @@
+package com.fs.hospital580.service.impl;
+
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONUtil;
+import com.fs.hospital580.dto.*;
+import com.fs.hospital580.entity.Hospital580ScrmEntity;
+import com.fs.hospital580.service.Hospital580Service;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+
+@Service
+@Slf4j
+public class Hospital580ServiceImpl implements Hospital580Service {
+    @Value("${hospital580.url:''}")
+    private String HOSPITAL_580_URL;
+    @Value("${hospital580.clientId:''}")
+    private String CLIENTID;
+    @Value("${hospital580.secretKey:''}")
+    private String SECRETKEY;
+    @Value("${hospital580.storeId:''}")
+    private String storeId;
+    @Value("${hospital580.callbackUrl:''}")
+    private String CALLBACKURL;
+    /**
+     * 4.7 同步药品信息接口-580提供
+     */
+    private static final String MEDICINE_PATH = "/v1_0/ehospital/openapi/kz/medicine/sync";
+    /**
+     * 4.2新 新增问诊单接口-580提供
+     */
+    private static final String PREDEMAND_PATH = "/v1_0/ehospital/openapi/kz/web/predemand/initPreDemand";
+    /**
+     * 5、查询诊断
+     */
+    private static final String DISEASE_PATH = "/v2_0/ehospital/openapi/diagnosis/disease/query";
+
+    private static final String TEXTRECORD_PATH = "/v1_0/ehospital/openapi/kz/textRecord/list";
+
+    @Override
+    public Result580 syncMedicine(MedicineDto dto) {
+        dto.setCallbackUrl(CALLBACKURL);
+        return requestResult580(dto, MEDICINE_PATH);
+
+    }
+
+
+    @Override
+    public Result580 initPreDemand(PreDemandDto dto) {
+        dto.setStoreId(storeId);
+        return requestResult580(dto, PREDEMAND_PATH);
+    }
+
+    @Override
+    public Result580 disease(DiseaseDto dto) {
+        return requestResult580(dto, DISEASE_PATH);
+    }
+
+    @Override
+    public Result580 textRecord(TextRecordDto dto) {
+        return requestResult580(dto, TEXTRECORD_PATH);
+    }
+
+    private <T extends CommonDto> Result580 requestResult580(T t, String path) {
+        t.initCommonDto(CLIENTID, SECRETKEY);
+        String url = HOSPITAL_580_URL + path;
+        String body = JSONUtil.toJsonStr(t);
+        String result;
+        Result580 result580;
+        boolean requestStatus;
+        try {
+            log.info("请求580接口:{}", body);
+            result = HttpRequest.post(url)
+                    .body(body)//表单内容
+                    .timeout(10000)//超时,毫秒
+                    .execute().body();
+            log.info("请求580接口返回:{}", result);
+            result580 = JSONUtil.toBean(result, Result580.class);
+            requestStatus = true;
+        } catch (Exception e) {
+            log.info("请求580接口异常:", e);
+            result580 = new Result580(e.getMessage());
+            requestStatus = false;
+            result="";
+        }
+        /*
+          保存调用记录
+         */
+        Hospital580ScrmEntity build = Hospital580ScrmEntity.builder()
+                .request(url)
+                .requestParm(body)
+                .response(result)
+                .requestStatus(requestStatus)
+                .createTime(LocalDateTime.now())
+                .build();
+        build.insert();
+        result580.setRequestId(build.getId());
+        return result580;
+    }
+
+    /*public static void main(String[] args) {
+        // 创建测试实例
+        Hospital580ServiceImpl service = new Hospital580ServiceImpl();
+
+        // 创建测试数据
+        MedicineDto dto = new MedicineDto();
+        //dto.setCallbackUrl("http://localhost:8080/callback");
+
+        List<Medicine> medicineList = new ArrayList<>();
+
+        // 添加测试药品数据
+        Medicine medicine = new Medicine();
+        medicine.setCategoryId(0); // 西药
+        medicine.setCommonName("阿司匹林肠溶片");
+        medicine.setName("拜阿司匹灵");
+        medicine.setDosage("片剂");
+        medicine.setSpec("0.25g*12粒");
+        medicine.setPackingSpec("30片/盒");
+        medicine.setManufacturer("拜耳医药保健有限公司");
+        medicine.setApprovalNumber("国药准字H10980126");
+        medicine.setUnit("盒");
+        medicine.setMedicineId("MED123456");
+        medicine.setBarCode("6920228888888");
+        medicine.setIsPrescription(0);
+        medicine.setPrice(25.80);
+        medicine.setStock(1000);
+        medicine.setSpecialCommonName("");
+        medicine.setSpecialSpec("");
+
+        medicineList.add(medicine);
+
+
+        dto.setMedicineList(medicineList);
+
+        // 调用测试方法
+        System.out.println("开始测试 medicine 接口...");
+        dto.setSign(ObjectApiSignUtil.getSign(dto, SECRETKEY));
+        System.out.println("签名:" + JSONUtil.toJsonStr(dto));
+        service.medicine(dto);
+        System.out.println("测试完成");
+    }*/
+
+}

+ 43 - 0
fs-service/src/main/java/com/fs/hospital580/util/MD5Util.java

@@ -0,0 +1,43 @@
+package com.fs.hospital580.util;
+
+import java.security.MessageDigest;
+
+public class MD5Util {
+
+    private static String byteArrayToHexString(byte b[]) {
+        StringBuffer resultSb = new StringBuffer();
+        for (int i = 0; i < b.length; i++)
+            resultSb.append(byteToHexString(b[i]));
+
+        return resultSb.toString();
+    }
+
+    private static String byteToHexString(byte b) {
+        int n = b;
+        if (n < 0)
+            n += 256;
+        int d1 = n / 16;
+        int d2 = n % 16;
+        return hexDigits[d1] + hexDigits[d2];
+    }
+
+    public static String MD5Encode(String origin, String charsetname) {
+        String resultString = null;
+        try {
+            resultString = new String(origin);
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            if (charsetname == null || "".equals(charsetname))
+                resultString = byteArrayToHexString(md.digest(resultString
+                        .getBytes()));
+            else
+                resultString = byteArrayToHexString(md.digest(resultString
+                        .getBytes(charsetname)));
+        } catch (Exception exception) {
+        }
+        return resultString;
+    }
+
+    private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5",
+            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
+
+}

+ 225 - 0
fs-service/src/main/java/com/fs/hospital580/util/ObjectApiSignUtil.java

@@ -0,0 +1,225 @@
+package com.fs.hospital580.util;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+/**
+ * ClassName: ObjectApiSignUtil<br/>
+ * Function: 签名<br/>
+ * Date: 2019-08-21 14:20<br/>
+ *
+ * @author km
+ */
+@Slf4j
+public class ObjectApiSignUtil {
+
+    /**
+     * 根据对应请求参数与对应serverCode获取secretKey进行签名并返回。
+     * 对signature参数不做签名
+     *
+     * @param paramMaps 参数
+     * @param secretKey clientId的secret
+     * @return 加密结果
+     */
+    public static String getSign(Map<String, Object> paramMaps, String secretKey) {
+        //按照自然排序
+        SortedMap<String, Object> sortedMap = new TreeMap<>(paramMaps);
+        String signString = ObjectApiSignUtil.getUrlSortParamsByMap(sortedMap);
+        signString += secretKey;
+        log.info("签名字符串为:{}", signString);
+        return MD5Util.MD5Encode(signString, "UTF-8").toUpperCase();
+    }
+
+    /**
+     * 根据对应请求参数与对应serverCode获取secretKey进行签名并返回。
+     * 对signature参数不做签名
+     *
+     * @param object    参数
+     * @param secretKey clientId的secretKey
+     * @return 加密结果
+     */
+    public static String getSign(Object object, String secretKey) {
+        ObjectMapper mapper = new ObjectMapper();
+        Map<String, Object> map = mapper.convertValue(object, new TypeReference<Map<String, Object>>() {
+        });
+
+        // 按照自然排序
+        SortedMap<String, Object> sortedMap = new TreeMap<>(map);
+        String signString = ObjectApiSignUtil.getUrlSortParamsByMap(sortedMap);
+        signString += secretKey;
+        log.info("签名字符串为:{}", signString);
+        return MD5Util.MD5Encode(signString, "UTF-8").toUpperCase();
+    }
+
+    /**
+     * 对map排序(key-value格式)
+     *
+     * @param map 入参
+     * @return 排序后的结果
+     */
+    public static String getUrlSortParamsByMap(Map<String, Object> map) {
+        if (map == null) {
+            return "";
+        }
+
+        // 定义拼接对象
+        StringBuilder stringBuffer = new StringBuilder();
+        SortedMap<String, Object> sortedMap = new TreeMap<>(map); // 对Map做排序处理
+
+        // 遍历Map对象
+        for (Map.Entry<String, Object> entry : sortedMap.entrySet()) {
+            // 获取key
+            String key = entry.getKey();
+
+            // sign字段不参与签名
+            if ("sign".equals(key)) {
+                continue;
+            }
+
+            // 获取加密对象
+            Object value = entry.getValue();
+
+            // 如果加密对象是空,或者空字符串,则不作加密
+            if (null == value || "".equals(value)) {
+                continue;
+            }
+
+            // 如果加密对象是数组,则调用数组排序方法
+            if (value instanceof Object[]) {
+                Object[] objects = (Object[]) value;
+                stringBuffer.append(key).append("=")
+                        .append(ObjectApiSignUtil.getSignStringByList(Arrays.asList(objects))).append("&");
+            } else if (value instanceof List) {
+                // 如果加密对象是列表,则调用列表排序方法
+                stringBuffer.append(key).append("=")
+                        .append(ObjectApiSignUtil.getSignStringByList((List) value)).append("&");
+            } else if (value instanceof Map) {
+                // 如果加密对象是Map,则递归当前方法
+                stringBuffer.append(key).append("=")
+                        .append(ObjectApiSignUtil.getSignStringByMap((Map) value)).append("&");
+            } else {
+                // 否则直接拼接对象转字符串值
+                stringBuffer.append(key).append("=").append(value.toString()).append("&");
+            }
+        }
+
+        stringBuffer.append("key=");
+        return stringBuffer.toString();
+    }
+
+    /**
+     * 对map排序
+     *
+     * @param map 入参
+     * @return 排序后的结果
+     */
+    public static String getSignStringByMap(Map<String, Object> map) {
+        if (map == null) {
+            return null;
+        }
+
+        // 定义拼接对象
+        StringBuilder stringBuffer = new StringBuilder();
+        stringBuffer.append("{");
+        SortedMap<String, Object> sortedMap = new TreeMap<>(map); // 对Map做排序处理
+
+        // 遍历Map对象
+        for (Map.Entry<String, Object> entry : sortedMap.entrySet()) {
+            // 获取key
+            String key = entry.getKey();
+
+            // 获取加密对象
+            Object value = entry.getValue();
+
+            // 如果加密对象是空,或者空字符串,则不作加密
+            if (null == value || "".equals(value)) {
+                continue;
+            }
+
+            // 如果加密对象是数组,则调用数组排序方法
+            if (value instanceof Object[]) {
+                Object[] objects = (Object[]) value;
+                stringBuffer.append(key).append(":")
+                        .append(ObjectApiSignUtil.getSignStringByList(Arrays.asList(objects))).append(",");
+            } else if (value instanceof List) {
+                // 如果加密对象是列表,则调用列表排序方法
+                stringBuffer.append(key).append(":")
+                        .append(ObjectApiSignUtil.getSignStringByList((List) value)).append(",");
+            } else if (value instanceof Map) {
+                // 如果加密对象是Map,则递归当前方法
+                stringBuffer.append(key).append(":")
+                        .append(ObjectApiSignUtil.getSignStringByMap((Map) value)).append(",");
+            } else {
+                // 否则直接拼接对象转字符串值
+                stringBuffer.append(key).append(":").append(value.toString()).append(",");
+            }
+        }
+
+        // 移除最后一个逗号
+        if (stringBuffer.length() > 1) {
+            stringBuffer.deleteCharAt(stringBuffer.length() - 1);
+        }
+        stringBuffer.append("}");
+
+        return stringBuffer.toString();
+    }
+
+    /**
+     * 对list排序
+     *
+     * @param list 列表
+     * @return 排序后的结果
+     */
+    public static String getSignStringByList(List list) {
+        // 如果列表为空,则直接返回
+        if (null == list) {
+            return null;
+        } else if (list.isEmpty()) {
+            // 如果列表长度为0,则返回空长度字符串
+            return "[]";
+        }
+
+        // 定义拼接对象
+        StringBuilder stringBuffer = new StringBuilder();
+        stringBuffer.append("[");
+
+        // 遍历处理列表
+        for (Object object : list) {
+            // 如果对象是空,或者空字符串,则跳过
+            if (null == object || "".equals(object)) {
+                continue;
+            }
+
+            // 如果加密对象是数组,则调用数组排序方法
+            if (object instanceof Object[]) {
+                Object[] objects = (Object[]) object;
+                stringBuffer.append(ObjectApiSignUtil.getSignStringByList(Arrays.asList(objects))).append(",");
+            } else if (object instanceof List) {
+                // 如果加密对象是列表,则递归当前方法
+                stringBuffer.append(ObjectApiSignUtil.getSignStringByList((List) object)).append(",");
+            } else if (object instanceof Map) {
+                // 如果加密对象是Map,则调用Map排序方法
+                stringBuffer.append(ObjectApiSignUtil.getSignStringByMap((Map) object)).append(",");
+            } else {
+                // 否则直接拼接对象转字符串值
+                stringBuffer.append(object.toString()).append(",");
+            }
+        }
+
+        // 移除最后一个逗号
+        if (stringBuffer.length() > 1) {
+            stringBuffer.deleteCharAt(stringBuffer.length() - 1);
+        }
+        stringBuffer.append("]");
+
+        return stringBuffer.toString();
+    }
+
+}

+ 43 - 0
fs-service/src/main/java/com/fs/hospital580/vo/AnswerDataVo.java

@@ -0,0 +1,43 @@
+package com.fs.hospital580.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 问诊题目请求
+ */
+@Data
+@ApiModel("问诊答案对象")
+public class AnswerDataVo {
+    @ApiModelProperty("固定 1,2,3,4,5")
+    private Integer subjectId;
+    @ApiModelProperty("题目:1-症状(列表接口获取),2-居民用药信息选择,3-是否使用过此类药物?,4-是否有药物过敏史?,5-肝肾功能是否有异常?")
+    private String title;
+    @ApiModelProperty("题目答案多个诊断用逗号分隔")
+    private String answer;
+    @ApiModelProperty("题目为2才传 问诊用药信息选择medicineId为药品id number为数量 [{\"medicineId\":\"1\",\"number\":1},{\"medicineId\":\"2\",\"number\":2}]")
+    private String answerMedicine;
+
+    public void setTitle() {
+        switch (subjectId) {
+            case 1:
+                this.title = "症状";
+                break;
+            case 2:
+                this.title = "用药信息";
+                break;
+            case 3:
+                this.title = "是否使用过此类药物";
+                break;
+            case 4:
+                this.title = "药物过敏史";
+                break;
+            case 5:
+                this.title = "肝肾功能异常";
+                break;
+            default:
+                this.title = "";
+        }
+    }
+}

+ 12 - 0
fs-service/src/main/java/com/fs/hospital580/vo/CommonVo.java

@@ -0,0 +1,12 @@
+package com.fs.hospital580.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CommonVo implements Serializable {
+    private String clientId ;
+    private String sign ;
+    private Long timeStamp ;
+}

+ 14 - 0
fs-service/src/main/java/com/fs/hospital580/vo/MedicineSyncVo.java

@@ -0,0 +1,14 @@
+package com.fs.hospital580.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class MedicineSyncVo extends CommonVo implements Serializable {
+    private String medicineIds;
+    private String errCode;
+    private String errMsg;
+}

+ 30 - 0
fs-service/src/main/java/com/fs/hospital580/vo/OrderChatScrmVo.java

@@ -0,0 +1,30 @@
+package com.fs.hospital580.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+@Getter
+@Setter
+@ApiModel("聊天记录vo")
+public class OrderChatScrmVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty("聊天表主键")
+    private Long id;
+
+    @ApiModelProperty("	聊天记录信息")
+    private String content;
+
+    @ApiModelProperty("目标(1是用户发送给医生,2是医生发送给用户)")
+    private Byte target;
+
+    @ApiModelProperty("类型(1是文字,2是图片,3是处方,4是诊疗详情,5是音频,12是患者信息问诊卡)")
+    private Byte type;
+    @ApiModelProperty("聊天时间")
+    private LocalDateTime createdTime;
+}

+ 81 - 0
fs-service/src/main/java/com/fs/hospital580/vo/OrderScrmVo.java

@@ -0,0 +1,81 @@
+package com.fs.hospital580.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+@Getter
+@Setter
+@ApiModel("问诊订单")
+public class OrderScrmVo {
+    @ApiModelProperty("主键ID")
+    private Long orderId;
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("服务类型:0-图文,1-视频")
+    private Byte serviceType;
+
+    @ApiModelProperty("是否需要审方:0-不需要,1-需要")
+    private Byte isExamine;
+
+    @ApiModelProperty("是否孕妇:0-否,1-是")
+    private Byte isPregnantWoman;
+
+    @ApiModelProperty("是否哺乳期:0-否,1-是")
+    private Byte isLactation;
+
+    @ApiModelProperty("来源:0-微信小程序,1-APP,2-H5,3-支付宝小程序")
+    private Byte souceFrom;
+
+    @ApiModelProperty("用药人姓名")
+    private String userFamilyName;
+
+    @ApiModelProperty("用药人身份证")
+    private String userFamilyIdCard;
+
+    @ApiModelProperty("年龄")
+    private Integer userFamilyAge;
+
+    @ApiModelProperty("性别:1-男,2-女")
+    private Byte userFamilyGender;
+
+    @ApiModelProperty("手机号码")
+    private String userFamilyPhone;
+
+    @ApiModelProperty("关系:1-本人,2-父母,3-配偶,4-子女,5-其他")
+    private Byte relationship;
+
+    @ApiModelProperty("就诊人住址(最多30个字符)")
+    private String userFamilyAddr;
+
+    @ApiModelProperty("图片附件URL,多个以英文逗号隔开")
+    private String imgList;
+
+    @ApiModelProperty("结束问诊后跳回三方的地址")
+    private String thirdReturnUrl;
+
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("问诊知情确认页面URL")
+    private String jumpUrl;
+
+    @ApiModelProperty("开方情况0未开方1开方2拒绝")
+    private Byte prescriptionStatus;
+
+    @ApiModelProperty("未开方原因")
+    private String reason;
+
+    @ApiModelProperty("答案信息")
+    private List<AnswerDataVo> drugRspList;
+}

+ 25 - 0
fs-service/src/main/java/com/fs/hospital580/vo/PrescriptionAdminQueryVo.java

@@ -0,0 +1,25 @@
+package com.fs.hospital580.vo;
+
+import com.fs.common.core.page.PageRequest;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PrescriptionAdminQueryVo extends PageRequest {
+    @ApiModelProperty("医院名称")
+    private String hospitalName;
+    @ApiModelProperty("药店名称")
+    private String storeName;
+    @ApiModelProperty("患者姓名")
+    private String userFamilyName;
+    @ApiModelProperty("患者手机号")
+    private String userFamilyPhone;
+    private String beginTime;
+    private String endTime;
+    @ApiModelProperty("处方审核状态:1为待审核,2为审核通过,3为审核不通过")
+    private Byte auditStatus;
+}

+ 146 - 0
fs-service/src/main/java/com/fs/hospital580/vo/PrescriptionAdminScrmVo.java

@@ -0,0 +1,146 @@
+package com.fs.hospital580.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+@Data
+public class PrescriptionAdminScrmVo implements Serializable {
+
+    @ApiModelProperty("主键ID")
+    private Long preId;
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("服务类型:0-图文,1-视频")
+    private Byte serviceType;
+
+    @ApiModelProperty("是否需要审方:0-不需要,1-需要")
+    private Byte isExamine;
+
+    @ApiModelProperty("是否孕妇:0-否,1-是")
+    private Byte isPregnantWoman;
+
+    @ApiModelProperty("是否哺乳期:0-否,1-是")
+    private Byte isLactation;
+
+    @ApiModelProperty("来源:0-微信小程序,1-APP,2-H5,3-支付宝小程序")
+    private Byte souceFrom;
+
+    @ApiModelProperty("就诊人姓名")
+    private String userFamilyName;
+
+    @ApiModelProperty("就诊人身份证")
+    private String userFamilyIdCard;
+
+    @ApiModelProperty("就诊人年龄")
+    private Integer userFamilyAge;
+
+    @ApiModelProperty("就诊人性别:1-男,2-女")
+    private Byte userFamilyGender;
+
+    @ApiModelProperty("就诊人手机号码")
+    private String userFamilyPhone;
+
+    @ApiModelProperty("关系:1-本人,2-父母,3-配偶,4-子女,5-其他")
+    private Boolean relationship;
+
+    @ApiModelProperty("就诊人住址(最多30个字符)")
+    private String userFamilyAddr;
+
+    @ApiModelProperty("图片附件URL,多个以英文逗号隔开")
+    private String imgList;
+
+    @ApiModelProperty("结束问诊后跳回三方的地址")
+    private String thirdReturnUrl;
+
+    @ApiModelProperty("问诊时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("处方id(580)")
+    private Long pid;
+
+    @ApiModelProperty("医院名称")
+    private String hospitalName;
+
+    @ApiModelProperty("药店ID")
+    private Long storeId;
+
+    @ApiModelProperty("药店名称")
+    private String storeName;
+
+    @ApiModelProperty("问诊单ID(580)")
+    private Long diagnosisId;
+
+    @ApiModelProperty("医生签名时间")
+    private LocalDateTime doctorSignTime;
+
+    @ApiModelProperty("医生ID")
+    private Long doctorId;
+
+    @ApiModelProperty("医生科室")
+    private String doctorOffice;
+
+    @ApiModelProperty("医生姓名")
+    private String doctorName;
+
+    @ApiModelProperty("诊断标签")
+    private String tags;
+
+    @ApiModelProperty("处方状态(1正常 2已作废 )")
+    private Byte status;
+
+    @ApiModelProperty("备注")
+    private String memo;
+
+    @ApiModelProperty("说明")
+    private String remarks;
+
+    @ApiModelProperty("审核不通过的理由(可能为空)")
+    private String reason;
+
+    @ApiModelProperty("处方图片地址")
+    private String dstFilePath;
+
+    @ApiModelProperty("开方时间")
+    private LocalDateTime createdTime;
+
+    @ApiModelProperty("处方编号")
+    private String serialNo;
+
+    @ApiModelProperty("处方审核状态:1为待审核,2为审核通过,3为审核不通过")
+    private Boolean auditStatus;
+
+    @ApiModelProperty("审方时间")
+    private LocalDateTime auditTime;
+
+    @ApiModelProperty("审方药师名称")
+    private String auditApothecaryName;
+
+    @ApiModelProperty("问诊知情确认页面URL")
+    private String jumpUrl;
+
+    @ApiModelProperty("开方情况0未开方1开方2拒绝")
+    private Byte prescriptionStatus;
+
+    @ApiModelProperty("商城订单id")
+    private Long storeOrderId;
+
+    // 问诊题目
+    @ApiModelProperty(value = "问诊题目")
+    private List<AnswerDataVo> beforeAiDataList;
+    /**
+     * 药品信息列表
+     */
+    @ApiModelProperty("药品信息列表")
+    private List<PrescriptionMedicineScrmVo> drugRspList;
+}
+

+ 53 - 0
fs-service/src/main/java/com/fs/hospital580/vo/PrescriptionMedicineScrmVo.java

@@ -0,0 +1,53 @@
+package com.fs.hospital580.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class PrescriptionMedicineScrmVo implements Serializable {
+    /**
+     * 药品通用名
+     */
+    @ApiModelProperty("药品通用名")
+    private String drugCommonName;
+
+    /**
+     * 药品名称
+     */
+    @ApiModelProperty("药品名称")
+    private String drugName;
+
+    /**
+     * 药品数量
+     */
+    @ApiModelProperty("药品数量")
+    private Integer amount;
+
+    /**
+     * 使用说明(如:口服 饭后服用 qd 每日1次)
+     */
+    @ApiModelProperty("使用说明")
+    private String instructions;
+
+    /**
+     * 药品规格(如:20mg*7片*2板/盒)
+     */
+    @ApiModelProperty("药品规格")
+    private String spec;
+
+    /**
+     * 三方商品编码
+     */
+    @ApiModelProperty("三方商品编码")
+    private String commodityCode;
+
+    /**
+     * 系统药品ID
+     */
+    @ApiModelProperty("系统药品ID")
+    private Integer medicineId;
+    @ApiModelProperty("商品图片")
+    private String image;
+}

+ 17 - 0
fs-service/src/main/java/com/fs/hospital580/vo/RefusePrescriptionVo.java

@@ -0,0 +1,17 @@
+package com.fs.hospital580.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class RefusePrescriptionVo extends CommonVo implements Serializable {
+    // 580问诊单id
+    private Integer diagnosisId;
+    // 第三方唯一订单号
+    private String bizOrderId;
+    // 未开方原因
+    private String reason;
+}

+ 25 - 0
fs-service/src/main/java/com/fs/hospital580/vo/ReviewPrescriptionVo.java

@@ -0,0 +1,25 @@
+package com.fs.hospital580.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ReviewPrescriptionVo extends CommonVo implements Serializable {
+    // 580处方id
+    private Long pid;
+    // 处方审核状态:1为待审核,2为审核通过,3为审核不通过
+    private Byte auditStatus;
+    // 审方时间(时间戳)
+    private Long auditTime;
+    // 审方药师名称
+    private String auditApothecaryName;
+    // 审核不通过原因
+    private String reason;
+    // 处方图片地址
+    private String dstFilePath;
+    // 处方编号
+    private String serialNo;
+}

+ 23 - 0
fs-service/src/main/java/com/fs/hospital580/vo/req/DiseaseReq.java

@@ -0,0 +1,23 @@
+package com.fs.hospital580.vo.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+@ApiModel("聊天记录请求")
+public class DiseaseReq implements Serializable {
+    @ApiModelProperty(value = "诊断类型(0为西医诊断,1为中医诊断)")
+    private Integer type = 0;
+    @ApiModelProperty("诊断名称 模糊查询")
+    private String diagnosisName;
+    @ApiModelProperty("分页参数")
+    private Integer pageNum = 1;
+    @ApiModelProperty("分页参数")
+    private Integer pageSize = 10;
+}
+
+

+ 78 - 0
fs-service/src/main/java/com/fs/hospital580/vo/req/Prescription580Req.java

@@ -0,0 +1,78 @@
+package com.fs.hospital580.vo.req;
+
+import com.fs.hospital580.vo.CommonVo;
+import com.fs.hospital580.vo.PrescriptionMedicineScrmVo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class Prescription580Req extends CommonVo implements Serializable {
+
+    @ApiModelProperty("第三方唯一id")
+    private Long bizOrderId;
+
+    @ApiModelProperty("处方id(580)")
+    private Long pid;
+
+    @ApiModelProperty("医院名称")
+    private String hospitalName;
+
+    @ApiModelProperty("药店ID")
+    private Long storeId;
+
+    @ApiModelProperty("药店名称")
+    private String storeName;
+
+    @ApiModelProperty("问诊单ID(580)")
+    private Long diagnosisId;
+
+    @ApiModelProperty("医生签名时间")
+    private Long doctorSignTime;
+
+    @ApiModelProperty("医生ID")
+    private Long doctorId;
+
+    @ApiModelProperty("医生科室")
+    private String doctorOffice;
+
+    @ApiModelProperty("医生姓名")
+    private String doctorName;
+
+    @ApiModelProperty("诊断标签")
+    private String tags;
+
+    @ApiModelProperty("处方状态(1正常 2已作废 )")
+    private Byte status;
+
+    @ApiModelProperty("备注")
+    private String memo;
+
+    @ApiModelProperty("说明")
+    private String remarks;
+
+    @ApiModelProperty("审核不通过的理由(可能为空)")
+    private String reason;
+
+    @ApiModelProperty("处方图片地址")
+    private String dstFilePath;
+
+    @ApiModelProperty("开方时间")
+    private Long createdTime;
+
+    @ApiModelProperty("处方编号")
+    private String serialNo;
+    /**
+     * 药品信息列表
+     */
+    @ApiModelProperty("药品信息列表")
+    private List<PrescriptionMedicineScrmVo> drugRspList;
+}
+

+ 79 - 0
fs-service/src/main/java/com/fs/hospital580/vo/req/SaveOrderScrmReq.java

@@ -0,0 +1,79 @@
+package com.fs.hospital580.vo.req;
+
+import com.fs.hospital580.vo.AnswerDataVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+
+@Getter
+@Setter
+@ApiModel("新增问诊请求")
+public class SaveOrderScrmReq implements Serializable {
+
+    @ApiModelProperty(value = "服务类型:0-图文,1-视频")
+    private Byte serviceType = 0;
+
+    @ApiModelProperty(value = "是否需要审方:0-不需要,1-需要")
+    private Byte isExamine = 0;
+
+    @ApiModelProperty(value = "是否孕妇:0-否,1-是", required = true)
+    @NotNull(message = "isPregnantWoman is null")
+    private Byte isPregnantWoman;
+
+    @ApiModelProperty(value = "是否哺乳期:0-否,1-是", required = true)
+    @NotNull(message = "isLactation is null")
+    private Byte isLactation;
+
+    @ApiModelProperty(value = "来源:0-微信小程序,1-APP,2-H5,3-支付宝小程序", required = true)
+    @NotNull(message = "souceFrom is null")
+    private Byte souceFrom;
+
+    @ApiModelProperty(value = "就诊人信息", required = true)
+    @NotNull(message = "patientId is null")
+    private Long patientId;
+
+/*    @ApiModelProperty(value = "用药人姓名", required = true)
+    @NotNull(message = "userFamilyName is null")
+    private String userFamilyName;
+
+    @ApiModelProperty("用药人身份证号")
+    private String userFamilyIdCard;
+
+    @ApiModelProperty(value = "用药人年龄", required = true)
+    @NotNull(message = "userFamilyAge is null")
+    private Integer userFamilyAge;
+
+    @NotNull(message = "userFamilyGender is null")
+    @ApiModelProperty(value = "用药人性别:1-男,2-女", required = true)
+    private Byte userFamilyGender;
+
+    @ApiModelProperty(value = "用药人手机号码", required = true)
+    @NotNull(message = "userFamilyPhone is null")
+    private String userFamilyPhone;*/
+
+    @NotNull(message = "relationship is null")
+    @ApiModelProperty(value = "用药人与问诊人关系:1-本人,2-父母,3-配偶,4-子女,5-其他", required = true)
+    private Byte relationship;
+
+/*    @ApiModelProperty("就诊人住址(最多30个字符)")
+    private String userFamilyAddr;*/
+
+    @ApiModelProperty("图片附件URL,多个以英文逗号隔开")
+    private String imgList;
+
+    @NotNull(message = "beforeAiDataList is null")
+    @ApiModelProperty(value = "问诊题目", required = true)
+    private List<AnswerDataVo> beforeAiDataList; // 问诊前面的题目,传固定的五道题
+
+    private Long userId;
+
+    @NotNull(message = "storeOrderId is null")
+    @ApiModelProperty(value = "商城订单id", required = true)
+    private Long storeOrderId;
+}

+ 15 - 0
fs-service/src/main/java/com/fs/hospital580/vo/res/DiseaseQueryRes.java

@@ -0,0 +1,15 @@
+package com.fs.hospital580.vo.res;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class DiseaseQueryRes implements Serializable {
+    @ApiModelProperty("诊断ICD编码")
+    private String icdCode;
+    @ApiModelProperty("诊断名称")
+    private String diagnosisName;
+
+}

+ 147 - 0
fs-service/src/main/java/com/fs/hospital580/vo/res/PrescriptionDetailRes.java

@@ -0,0 +1,147 @@
+package com.fs.hospital580.vo.res;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.hospital580.vo.PrescriptionMedicineScrmVo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+public class PrescriptionDetailRes implements Serializable {
+
+    @ApiModelProperty("主键ID")
+    private Long preId;
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("服务类型:0-图文,1-视频")
+    private Byte serviceType;
+
+    @ApiModelProperty("是否需要审方:0-不需要,1-需要")
+    private Byte isExamine;
+
+    @ApiModelProperty("是否孕妇:0-否,1-是")
+    private Byte isPregnantWoman;
+
+    @ApiModelProperty("是否哺乳期:0-否,1-是")
+    private Byte isLactation;
+
+    @ApiModelProperty("来源:0-微信小程序,1-APP,2-H5,3-支付宝小程序")
+    private Byte souceFrom;
+
+    @ApiModelProperty("用药人姓名")
+    private String userFamilyName;
+
+    @ApiModelProperty("身份证")
+    private String userFamilyIdCard;
+
+    @ApiModelProperty("年龄")
+    private Integer userFamilyAge;
+
+    @ApiModelProperty("性别:1-男,2-女")
+    private Byte userFamilyGender;
+
+    @ApiModelProperty("手机号码")
+    private String userFamilyPhone;
+
+    @ApiModelProperty("关系:1-本人,2-父母,3-配偶,4-子女,5-其他")
+    private Boolean relationship;
+
+    @ApiModelProperty("就诊人住址(最多30个字符)")
+    private String userFamilyAddr;
+
+    @ApiModelProperty("图片附件URL,多个以英文逗号隔开")
+    private String imgList;
+
+    @ApiModelProperty("结束问诊后跳回三方的地址")
+    private String thirdReturnUrl;
+
+    @ApiModelProperty("创建时间")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("处方id(580)")
+    private Long pid;
+
+    @ApiModelProperty("医院名称")
+    private String hospitalName;
+
+    @ApiModelProperty("药店ID")
+    private Long storeId;
+
+    @ApiModelProperty("药店名称")
+    private String storeName;
+
+    @ApiModelProperty("问诊单ID(580)")
+    private Long diagnosisId;
+
+    @ApiModelProperty("医生签名时间")
+    private LocalDateTime doctorSignTime;
+
+    @ApiModelProperty("医生ID")
+    private Long doctorId;
+
+    @ApiModelProperty("医生科室")
+    private String doctorOffice;
+
+    @ApiModelProperty("医生姓名")
+    private String doctorName;
+
+    @ApiModelProperty("诊断标签")
+    private String tags;
+
+    @ApiModelProperty("处方状态(1正常 2已作废 )")
+    private Byte status;
+
+    @ApiModelProperty("备注")
+    private String memo;
+
+    @ApiModelProperty("说明")
+    @TableField("remarks")
+    private String remarks;
+
+    @ApiModelProperty("审核不通过的理由(可能为空)")
+    private String reason;
+
+    @ApiModelProperty("处方图片地址")
+    @TableField("dst_file_path")
+    private String dstFilePath;
+
+    @ApiModelProperty("创建时间/开方时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createdTime;
+
+    @ApiModelProperty("处方编号")
+    private String serialNo;
+
+    @ApiModelProperty("处方审核状态:1为待审核,2为审核通过,3为审核不通过")
+    private Boolean auditStatus;
+
+    @ApiModelProperty("审方时间")
+    private LocalDateTime auditTime;
+
+    @ApiModelProperty("审方药师名称")
+    private String auditApothecaryName;
+
+    @ApiModelProperty("问诊知情确认页面URL")
+    private String jumpUrl;
+
+    @ApiModelProperty("开方情况0未开方1开方2拒绝")
+    private Byte prescriptionStatus;
+
+    @ApiModelProperty("药品信息列表")
+    private List<PrescriptionMedicineScrmVo> drugRspList;
+
+    @ApiModelProperty("商城订单id")
+    private Long storeOrderId;
+}

+ 69 - 0
fs-service/src/main/java/com/fs/hospital580/vo/res/PrescriptionListRes.java

@@ -0,0 +1,69 @@
+package com.fs.hospital580.vo.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+public class PrescriptionListRes implements Serializable {
+
+    @ApiModelProperty("id 传值用")
+    private Long preId;
+
+    @ApiModelProperty("处方ID 展示用")
+    private Long pid;
+
+    @ApiModelProperty("提交时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("开方时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createdTime;
+
+    /**
+     * 医生姓名
+     */
+    @ApiModelProperty("医生姓名")
+    private String doctorName;
+
+    /**
+     * 患者姓名
+     */
+    @ApiModelProperty("患者姓名")
+    private String userFamilyName;
+
+
+    /**
+     * 患者性别(1:男, 其他:女)
+     */
+    @ApiModelProperty("患者性别")
+    private Byte userFamilyGender;
+
+    /**
+     * 患者年龄
+     */
+    @ApiModelProperty("患者年龄")
+    private Integer userFamilyAge;
+
+    /**
+     * 标签(如:高血压)
+     */
+    @ApiModelProperty("诊断标签")
+    private String tags;
+
+    @ApiModelProperty("开方情况0待开方1已开方2未通过")
+    private Byte prescriptionStatus;
+
+
+    @ApiModelProperty("处方编号")
+    private String serialNo;
+}

+ 7 - 0
fs-service/src/main/resources/application-config-druid-yjb.yml

@@ -98,3 +98,10 @@ jst:
   app_secret: 5b7d9369dbcd414db45089bc047ebe1a #聚水潭2025-08-15
   authorization_code: 999999
   shop_code: "18849902"
+
+hospital580:
+  url: https://ehospital-openapi-test.sq580.com
+  clientId: yjbz_15700159162_test
+  secretKey: ESzFwwum4Jz95f4ubg4rP7lQG4LZsWFv
+  storeId: 17478
+  callbackUrl: https://userapp.bjyjbao.com/prod-api/hospital580/sync/medicine

+ 7 - 0
fs-service/src/main/resources/application-dev.yml

@@ -164,3 +164,10 @@ openIM:
     userID: imAdmin
 #是否为新商户,新商户不走mpOpenId
 isNewWxMerchant: true
+hospital580:
+    url: https://ehospital-openapi-test.sq580.com
+    clientId: yjbz_15700159162_test
+    secretKey: ESzFwwum4Jz95f4ubg4rP7lQG4LZsWFv
+    storeId: 17478
+    callbackUrl: http://v78ee625.natappfree.cc/hospital580/sync/medicine
+

+ 20 - 0
fs-service/src/main/resources/mapper/hospital580/Hospital580PrescriptionAnswerScrmMapper.xml

@@ -0,0 +1,20 @@
+<?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.hospital580.mapper.Hospital580PrescriptionAnswerScrmMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.fs.hospital580.entity.Hospital580PrescriptionAnswerScrmEntity">
+        <id column="id" property="id" />
+        <result column="pre_id" property="preId" />
+        <result column="subject_id" property="subjectId" />
+        <result column="answer" property="answer" />
+        <result column="answer_medicine" property="answerMedicine" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, pre_id, subject_id, answer, answer_medicine, create_time
+    </sql>
+
+</mapper>

+ 17 - 0
fs-service/src/main/resources/mapper/hospital580/Hospital580PrescriptionChatScrmMapper.xml

@@ -0,0 +1,17 @@
+<?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.hospital580.mapper.Hospital580PrescriptionChatScrmMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.fs.hospital580.entity.Hospital580PrescriptionChatScrmEntity">
+        <result column="id" property="id"/>
+        <result column="content" property="content"/>
+        <result column="pre_id" property="preId"/>
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,content,pre_id
+    </sql>
+
+</mapper>

+ 25 - 0
fs-service/src/main/resources/mapper/hospital580/Hospital580PrescriptionMedicineScrmMapper.xml

@@ -0,0 +1,25 @@
+<?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.hospital580.mapper.Hospital580PrescriptionMedicineScrmMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.fs.hospital580.entity.Hospital580PrescriptionMedicineScrmEntity">
+        <id column="id" property="id" />
+        <result column="pre_id" property="preId" />
+        <result column="drug_common_name" property="drugCommonName" />
+        <result column="drug_name" property="drugName" />
+        <result column="amount" property="amount" />
+        <result column="instructions" property="instructions" />
+        <result column="spec" property="spec" />
+        <result column="commodity_code" property="commodityCode" />
+        <result column="medicine_id" property="medicineId" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, pre_id, drug_common_name, drug_name, amount, instructions, spec, commodity_code, medicine_id, created_time, updated_time
+    </sql>
+
+</mapper>

+ 55 - 0
fs-service/src/main/resources/mapper/hospital580/Hospital580PrescriptionScrmMapper.xml

@@ -0,0 +1,55 @@
+<?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.hospital580.mapper.Hospital580PrescriptionScrmMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.fs.hospital580.entity.Hospital580PrescriptionScrmEntity">
+        <id column="pre_id" property="preId" />
+        <result column="user_id" property="userId" />
+        <result column="service_type" property="serviceType" />
+        <result column="is_examine" property="isExamine" />
+        <result column="is_pregnant_woman" property="isPregnantWoman" />
+        <result column="is_lactation" property="isLactation" />
+        <result column="souce_from" property="souceFrom" />
+        <result column="user_family_name" property="userFamilyName" />
+        <result column="user_family_id_card" property="userFamilyIdCard" />
+        <result column="user_family_age" property="userFamilyAge" />
+        <result column="user_family_gender" property="userFamilyGender" />
+        <result column="user_family_phone" property="userFamilyPhone" />
+        <result column="relationship" property="relationship" />
+        <result column="user_family_addr" property="userFamilyAddr" />
+        <result column="img_list" property="imgList" />
+        <result column="third_return_url" property="thirdReturnUrl" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="pid" property="pid" />
+        <result column="hospital_name" property="hospitalName" />
+        <result column="store_id" property="storeId" />
+        <result column="store_name" property="storeName" />
+        <result column="diagnosis_id" property="diagnosisId" />
+        <result column="doctor_sign_time" property="doctorSignTime" />
+        <result column="doctor_id" property="doctorId" />
+        <result column="doctor_office" property="doctorOffice" />
+        <result column="doctor_name" property="doctorName" />
+        <result column="tags" property="tags" />
+        <result column="status" property="status" />
+        <result column="memo" property="memo" />
+        <result column="remarks" property="remarks" />
+        <result column="reason" property="reason" />
+        <result column="dst_file_path" property="dstFilePath" />
+        <result column="created_time" property="createdTime" />
+        <result column="serial_no" property="serialNo" />
+        <result column="audit_status" property="auditStatus" />
+        <result column="audit_time" property="auditTime" />
+        <result column="audit_apothecary_name" property="auditApothecaryName" />
+        <result column="jump_url" property="jumpUrl" />
+        <result column="prescription_status" property="prescriptionStatus" />
+        <result column="store_order_id" property="storeOrderId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        pre_id, user_id, service_type, is_examine, is_pregnant_woman, is_lactation, souce_from, user_family_name, user_family_id_card, user_family_age, user_family_gender, user_family_phone, relationship, user_family_addr, img_list, third_return_url, create_time, update_time, pid, hospital_name, store_id, store_name, diagnosis_id, doctor_sign_time, doctor_id, doctor_office, doctor_name, tags, status, memo, remarks, reason, dst_file_path, created_time, serial_no, audit_status, audit_time, audit_apothecary_name, jump_url, prescription_status, store_order_id
+    </sql>
+
+</mapper>

+ 21 - 0
fs-service/src/main/resources/mapper/hospital580/Hospital580ProductPushScrmMapper.xml

@@ -0,0 +1,21 @@
+<?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.hospital580.mapper.Hospital580ProductPushScrmMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.fs.hospital580.entity.Hospital580ProductPushScrmEntity">
+        <id column="id" property="id" />
+        <result column="product_id" property="productId" />
+        <result column="push_status" property="pushStatus" />
+        <result column="err_msg" property="errMsg" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="request_id" property="requestId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, product_id, push_status, err_msg, create_time, update_time, request_id
+    </sql>
+
+</mapper>

+ 21 - 0
fs-service/src/main/resources/mapper/hospital580/Hospital580ScrmMapper.xml

@@ -0,0 +1,21 @@
+<?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.hospital580.mapper.Hospital580ScrmMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.fs.hospital580.entity.Hospital580ScrmEntity">
+        <id column="id" property="id" />
+        <result column="request" property="request" />
+        <result column="request_parm" property="requestParm" />
+        <result column="response" property="response" />
+        <result column="request_status" property="requestStatus" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, request, request_parm, response, request_status, create_time, update_time
+    </sql>
+
+</mapper>

+ 57 - 0
fs-user-app/src/main/java/com/fs/app/controller/Hospital580CallbackController.java

@@ -0,0 +1,57 @@
+package com.fs.app.controller;
+
+import com.fs.app.facade.Hospital580FacadeService;
+import com.fs.hospital580.vo.MedicineSyncVo;
+import com.fs.hospital580.vo.RefusePrescriptionVo;
+import com.fs.hospital580.vo.ReviewPrescriptionVo;
+import com.fs.hospital580.vo.req.Prescription580Req;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 580医院回调接口
+ */
+@RestController
+@RequestMapping("/hospital580/sync")
+@Slf4j
+public class Hospital580CallbackController {
+
+    @Autowired
+    private Hospital580FacadeService hospital580FacadeService;
+
+    /**
+     * 4.14 同步药品信息接口回调
+     */
+    @PostMapping("/medicine")
+    public void medicineSync(@RequestBody MedicineSyncVo map) {
+        hospital580FacadeService.medicineSync(map);
+    }
+
+    /**
+     * 4.10 处方推送接口
+     */
+    @PostMapping("/prescription")
+    public void prescription(@RequestBody Prescription580Req vo) {
+        hospital580FacadeService.prescription(vo);
+    }
+
+    /**
+     * 4.15 医生拒绝开方推送接口
+     */
+    @PostMapping("/refusePrescription")
+    public void refusePrescription(@RequestBody RefusePrescriptionVo vo) {
+        hospital580FacadeService.refusePrescription(vo);
+    }
+
+    /**
+     * 4.13 处方药师审核
+     */
+    @PostMapping("/reviewPrescription")
+    public void reviewPrescription(@RequestBody ReviewPrescriptionVo vo) {
+        hospital580FacadeService.reviewPrescription(vo);
+    }
+}

+ 58 - 0
fs-user-app/src/main/java/com/fs/app/controller/Hospital580Controller.java

@@ -0,0 +1,58 @@
+package com.fs.app.controller;
+
+import com.fs.app.annotation.Login;
+import com.fs.app.facade.Hospital580FacadeService;
+import com.fs.common.core.domain.PageResponse;
+import com.fs.common.core.domain.Result;
+import com.fs.common.core.page.PageRequest;
+import com.fs.hospital580.vo.req.DiseaseReq;
+import com.fs.hospital580.vo.req.SaveOrderScrmReq;
+import com.fs.hospital580.vo.res.DiseaseQueryRes;
+import com.fs.hospital580.vo.res.PrescriptionDetailRes;
+import com.fs.hospital580.vo.res.PrescriptionListRes;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+
+@RestController
+@RequestMapping("/hospital580/app")
+@Slf4j
+@Api(tags = "处方相关接口")
+public class Hospital580Controller extends AppBaseController {
+
+    @Autowired
+    private Hospital580FacadeService hospital580FacadeService;
+
+    @ApiOperation(value = "新增问诊单接口")
+    @Login
+    @PostMapping("/savePreDemand")
+    public Result<String> savePreDemand(@RequestBody @Valid SaveOrderScrmReq vo) {
+        return hospital580FacadeService.savePreDemand(vo);
+    }
+
+    @ApiOperation(value = "查询诊断类型列表")
+    @PostMapping("/diseaseQueryList")
+    public PageResponse<DiseaseQueryRes> diseaseQuery(@RequestBody DiseaseReq req) {
+        return hospital580FacadeService.diseaseQuery(req);
+    }
+
+
+    @ApiOperation(value = "处方订单列表")
+    @Login
+    @PostMapping("/prescriptionList")
+    public PageResponse<PrescriptionListRes> prescriptionList(@RequestBody PageRequest pageRequest) {
+        return hospital580FacadeService.prescriptionList(getUserId(), pageRequest);
+    }
+
+    @ApiOperation(value = "处方订单详情")
+    @Login
+    @PostMapping("/prescriptionDetail/{preId}")
+    public Result<PrescriptionDetailRes> prescriptionDetail(@PathVariable("preId") Long preId) {
+        return hospital580FacadeService.prescriptionDetail(getUserId(), preId);
+    }
+}

+ 30 - 0
fs-user-app/src/main/java/com/fs/app/facade/Hospital580FacadeService.java

@@ -0,0 +1,30 @@
+package com.fs.app.facade;
+
+import com.fs.common.core.domain.PageResponse;
+import com.fs.common.core.page.PageRequest;
+import com.fs.hospital580.vo.req.DiseaseReq;
+import com.fs.hospital580.vo.req.Prescription580Req;
+import com.fs.hospital580.vo.req.SaveOrderScrmReq;
+import com.fs.hospital580.vo.res.DiseaseQueryRes;
+import com.fs.common.core.domain.Result;
+import com.fs.hospital580.vo.*;
+import com.fs.hospital580.vo.res.PrescriptionDetailRes;
+import com.fs.hospital580.vo.res.PrescriptionListRes;
+
+public interface Hospital580FacadeService {
+    Result<String> savePreDemand(SaveOrderScrmReq vo);
+
+    PageResponse<DiseaseQueryRes> diseaseQuery(DiseaseReq vo);
+
+    void prescription(Prescription580Req vo);
+
+    void refusePrescription(RefusePrescriptionVo vo);
+
+    void reviewPrescription(ReviewPrescriptionVo vo);
+
+    void medicineSync(MedicineSyncVo vo);
+
+    PageResponse<PrescriptionListRes> prescriptionList(String userId, PageRequest pageRequest);
+
+    Result<PrescriptionDetailRes> prescriptionDetail(String userId, Long orderId);
+}

+ 267 - 0
fs-user-app/src/main/java/com/fs/app/facade/impl/Hospital580FacadeServiceImpl.java

@@ -0,0 +1,267 @@
+package com.fs.app.facade.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fs.app.exception.FSException;
+import com.fs.app.facade.Hospital580FacadeService;
+import com.fs.common.core.domain.PageResponse;
+import com.fs.common.core.domain.Result;
+import com.fs.common.core.page.PageRequest;
+import com.fs.framework.aspectj.lock.DistributeLock;
+import com.fs.his.domain.FsPatient;
+import com.fs.his.service.IFsPatientService;
+import com.fs.his.utils.PhoneUtil;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hisStore.service.IFsStoreOrderScrmService;
+import com.fs.hisStore.service.IFsStoreProductScrmService;
+import com.fs.hospital580.dto.*;
+import com.fs.hospital580.entity.*;
+import com.fs.hospital580.service.Hospital580PrescriptionAnswerScrmService;
+import com.fs.hospital580.service.Hospital580PrescriptionMedicineScrmService;
+import com.fs.hospital580.service.Hospital580PrescriptionScrmService;
+import com.fs.hospital580.service.Hospital580Service;
+import com.fs.hospital580.vo.MedicineSyncVo;
+import com.fs.hospital580.vo.PrescriptionMedicineScrmVo;
+import com.fs.hospital580.vo.RefusePrescriptionVo;
+import com.fs.hospital580.vo.ReviewPrescriptionVo;
+import com.fs.hospital580.vo.req.DiseaseReq;
+import com.fs.hospital580.vo.req.Prescription580Req;
+import com.fs.hospital580.vo.req.SaveOrderScrmReq;
+import com.fs.hospital580.vo.res.DiseaseQueryRes;
+import com.fs.hospital580.vo.res.PrescriptionDetailRes;
+import com.fs.hospital580.vo.res.PrescriptionListRes;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.Period;
+import java.time.ZoneId;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service
+public class Hospital580FacadeServiceImpl implements Hospital580FacadeService {
+
+    @Autowired
+    private Hospital580Service hospital580Service;
+    @Autowired
+    private Hospital580PrescriptionAnswerScrmService answerScrmService;
+
+    @Autowired
+    private Hospital580PrescriptionScrmService orderScrmService;
+    @Autowired
+    private IFsPatientService fsPatientService;
+
+    @Autowired
+    private Hospital580PrescriptionMedicineScrmService medicineScrmService;
+    @Autowired
+    private IFsStoreProductScrmService productScrmService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @DistributeLock(key = "#vo.userId", scene = "savePreDemand", waitTime = 5000, errorMsg = "新增问诊信息失败")
+    public Result<String> savePreDemand(SaveOrderScrmReq vo) {
+        // 校验是否存在问诊单
+        if (orderScrmService.isByStoreOrder(vo.getStoreOrderId())){
+            throw new FSException("您已存在未处理的问诊单");
+        }
+
+        // 保存问诊信息
+        Hospital580PrescriptionScrmEntity order = new Hospital580PrescriptionScrmEntity();
+        BeanUtil.copyProperties(vo, order);
+        FsPatient fsPatient = fsPatientService.selectFsPatientByPatientId(vo.getPatientId());
+        order.setUserFamilyIdCard(fsPatient.getIdCard());
+        order.setUserFamilyPhone(PhoneUtil.decryptPhone(fsPatient.getMobile()));
+        order.setUserFamilyName(fsPatient.getPatientName());
+        order.setUserFamilyGender(fsPatient.getSex().byteValue());
+        order.setUserFamilyAge(Period.between(fsPatient.getBirthday().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), LocalDate.now()).getYears());
+        order.insert();
+
+        // 保存问诊答案
+        answerScrmService.saveBatch(vo.getBeforeAiDataList().stream()
+                .map(item -> {
+                    Hospital580PrescriptionAnswerScrmEntity entity = new Hospital580PrescriptionAnswerScrmEntity();
+                    BeanUtil.copyProperties(item, entity);
+                    entity.setPreId(order.getPreId());
+                    return entity;
+                })
+                .collect(Collectors.toList()));
+
+        // 获取问诊链接并更新
+        PreDemandDto dto = new PreDemandDto();
+        BeanUtil.copyProperties(order, dto);
+        dto.setBizOrderId(order.getPreId().toString());
+        dto.setMemberId(order.getUserFamilyPhone());
+        dto.setThirdReturnUrl(vo.getStoreOrderId());
+        dto.setBeforeAiDataList(vo.getBeforeAiDataList().stream().map(item -> {
+            BeforeAiData textRecordDto = new BeforeAiData();
+            textRecordDto.setSubjectId(item.getSubjectId());
+            textRecordDto.setAnswer(item.getAnswer());
+            textRecordDto.setAnswerMedicine(item.getAnswerMedicine());
+            return textRecordDto;
+        }).collect(Collectors.toList()));
+        Result580 result580 = hospital580Service.initPreDemand(dto);
+        order.setJumpUrl(result580.getData());
+        order.updateById();
+
+        return processResult(result580);
+    }
+
+    @Override
+    public PageResponse<DiseaseQueryRes> diseaseQuery(DiseaseReq req) {
+        Result<String> stringResult = processResult(hospital580Service.disease(BeanUtil.copyProperties(req, DiseaseDto.class)));
+        JSONObject jsonObject = JSONUtil.parseObj(stringResult.getData());
+        return PageResponse.of(JSONUtil.toList(jsonObject.getJSONArray("list"), DiseaseQueryRes.class),
+                jsonObject.getInt("rowCount"),
+                req.getPageNum(),
+                req.getPageSize());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void prescription(Prescription580Req vo) {
+        // 处方信息
+        Hospital580PrescriptionScrmEntity prescription = orderScrmService.getById(vo.getBizOrderId());
+        BeanUtil.copyProperties(vo, prescription);
+        prescription.setPrescriptionStatus(vo.getStatus());
+        // 更新处方记录
+        prescription.updateById();
+        List<PrescriptionMedicineScrmVo> drugRspList = vo.getDrugRspList();
+        drugRspList.forEach(item -> {
+            Hospital580PrescriptionMedicineScrmEntity entity = new Hospital580PrescriptionMedicineScrmEntity();
+            BeanUtil.copyProperties(item, entity);
+            entity.setPreId(prescription.getPreId());
+            // 插入药品信息
+            entity.insert();
+        });
+
+        ThreadUtil.execute(() -> {
+            // 同步聊天记录
+            TextRecordDto build = TextRecordDto.builder().diagnosisId(prescription.getDiagnosisId()).pageSize(1).pageNum(100).build();
+            Result580 result580 = hospital580Service.textRecord(build);
+            JSONObject jsonObject = JSONUtil.parseObj(result580.getData());
+            if (jsonObject.getInt("rowCount") > build.getPageSize()) {
+                build.setPageSize(jsonObject.getInt("rowCount"));
+                result580 = hospital580Service.textRecord(build);
+                jsonObject = JSONUtil.parseObj(result580.getData());
+                JSONArray data = jsonObject.getJSONArray("data");
+                Hospital580PrescriptionChatScrmEntity chatScrmEntity = new Hospital580PrescriptionChatScrmEntity();
+                chatScrmEntity.setContent(data.toString());
+                chatScrmEntity.setPreId(prescription.getPreId());
+                chatScrmEntity.insert();
+            }
+        });
+    }
+
+    @Override
+    public void refusePrescription(RefusePrescriptionVo vo) {
+        // 修改处方信息
+        Hospital580PrescriptionScrmEntity prescription = orderScrmService.getById(vo.getBizOrderId());
+        prescription.setReason(vo.getReason());
+        prescription.setPrescriptionStatus((byte) 2);
+        prescription.updateById();
+    }
+
+    @Override
+    public void reviewPrescription(ReviewPrescriptionVo vo) {
+        if (ObjectUtil.isEmpty(vo) || ObjectUtil.isEmpty(vo.getPid())) {
+            return;
+        }
+        // 修改处方信息
+        Hospital580PrescriptionScrmEntity prescription = new Hospital580PrescriptionScrmEntity();
+        prescription.update(new LambdaUpdateWrapper<Hospital580PrescriptionScrmEntity>()
+                .eq(Hospital580PrescriptionScrmEntity::getPid, vo.getPid())
+                .set(Hospital580PrescriptionScrmEntity::getAuditStatus, vo.getAuditStatus())
+                .set(Hospital580PrescriptionScrmEntity::getAuditTime, vo.getAuditTime())
+                .set(Hospital580PrescriptionScrmEntity::getAuditApothecaryName, vo.getAuditApothecaryName())
+                .set(Hospital580PrescriptionScrmEntity::getReason, vo.getReason())
+                .set(Hospital580PrescriptionScrmEntity::getDstFilePath, vo.getDstFilePath()));
+    }
+
+    @Override
+    public void medicineSync(MedicineSyncVo vo) {
+        Hospital580ProductPushScrmEntity productPushScrm = new Hospital580ProductPushScrmEntity();
+        List<String> medicineIdList = JSONUtil.toList(JSONUtil.parseArray(vo.getMedicineIds()), String.class);
+        List<Long> medicineIds = medicineIdList.stream()
+                .map(Long::valueOf)
+                .collect(Collectors.toList());
+        productPushScrm.update(new LambdaUpdateWrapper<Hospital580ProductPushScrmEntity>()
+                .in(Hospital580ProductPushScrmEntity::getProductId, medicineIds)
+                .eq(Hospital580ProductPushScrmEntity::getPushStatus, 0)
+                .set(Hospital580ProductPushScrmEntity::getPushStatus, vo.getErrCode().equals("0") ? 1 : 2)
+                .set(Hospital580ProductPushScrmEntity::getErrMsg, vo.getErrMsg())
+                .set(Hospital580ProductPushScrmEntity::getUpdateTime, LocalDateTime.now()));
+    }
+
+    @Override
+    public PageResponse<PrescriptionListRes> prescriptionList(String userId, PageRequest pageRequest) {
+        // 问诊列表
+        IPage<Hospital580PrescriptionScrmEntity> page = orderScrmService.page(
+                new Page<Hospital580PrescriptionScrmEntity>(pageRequest.getPageNum(), pageRequest.getPageSize())
+                , new LambdaQueryWrapper<Hospital580PrescriptionScrmEntity>()
+                        //.eq(Hospital580PrescriptionScrmEntity::getUserId, userId)
+                        .orderByDesc(Hospital580PrescriptionScrmEntity::getCreatedTime)
+        );
+        List<Hospital580PrescriptionScrmEntity> orderRecords = page.getRecords();
+        // 构建返回结果
+        List<PrescriptionListRes> result = orderRecords.stream()
+                .map(order -> {
+                    return PrescriptionListRes.builder()
+                            .pid(order.getPid())
+                            .preId(order.getPreId())
+                            .createdTime(order.getCreatedTime())
+                            .createTime(order.getCreatedTime())
+                            .tags(order.getTags())
+                            .userFamilyName(order.getUserFamilyName())
+                            .userFamilyGender(order.getUserFamilyGender())
+                            .userFamilyAge(order.getUserFamilyAge())
+                            .prescriptionStatus(order.getPrescriptionStatus())
+                            .doctorName(order.getDoctorName())
+                            .serialNo(order.getSerialNo())
+                            .build();
+                })
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        return PageResponse.of(result, Math.toIntExact(page.getTotal()), pageRequest.getPageSize(), pageRequest.getPageNum());
+    }
+
+    @Override
+    public Result<PrescriptionDetailRes> prescriptionDetail(String userId, Long preId) {
+        Hospital580PrescriptionScrmEntity byId = orderScrmService.getById(preId);
+        PrescriptionDetailRes prescriptionScrmVo = BeanUtil.toBean(byId, PrescriptionDetailRes.class);
+        prescriptionScrmVo.setDrugRspList(medicineScrmService.list(new LambdaQueryWrapper<Hospital580PrescriptionMedicineScrmEntity>()
+                        .eq(Hospital580PrescriptionMedicineScrmEntity::getPreId, prescriptionScrmVo.getPreId()))
+                .stream()
+                .filter(Objects::nonNull)  // 过滤掉空对象
+                .map(item -> {
+                    PrescriptionMedicineScrmVo vo = new PrescriptionMedicineScrmVo();
+                    BeanUtil.copyProperties(item, vo);
+                    FsStoreProductScrm fsStoreProductScrm = productScrmService.selectFsStoreProductById(Long.valueOf(item.getCommodityCode()));
+                    vo.setImage(fsStoreProductScrm.getImage());
+                    return vo;
+                })
+                .collect(Collectors.toList()));
+        return Result.success(prescriptionScrmVo);
+    }
+
+    private Result<String> processResult(Result580 result580) {
+        if (0 == result580.getErr()) {
+            return Result.success(result580.getData());
+        }
+        throw new FSException(result580.getErrmsg());
+    }
+
+}

+ 47 - 0
fs-user-app/src/main/java/com/fs/framework/aspectj/Hospital580Aspect.java

@@ -0,0 +1,47 @@
+package com.fs.framework.aspectj;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.fs.hospital580.util.ObjectApiSignUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Aspect
+@Component
+public class Hospital580Aspect {
+
+
+    @Value("${hospital580.secretKey:''}")
+    private String SECRETKEY;
+
+
+    @Pointcut("execution(* com.fs.app.controller.Hospital580CallbackController.*(..))")
+    public void myControllerMethods() {
+    }
+
+    /**
+     * 验签 580医院
+     *
+     * @param joinPoint
+     */
+    @Before("myControllerMethods()")
+    public void logBeforeMethodExecution(JoinPoint joinPoint) {
+        String methodName = joinPoint.getSignature().getName();
+        Object[] args = joinPoint.getArgs();
+        Object parm = args[0];
+        log.info("580医院请求:{} {}", methodName,JSONUtil.toJsonStr(parm));
+        JSONObject entries = JSONUtil.parseObj(parm);
+        String sign1 = entries.getStr("sign");
+        String sign = ObjectApiSignUtil.getSign(parm, SECRETKEY);
+/*        if (!sign1.equals(sign)) {
+            log.info("验签失败");
+            throw new RuntimeException("验签失败");
+        }*/
+    }
+}

+ 58 - 0
fs-user-app/src/main/java/com/fs/framework/aspectj/lock/DistributeLock.java

@@ -0,0 +1,58 @@
+package com.fs.framework.aspectj.lock;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 分布式锁注解
+ *
+ * @author Hollis
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DistributeLock {
+
+    /**
+     * 锁的场景
+     *
+     * @return
+     */
+    public String scene() default "lock";
+
+    /**
+     * 加锁的key,优先取key(),如果没有,则取keyExpression()
+     *
+     * @return
+     */
+    public String key() default DistributeLockConstant.NONE_KEY;
+
+    /**
+     * SPEL表达式:
+     * <pre>
+     *     #id
+     *     #insertResult.id
+     * </pre>
+     *
+     * @return
+     */
+    public String keyExpression() default DistributeLockConstant.NONE_KEY;
+
+    /**
+     * 超时时间,毫秒
+     * 默认情况下不设置超时时间,会自动续期
+     *
+     * @return
+     */
+    public int expireTime() default DistributeLockConstant.DEFAULT_EXPIRE_TIME;
+
+    public String errorMsg() default DistributeLockConstant.ERROR_MSG;
+
+    /**
+     * 加锁等待时长,毫秒
+     * 默认情况下不设置等待时长,会一直等待直到获取到锁
+     * @return
+     */
+    public int waitTime() default DistributeLockConstant.DEFAULT_WAIT_TIME;
+}

+ 113 - 0
fs-user-app/src/main/java/com/fs/framework/aspectj/lock/DistributeLockAspect.java

@@ -0,0 +1,113 @@
+package com.fs.framework.aspectj.lock;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.StandardReflectionParameterNameDiscoverer;
+import org.springframework.core.annotation.Order;
+import org.springframework.expression.EvaluationContext;
+import org.springframework.expression.Expression;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.concurrent.TimeUnit;
+
+@Aspect
+@Component
+@Order(Integer.MIN_VALUE + 1)
+public class DistributeLockAspect {
+
+    private RedissonClient redissonClient;
+
+    public DistributeLockAspect(RedissonClient redissonClient) {
+        this.redissonClient = redissonClient;
+    }
+
+    private static final Logger LOG = LoggerFactory.getLogger(DistributeLockAspect.class);
+
+    @Around("@annotation(com.fs.framework.aspectj.lock.DistributeLock)")
+    public Object process(ProceedingJoinPoint pjp) throws Throwable {
+        Object response = null;
+        Method method = ((MethodSignature) pjp.getSignature()).getMethod();
+        DistributeLock distributeLock = method.getAnnotation(DistributeLock.class);
+
+        String key = distributeLock.key();
+        if (DistributeLockConstant.NONE_KEY.equals(key)) {
+            if (DistributeLockConstant.NONE_KEY.equals(distributeLock.keyExpression())) {
+                throw new DistributeLockException("no lock key found...");
+            }
+            SpelExpressionParser parser = new SpelExpressionParser();
+            Expression expression = parser.parseExpression(distributeLock.keyExpression());
+
+            EvaluationContext context = new StandardEvaluationContext();
+            // 获取参数值
+            Object[] args = pjp.getArgs();
+
+            // 获取运行时参数的名称
+            StandardReflectionParameterNameDiscoverer discoverer
+                    = new StandardReflectionParameterNameDiscoverer();
+            String[] parameterNames = discoverer.getParameterNames(method);
+
+            // 将参数绑定到context中
+            if (parameterNames != null) {
+                for (int i = 0; i < parameterNames.length; i++) {
+                    context.setVariable(parameterNames[i], args[i]);
+                }
+            }
+
+            // 解析表达式,获取结果
+            key = String.valueOf(expression.getValue(context));
+        }
+
+        String scene = distributeLock.scene();
+
+        String lockKey = scene + "#" + key;
+
+        int expireTime = distributeLock.expireTime();
+        int waitTime = distributeLock.waitTime();
+        RLock rLock= redissonClient.getLock(lockKey);
+        try {
+            boolean lockResult = false;
+            if (waitTime == DistributeLockConstant.DEFAULT_WAIT_TIME) {
+                if (expireTime == DistributeLockConstant.DEFAULT_EXPIRE_TIME) {
+                    LOG.info(String.format("lock for key : %s", lockKey));
+                    rLock.lock();
+                } else {
+                    LOG.info(String.format("lock for key : %s , expire : %s", lockKey, expireTime));
+                    rLock.lock(expireTime, TimeUnit.MILLISECONDS);
+                }
+                lockResult = true;
+            } else {
+                if (expireTime == DistributeLockConstant.DEFAULT_EXPIRE_TIME) {
+                    LOG.info(String.format("try lock for key : %s , wait : %s", lockKey, waitTime));
+                    lockResult = rLock.tryLock(waitTime, TimeUnit.MILLISECONDS);
+                } else {
+                    LOG.info(String.format("try lock for key : %s , expire : %s , wait : %s", lockKey, expireTime, waitTime));
+                    lockResult = rLock.tryLock(waitTime, expireTime, TimeUnit.MILLISECONDS);
+                }
+            }
+
+            if (!lockResult) {
+                LOG.warn(String.format("lock failed for key : %s , expire : %s", lockKey, expireTime));
+                throw new DistributeLockException(distributeLock.errorMsg());
+            }
+
+
+            LOG.info(String.format("lock success for key : %s , expire : %s", lockKey, expireTime));
+            response = pjp.proceed();
+        }  finally {
+            if (rLock.isHeldByCurrentThread()) {
+                rLock.unlock();
+                LOG.info(String.format("unlock for key : %s , expire : %s", lockKey, expireTime));
+            }
+        }
+        return response;
+    }
+}

+ 13 - 0
fs-user-app/src/main/java/com/fs/framework/aspectj/lock/DistributeLockConstant.java

@@ -0,0 +1,13 @@
+package com.fs.framework.aspectj.lock;
+
+public class DistributeLockConstant {
+
+    public static final String NONE_KEY = "NONE";
+
+    public static final String DEFAULT_OWNER = "DEFAULT";
+
+    public static final int DEFAULT_EXPIRE_TIME = -1;
+
+    public static final int DEFAULT_WAIT_TIME = Integer.MAX_VALUE;
+    public static final String ERROR_MSG  = "请勿重复操作";
+}

+ 24 - 0
fs-user-app/src/main/java/com/fs/framework/aspectj/lock/DistributeLockException.java

@@ -0,0 +1,24 @@
+package com.fs.framework.aspectj.lock;
+
+
+public class DistributeLockException extends RuntimeException {
+
+    public DistributeLockException() {
+    }
+
+    public DistributeLockException(String message) {
+        super(message);
+    }
+
+    public DistributeLockException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public DistributeLockException(Throwable cause) {
+        super(cause);
+    }
+
+    public DistributeLockException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+}

+ 8 - 1
fs-user-app/src/main/java/com/fs/framework/config/MyBatisConfig.java

@@ -1,5 +1,7 @@
 package com.fs.framework.config;
 
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
 import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
 import com.fs.common.utils.StringUtils;
 import org.apache.ibatis.io.VFS;
@@ -146,6 +148,11 @@ public class MyBatisConfig
         sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
         sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
         sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
+        
+        // 添加MyBatis-Plus分页插件
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        sessionFactory.setPlugins(new PaginationInterceptor[]{paginationInterceptor});
+        
         return sessionFactory.getObject();
     }
-}
+}