YpCodgMatchService.java 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. package thyyxxk.webserver.service.medicine;
  2. import cn.hutool.core.convert.Convert;
  3. import cn.hutool.core.date.DateUtil;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.taobao.api.response.AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.apache.commons.collections4.ListUtils;
  8. import org.apache.commons.lang3.StringUtils;
  9. import org.springframework.stereotype.Service;
  10. import thyyxxk.webserver.config.exception.ExceptionEnum;
  11. import thyyxxk.webserver.dao.his.medicine.MzDrugTracCodgDao;
  12. import thyyxxk.webserver.dao.his.medicine.YpCodgLineDao;
  13. import thyyxxk.webserver.dao.his.medicine.YpCodgMatchDao;
  14. import thyyxxk.webserver.dao.his.medicine.YpInDetlDao;
  15. import thyyxxk.webserver.dao.his.medicine.YpSelinfoSoldDao;
  16. import thyyxxk.webserver.dao.his.medicine.YpTracCodgDao;
  17. import thyyxxk.webserver.entity.ResultVo;
  18. import thyyxxk.webserver.entity.login.UserInfo;
  19. import thyyxxk.webserver.entity.medicine.MzDrugTracCodg;
  20. import thyyxxk.webserver.entity.medicine.YpCodgLine;
  21. import thyyxxk.webserver.entity.medicine.YpInDetlVo;
  22. import thyyxxk.webserver.entity.medicine.YpSelinfoSold;
  23. import thyyxxk.webserver.entity.medicine.vo.YpCodgVo;
  24. import thyyxxk.webserver.service.hutoolcache.UserCache;
  25. import thyyxxk.webserver.utils.ResultVoUtil;
  26. import java.math.BigDecimal;
  27. import java.util.ArrayList;
  28. import java.util.Arrays;
  29. import java.util.Date;
  30. import java.util.HashMap;
  31. import java.util.List;
  32. import java.util.Map;
  33. import java.util.stream.Collectors;
  34. /**
  35. * @ClassName YpCodgMatchService
  36. * @Author hsh
  37. * @Date 2025/6/20 0020 11:25
  38. * @Version 1.0
  39. * @Description 药品追溯码匹配Service
  40. **/
  41. @Service
  42. @Slf4j
  43. public class YpCodgMatchService {
  44. private final YpCodgMatchDao matchDao;
  45. private final YpCodgLineDao lineDao;
  46. private final YpTaoBaoService taoBaoService;
  47. private final YpInDetlDao inDao;
  48. private final MzDrugTracCodgDao mzDrugTracCodgDao;
  49. private final UserCache userCache;
  50. private final YpTracCodgDao codgDao;
  51. private final YpSelinfoSoldDao soldDao;
  52. public YpCodgMatchService(YpCodgMatchDao matchDao, YpCodgLineDao lineDao, YpTaoBaoService taoBaoService,
  53. YpInDetlDao inDao, MzDrugTracCodgDao mzDrugTracCodgDao, UserCache userCache,
  54. YpTracCodgDao codgDao, YpSelinfoSoldDao soldDao) {
  55. this.matchDao = matchDao;
  56. this.lineDao = lineDao;
  57. this.taoBaoService = taoBaoService;
  58. this.inDao = inDao;
  59. this.mzDrugTracCodgDao = mzDrugTracCodgDao;
  60. this.userCache = userCache;
  61. this.codgDao = codgDao;
  62. this.soldDao = soldDao;
  63. }
  64. /**
  65. * @Description 查询已缴费的待发药处方
  66. * @Author hsh
  67. * @param vo 参数
  68. * @return list 待发药处方明细
  69. * @Date 2025/6/25 0025 11:11
  70. */
  71. public ResultVo<List<Map<String, Object>>> selectMzChargePrescription(YpCodgVo vo){
  72. // 查询血透室的科室编码(特殊需求: 血透室的发药是批量发的,不再这里显示)
  73. // String deptCode = matchDao.selectXtsDeptCode();
  74. List<Map<String, Object>> cfList = matchDao.selectMzChargePrescription(vo);
  75. // 增加移动支付的医保信息收集
  76. for(Map<String, Object> map : cfList){
  77. String setlId = Convert.toStr(map.get("setlId"));
  78. if(StringUtils.isEmpty(setlId)){
  79. String id = Convert.toStr(map.get("patNo")) + "_" + Convert.toInt(map.get("times")) + "_1";
  80. Map<String, String> m = codgDao.selectMobileSetlInfoById(id);
  81. if(null != m){
  82. String payType = m.get("pay_type");
  83. if("1".equals(payType)){
  84. JSONObject j = JSONObject.parseObject(m.get("hi_ext_data"));
  85. JSONObject s = j.getJSONObject("setlinfo");
  86. map.put("setlId", s.getString("setlId"));
  87. map.put("mdtrtId",s.getString("mdtrtId"));
  88. }
  89. }
  90. }
  91. }
  92. return ResultVoUtil.success(cfList);
  93. }
  94. /**
  95. * @Description 根据处方信息查询处方明细
  96. * @Author hsh
  97. * @param vo 处方信息
  98. * @return list 处方明细
  99. * @Date 2025/7/4 0004 11:34
  100. */
  101. public ResultVo<List<Map<String, Object>>> selectMzCfDetail(YpCodgVo vo){
  102. return ResultVoUtil.success(matchDao.selectMzCfDetail(vo));
  103. }
  104. /**
  105. * @Description 查询获取的追溯码匹配信息
  106. * @Author hsh
  107. * @param vo 处方信息
  108. * @return map
  109. * @Date 2025/7/7 0007 14:48
  110. */
  111. public ResultVo<Map<String, Object>> selectMatchCodgInfo(YpCodgVo vo){
  112. String codgLine = vo.getCodeLine();
  113. if(StringUtils.isBlank(codgLine)){
  114. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "药品追溯码信息不存在,请检查!");
  115. }
  116. // 查询处方明细
  117. List<Map<String, Object>> cfDetail = matchDao.selectMzCfDetail(vo);
  118. // 查询是否开放码上放心平台核对校验功能(0:否; 1:是)
  119. String isOpenTb = matchDao.selectIsOpenTb();
  120. if(cfDetail.isEmpty()){
  121. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人处方信息不存在,请检查!");
  122. }
  123. Map<String, Object> resultMap = new HashMap<>();
  124. List<MzDrugTracCodg> resultList = new ArrayList<>();
  125. UserInfo us = userCache.getUserInfoByToken();
  126. // 根据处方信息查询企业追溯下载信息并进行追溯码匹配工作
  127. List<String> strArr = Arrays.stream(codgLine.split("\n")).collect(Collectors.toList());
  128. // 查询匹配的未上传使用的追溯码信息
  129. List<YpCodgLine> lines = lineDao.selectYpCodgLineByIds(strArr);
  130. if(!lines.isEmpty()){
  131. // 匹配后直接生成门诊销售待上传数据(这个后续在考虑是否有必要)
  132. // List<YpSelinfoSold> solds = callYpSelinfoSoldData(vo, lines, cfDetail);
  133. // 根据匹配信息生成门诊处方药品追溯码信息
  134. List<MzDrugTracCodg> ss = callMzDrugTracCodgDataByYb(us, vo, cfDetail, lines);
  135. if(!ss.isEmpty()) {
  136. resultList.addAll(ss);
  137. }
  138. }
  139. // 未匹配企业追溯下载的追溯码并且走淘宝接口获取药品信息
  140. List<String> unMatchCodgList;
  141. if(!lines.isEmpty()) {
  142. unMatchCodgList = strArr.stream().filter(s ->
  143. lines.stream().noneMatch(line -> s.equals(line.getSmlPacTracCodg()))).collect(Collectors.toList());
  144. } else {
  145. unMatchCodgList = new ArrayList<>(strArr);
  146. }
  147. // 生成门诊药品追溯码信息
  148. if(!unMatchCodgList.isEmpty() && "1".equals(isOpenTb)){
  149. // 调用淘宝接口核对药品信息
  150. String str = String.join(",", unMatchCodgList);
  151. ResultVo<Map<String, Object>> resultVo = taoBaoService.queryCodeDetail(str);
  152. Map<String, Object> map = resultVo.getData();
  153. if(null == map){
  154. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, resultVo.getMessage());
  155. }
  156. List<AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse.CodeFullInfoDto> codeFullInfoDto =
  157. (List<AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse.CodeFullInfoDto>) map.get("data");
  158. // 根据淘宝接口返回追溯码信息匹配并生成门诊处方药品追溯码信息
  159. List<MzDrugTracCodg> tb = callMzDrugTracCodgDataByTaoBao(us, vo, cfDetail, codeFullInfoDto);
  160. if(!tb.isEmpty()) {
  161. resultList.addAll(tb);
  162. }
  163. } else {
  164. for(String str : unMatchCodgList){
  165. MzDrugTracCodg codg = new MzDrugTracCodg();
  166. codg.setDrugTracCodg(str);
  167. codg.setPatientId(vo.getPatNo());
  168. codg.setTimes(vo.getTimes());
  169. codg.setReceiptNo(vo.getReceiptNo());
  170. codg.setOrderNo(vo.getOrderNo());
  171. codg.setItemNo(vo.getItemNo());
  172. codg.setRealNo(vo.getRealNo());
  173. codg.setGroupNo(vo.getGroupNo());
  174. codg.setConfirmId(StringUtils.trim(us.getCode()));
  175. codg.setConfirmName(StringUtils.trim(us.getName()));
  176. codg.setConfirmTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
  177. codg.setFlag("-1");
  178. codg.setMatchFlag("-1");
  179. codg.setMatchMessage("未匹配到药品信息,请检查!");
  180. }
  181. }
  182. resultMap.put("data", resultList);
  183. return ResultVoUtil.success(resultMap);
  184. }
  185. private List<MzDrugTracCodg> callMzDrugTracCodgDataByTaoBao(UserInfo us, YpCodgVo vo, List<Map<String, Object>> cfDetail,
  186. List<AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse.CodeFullInfoDto> codeFullInfoDto) {
  187. List<MzDrugTracCodg> tracCodgList = new ArrayList<>();
  188. if(null == codeFullInfoDto || codeFullInfoDto.isEmpty()){
  189. return tracCodgList;
  190. }
  191. Map<String, List<Map<String, Object>>> m =
  192. cfDetail.stream().collect(Collectors.groupingBy(f -> String.valueOf(f.get("chargeCode")), Collectors.toList()));
  193. for (AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse.CodeFullInfoDto dto : codeFullInfoDto){
  194. MzDrugTracCodg codg = new MzDrugTracCodg();
  195. // 药品生产信息
  196. List<AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse.ProduceInfoDto> produceInfoDto =
  197. dto.getCodeProduceInfoDTO().getProduceInfoList();
  198. // 药品基本信息
  199. AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse.DrugEntBaseDto drugEntBaseDto = dto.getDrugEntBaseDTO();
  200. // 生产企业信息
  201. AlibabaAlihealthDrugtraceTopYljgQueryCodedetailResponse.PUserEntDto pUserEntDto = dto.getpUserEntDTO();
  202. // 追溯码
  203. codg.setDrugTracCodg(dto.getCode());
  204. codg.setConfirmId(StringUtils.trim(us.getCode()));
  205. codg.setConfirmName(StringUtils.trim(us.getName()));
  206. codg.setConfirmTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
  207. codg.setPatientId(vo.getPatNo());
  208. codg.setTimes(vo.getTimes());
  209. codg.setReceiptNo(vo.getReceiptNo());
  210. codg.setOrderNo(vo.getOrderNo());
  211. codg.setItemNo(vo.getItemNo());
  212. codg.setRealNo(vo.getRealNo());
  213. codg.setGroupNo(vo.getGroupNo());
  214. // 生产批号
  215. String manuNo = produceInfoDto.get(0).getBatchNo();
  216. // 生产日期
  217. String manuDate = produceInfoDto.get(0).getProduceDateStr();
  218. // 有效期止
  219. String expyEnd = DateUtil.format(DateUtil.parse(produceInfoDto.get(0).getExpireDate(), "yyyyMMdd"), "yyyy-MM-dd");
  220. // 药品名称
  221. String chargeName = drugEntBaseDto.getPhysicName();
  222. // 批准文号
  223. String licenceNo = drugEntBaseDto.getApprovalLicenceNo();
  224. // 包装规格
  225. String specification = drugEntBaseDto.getPkgSpecCrit();
  226. // 制剂规格
  227. String spec = drugEntBaseDto.getPrepnSpec();
  228. // 生产企业名称
  229. String factory = pUserEntDto.getEntName();
  230. // 模糊查询入库信息(根据追溯码只能模糊匹配) 2025.07.25 暂时不根据批准文号匹配,因院内维护原因会有很多不一致
  231. List<YpInDetlVo> detlVoList = inDao.selectYpInDetlListByName(manuNo, chargeName);
  232. if(null == detlVoList || detlVoList.isEmpty()){
  233. codg.setFlag("-1");
  234. codg.setMatchFlag("-1");
  235. codg.setDrugName(chargeName);
  236. codg.setSpecification(specification);
  237. codg.setManuNo(manuNo);
  238. codg.setManuDate(manuDate);
  239. codg.setAbbrName(factory);
  240. codg.setExpyEnd(expyEnd);
  241. codg.setMatchMessage("未匹配到入库信息:扫码药品【" + chargeName + "】,请核对!");
  242. } else {
  243. List<Map<String, Object>> l = m.get(detlVoList.get(0).getChargeCode());
  244. if(null != l && !l.isEmpty()){
  245. String drugName = Convert.toStr(l.get(0).get("chargeName"));
  246. String serial = Convert.toStr(l.get(0).get("serial"));
  247. if(serial.equals(detlVoList.get(0).getSerial())){
  248. codg.setFlag("0");
  249. codg.setMatchFlag("1");
  250. codg.setMatchMessage("匹配码上放心平台药品信息成功");
  251. // 补全处方信息
  252. codg.setItemNo(Convert.toInt(l.get(0).get("itemNo")));
  253. codg.setDrugName(drugName);
  254. codg.setChargeItemCode(Convert.toStr(l.get(0).get("chargeCode")));
  255. codg.setSerial(Convert.toStr(l.get(0).get("serial")));
  256. codg.setChargeDate(Convert.toStr(l.get(0).get("chargeDate")));
  257. codg.setWarnDeptName(Convert.toStr(l.get(0).get("deptName")));
  258. codg.setSpecification(Convert.toStr(l.get(0).get("specification")));
  259. codg.setAbbrName(Convert.toStr(l.get(0).get("factory")));
  260. codg.setUnitPrice(Convert.toBigDecimal(l.get(0).get("retprice")));
  261. codg.setManuNo(manuNo);
  262. codg.setManuDate(manuDate);
  263. codg.setExpyEnd(expyEnd);
  264. } else {
  265. codg.setFlag("-1");
  266. codg.setMatchFlag("-1");
  267. codg.setDrugName(chargeName);
  268. codg.setSpecification(specification);
  269. codg.setManuNo(manuNo);
  270. codg.setManuDate(manuDate);
  271. codg.setAbbrName(factory);
  272. codg.setExpyEnd(expyEnd);
  273. codg.setMatchMessage("未匹配到药品信息,药品大小包装规格不对,请核对是否拆零");
  274. }
  275. } else {
  276. codg.setFlag("-1");
  277. codg.setMatchFlag("-1");
  278. codg.setDrugName(chargeName);
  279. codg.setSpecification(specification);
  280. codg.setManuNo(manuNo);
  281. codg.setManuDate(manuDate);
  282. codg.setAbbrName(factory);
  283. codg.setExpyEnd(expyEnd);
  284. codg.setMatchMessage("未匹配到处方药品信息: 扫码药品是【" + chargeName + "】,请核对!");
  285. }
  286. }
  287. tracCodgList.add(codg);
  288. }
  289. return tracCodgList;
  290. }
  291. private List<MzDrugTracCodg> callMzDrugTracCodgDataByYb(UserInfo us, YpCodgVo vo, List<Map<String, Object>> cfDetail, List<YpCodgLine> lines) {
  292. List<MzDrugTracCodg> tracCodgList = new ArrayList<>();
  293. if(null == lines || lines.isEmpty()){
  294. return tracCodgList;
  295. }
  296. Map<String, List<Map<String, Object>>> m =
  297. cfDetail.stream().collect(Collectors.groupingBy(f -> String.valueOf(f.get("chargeCode")), Collectors.toList()));
  298. for(YpCodgLine line : lines){
  299. MzDrugTracCodg codg = new MzDrugTracCodg();
  300. codg.setDrugTracCodg(line.getSmlPacTracCodg());
  301. codg.setPatientId(vo.getPatNo());
  302. codg.setTimes(vo.getTimes());
  303. codg.setReceiptNo(vo.getReceiptNo());
  304. codg.setOrderNo(vo.getOrderNo());
  305. codg.setItemNo(vo.getItemNo());
  306. codg.setRealNo(vo.getRealNo());
  307. codg.setGroupNo(vo.getGroupNo());
  308. codg.setConfirmId(StringUtils.trim(us.getCode()));
  309. codg.setConfirmName(StringUtils.trim(us.getName()));
  310. codg.setConfirmTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
  311. // 根据传票号和生产批号查询入库记录
  312. YpInDetlVo detlVo = inDao.selectYpInDetlListByNo(line.getDelvBchno(), line.getManuBchno());
  313. if(null == detlVo){
  314. codg.setFlag("-1");
  315. codg.setMatchFlag("-1");
  316. codg.setDrugName(line.getDrugProdname());
  317. codg.setSpecification(line.getDrugSpec());
  318. codg.setManuNo(line.getManuBchno());
  319. codg.setManuDate(line.getManuDate());
  320. codg.setAbbrName(line.getProdentpName());
  321. codg.setExpyEnd(line.getExpyEnd());
  322. codg.setMatchMessage("未匹配到入库信息:扫码药品【" + line.getDrugProdname() + "】,请核对!");
  323. } else {
  324. List<Map<String, Object>> l = m.get(StringUtils.trim(detlVo.getChargeCode()));
  325. if(null != l && !l.isEmpty()){
  326. String chargeName = Convert.toStr(l.get(0).get("chargeName"));
  327. String serial = Convert.toStr(l.get(0).get("serial"));
  328. if(serial.equals(detlVo.getSerial())){
  329. codg.setFlag("0");
  330. codg.setMatchFlag("0");
  331. codg.setMatchMessage("匹配企业追溯下载信息成功");
  332. // 补全处方信息
  333. codg.setItemNo(Convert.toInt(l.get(0).get("itemNo")));
  334. codg.setDrugName(chargeName);
  335. codg.setChargeItemCode(Convert.toStr(l.get(0).get("chargeCode")));
  336. codg.setSerial(Convert.toStr(l.get(0).get("serial")));
  337. codg.setChargeDate(Convert.toStr(l.get(0).get("chargeDate")));
  338. codg.setWarnDeptName(Convert.toStr(l.get(0).get("deptName")));
  339. codg.setSpecification(Convert.toStr(l.get(0).get("specification")));
  340. codg.setAbbrName(Convert.toStr(l.get(0).get("factory")));
  341. codg.setUnitPrice(Convert.toBigDecimal(l.get(0).get("retprice")));
  342. codg.setManuNo(line.getManuBchno());
  343. codg.setManuDate(line.getManuDate());
  344. codg.setExpyEnd(line.getExpyEnd());
  345. } else {
  346. codg.setFlag("-1");
  347. codg.setMatchFlag("-1");
  348. codg.setDrugName(line.getDrugProdname());
  349. codg.setSpecification(line.getDrugSpec());
  350. codg.setManuNo(line.getManuBchno());
  351. codg.setManuDate(line.getManuDate());
  352. codg.setAbbrName(line.getProdentpName());
  353. codg.setExpyEnd(line.getExpyEnd());
  354. codg.setMatchMessage("未匹配到药品信息,药品大小包装规格不对,请核对是否拆零");
  355. }
  356. } else {
  357. codg.setFlag("-1");
  358. codg.setMatchFlag("-1");
  359. codg.setDrugName(line.getDrugProdname());
  360. codg.setSpecification(line.getDrugSpec());
  361. codg.setManuNo(line.getManuBchno());
  362. codg.setManuDate(DateUtil.format(DateUtil.parse(line.getManuDate()), "yyyy-MM-dd"));
  363. codg.setAbbrName(line.getProdentpName());
  364. codg.setExpyEnd(DateUtil.format(DateUtil.parse(line.getExpyEnd()), "yyyy-MM-dd"));
  365. codg.setMatchMessage("未匹配到处方药品信息: 扫码药品是【" + line.getDrugProdname() + "】,请核对!");
  366. }
  367. }
  368. tracCodgList.add(codg);
  369. }
  370. return tracCodgList;
  371. }
  372. private List<YpSelinfoSold> callYpSelinfoSoldData(YpCodgVo vo, List<YpCodgLine> lines, List<Map<String, Object>> cfDetail) {
  373. List<YpSelinfoSold> solds = new ArrayList<>();
  374. if(null == lines || lines.isEmpty()){
  375. return solds;
  376. }
  377. for(YpCodgLine line : lines){
  378. YpSelinfoSold sold = new YpSelinfoSold();
  379. sold.setMedListCodg(line.getMedListCodg());
  380. sold.setFixmedinsHilistId(line.getFixmedinsCode());
  381. sold.setFixmedinsHilistName(line.getFixmedinsName());
  382. sold.setFixmedinsBchno(line.getDelvBchno());
  383. sold.setManuLotnum(line.getManuBchno());
  384. sold.setManuDate(DateUtil.format(DateUtil.parse(line.getManuDate(), "yyyy-MM-dd"), "yyyy-MM-dd"));
  385. sold.setExpyEnd(DateUtil.format(DateUtil.parse(line.getExpyEnd(), "yyyy-MM-dd"), "yyyy-MM-dd"));
  386. sold.setRxFlag(line.getRxFlag());
  387. sold.setTrdnFlag("0");
  388. sold.setRxno(vo.getPatNo() + "_" + vo.getTimes());
  389. sold.setRtalDocno(String.valueOf(vo.getRealNo()));
  390. sold.setSelRetnCnt(BigDecimal.ONE);
  391. }
  392. return solds;
  393. }
  394. /**
  395. * @Description 更新门诊处方药品追溯码匹配信息
  396. * @Author hsh
  397. * @param list 门诊处方药品追溯码匹配信息
  398. * @return map
  399. * @Date 2025/7/11 0011 17:15
  400. */
  401. public ResultVo<Map<String, Object>> updateMzDrugCodgData(List<MzDrugTracCodg> list){
  402. Map<String, Object> resultMap = new HashMap<>();
  403. if(null == list || list.isEmpty()){
  404. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "药品扫码的追溯码信息不存在,请检查!");
  405. }
  406. String patNo = list.get(0).getPatientId();
  407. Integer times = list.get(0).getTimes();
  408. Integer orderNo = list.get(0).getOrderNo();
  409. String groupNo = list.get(0).getGroupNo();
  410. if(StringUtils.isBlank(patNo)){
  411. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人门诊号信息不存在,请检查!");
  412. }
  413. if(null == times){
  414. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人门诊次数信息不存在,请检查!");
  415. }
  416. if(null == orderNo){
  417. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人门诊处方号信息不存在,请检查!");
  418. }
  419. if(StringUtils.isBlank(groupNo)){
  420. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人药房信息不存在,请检查!");
  421. }
  422. List<MzDrugTracCodg> mzCodgList = mzDrugTracCodgDao.selectMzDrugTracCodgByCode(list.get(0));
  423. int c = 0;
  424. if(null == mzCodgList || mzCodgList.isEmpty()){
  425. List<List<MzDrugTracCodg>> rl = ListUtils.partition(list, 30);
  426. for (List<MzDrugTracCodg> al : rl) {
  427. c = c + mzDrugTracCodgDao.insertMzDrugTracCodgBatch(al);
  428. }
  429. } else {
  430. mzDrugTracCodgDao.deleteMzDrugTracCodgByCode(list.get(0));
  431. List<List<MzDrugTracCodg>> rl = ListUtils.partition(list, 30);
  432. for (List<MzDrugTracCodg> al : rl) {
  433. c = c + mzDrugTracCodgDao.insertMzDrugTracCodgBatch(al);
  434. }
  435. }
  436. // 更新发药状态为已配药
  437. mzDrugTracCodgDao.updateMzChargeDetailConfirmFlag(patNo, times, orderNo, groupNo);
  438. if(c > 0){
  439. resultMap.put("code", 0);
  440. resultMap.put("message", "保存追溯码信息成功!");
  441. } else {
  442. resultMap.put("code", -1);
  443. resultMap.put("message", "保存追溯码信息失败!");
  444. }
  445. resultMap.put("data", list);
  446. return ResultVoUtil.success(resultMap);
  447. }
  448. /**
  449. * @Description 根据条件删除门诊处方匹配的追溯码信息
  450. * @Author hsh
  451. * @param vo 条件
  452. * @return map
  453. * @Date 2025/7/14 0014 15:52
  454. */
  455. public ResultVo<Map<String, Object>> delMzDrugCodgByCode(YpCodgVo vo){
  456. Map<String, Object> map = new HashMap<>();
  457. MzDrugTracCodg codg = new MzDrugTracCodg();
  458. codg.setPatientId(vo.getPatNo());
  459. codg.setTimes(vo.getTimes());
  460. codg.setReceiptNo(vo.getReceiptNo());
  461. codg.setOrderNo(vo.getOrderNo());
  462. List<MzDrugTracCodg> l = mzDrugTracCodgDao.selectMzDrugTracCodgByCode(codg);
  463. if(null == l || l.isEmpty()){
  464. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "门诊处方匹配的追溯码信息不存在,请检查!");
  465. }
  466. int c = mzDrugTracCodgDao.deleteMzDrugTracCodgByCode(codg);
  467. if(c > 0){
  468. map.put("code", 0);
  469. map.put("message", "删除门诊处方匹配的追溯码信息成功!");
  470. } else {
  471. map.put("code", -1);
  472. map.put("message", "删除门诊处方匹配的追溯码信息失败!");
  473. }
  474. return ResultVoUtil.success(map);
  475. }
  476. /**
  477. * @Description 查询门诊处方药品追溯码匹配情况
  478. * @Author hsh
  479. * @param vo 查询条件
  480. * @return map
  481. * @Date 2025/7/15 0015 16:47
  482. */
  483. public ResultVo<Map<String, Object>> selectMzDrugTracCodgData(YpCodgVo vo){
  484. Map<String, Object> map = new HashMap<>();
  485. if(StringUtils.isBlank(vo.getPatNo())){
  486. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人门诊号信息不存在,请检查!");
  487. }
  488. if(null == vo.getTimes()){
  489. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人门诊次数信息不存在,请检查!");
  490. }
  491. if(null == vo.getReceiptNo()){
  492. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人门诊结帐次数信息不存在,请检查!");
  493. }
  494. if(null == vo.getOrderNo()){
  495. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人门诊处方号信息不存在,请检查!");
  496. }
  497. MzDrugTracCodg codg = new MzDrugTracCodg();
  498. codg.setPatientId(vo.getPatNo());
  499. codg.setTimes(vo.getTimes());
  500. codg.setReceiptNo(vo.getReceiptNo());
  501. codg.setOrderNo(vo.getOrderNo());
  502. List<MzDrugTracCodg> mzCodgList = mzDrugTracCodgDao.selectMzDrugTracCodgByCode(codg);
  503. map.put("data", mzCodgList);
  504. return ResultVoUtil.success(map);
  505. }
  506. /**
  507. * @Description 变更门诊病人追溯码信息
  508. * @Author hsh
  509. * @param list 门诊病人追溯码信息
  510. * @return map
  511. * @Date 2025/8/22 0022 14:45
  512. */
  513. public ResultVo<Map<String, Object>> updateMzDrugCodgDataNew(List<MzDrugTracCodg> list){
  514. Map<String, Object> resultMap = new HashMap<>();
  515. if(null == list || list.isEmpty()){
  516. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "药品扫码的追溯码信息不存在,请检查!");
  517. }
  518. String patNo = list.get(0).getPatientId();
  519. Integer times = list.get(0).getTimes();
  520. Integer orderNo = list.get(0).getOrderNo();
  521. String groupNo = list.get(0).getGroupNo();
  522. if(StringUtils.isBlank(patNo)){
  523. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人门诊号信息不存在,请检查!");
  524. }
  525. if(null == times){
  526. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人门诊次数信息不存在,请检查!");
  527. }
  528. if(null == orderNo){
  529. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人门诊处方号信息不存在,请检查!");
  530. }
  531. if(StringUtils.isBlank(groupNo)){
  532. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "病人药房信息不存在,请检查!");
  533. }
  534. List<MzDrugTracCodg> mzCodgList = mzDrugTracCodgDao.selectMzDrugTracCodgByCode(list.get(0));
  535. int c = 0;
  536. if(null == mzCodgList || mzCodgList.isEmpty()){
  537. List<List<MzDrugTracCodg>> rl = ListUtils.partition(list, 30);
  538. for (List<MzDrugTracCodg> al : rl) {
  539. c = c + mzDrugTracCodgDao.insertMzDrugTracCodgBatch(al);
  540. }
  541. } else {
  542. // 查询看是否有存在已经上传追溯码情况
  543. List<YpSelinfoSold> soldList = soldDao.selectYpSelinfoSoldByCode(patNo, times);
  544. if(null != soldList && !soldList.isEmpty()){
  545. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "存在已经上传的追溯码,请核对并取消上传再更新!");
  546. }
  547. mzDrugTracCodgDao.deleteMzDrugTracCodgByCode(list.get(0));
  548. List<List<MzDrugTracCodg>> rl = ListUtils.partition(list, 30);
  549. for (List<MzDrugTracCodg> al : rl) {
  550. c = c + mzDrugTracCodgDao.insertMzDrugTracCodgBatch(al);
  551. }
  552. }
  553. if(c > 0){
  554. resultMap.put("code", 0);
  555. resultMap.put("message", "更新追溯码信息成功!");
  556. } else {
  557. resultMap.put("code", -1);
  558. resultMap.put("message", "更新追溯码信息失败!");
  559. }
  560. resultMap.put("data", list);
  561. return ResultVoUtil.success(resultMap);
  562. }
  563. }