YpCodgMatchService.java 33 KB

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