|
|
@@ -13,7 +13,10 @@ import com.fs.his.mapper.FsPrescribeDataScrmMapper;
|
|
|
import com.fs.his.mapper.PrescribeScrmTaskRecordMapper;
|
|
|
import com.fs.his.param.PrescribeXyImgParam;
|
|
|
import com.fs.his.service.IFsPrescribeDataScrmService;
|
|
|
-import com.fs.qw.domain.FsCompanyCustomer;
|
|
|
+import com.fs.his.service.PrescriptionImageService;
|
|
|
+import com.fs.his.vo.FsPrescribeDataScrmImgVO;
|
|
|
+import com.fs.hisStore.domain.FsStoreProductScrm;
|
|
|
+import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
|
|
|
import com.fs.qw.mapper.FsCompanyCustomerMapper;
|
|
|
import com.fs.qw.vo.FsPrescribeDataScrmVO;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
@@ -25,252 +28,391 @@ import org.springframework.context.ApplicationContext;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import java.util.Collections;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
- * 处方表(SCRM)Service业务层处理
|
|
|
+ * 商城处方表(SCRM)Service业务层处理
|
|
|
*
|
|
|
* @author ruoyi
|
|
|
* @date 2026-06-11
|
|
|
*/
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
-public class FsPrescribeDataScrmServiceImpl implements IFsPrescribeDataScrmService
|
|
|
-{
|
|
|
+public class FsPrescribeDataScrmServiceImpl implements IFsPrescribeDataScrmService {
|
|
|
+
|
|
|
@Autowired
|
|
|
private FsPrescribeDataScrmMapper fsPrescribeDataScrmMapper;
|
|
|
-
|
|
|
@Autowired
|
|
|
private PrescribeScrmTaskRecordMapper scrmTaskRecordMapper;
|
|
|
-
|
|
|
@Autowired
|
|
|
private FsCompanyCustomerMapper companyCustomerMapper;
|
|
|
-
|
|
|
@Autowired
|
|
|
private FsPrescribeDataScrmDrugMapper dataScrmDrugMapper;
|
|
|
-
|
|
|
+ @Autowired
|
|
|
+ private PrescriptionImageService prescriptionImageService;
|
|
|
+ @Autowired
|
|
|
+ private FsStoreProductScrmMapper fsStoreProductScrmMapper;
|
|
|
@Autowired
|
|
|
private ApplicationContext applicationContext;
|
|
|
+
|
|
|
private IFsPrescribeDataScrmService self() {
|
|
|
return applicationContext.getBean(IFsPrescribeDataScrmService.class);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 查询处方表(SCRM)
|
|
|
- *
|
|
|
- * @param prescribeId 处方表(SCRM)主键
|
|
|
- * @return 处方表(SCRM)
|
|
|
- */
|
|
|
+ /*
|
|
|
+ * 开方中
|
|
|
+ * */
|
|
|
+ private static final Integer IS_PRESCRIBING = 2;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 待审核
|
|
|
+ * */
|
|
|
+ private static final Integer WAIT_AUDIT = 3;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 已开方
|
|
|
+ * */
|
|
|
+ private static final Integer OPEN_PRESCRIBE = 4;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 已拒方
|
|
|
+ * */
|
|
|
+ private static final Integer REJECT_PRESCRIBE = 5;
|
|
|
+
|
|
|
+
|
|
|
+ // ==================== 基础 CRUD ====================
|
|
|
@Override
|
|
|
- public FsPrescribeDataScrm selectFsPrescribeDataScrmByPrescribeId(Long prescribeId)
|
|
|
- {
|
|
|
+ public FsPrescribeDataScrm selectFsPrescribeDataScrmByPrescribeId(Long prescribeId) {
|
|
|
return fsPrescribeDataScrmMapper.selectFsPrescribeDataScrmByPrescribeId(prescribeId);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 查询处方表(SCRM)列表
|
|
|
- *
|
|
|
- * @param fsPrescribeDataScrm 处方表(SCRM)
|
|
|
- * @return 处方表(SCRM)
|
|
|
- */
|
|
|
@Override
|
|
|
- public List<FsPrescribeDataScrm> selectFsPrescribeDataScrmList(FsPrescribeDataScrm fsPrescribeDataScrm)
|
|
|
- {
|
|
|
+ public List<FsPrescribeDataScrm> selectFsPrescribeDataScrmList(FsPrescribeDataScrm fsPrescribeDataScrm) {
|
|
|
return fsPrescribeDataScrmMapper.selectFsPrescribeDataScrmList(fsPrescribeDataScrm);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 新增处方表(SCRM)
|
|
|
- *
|
|
|
- * @param fsPrescribeDataScrm 处方表(SCRM)
|
|
|
- * @return 结果
|
|
|
- */
|
|
|
@Override
|
|
|
- public int insertFsPrescribeDataScrm(FsPrescribeDataScrm fsPrescribeDataScrm)
|
|
|
- {
|
|
|
+ public int insertFsPrescribeDataScrm(FsPrescribeDataScrm fsPrescribeDataScrm) {
|
|
|
fsPrescribeDataScrm.setCreateTime(DateUtils.getNowDate());
|
|
|
return fsPrescribeDataScrmMapper.insertFsPrescribeDataScrm(fsPrescribeDataScrm);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 修改处方表(SCRM)
|
|
|
- *
|
|
|
- * @param fsPrescribeDataScrm 处方表(SCRM)
|
|
|
- * @return 结果
|
|
|
- */
|
|
|
@Override
|
|
|
- public int updateFsPrescribeDataScrm(FsPrescribeDataScrm fsPrescribeDataScrm)
|
|
|
- {
|
|
|
+ public int updateFsPrescribeDataScrm(FsPrescribeDataScrm fsPrescribeDataScrm) {
|
|
|
return fsPrescribeDataScrmMapper.updateFsPrescribeDataScrm(fsPrescribeDataScrm);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 批量删除处方表(SCRM)
|
|
|
- *
|
|
|
- * @param prescribeIds 需要删除的处方表(SCRM)主键
|
|
|
- * @return 结果
|
|
|
- */
|
|
|
@Override
|
|
|
- public int deleteFsPrescribeDataScrmByPrescribeIds(Long[] prescribeIds)
|
|
|
- {
|
|
|
+ public int deleteFsPrescribeDataScrmByPrescribeIds(Long[] prescribeIds) {
|
|
|
return fsPrescribeDataScrmMapper.deleteFsPrescribeDataScrmByPrescribeIds(prescribeIds);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 删除处方表(SCRM)信息
|
|
|
- *
|
|
|
- * @param prescribeId 处方表(SCRM)主键
|
|
|
- * @return 结果
|
|
|
- */
|
|
|
@Override
|
|
|
- public int deleteFsPrescribeDataScrmByPrescribeId(Long prescribeId)
|
|
|
- {
|
|
|
+ public int deleteFsPrescribeDataScrmByPrescribeId(Long prescribeId) {
|
|
|
return fsPrescribeDataScrmMapper.deleteFsPrescribeDataScrmByPrescribeId(prescribeId);
|
|
|
}
|
|
|
|
|
|
+ // ==================== 查询列表 ====================
|
|
|
@Override
|
|
|
public List<FsPrescribeDataScrmVO> waitOpenPrescribeList(FsPrescribeDataDoctorQueryDto queryDto) {
|
|
|
- List<FsPrescribeDataScrmVO> list=fsPrescribeDataScrmMapper.waitOpenPrescribeList(queryDto);
|
|
|
- if (CollectionUtils.isEmpty(list)){
|
|
|
- return Collections.emptyList();
|
|
|
- }
|
|
|
- return list;
|
|
|
+ List<FsPrescribeDataScrmVO> list = fsPrescribeDataScrmMapper.waitOpenPrescribeList(queryDto);
|
|
|
+ return CollectionUtils.isEmpty(list) ? Collections.emptyList() : list;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<FsPrescribeDataScrmVO> pendingStorePrescribeList(FsPrescribeDataDrugDoctorQueryDto queryDto) {
|
|
|
+ List<FsPrescribeDataScrmVO> list = fsPrescribeDataScrmMapper.pendingStorePrescribeList(queryDto);
|
|
|
+ return CollectionUtils.isEmpty(list) ? Collections.emptyList() : list;
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 医生操作 ====================
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public int doctorExecuteScrmPrescribe(FsPrescribeDataDoctorUpdateDto updateDto) {
|
|
|
- FsPrescribeDataScrm updatePrescribe=new FsPrescribeDataScrm();
|
|
|
- BeanCopyUtils.copy(updateDto,updatePrescribe);
|
|
|
- //TODO 删除只有医生签名的处方图片(处方生成时就用定时任务生成了基础处方图片[无药品、无医生、药师签名])
|
|
|
- if (updateDto.getDoctorConfirm()==1){
|
|
|
- //医生确认开方-生成处方单定时任务
|
|
|
- PrescribeScrmTaskRecord record = new PrescribeScrmTaskRecord();
|
|
|
- record.setPrescribeId(updateDto.getPrescribeId());
|
|
|
- record.setCreateTime(DateUtils.getNowDate());
|
|
|
- record.setExecuteStatus(0);
|
|
|
- record.setRetryCount(0);
|
|
|
- //只有医生签名的处方图片标识
|
|
|
- record.setSignFlag(1);
|
|
|
- scrmTaskRecordMapper.insertPrescribeScrmTaskRecord(record);
|
|
|
- }else if (updateDto.getDoctorConfirm()==-1){
|
|
|
- //拒方
|
|
|
- if (StringUtils.isBlank(updateDto.getAuditReason())){
|
|
|
+ // 1. 清除原有基础处方图片
|
|
|
+ clearPrescriptionImage(updateDto.getPrescribeId());
|
|
|
+
|
|
|
+ // 2. 更新处方主记录
|
|
|
+ FsPrescribeDataScrm updatePrescribe = new FsPrescribeDataScrm();
|
|
|
+ BeanCopyUtils.copy(updateDto, updatePrescribe);
|
|
|
+ int updateCount = fsPrescribeDataScrmMapper.updateFsPrescribeDataScrm(updatePrescribe);
|
|
|
+
|
|
|
+ // 3. 根据医生确认结果进行后续处理
|
|
|
+ if (updateDto.getDoctorConfirm() == 1) {
|
|
|
+ // 确认开方 → 异步生成医生签名处方图片
|
|
|
+ submitPrescribeImageTask(updateDto.getPrescribeId(), 1);
|
|
|
+ // 更新用户状态为待审核
|
|
|
+ updateCustomerStatus(updateDto.getPrescribeId(), WAIT_AUDIT);
|
|
|
+ } else if (updateDto.getDoctorConfirm() == -1) {
|
|
|
+ // 拒方
|
|
|
+ if (StringUtils.isBlank(updateDto.getAuditReason())) {
|
|
|
throw new CustomException("拒方原因不能为空");
|
|
|
}
|
|
|
- //修改客户信息表状态为医生拒方
|
|
|
- FsCompanyCustomer fsCompanyCustomer=new FsCompanyCustomer();
|
|
|
- fsCompanyCustomer.setPrescribeId(updateDto.getPrescribeId());
|
|
|
- fsCompanyCustomer.setProcessStatus(5);//医生拒方
|
|
|
- companyCustomerMapper.updateFsCompanyCustomer(fsCompanyCustomer);
|
|
|
+ // 更新用户状态为已拒方
|
|
|
+ updateCustomerStatus(updateDto.getPrescribeId(), REJECT_PRESCRIBE);
|
|
|
+ }
|
|
|
+ return updateCount;
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 药师操作 ====================
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public int drugDoctorExecuteScrmPrescribe(FsPrescribeDataDrugDoctorUpdateDto updateDto) {
|
|
|
+ if (updateDto.getStatus() == 1) {
|
|
|
+ // 审核通过 → 异步生成医生+药师签名处方图片
|
|
|
+ submitPrescribeImageTask(updateDto.getPrescribeId(), 2);
|
|
|
+ updateCustomerStatus(updateDto.getPrescribeId(), OPEN_PRESCRIBE);
|
|
|
+ } else if (updateDto.getStatus() == 2) {
|
|
|
+ // 审核不通过 → 清除处方图片,退回状态
|
|
|
+ clearPrescriptionImage(updateDto.getPrescribeId());
|
|
|
+ updateCustomerStatus(updateDto.getPrescribeId(), IS_PRESCRIBING);
|
|
|
}
|
|
|
+
|
|
|
+ // 更新处方主记录
|
|
|
+ FsPrescribeDataScrm updatePrescribe = new FsPrescribeDataScrm();
|
|
|
+ BeanCopyUtils.copy(updateDto, updatePrescribe);
|
|
|
return fsPrescribeDataScrmMapper.updateFsPrescribeDataScrm(updatePrescribe);
|
|
|
}
|
|
|
|
|
|
+ // ==================== 处方图片生成 ====================
|
|
|
+ /**
|
|
|
+ * 生成处方图片(异步任务调用)
|
|
|
+ * @param prescribeId 处方ID
|
|
|
+ * @param signFlag 签名标识:1-仅医生签名,2-医生+药师签名
|
|
|
+ * @return Map 包含两个 key:
|
|
|
+ * "prescribeImgUrl" - 中药处方图片地址
|
|
|
+ * "prescribeImgStoreUrl" - 西药处方图片地址
|
|
|
+ * 未生成对应的图片时 value 为 null
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<String, String> prescribeScrmImgYsyTask(Long prescribeId, Integer signFlag) {
|
|
|
+ FsPrescribeDataScrmImgVO imgVO = fsPrescribeDataScrmMapper.selectFsPrescribeDataScrmImgVOByPrescribeId(prescribeId);
|
|
|
+ Asserts.notNull(imgVO, String.format("处方 %d 未找到!", prescribeId));
|
|
|
+ Asserts.notNull(imgVO.getDoctorId(), String.format("医生 %s 未找到!", imgVO.getDoctorId()));
|
|
|
+ Asserts.notNull(imgVO.getDrugDoctorId(), String.format("药师 %s 未找到!", imgVO.getDrugDoctorId()));
|
|
|
+
|
|
|
+ // 1. 获取并过滤药品
|
|
|
+ FsPrescribeDataScrmDrug query = new FsPrescribeDataScrmDrug();
|
|
|
+ query.setPrescribeId(prescribeId);
|
|
|
+ List<FsPrescribeDataScrmDrug> drugList = dataScrmDrugMapper.selectFsPrescribeDataScrmDrugList(query);
|
|
|
+ if (CollectionUtils.isEmpty(drugList)) {
|
|
|
+ throw new CustomException(String.format("处方单 %d 对应药品为空!", prescribeId));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<FsPrescribeDataScrmDrug> effectiveDrugs = filterNonDrugScrmPrescribe(drugList);
|
|
|
+
|
|
|
+ // 2. 按药品类型分组
|
|
|
+ Map<Integer, List<FsPrescribeDataScrmDrug>> drugTypeMap = effectiveDrugs.stream()
|
|
|
+ .collect(Collectors.groupingBy(FsPrescribeDataScrmDrug::getDrugType));
|
|
|
+ List<FsPrescribeDataScrmDrug> westernDrugs = drugTypeMap.getOrDefault(1, Collections.emptyList()); // 西药
|
|
|
+ List<FsPrescribeDataScrmDrug> chineseDrugs = drugTypeMap.getOrDefault(2, Collections.emptyList()); // 中药
|
|
|
+
|
|
|
+ // 3. 根据处方类型决定要生成的图片
|
|
|
+ Integer prescribeType = imgVO.getPrescribeType();
|
|
|
+ boolean needWestern = (prescribeType == 1 || prescribeType == 3) && !westernDrugs.isEmpty();
|
|
|
+ boolean needChinese = (prescribeType == 2 || prescribeType == 3) && !chineseDrugs.isEmpty();
|
|
|
+
|
|
|
+ // 4. 分别生成图片并更新数据库
|
|
|
+ FsPrescribeDataScrm updateData = new FsPrescribeDataScrm();
|
|
|
+ updateData.setPrescribeId(prescribeId);
|
|
|
+ boolean hasUpdate = false;
|
|
|
+
|
|
|
+ // 生成西药图片 → prescribeImgStoreUrl
|
|
|
+ if (needWestern) {
|
|
|
+ if (StringUtils.isBlank(imgVO.getPrescribeImgStoreUrl())) {
|
|
|
+ String url = generatePrescriptionImageForType(imgVO, signFlag, westernDrugs);
|
|
|
+ updateData.setPrescribeImgStoreUrl(url);
|
|
|
+ hasUpdate = true;
|
|
|
+ } else {
|
|
|
+ log.info("处方 {} 西药图片已存在,跳过生成", prescribeId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成中药图片 → prescribeImgUrl
|
|
|
+ if (needChinese) {
|
|
|
+ if (StringUtils.isBlank(imgVO.getPrescribeImgUrl())) {
|
|
|
+ String url = generatePrescriptionImageForType(imgVO, signFlag, chineseDrugs);
|
|
|
+ updateData.setPrescribeImgUrl(url);
|
|
|
+ hasUpdate = true;
|
|
|
+ } else {
|
|
|
+ log.info("处方 {} 中药图片已存在,跳过生成", prescribeId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (hasUpdate) {
|
|
|
+ fsPrescribeDataScrmMapper.updateFsPrescribeDataScrm(updateData);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 构建返回结果(重新查询一次确保拿到最新值)
|
|
|
+ FsPrescribeDataScrmImgVO latest = fsPrescribeDataScrmMapper.selectFsPrescribeDataScrmImgVOByPrescribeId(prescribeId);
|
|
|
+ Map<String, String> result = new HashMap<>();
|
|
|
+ result.put("prescribeImgUrl", latest != null ? latest.getPrescribeImgUrl() : null);
|
|
|
+ result.put("prescribeImgStoreUrl", latest != null ? latest.getPrescribeImgStoreUrl() : null);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成处方图片(按药品类型)
|
|
|
+ */
|
|
|
+ private String generatePrescriptionImageForType(FsPrescribeDataScrmImgVO imgVO,
|
|
|
+ Integer signFlag,
|
|
|
+ List<FsPrescribeDataScrmDrug> drugList) {
|
|
|
+ PrescribeXyImgParam imgParam = new PrescribeXyImgParam();
|
|
|
+ imgParam.setTime(imgVO.getCreateTime());
|
|
|
+ imgParam.setPrescribeId(imgVO.getPrescribeCode());
|
|
|
+ imgParam.setPatientName(imgVO.getPatientName());
|
|
|
+ imgParam.setPatientGender(String.valueOf(imgVO.getPatientGender()));
|
|
|
+ imgParam.setPatientAge(imgVO.getPatientAge());
|
|
|
+ imgParam.setOutpatientId(imgVO.getPrescribeCode());
|
|
|
+
|
|
|
+ if (com.fs.common.utils.StringUtils.isNotBlank(imgVO.getRemark())) {
|
|
|
+ imgParam.setRemark(imgVO.getRemark());
|
|
|
+ } else {
|
|
|
+ log.error("PrescribeImgYsyTask 处方id:{},缺失医嘱内容", imgVO.getPrescribeId());
|
|
|
+ imgParam.setRemark("请按照用药说明书服用药品,如有不适,请及时就医!");
|
|
|
+ }
|
|
|
+
|
|
|
+ imgParam.setHistoryAllergic(imgVO.getHistoryAllergic());
|
|
|
+ imgParam.setDiagnose(imgVO.getDiagnose());
|
|
|
+ imgParam.setPrescribeDrug(convertToPrescribeDrugList(drugList));
|
|
|
|
|
|
- //生成带有医生签名的处方图片
|
|
|
- public void createDoctorSignImg(FsPrescribeDataScrm prescribeDataScrm) {
|
|
|
- if(prescribeDataScrm != null&& prescribeDataScrm.getPrescribeId() != null) {
|
|
|
- String prescribeImgUrl = self().prescribeScrmImgYsyTask(prescribeDataScrm.getPrescribeId(),1);//1:生成只有医生签名的处方图片
|
|
|
- prescribeDataScrm.setPrescribeImgUrl(prescribeImgUrl);
|
|
|
- fsPrescribeDataScrmMapper.updateFsPrescribeDataScrm(prescribeDataScrm);
|
|
|
+ // 签名设置(保底默认全部签名)
|
|
|
+ imgParam.setUrl(imgVO.getDoctorSign());
|
|
|
+ if (signFlag == null || signFlag == 2) {
|
|
|
+ imgParam.setDrugDoctorUrl(imgVO.getDrugDoctorSignUrl());
|
|
|
}
|
|
|
+
|
|
|
+ imgParam.setDoctorName(imgVO.getDoctorName());
|
|
|
+ imgParam.setAuditDoctor(imgVO.getDrugDoctorName());
|
|
|
+ imgParam.setTelPhone(imgVO.getPatientTel());
|
|
|
+ imgParam.setJobLicenseNumber(imgVO.getPractiseCode());
|
|
|
+ imgParam.setDoctorNo(imgVO.getDoctorCertificate());
|
|
|
+ imgParam.setDoctorTitle(imgVO.getDoctorPosition());
|
|
|
+
|
|
|
+ return prescriptionImageService.generatePrescriptionImage(imgParam);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public String prescribeScrmImgYsyTask(Long prescribeId,Integer signFlag) {
|
|
|
-// FsPrescribeDataScrm f = fsPrescribeDataScrmMapper.selectFsPrescribeDataScrmByPrescribeId(prescribeId);
|
|
|
-// Asserts.notNull(f,String.format("处方 %d 未找到!",prescribeId));
|
|
|
-//
|
|
|
-// if (com.fs.common.utils.StringUtils.isBlank(f.getPrescribeImgUrl())) {
|
|
|
-// FsPrescribeDrug d = new FsPrescribeDrug();
|
|
|
-// d.setPrescribeId(f.getPrescribeId());
|
|
|
-// List<FsPrescribeDrug> list = fsPrescribeDrugMapper.selectFsPrescribeDrugList(d);
|
|
|
-//
|
|
|
-// if (org.springframework.util.CollectionUtils.isEmpty(list)) {
|
|
|
-// throw new IllegalArgumentException(String.format("处方单 %d 对应药品为空!",prescribeId));
|
|
|
-// }
|
|
|
-// PrescribeXyImgParam o = new PrescribeXyImgParam();
|
|
|
-// o.setTime(f.getCreateTime());
|
|
|
-// o.setPrescribeId(f.getPrescribeCode());
|
|
|
-// o.setPatientName(f.getPatientName());
|
|
|
-// o.setPatientGender(f.getPatientGender());
|
|
|
-// o.setPatientAge(f.getPatientAge());
|
|
|
-// o.setOutpatientId(f.getPrescribeCode());
|
|
|
-// if (com.fs.common.utils.StringUtils.isNotBlank(f.getRemark())){
|
|
|
-// o.setRemark(f.getRemark());
|
|
|
-// } else {
|
|
|
-// log.error("PrescribeImgYsyTask 处方id:{},缺失医嘱内容", f.getPrescribeId());
|
|
|
-// o.setRemark("请按照用药说明书服用药品,如有不适,请及时就医!");
|
|
|
-// }
|
|
|
-// o.setHistoryAllergic(f.getHistoryAllergic());
|
|
|
-// o.setDiagnose(f.getDiagnose());
|
|
|
-// // 在这里添加处方药品列表的值
|
|
|
-// List<FsPrescribeDrug> PrescribeDrugList=filterNonDrugPrescribe(list);
|
|
|
-// o.setPrescribeDrug(PrescribeDrugList);
|
|
|
-// if (signFlag!=null&&signFlag==1){
|
|
|
-// //医生签名
|
|
|
-// o.setUrl(f.getUrl());
|
|
|
-// }else if (signFlag!=null&&signFlag==2){
|
|
|
-// //医生签名+药师签名
|
|
|
-// o.setUrl(f.getUrl());
|
|
|
-// //药师签名
|
|
|
-// o.setDrugDoctorUrl(f.getDrugDoctorSignUrl());
|
|
|
-// } else if (signFlag==null){//保底策略 默认
|
|
|
-// //医生签名
|
|
|
-// o.setUrl(f.getUrl());
|
|
|
-// //药师签名
|
|
|
-// o.setDrugDoctorUrl(f.getDrugDoctorSignUrl());
|
|
|
-// }
|
|
|
-// //医生名称
|
|
|
-// o.setDoctorName(f.getDoctorName());
|
|
|
-// //审核药师
|
|
|
-// o.setAuditDoctor(f.getDoctorDrugName());
|
|
|
-// o.setDispatcher("");
|
|
|
-// o.setCheckDoctor("");
|
|
|
-// o.setTelPhone(f.getPatientTel());
|
|
|
-// FsDoctor fsDoctor = doctorMapper.selectFsDoctorByDoctorId(f.getDoctorId());
|
|
|
-// Asserts.notNull(fsDoctor,String.format("医生 %s 未找到!",f.getDoctorId()));
|
|
|
-// //执业证号
|
|
|
-// o.setJobLicenseNumber(fsDoctor.getPractiseCode());
|
|
|
-// //医生证号
|
|
|
-// o.setDoctorNo(fsDoctor.getCertificateCode());
|
|
|
-// o.setDoctorTitle(fsDoctor.getPosition());
|
|
|
-//
|
|
|
-// String url = prescriptionImageService.generatePrescriptionImage(o);
|
|
|
-// FsPrescribe fsPrescribe = new FsPrescribe();
|
|
|
-// fsPrescribe.setPrescribeImgUrl(url);
|
|
|
-// fsPrescribe.setPrescribeId(f.getPrescribeId());
|
|
|
-// fsPrescribeMapper.updateFsPrescribe(fsPrescribe);
|
|
|
-// f.setPrescribeImgUrl(url);
|
|
|
-//
|
|
|
-// } else {
|
|
|
-// log.info("处方 {} 对应处方单已经被生成!",prescribeId);
|
|
|
-// }
|
|
|
-// return f.getPrescribeImgUrl();
|
|
|
- return null;
|
|
|
+ public void clearPrescribeUrl(Long prescribeId) {
|
|
|
+ fsPrescribeDataScrmMapper.clearPrescribeUrl(prescribeId);
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public List<FsPrescribeDataScrmVO> pendingStorePrescribeList(FsPrescribeDataDrugDoctorQueryDto queryDto) {
|
|
|
- List<FsPrescribeDataScrmVO> list=fsPrescribeDataScrmMapper.pendingStorePrescribeList(queryDto);
|
|
|
- if (CollectionUtils.isEmpty(list)){
|
|
|
+ // ==================== 私有辅助方法 ====================
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 统一更新客户信息表流程状态
|
|
|
+ */
|
|
|
+ private void updateCustomerStatus(Long prescribeId, Integer status) {
|
|
|
+ companyCustomerMapper.updateProcessStatusByPrescribeId(prescribeId, status);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 提交异步处方图片生成任务
|
|
|
+ */
|
|
|
+ private void submitPrescribeImageTask(Long prescribeId, Integer signFlag) {
|
|
|
+ PrescribeScrmTaskRecord record = new PrescribeScrmTaskRecord();
|
|
|
+ record.setPrescribeId(prescribeId);
|
|
|
+ record.setCreateTime(DateUtils.getNowDate());
|
|
|
+ record.setExecuteStatus(0);
|
|
|
+ record.setRetryCount(0);
|
|
|
+ record.setSignFlag(signFlag);
|
|
|
+ scrmTaskRecordMapper.insertPrescribeScrmTaskRecord(record);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清除处方图片
|
|
|
+ */
|
|
|
+ private void clearPrescriptionImage(Long prescribeId) {
|
|
|
+ self().clearPrescribeUrl(prescribeId);
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 药品过滤与转换 ====================
|
|
|
+ /**
|
|
|
+ * 根据产品最新状态过滤处方单药品列表。
|
|
|
+ * <p>
|
|
|
+ * 该方法的过滤规则如下:
|
|
|
+ * - 对于 productId 非空的处方药,使用其对应产品表(FsStoreProduct)中的 isDrug 状态进行判断,只保留 isDrug=1 的项。
|
|
|
+ * - 对于 productId 为空的处方药,直接使用其自身的 isDrug 状态进行判断,只保留 isDrug=1 的项。
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @param prescribeDrugs 待过滤的处方单药品列表。如果为 null 或空,则直接返回空列表。
|
|
|
+ * @return 一个符合上述规则的新列表。
|
|
|
+ */
|
|
|
+ public List<FsPrescribeDataScrmDrug> filterNonDrugScrmPrescribe(List<FsPrescribeDataScrmDrug> prescribeDrugs) {
|
|
|
+ if (CollectionUtils.isEmpty(prescribeDrugs)) {
|
|
|
return Collections.emptyList();
|
|
|
}
|
|
|
- return list;
|
|
|
+
|
|
|
+ Set<Long> productIds = prescribeDrugs.stream()
|
|
|
+ .map(FsPrescribeDataScrmDrug::getProductId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ List<FsStoreProductScrm> storeProductIns = Collections.emptyList();
|
|
|
+ if (!productIds.isEmpty()) {
|
|
|
+ storeProductIns = fsStoreProductScrmMapper.getStoreProductInProductIds(new ArrayList<>(productIds));
|
|
|
+ if (storeProductIns.isEmpty()) {
|
|
|
+ log.error("查询产品id列表:{}查询产品信息为空!", productIds);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<Long, FsStoreProductScrm> storeProductMap = storeProductIns.stream()
|
|
|
+ .collect(Collectors.toMap(FsStoreProductScrm::getProductId, Function.identity()));
|
|
|
+
|
|
|
+ List<FsPrescribeDataScrmDrug> filteredDrugs = new ArrayList<>();
|
|
|
+ for (FsPrescribeDataScrmDrug drug : prescribeDrugs) {
|
|
|
+ boolean shouldKeep = false;
|
|
|
+ if (drug.getProductId() != null) {
|
|
|
+ FsStoreProductScrm product = storeProductMap.get(drug.getProductId());
|
|
|
+ if (product != null) {
|
|
|
+ shouldKeep = Integer.valueOf(1).equals(product.getIsDrug());
|
|
|
+ } else {
|
|
|
+ log.warn("药品 '{}' (ID: {}) 在产品表中未找到对应记录,将被过滤。", drug.getDrugName(), drug.getProductId());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ shouldKeep = Integer.valueOf(1).equals(drug.getIsDrug());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shouldKeep) {
|
|
|
+ filteredDrugs.add(drug);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return filteredDrugs;
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public int drugDoctorExecuteScrmPrescribe(FsPrescribeDataDrugDoctorUpdateDto updateDto) {
|
|
|
- FsPrescribeDataScrm updatePrescribe=new FsPrescribeDataScrm();
|
|
|
- BeanCopyUtils.copy(updateDto,updatePrescribe);
|
|
|
- if (updateDto.getStatus()==1){
|
|
|
- //TODO 生成具有医生、药师签名的处方图片
|
|
|
- }else if (updateDto.getStatus()==2){
|
|
|
- //TODO 删除只有医生签名的处方图片
|
|
|
+ /**
|
|
|
+ * 转换处方单药品列表
|
|
|
+ * */
|
|
|
+ private List<FsPrescribeDrug> convertToPrescribeDrugList(List<FsPrescribeDataScrmDrug> sourceList) {
|
|
|
+ if (sourceList == null || sourceList.isEmpty()) {
|
|
|
+ return new ArrayList<>();
|
|
|
}
|
|
|
- return fsPrescribeDataScrmMapper.updateFsPrescribeDataScrm(updatePrescribe);
|
|
|
+ return sourceList.stream()
|
|
|
+ .map(source -> {
|
|
|
+ FsPrescribeDrug target = new FsPrescribeDrug();
|
|
|
+ target.setDrugId(source.getDrugId());
|
|
|
+ target.setPrescribeId(source.getPrescribeId());
|
|
|
+ target.setDrugName(source.getDrugName());
|
|
|
+ target.setDrugSpec(source.getDrugSpec());
|
|
|
+ target.setUsageMethod(source.getUsageMethod());
|
|
|
+ target.setUsageFrequencyUnit(source.getUsageFrequencyUnit());
|
|
|
+ target.setUsagePerUseCount(source.getUsagePerUseCount());
|
|
|
+ target.setUsagePerUseUnit(source.getUsagePerUseUnit());
|
|
|
+ target.setUsageDays(source.getUsageDays());
|
|
|
+ target.setDrugPrice(source.getDrugPrice());
|
|
|
+ target.setDrugUnit(source.getDrugUnit());
|
|
|
+ target.setInstructions(source.getInstructions());
|
|
|
+ target.setProductId(source.getProductId());
|
|
|
+ target.setDrugImgUrl(source.getDrugImgUrl());
|
|
|
+ target.setProductAttrValueId(source.getProductAttrValueId());
|
|
|
+ target.setRemark(source.getRemark());
|
|
|
+ target.setDrugType(source.getDrugType());
|
|
|
+ target.setIsDrug(source.getIsDrug());
|
|
|
+ target.setDrugNum(source.getDrugNum());
|
|
|
+ return target;
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
}
|
|
|
}
|