MzChargeDetailController.java 87 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830
  1. package cn.hnthyy.thmz.controller.mz;
  2. import cn.hnthyy.thmz.Utils.DateUtil;
  3. import cn.hnthyy.thmz.Utils.HttpUtil;
  4. import cn.hnthyy.thmz.Utils.JsonUtil;
  5. import cn.hnthyy.thmz.Utils.TokenUtil;
  6. import cn.hnthyy.thmz.comment.UserLoginToken;
  7. import cn.hnthyy.thmz.common.Constants;
  8. import cn.hnthyy.thmz.entity.MzException;
  9. import cn.hnthyy.thmz.entity.his.mz.*;
  10. import cn.hnthyy.thmz.entity.his.zd.ZdChargeItem;
  11. import cn.hnthyy.thmz.entity.his.zd.ZdUnitCode;
  12. import cn.hnthyy.thmz.entity.his.zy.ZyZdAuditItem;
  13. import cn.hnthyy.thmz.entity.thmz.Clinic;
  14. import cn.hnthyy.thmz.entity.thmz.PayInfo;
  15. import cn.hnthyy.thmz.entity.thmz.User;
  16. import cn.hnthyy.thmz.enums.ConfirmFlagEnum;
  17. import cn.hnthyy.thmz.enums.GenderEnum;
  18. import cn.hnthyy.thmz.enums.PayMarkEnum;
  19. import cn.hnthyy.thmz.enums.YesNoEnum;
  20. import cn.hnthyy.thmz.pageDto.MzChargeDetailPageDto;
  21. import cn.hnthyy.thmz.service.his.mz.*;
  22. import cn.hnthyy.thmz.service.his.zd.ZdChargeItemService;
  23. import cn.hnthyy.thmz.service.his.zd.ZdUnitCodeService;
  24. import cn.hnthyy.thmz.service.his.zy.ZyZdAuditItemService;
  25. import cn.hnthyy.thmz.service.thmz.ClinicService;
  26. import cn.hnthyy.thmz.service.thmz.HaiCiAdapterService;
  27. import cn.hnthyy.thmz.service.thmz.TsmzService;
  28. import cn.hnthyy.thmz.vo.*;
  29. import com.auth0.jwt.interfaces.DecodedJWT;
  30. import lombok.extern.slf4j.Slf4j;
  31. import org.apache.commons.lang3.StringUtils;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.web.bind.annotation.*;
  34. import javax.servlet.http.HttpServletRequest;
  35. import java.math.BigDecimal;
  36. import java.util.*;
  37. import java.util.stream.Collectors;
  38. @Slf4j
  39. @RestController
  40. public class MzChargeDetailController {
  41. @Autowired
  42. private MzChargeDetailService mzChargeDetailService;
  43. @Autowired
  44. private ZdUnitCodeService zdUnitCodeService;
  45. @Autowired
  46. private EmployeeService employeeService;
  47. @Autowired
  48. private MzBillItemService mzBillItemService;
  49. @Autowired
  50. private MzReceiptSerialService mzReceiptSerialService;
  51. @Autowired
  52. private MzPatientMiService mzPatientMiService;
  53. @Autowired
  54. private ZyZdAuditItemService zyZdAuditItemService;
  55. @Autowired
  56. private ZdChargeItemService zdChargeItemService;
  57. @Autowired
  58. private MzChargeDetailYbService mzChargeDetailYbService;
  59. @Autowired
  60. private TsmzService tsmzService;
  61. @Autowired
  62. private MzfzPatientOrderService mzfzPatientOrderService;
  63. @Autowired
  64. private ClinicService clinicService;
  65. @Autowired
  66. private HaiCiAdapterService haiCiAdapterService;
  67. /**
  68. * 查询费用列表
  69. *
  70. * @return
  71. */
  72. @UserLoginToken
  73. @RequestMapping(value = "/listMzChargeDetail", method = {RequestMethod.POST})
  74. public Map<String, Object> listMzChargeDetail(@RequestBody MzChargeDetailPageDto mzChargeDetailPageDto, HttpServletRequest httpServletRequest) {
  75. Map<String, Object> resultMap = new HashMap<>();
  76. try {
  77. if (mzChargeDetailPageDto == null || mzChargeDetailPageDto.getMzChargeDetail() == null) {
  78. resultMap.put("code", -1);
  79. resultMap.put("message", "费用列表查询参数不能为空");
  80. return resultMap;
  81. }
  82. PageViewVo pageViewVo = new PageViewVo();
  83. MzChargeDetail mzChargeDetail = mzChargeDetailPageDto.getMzChargeDetail();
  84. List<MzChargeDetail> mzChargeDetails = new ArrayList<>();
  85. if (PayMarkEnum.NO_CHARGE.code.equals(mzChargeDetail.getPayMark())) {
  86. if (StringUtils.isNotBlank(mzChargeDetail.getPatientId())) {
  87. MzPatientMi mzPatientMi = mzPatientMiService.queryByPatientId(mzChargeDetail.getPatientId());
  88. if (mzPatientMi == null) {
  89. resultMap.put("code", -1);
  90. resultMap.put("message", "病人不存在!");
  91. return resultMap;
  92. }
  93. mzChargeDetails.addAll(mzChargeDetailService.unPaidToFullChargeDetail(mzChargeDetail.getPatientId(), mzPatientMi.getName()));
  94. }
  95. if (StringUtils.isNotBlank(mzChargeDetail.getName())) {
  96. List<MzPatientMi> mzPatientMis = mzPatientMiService.queryByName(mzChargeDetail.getName());
  97. if (mzPatientMis != null && mzPatientMis.size() > 0) {
  98. for (MzPatientMi m : mzPatientMis) {
  99. if (m != null && StringUtils.isNotBlank(m.getPatientId())) {
  100. mzChargeDetails.addAll(mzChargeDetailService.unPaidToFullChargeDetail(m.getPatientId(), m.getName()));
  101. }
  102. }
  103. }
  104. }
  105. //if(StringUtils.isNotBlank(mzChargeDetail.get()))
  106. pageViewVo.setPageSize(100);
  107. pageViewVo.setTotal(mzChargeDetails.size());
  108. } else {
  109. if (mzChargeDetailPageDto.getSerialNo() != null) {
  110. MzReceiptSerial mzReceiptSerial = mzReceiptSerialService.queryReceiptSerialBySerialNo(mzChargeDetailPageDto.getSerialNo());
  111. if (mzReceiptSerial == null) {
  112. pageViewVo.setTotal(0);
  113. pageViewVo.setData(Collections.EMPTY_LIST);
  114. resultMap.put("code", 0);
  115. resultMap.put("message", "查询费用列表信息成功,但是当前机制号无对应的缴费信息");
  116. resultMap.put("pageViewVo", pageViewVo);
  117. return resultMap;
  118. }
  119. mzChargeDetail.setPatientId(mzReceiptSerial.getPatientId());
  120. mzChargeDetail.setTimes(mzReceiptSerial.getTimes());
  121. }
  122. if (StringUtils.isBlank(mzChargeDetail.getName())) {
  123. mzChargeDetail.setName(null);
  124. } else {
  125. mzChargeDetail.setName("%" + mzChargeDetail.getName() + "%");
  126. }
  127. if (StringUtils.isBlank(mzChargeDetail.getPatientId())) {
  128. mzChargeDetail.setPatientId(null);
  129. }
  130. if (StringUtils.isBlank(mzChargeDetail.getWarnDept())) {
  131. mzChargeDetail.setWarnDept(null);
  132. }
  133. if (StringUtils.isBlank(mzChargeDetail.getDoctorCode())) {
  134. mzChargeDetail.setDoctorCode(null);
  135. }
  136. if (YesNoEnum.YES.equals(mzChargeDetailPageDto.getOwnData())) {
  137. User tokenUser = TokenUtil.getUser(httpServletRequest);
  138. mzChargeDetailPageDto.setOpId(tokenUser.getUserIdCode());
  139. }
  140. pageViewVo.setPageIndex(mzChargeDetailPageDto.getPageIndex());
  141. pageViewVo.setPageSize(mzChargeDetailPageDto.getPageSize());
  142. //mzChargeDetailService.refshOldSystemReceiptData();
  143. pageViewVo.setTotal(mzChargeDetailService.countMzChargeDetail(mzChargeDetailPageDto));
  144. mzChargeDetails = mzChargeDetailService.queryMzChargeDetailWithPage(mzChargeDetailPageDto);
  145. }
  146. mzChargeDetailService.formatMzChargeDetail(mzChargeDetails);
  147. pageViewVo.setData(mzChargeDetails);
  148. resultMap.put("code", 0);
  149. resultMap.put("message", "查询费用列表信息成功");
  150. resultMap.put("pageViewVo", pageViewVo);
  151. return resultMap;
  152. } catch (MzException e) {
  153. log.error("查询费用列表失败,错误信息{}", e);
  154. resultMap.put("code", -1);
  155. resultMap.put("message", "查询费用列表失败,错误原因:" + e.getMessage());
  156. return resultMap;
  157. } catch (Exception e) {
  158. e.printStackTrace();
  159. resultMap.put("code", -1);
  160. resultMap.put("message", "查询费用列表失败,系统出错,请联系管理员");
  161. log.error("查询费用列表失败,系统异常,错误信息{}", e);
  162. return resultMap;
  163. }
  164. }
  165. // /**
  166. // * 构造包含病人信息的挂号记录视图
  167. // *
  168. // * @param mzChargeDetails
  169. // * @return
  170. // */
  171. // private void formatMzChargeDetail(List<MzChargeDetail> mzChargeDetails) {
  172. // if (mzChargeDetails == null) {
  173. // return;
  174. // }
  175. // List<String> doctorCodes = mzChargeDetails.stream().filter(u -> StringUtils.isNotBlank(u.getDoctorCode())).map-util.js(u -> u.getDoctorCode()).collect(Collectors.toList());
  176. // Map<String, String> employeeMap = null;
  177. // List<Employee> employees = employeeService.queryByCodes(doctorCodes);
  178. // if (employees != null) {
  179. // employeeMap = employees.stream().collect(Collectors.toMap(Employee::getEmployeeCode, Employee::getEmployeeName));
  180. // }
  181. // for (MzChargeDetail mzChargeDetail : mzChargeDetails) {
  182. // if (mzChargeDetail != null) {
  183. // mzChargeDetail.setWarnDept(zdUnitCodeService.queryDeptNameByIdInCache(mzChargeDetail.getWarnDept()));
  184. // if (employeeMap != null) {
  185. // String doctorCode = employeeMap.get(mzChargeDetail.getDoctorCode());
  186. // mzChargeDetail.setDoctorCode(doctorCode == null ? "" : doctorCode);
  187. // }
  188. // if (mzChargeDetail.getAmount() != null) {
  189. // mzChargeDetail.setAmount(mzChargeDetail.getAmount().setScale(1, BigDecimal.ROUND_HALF_UP));
  190. // }
  191. // }
  192. // }
  193. // }
  194. /**
  195. * 查询费用明细列表
  196. *
  197. * @return
  198. */
  199. @UserLoginToken
  200. @RequestMapping(value = "/getMzChargeDetailByBillItem", method = {RequestMethod.POST})
  201. public Map<String, Object> getMzChargeDetailByBillItem(@RequestBody MzChargeDetail mzChargeDetail) {
  202. Map<String, Object> resultMap = new HashMap<>();
  203. try {
  204. if (mzChargeDetail == null) {
  205. resultMap.put("code", -1);
  206. resultMap.put("message", "费用明细列表查询参数不能为空");
  207. return resultMap;
  208. }
  209. if (StringUtils.isBlank(mzChargeDetail.getPatientId())) {
  210. resultMap.put("code", -1);
  211. resultMap.put("message", "病人编码不能为空");
  212. return resultMap;
  213. }
  214. if (mzChargeDetail.getTimes() == null) {
  215. resultMap.put("code", -1);
  216. resultMap.put("message", "病人就诊次数不能为空");
  217. return resultMap;
  218. }
  219. if (StringUtils.isBlank(mzChargeDetail.getBillItemCode())) {
  220. resultMap.put("code", -1);
  221. resultMap.put("message", "费用类型不能为空");
  222. return resultMap;
  223. }
  224. List<MzChargeDetail> mzChargeDetailList;
  225. if (PayMarkEnum.NO_CHARGE.code.equals(mzChargeDetail.getPayMark())) {
  226. mzChargeDetailList = mzChargeDetailService.getTempMzChargeDetailListForUnPaid(mzChargeDetail);
  227. } else {
  228. if (mzChargeDetail.getReceiptNo() == null) {
  229. resultMap.put("code", -1);
  230. resultMap.put("message", "缴费次数不能为空");
  231. return resultMap;
  232. }
  233. List<String> billItemTypes = new ArrayList<>();
  234. if ("0".equals(mzChargeDetail.getBillItemCode())) {
  235. billItemTypes.add(Constants.XYF);
  236. billItemTypes.add(Constants.ZCYF);
  237. } else if ("1".equals(mzChargeDetail.getBillItemCode())) {
  238. billItemTypes.add(Constants.CYF);
  239. } else if ("2".equals(mzChargeDetail.getBillItemCode())) {
  240. billItemTypes.add(Constants.XYF);
  241. billItemTypes.add(Constants.ZCYF);
  242. billItemTypes.add(Constants.CYF);
  243. billItemTypes.add(Constants.SSWRF);
  244. billItemTypes.add(Constants.TC);
  245. }
  246. mzChargeDetailList = mzChargeDetailService.queryMzChargeDetailByBillItemCode(mzChargeDetail.getPatientId(), mzChargeDetail.getTimes(), mzChargeDetail.getReceiptNo(), mzChargeDetail.getPayMark(), mzChargeDetail.getBillItemCode(), billItemTypes);
  247. }
  248. mzChargeDetailList = mzChargeDetailService.getMzChargeDetails(mzChargeDetailList);
  249. resultMap.put("code", 0);
  250. resultMap.put("message", "查询费用明细列表信息成功");
  251. resultMap.put("data", mzChargeDetailList);
  252. return resultMap;
  253. } catch (MzException e) {
  254. resultMap.put("code", -1);
  255. resultMap.put("message", "缴费失败," + e.getMessage());
  256. log.error("缴费失败,系统异常,错误信息{}", e);
  257. return resultMap;
  258. } catch (Exception e) {
  259. e.printStackTrace();
  260. resultMap.put("code", -1);
  261. resultMap.put("message", "查询费用明细列表失败,系统出错,请联系管理员");
  262. log.error("查询费用明细列表失败,系统异常,错误信息{}", e);
  263. return resultMap;
  264. }
  265. }
  266. // /**
  267. // * 将套餐归类,并计算总费用
  268. // *
  269. // * @param mzChargeDetailList
  270. // * @return
  271. // */
  272. // private List<MzChargeDetail> getMzChargeDetails(List<MzChargeDetail> mzChargeDetailList) {
  273. // if (mzChargeDetailList != null) {
  274. // for (MzChargeDetail md : mzChargeDetailList) {
  275. // md.setAmount((md.getUnitPrice() == null ? BigDecimal.ZERO : md.getUnitPrice()).multiply(BigDecimal.valueOf(md.getQuantity() == null ? 1D : md.getQuantity())).multiply(BigDecimal.valueOf(md.getDrugWin() == null ? 1D : md.getDrugWin())).setScale(2, BigDecimal.ROUND_HALF_UP));
  276. // if (!Constants.YJ_GROUP_NO.equals(md.getGroupNo())) {
  277. // YpZdDict ypZdDict = ypZdDictService.queryYpZdDictByCode(md.getChargeItemCode(), md.getSerial());
  278. // if (ypZdDict != null) {
  279. // md.setTcName(ypZdDict.getName());
  280. // }
  281. // }
  282. // }
  283. // Collections.sort(mzChargeDetailList); // 按处方号排序
  284. // }
  285. // return mzChargeDetailList;
  286. // }
  287. /**
  288. * 收费
  289. *
  290. * @return
  291. */
  292. @UserLoginToken
  293. @RequestMapping(value = "/chargeFee", method = {RequestMethod.POST})
  294. public Map<String, Object> chargeFee(@RequestBody MzDepositFileVo mzDepositFileVo, HttpServletRequest httpServletRequest) {
  295. Map<String, Object> resultMap = new HashMap<>();
  296. try {
  297. if (mzDepositFileVo == null) {
  298. resultMap.put("code", -1);
  299. resultMap.put("message", "费用参数不能为空");
  300. return resultMap;
  301. }
  302. if (StringUtils.isBlank(mzDepositFileVo.getPatientId())) {
  303. resultMap.put("code", -1);
  304. resultMap.put("message", "病人编码不能为空");
  305. return resultMap;
  306. }
  307. if (mzDepositFileVo.getTimes() == null) {
  308. resultMap.put("code", -1);
  309. resultMap.put("message", "病人就诊次数不能为空");
  310. return resultMap;
  311. }
  312. if (mzDepositFileVo.getReceiptNo() == null) {
  313. resultMap.put("code", -1);
  314. resultMap.put("message", "病人结算次数不能为空");
  315. return resultMap;
  316. }
  317. if (mzDepositFileVo.getMzDepositFiles() == null || mzDepositFileVo.getMzDepositFiles().size() == 0) {
  318. resultMap.put("code", -1);
  319. resultMap.put("message", "费用方式不能为空");
  320. return resultMap;
  321. }
  322. String token = TokenUtil.getToken(httpServletRequest);
  323. if (StringUtils.isBlank(token)) {
  324. resultMap.put("code", -1);
  325. resultMap.put("message", "缴费失败,用户Token不存在");
  326. return resultMap;
  327. }
  328. DecodedJWT decodedJWT = TokenUtil.parseJWT(token);
  329. User tokenUser = (User) JsonUtil.jsontoObject(decodedJWT.getSubject(), User.class);
  330. List<MzReceiptSerial> mzReceiptSerials = mzReceiptSerialService.queryTallyReceiptSerialByIdAndTimes(mzDepositFileVo.getPatientId(), mzDepositFileVo.getTimes(), mzDepositFileVo.getReceiptNo());
  331. if (mzReceiptSerials != null && mzReceiptSerials.size() > 0) {
  332. //本院记账退费重收操作
  333. // for (MzDepositFile m : mzDepositFileVo.getMzDepositFiles()) {
  334. // if (Constants.BYJZ.equals(m.getChequeType())) {
  335. // resultMap.put("code", -1);
  336. // resultMap.put("message", "本院记账退费重收不能再选择记账收费方式");
  337. // return resultMap;
  338. // }
  339. // }
  340. int receiptNo = mzChargeDetailService.chargeFeeForByjz(tokenUser.getUserIdCode(), mzDepositFileVo);
  341. resultMap.put("receiptNo", receiptNo);
  342. } else {
  343. String ipAddress=HttpUtil.getIPAddress(httpServletRequest);
  344. int receiptNo = mzChargeDetailService.chargeFee(tokenUser.getUserIdCode(), mzDepositFileVo,ipAddress);
  345. resultMap.put("receiptNo", receiptNo);
  346. }
  347. resultMap.put("code", 0);
  348. resultMap.put("message", "缴费成功");
  349. return resultMap;
  350. } catch (MzException e) {
  351. e.printStackTrace();
  352. resultMap.put("code", -1);
  353. resultMap.put("message", "缴费失败," + e.getMessage());
  354. log.error("缴费失败,系统异常,错误信息【{}】", e);
  355. return resultMap;
  356. } catch (Exception e) {
  357. e.printStackTrace();
  358. resultMap.put("code", -1);
  359. resultMap.put("message", "缴费失败,系统出错,请联系管理员");
  360. log.error("缴费失败,系统异常" + e);
  361. return resultMap;
  362. }
  363. }
  364. /**
  365. * 修改病人姓名 120病人缴费时调用
  366. *
  367. * @param mzChargeDetail
  368. * @return
  369. */
  370. @UserLoginToken
  371. @RequestMapping(value = "/changePatientIdName", method = {RequestMethod.POST})
  372. public Map<String, Object> changePatientIdName(@RequestBody MzChargeDetail mzChargeDetail) {
  373. Map<String, Object> resultMap = new HashMap<>();
  374. try {
  375. if (mzChargeDetail == null) {
  376. resultMap.put("code", -1);
  377. resultMap.put("message", "参数不能为空");
  378. return resultMap;
  379. }
  380. if (StringUtils.isBlank(mzChargeDetail.getName())) {
  381. resultMap.put("code", -1);
  382. resultMap.put("message", "病人姓名不能为空");
  383. return resultMap;
  384. }
  385. if (StringUtils.isBlank(mzChargeDetail.getPatientId())) {
  386. resultMap.put("code", -1);
  387. resultMap.put("message", "病人编码不能为空");
  388. return resultMap;
  389. }
  390. if (mzChargeDetail.getTimes() == null) {
  391. resultMap.put("code", -1);
  392. resultMap.put("message", "病人就诊次数集合不能为空");
  393. return resultMap;
  394. }
  395. mzChargeDetailService.modifyNameByPatientIdAndTimes(mzChargeDetail.getName(), mzChargeDetail.getPatientId(), mzChargeDetail.getTimes());
  396. resultMap.put("code", 0);
  397. resultMap.put("message", "病人姓名更新成功");
  398. return resultMap;
  399. } catch (Exception e) {
  400. resultMap.put("code", -1);
  401. resultMap.put("message", "病人姓名更新失败,系统出错,请联系管理员");
  402. log.error("病人姓名更新失败,系统异常,错误信息{}", e);
  403. return resultMap;
  404. }
  405. }
  406. /**
  407. * 查询退费明细列表
  408. *
  409. * @return
  410. */
  411. @UserLoginToken
  412. @RequestMapping(value = "/getRefundFeeDetail", method = {RequestMethod.POST})
  413. public Map<String, Object> getRefundFeeDetail(@RequestBody MzChargeDetail mzChargeDetail) {
  414. Map<String, Object> resultMap = new HashMap<>();
  415. try {
  416. if (mzChargeDetail == null) {
  417. resultMap.put("code", -1);
  418. resultMap.put("message", "查询退费明细列表参数不能为空");
  419. return resultMap;
  420. }
  421. if (StringUtils.isBlank(mzChargeDetail.getPatientId())) {
  422. resultMap.put("code", -1);
  423. resultMap.put("message", "病人编码不能为空");
  424. return resultMap;
  425. }
  426. if (mzChargeDetail.getTimes() == null) {
  427. resultMap.put("code", -1);
  428. resultMap.put("message", "病人就诊次数不能为空");
  429. return resultMap;
  430. }
  431. if (mzChargeDetail.getReceiptNo() == null) {
  432. resultMap.put("code", -1);
  433. resultMap.put("message", "病人就缴费次数不能为空");
  434. return resultMap;
  435. }
  436. mzChargeDetail.setPayMark(PayMarkEnum.CHARGED.code);
  437. List<MzChargeDetail> mzChargeDetailList = mzChargeDetailService.queryChargeDetail(mzChargeDetail);
  438. List<BillItem> mzBillItems = mzBillItemService.queryMzBillItem();
  439. Map<String, String> mzBillItemMap = null;
  440. if (mzBillItems != null) {
  441. mzBillItemMap = mzBillItems.stream().collect(Collectors.toMap(BillItem::getCode, BillItem::getName));
  442. }
  443. List<MzChargeDetail> removeList = new ArrayList<>();
  444. if (mzChargeDetailList != null && mzChargeDetailList.size() > 0) {
  445. MzChargeDetailYb mzChargeDetailYb = new MzChargeDetailYb();
  446. mzChargeDetailYb.setPatientId(mzChargeDetail.getPatientId());
  447. mzChargeDetailYb.setTimes(mzChargeDetail.getTimes());
  448. mzChargeDetailYb.setReceiptNo(mzChargeDetail.getReceiptNo());
  449. int count = mzChargeDetailYbService.queryTmCount(mzChargeDetailYb);
  450. for (MzChargeDetail md : mzChargeDetailList) {
  451. if ("TC".equals(md.getBillItemCode()) || Constants.SSWRF.equals(md.getBillItemCode())) {
  452. removeList.add(md);
  453. continue;
  454. }
  455. if (mzBillItemMap != null) {
  456. md.setBillItemCode(mzBillItemMap.get(md.getBillItemCode()));
  457. }
  458. md.setExecDept(zdUnitCodeService.queryDeptNameByIdInCache(md.getExecDept()));
  459. md.setAmount((md.getUnitPrice() == null ? BigDecimal.ZERO : md.getUnitPrice()).multiply(BigDecimal.valueOf(md.getQuantity() == null ? 1D : md.getQuantity())).multiply(BigDecimal.valueOf(md.getDrugWin() == null ? 1D : md.getDrugWin())));
  460. if (count > 0) {
  461. //特门必须全退
  462. md.setConfirmFlag(ConfirmFlagEnum.DONE.code);
  463. }
  464. }
  465. }
  466. mzChargeDetailList.removeAll(removeList);
  467. mzChargeDetailService.getMzChargeDetails(mzChargeDetailList);
  468. resultMap.put("code", 0);
  469. resultMap.put("message", "查询退费明细列表信息成功");
  470. resultMap.put("data", mzChargeDetailList);
  471. return resultMap;
  472. } catch (Exception e) {
  473. e.printStackTrace();
  474. resultMap.put("code", -1);
  475. resultMap.put("message", "查询退费明细列表失败,系统出错,请联系管理员");
  476. log.error("查询退费明细列表失败,系统异常,错误信息{}", e);
  477. return resultMap;
  478. }
  479. }
  480. /**
  481. * 获取退费后新产生的缴费信息
  482. *
  483. * @return
  484. */
  485. @UserLoginToken
  486. @RequestMapping(value = "/getNewListForRefundFee", method = {RequestMethod.POST})
  487. public Map<String, Object> getNewListForRefundFee(@RequestBody MzDepositFileVo mzDepositFileVo, HttpServletRequest httpServletRequest) {
  488. Map<String, Object> resultMap = new HashMap<>();
  489. try {
  490. if (mzDepositFileVo == null) {
  491. resultMap.put("code", -1);
  492. resultMap.put("message", "退费参数不能为空");
  493. return resultMap;
  494. }
  495. if (StringUtils.isBlank(mzDepositFileVo.getPatientId())) {
  496. resultMap.put("code", -1);
  497. resultMap.put("message", "病人编码参数不能为空");
  498. return resultMap;
  499. }
  500. if (mzDepositFileVo.getTimes() == null) {
  501. resultMap.put("code", -1);
  502. resultMap.put("message", "病人就诊次数参数不能为空");
  503. return resultMap;
  504. }
  505. if (mzDepositFileVo.getReceiptNo() == null) {
  506. resultMap.put("code", -1);
  507. resultMap.put("message", "病人结算次数参数不能为空");
  508. return resultMap;
  509. }
  510. if (StringUtils.isBlank(mzDepositFileVo.getChargeItemCodes())) {
  511. resultMap.put("code", -1);
  512. resultMap.put("message", "没有选择需要退费的收费明细,无法退费");
  513. return resultMap;
  514. }
  515. String token = TokenUtil.getToken(httpServletRequest);
  516. if (StringUtils.isBlank(token)) {
  517. resultMap.put("code", -1);
  518. resultMap.put("message", "退费失败,用户Token不存在");
  519. return resultMap;
  520. }
  521. MzChargeDetailPageDto mzChargeDetailPageDto = new MzChargeDetailPageDto();
  522. mzChargeDetailPageDto.setPageIndex(0);
  523. mzChargeDetailPageDto.setPageSize(10);
  524. mzChargeDetailPageDto.setMzChargeDetail(new MzChargeDetail(mzDepositFileVo.getPatientId(), mzDepositFileVo.getTimes()));
  525. mzChargeDetailPageDto.getMzChargeDetail().setPayMark(PayMarkEnum.CHARGED.code);
  526. List<MzChargeDetail> oriMzChargeDetails = mzChargeDetailService.queryMzChargeDetailWithPage(mzChargeDetailPageDto);
  527. MzChargeDetail oriMzChargeDetail = oriMzChargeDetails.get(0);
  528. if (oriMzChargeDetails.size() > 1) {
  529. for (MzChargeDetail mz : oriMzChargeDetails) {
  530. if (mz.getReceiptNo().equals(mzDepositFileVo.getReceiptNo())) {
  531. oriMzChargeDetail = mz;
  532. }
  533. }
  534. }
  535. if (oriMzChargeDetail.getAmount() != null) {
  536. oriMzChargeDetail.setAmount(oriMzChargeDetail.getAmount().setScale(1, BigDecimal.ROUND_HALF_UP));
  537. }
  538. BigDecimal oriAmount = BigDecimal.ZERO;
  539. if (oriMzChargeDetail != null) {
  540. oriAmount = oriMzChargeDetail.getAmount();
  541. }
  542. DecodedJWT decodedJWT = TokenUtil.parseJWT(token);
  543. User tokenUser = (User) JsonUtil.jsontoObject(decodedJWT.getSubject(), User.class);
  544. List<MzChargeDetail> mzChargeDetails = mzChargeDetailService.getNewListForRefundFee(tokenUser.getUserIdCode(), mzDepositFileVo, YesNoEnum.NO);
  545. PageViewVo pageViewVo = new PageViewVo();
  546. if (mzChargeDetails == null || mzChargeDetails.size() == 0) {
  547. MzChargeDetail returnMzChargeDetail = new MzChargeDetail();
  548. returnMzChargeDetail.setPatientId(mzDepositFileVo.getPatientId());
  549. returnMzChargeDetail.setName(oriMzChargeDetails.get(0).getName());
  550. returnMzChargeDetail.setAmount(BigDecimal.ZERO);
  551. returnMzChargeDetail.setOriAmount(oriAmount);
  552. returnMzChargeDetail.setRefundFee(oriAmount);
  553. pageViewVo.setTotal(0);
  554. pageViewVo.setData(Arrays.asList(returnMzChargeDetail));
  555. resultMap.put("code", 0);
  556. resultMap.put("message", "预退费操作成功");
  557. resultMap.put("pageViewVo", pageViewVo);
  558. resultMap.put("mzChargeDetails", mzChargeDetails);
  559. return resultMap;
  560. }
  561. MzChargeDetail returnMzChargeDetail = getMzChargeDetail(mzDepositFileVo.getPatientId(), mzChargeDetails.get(0).getTimes(), mzChargeDetails);
  562. returnMzChargeDetail.setOriAmount(oriAmount);
  563. returnMzChargeDetail.setRefundFee(oriAmount.subtract(returnMzChargeDetail.getAmount()).setScale(1, BigDecimal.ROUND_HALF_UP));
  564. List<MzChargeDetail> realMzChargeDetails = Arrays.asList(returnMzChargeDetail);
  565. pageViewVo.setTotal(realMzChargeDetails.size());
  566. mzChargeDetailService.formatMzChargeDetail(realMzChargeDetails);
  567. pageViewVo.setData(realMzChargeDetails);
  568. resultMap.put("code", 0);
  569. resultMap.put("message", "预退费操作成功");
  570. resultMap.put("pageViewVo", pageViewVo);
  571. resultMap.put("mzChargeDetails", mzChargeDetails);
  572. return resultMap;
  573. } catch (MzException e) {
  574. resultMap.put("code", -1);
  575. resultMap.put("message", e.getMessage());
  576. log.error("预退费操作失败,系统异常,错误信息{}", e);
  577. return resultMap;
  578. } catch (Exception e) {
  579. e.printStackTrace();
  580. resultMap.put("code", -1);
  581. resultMap.put("message", "预退费操作失败,系统出错,请联系管理员");
  582. log.error("预退费操作失败,系统异常,错误信息{}", e);
  583. return resultMap;
  584. }
  585. }
  586. /**
  587. * 将收费明细列表转成总计费用
  588. *
  589. * @param patientId
  590. * @param times
  591. * @param mzChargeDetails
  592. * @return
  593. */
  594. private MzChargeDetail getMzChargeDetail(String patientId, Integer times, List<MzChargeDetail> mzChargeDetails) {
  595. MzChargeDetail returnMzChargeDetail = new MzChargeDetail();
  596. returnMzChargeDetail.setSerialNo(0);
  597. returnMzChargeDetail.setPatientId(patientId);
  598. returnMzChargeDetail.setTimes(times);
  599. returnMzChargeDetail.setAmount(BigDecimal.ZERO);
  600. for (MzChargeDetail md : mzChargeDetails) {
  601. if (StringUtils.isBlank(returnMzChargeDetail.getName())) {
  602. returnMzChargeDetail.setName(md.getName());
  603. }
  604. if (returnMzChargeDetail.getReceiptNo() == null) {
  605. returnMzChargeDetail.setReceiptNo(md.getReceiptNo());
  606. }
  607. if (StringUtils.isBlank(returnMzChargeDetail.getDoctorCode())) {
  608. returnMzChargeDetail.setDoctorCode(md.getDoctorCode());
  609. }
  610. if (StringUtils.isBlank(returnMzChargeDetail.getWarnDept())) {
  611. returnMzChargeDetail.setWarnDept(md.getWarnDept());
  612. }
  613. if (returnMzChargeDetail.getPriceTime() == null) {
  614. returnMzChargeDetail.setPriceTime(md.getPriceTime());
  615. }
  616. BigDecimal price = (md.getUnitPrice() == null ? BigDecimal.ZERO : md.getUnitPrice()).setScale(2, BigDecimal.ROUND_HALF_UP);
  617. if (BigDecimal.ZERO.compareTo(price) == 0) {
  618. price = BigDecimal.valueOf(0.01);
  619. }
  620. BigDecimal tempAmount = price.multiply(BigDecimal.valueOf(md.getQuantity() == null ? 1D : md.getQuantity())).multiply(BigDecimal.valueOf(md.getDrugWin() == null ? 1D : md.getDrugWin()));
  621. returnMzChargeDetail.setAmount(returnMzChargeDetail.getAmount().add(tempAmount));
  622. }
  623. returnMzChargeDetail.setAmount(returnMzChargeDetail.getAmount().setScale(1, BigDecimal.ROUND_HALF_UP));
  624. return returnMzChargeDetail;
  625. }
  626. /**
  627. * 获取退费后新产生的缴费明细分类信息
  628. *
  629. * @return
  630. */
  631. @UserLoginToken
  632. @RequestMapping(value = "/getNewListForRefundFeeByBillItem", method = {RequestMethod.POST})
  633. public Map<String, Object> getNewListForRefundFeeByBillItem(@RequestBody MzDepositFileVo mzDepositFileVo, HttpServletRequest httpServletRequest) {
  634. Map<String, Object> resultMap = new HashMap<>();
  635. try {
  636. if (mzDepositFileVo == null) {
  637. resultMap.put("code", -1);
  638. resultMap.put("message", "退费参数不能为空");
  639. return resultMap;
  640. }
  641. if (StringUtils.isBlank(mzDepositFileVo.getPatientId())) {
  642. resultMap.put("code", -1);
  643. resultMap.put("message", "病人编码参数不能为空");
  644. return resultMap;
  645. }
  646. if (mzDepositFileVo.getTimes() == null) {
  647. resultMap.put("code", -1);
  648. resultMap.put("message", "病人就诊次数参数不能为空");
  649. return resultMap;
  650. }
  651. if (StringUtils.isBlank(mzDepositFileVo.getChargeItemCodes())) {
  652. resultMap.put("code", -1);
  653. resultMap.put("message", "没有选择需要退费的收费明细,无法退费");
  654. return resultMap;
  655. }
  656. if (StringUtils.isBlank(mzDepositFileVo.getBillItemCode())) {
  657. resultMap.put("code", -1);
  658. resultMap.put("message", "费用类型不能为空");
  659. return resultMap;
  660. }
  661. String token = TokenUtil.getToken(httpServletRequest);
  662. if (StringUtils.isBlank(token)) {
  663. resultMap.put("code", -1);
  664. resultMap.put("message", "退费失败,用户Token不存在");
  665. return resultMap;
  666. }
  667. DecodedJWT decodedJWT = TokenUtil.parseJWT(token);
  668. User tokenUser = (User) JsonUtil.jsontoObject(decodedJWT.getSubject(), User.class);
  669. List<MzChargeDetail> mzChargeDetails = mzChargeDetailService.getTempMzChargeDetailListForNewListForRefundFee(tokenUser.getUserIdCode(), mzDepositFileVo, YesNoEnum.NO);
  670. mzChargeDetails = mzChargeDetailService.getMzChargeDetails(mzChargeDetails);
  671. resultMap.put("code", 0);
  672. resultMap.put("message", "查询费用明细列表信息成功");
  673. resultMap.put("data", mzChargeDetails);
  674. return resultMap;
  675. } catch (Exception e) {
  676. e.printStackTrace();
  677. resultMap.put("code", -1);
  678. resultMap.put("message", "预退费操作失败,系统出错,请联系管理员");
  679. log.error("预退费操作失败,系统异常,错误信息{}", e);
  680. return resultMap;
  681. }
  682. }
  683. /**
  684. * 保存退费信息
  685. *
  686. * @return
  687. */
  688. @UserLoginToken
  689. @RequestMapping(value = "/saveRefundFee", method = {RequestMethod.POST})
  690. public Map<String, Object> saveRefundFee(@RequestBody MzDepositFileVo mzDepositFileVo, HttpServletRequest httpServletRequest) {
  691. Map<String, Object> resultMap = new HashMap<>();
  692. try {
  693. if (mzDepositFileVo == null) {
  694. resultMap.put("code", -1);
  695. resultMap.put("message", "退费参数不能为空");
  696. return resultMap;
  697. }
  698. if (StringUtils.isBlank(mzDepositFileVo.getPatientId())) {
  699. resultMap.put("code", -1);
  700. resultMap.put("message", "病人编码参数不能为空");
  701. return resultMap;
  702. }
  703. if (mzDepositFileVo.getTimes() == null) {
  704. resultMap.put("code", -1);
  705. resultMap.put("message", "病人就诊次数参数不能为空");
  706. return resultMap;
  707. }
  708. if (mzDepositFileVo.getReceiptNo() == null) {
  709. resultMap.put("code", -1);
  710. resultMap.put("message", "病人缴费次数参数不能为空");
  711. return resultMap;
  712. }
  713. if (StringUtils.isBlank(mzDepositFileVo.getChargeItemCodes())) {
  714. resultMap.put("code", -1);
  715. resultMap.put("message", "没有选择需要退费的收费明细,无法退费");
  716. return resultMap;
  717. }
  718. String token = TokenUtil.getToken(httpServletRequest);
  719. if (StringUtils.isBlank(token)) {
  720. resultMap.put("code", -1);
  721. resultMap.put("message", "退费失败,用户Token不存在");
  722. return resultMap;
  723. }
  724. DecodedJWT decodedJWT = TokenUtil.parseJWT(token);
  725. User tokenUser = (User) JsonUtil.jsontoObject(decodedJWT.getSubject(), User.class);
  726. //如果返回的是0,表示全退,大于0,表示新的收费记录的就诊次数
  727. String ipAddress=HttpUtil.getIPAddress(httpServletRequest);
  728. int times = mzChargeDetailService.refundFee(tokenUser.getUserIdCode(), mzDepositFileVo,ipAddress);
  729. resultMap.put("code", 0);
  730. resultMap.put("times", times);
  731. resultMap.put("patientId", mzDepositFileVo.getPatientId());
  732. resultMap.put("message", "退费操作成功");
  733. return resultMap;
  734. } catch (MzException e) {
  735. resultMap.put("code", -1);
  736. resultMap.put("message", e.getMessage());
  737. log.error("退费操作失败,系统异常,错误信息{}", e);
  738. return resultMap;
  739. } catch (Exception e) {
  740. e.printStackTrace();
  741. resultMap.put("code", -1);
  742. resultMap.put("message", "退费操作失败,系统出错,请联系管理员");
  743. log.error("退费操作失败,系统异常,错误信息{}", e);
  744. return resultMap;
  745. }
  746. }
  747. /**
  748. * 查询病人缴费记录
  749. *
  750. * @return
  751. */
  752. @UserLoginToken
  753. @RequestMapping(value = "/getChargeListByPatient", method = {RequestMethod.POST})
  754. public Map<String, Object> getChargeListByPatient(@RequestBody ChargeFeeParamsVo chargeFeeParamsVo) {
  755. Map<String, Object> resultMap = new HashMap<>();
  756. try {
  757. if (chargeFeeParamsVo == null) {
  758. resultMap.put("code", -1);
  759. resultMap.put("message", "检索参数不能为空");
  760. return resultMap;
  761. }
  762. if (chargeFeeParamsVo.getBeginDate() == null) {
  763. resultMap.put("code", -1);
  764. resultMap.put("message", "检索开始时间不能为空");
  765. return resultMap;
  766. }
  767. if (chargeFeeParamsVo.getEndDate() == null) {
  768. resultMap.put("code", -1);
  769. resultMap.put("message", "检索结束时间不能为空");
  770. return resultMap;
  771. }
  772. if (StringUtils.isBlank(chargeFeeParamsVo.getPatientId())) {
  773. chargeFeeParamsVo.setPatientId(null);
  774. } else {
  775. chargeFeeParamsVo.setPatientId("%" + chargeFeeParamsVo.getPatientId() + "%");
  776. }
  777. if (StringUtils.isBlank(chargeFeeParamsVo.getName())) {
  778. chargeFeeParamsVo.setName(null);
  779. } else {
  780. chargeFeeParamsVo.setName("%" + chargeFeeParamsVo.getName() + "%");
  781. }
  782. if (StringUtils.isBlank(chargeFeeParamsVo.getSerialNo())) {
  783. chargeFeeParamsVo.setSerialNo(null);
  784. } else {
  785. chargeFeeParamsVo.setSerialNo("%" + chargeFeeParamsVo.getSerialNo() + "%");
  786. }
  787. resultMap.put("code", 0);
  788. resultMap.put("mzChargeDetailList", mzChargeDetailService.queryChargeListByPatient(chargeFeeParamsVo.getPatientId(), chargeFeeParamsVo.getName(), chargeFeeParamsVo.getSerialNo(), chargeFeeParamsVo.getBeginDate(), chargeFeeParamsVo.getEndDate()));
  789. resultMap.put("message", "查询病人缴费记录成功");
  790. return resultMap;
  791. } catch (Exception e) {
  792. e.printStackTrace();
  793. resultMap.put("code", -1);
  794. resultMap.put("message", "查询病人缴费记录失败,系统出错,请联系管理员");
  795. log.error("查询病人缴费记录失败,系统异常,错误信息{}", e);
  796. return resultMap;
  797. }
  798. }
  799. /**
  800. * 根据病人编码和收费流水号查询缴费明细
  801. *
  802. * @return
  803. */
  804. @UserLoginToken
  805. @RequestMapping(value = "/getChargeDetailByPatient", method = {RequestMethod.POST})
  806. public Map<String, Object> getChargeDetailByPatient(@RequestBody ChargeFeeParamsVo chargeFeeParamsVo, HttpServletRequest httpServletRequest) {
  807. Map<String, Object> resultMap = new HashMap<>();
  808. try {
  809. if (chargeFeeParamsVo == null) {
  810. resultMap.put("code", -1);
  811. resultMap.put("message", "检索参数不能为空");
  812. return resultMap;
  813. }
  814. if (StringUtils.isBlank(chargeFeeParamsVo.getPatientId())) {
  815. resultMap.put("code", -1);
  816. resultMap.put("message", "病人编号不能为空");
  817. return resultMap;
  818. }
  819. if (StringUtils.isBlank(chargeFeeParamsVo.getSerialNo())) {
  820. resultMap.put("code", -1);
  821. resultMap.put("message", "缴费流水号不能为空");
  822. return resultMap;
  823. }
  824. List<Map<String, Object>> data = mzChargeDetailService.queryChargeDetailByPatient(chargeFeeParamsVo.getPatientId(), chargeFeeParamsVo.getSerialNo());
  825. BigDecimal totalPriceCount = BigDecimal.ZERO;
  826. totalPriceCount = getBigDecimal(data, totalPriceCount);
  827. User tokenUser = TokenUtil.getUser(httpServletRequest);
  828. MzReceiptSerial mzReceiptSerial = mzReceiptSerialService.queryReceiptDetailsByReceiptSn(Integer.valueOf(chargeFeeParamsVo.getSerialNo()));
  829. if (mzReceiptSerial != null) {
  830. Employee opEmployee = employeeService.queryByUserCode(mzReceiptSerial.getOperatorId());
  831. if (opEmployee != null) {
  832. mzReceiptSerial.setOperatorId(opEmployee.getEmployeeName());
  833. }
  834. }
  835. resultMap.put("code", 0);
  836. resultMap.put("data", data);
  837. resultMap.put("totalPriceCount", totalPriceCount);
  838. resultMap.put("user", tokenUser);
  839. resultMap.put("mzReceiptSerial", mzReceiptSerial);
  840. resultMap.put("message", "查询病人缴费记录成功");
  841. return resultMap;
  842. } catch (MzException e) {
  843. log.error("根据病人编码和收费流水号查询缴费明细失败,错误信息{}", e);
  844. resultMap.put("code", -1);
  845. resultMap.put("message", "根据病人编码和收费流水号查询缴费明细失败");
  846. return resultMap;
  847. } catch (Exception e) {
  848. e.printStackTrace();
  849. resultMap.put("code", -1);
  850. resultMap.put("message", "根据病人编码和收费流水号查询缴费明细失败,系统出错,请联系管理员");
  851. log.error("根据病人编码和收费流水号查询缴费明细失败,系统异常,错误信息{}", e);
  852. return resultMap;
  853. }
  854. }
  855. /**
  856. * 查询病人的所有缴费明细
  857. *
  858. * @return
  859. */
  860. @UserLoginToken
  861. @RequestMapping(value = "/getAllChargeDetailByPatient", method = {RequestMethod.POST})
  862. public Map<String, Object> getAllChargeDetailByPatient(@RequestBody ChargeFeeParamsVo chargeFeeParamsVo, HttpServletRequest httpServletRequest) {
  863. Map<String, Object> resultMap = new HashMap<>();
  864. try {
  865. if (chargeFeeParamsVo == null) {
  866. resultMap.put("code", -1);
  867. resultMap.put("message", "检索参数不能为空");
  868. return resultMap;
  869. }
  870. if (chargeFeeParamsVo.getBeginDate() == null) {
  871. resultMap.put("code", -1);
  872. resultMap.put("message", "检索开始时间不能为空");
  873. return resultMap;
  874. }
  875. if (chargeFeeParamsVo.getEndDate() == null) {
  876. resultMap.put("code", -1);
  877. resultMap.put("message", "检索结束时间不能为空");
  878. return resultMap;
  879. }
  880. if (StringUtils.isBlank(chargeFeeParamsVo.getPatientId())) {
  881. resultMap.put("code", -1);
  882. resultMap.put("message", "病人id不能为空");
  883. return resultMap;
  884. }
  885. List<Map<String, Object>> mzChargeDetailList = mzChargeDetailService.queryChargeListByPatient("%" + chargeFeeParamsVo.getPatientId() + "%", null, null, chargeFeeParamsVo.getBeginDate(), chargeFeeParamsVo.getEndDate());
  886. List<Map<String, Object>> data = new ArrayList<>();
  887. if (mzChargeDetailList != null) {
  888. StringBuilder sbf = new StringBuilder();
  889. List<String> receiptBillList = new ArrayList<>();
  890. int index = 0;
  891. for (Map<String, Object> map : mzChargeDetailList) {
  892. if (map != null) {
  893. Integer realNo = (Integer) map.get("real_no");
  894. data.addAll(mzChargeDetailService.queryChargeDetailByPatient(chargeFeeParamsVo.getPatientId(), realNo.toString()));
  895. MzReceiptSerial mzReceiptSerial = mzReceiptSerialService.queryReceiptDetailsByReceiptSn(realNo);
  896. if (mzReceiptSerial != null && StringUtils.isNotBlank(mzReceiptSerial.getReceiptBill())) {
  897. if (sbf.length() == 0) {
  898. sbf.append(mzReceiptSerial.getReceiptBill());
  899. } else {
  900. sbf.append(",").append(mzReceiptSerial.getReceiptBill());
  901. }
  902. //每6个发票号换一次行
  903. index++;
  904. if (index % 6 == 0) {
  905. receiptBillList.add(sbf.toString());
  906. sbf.setLength(0);
  907. }
  908. }
  909. }
  910. }
  911. if (sbf.toString().length() > 0) {
  912. receiptBillList.add(sbf.toString());
  913. }
  914. if (sbf.length() > 0) {
  915. resultMap.put("receiptBillList", receiptBillList);
  916. }
  917. }
  918. BigDecimal totalPriceCount = BigDecimal.ZERO;
  919. totalPriceCount = getBigDecimal(data, totalPriceCount);
  920. User tokenUser = TokenUtil.getUser(httpServletRequest);
  921. resultMap.put("code", 0);
  922. resultMap.put("data", data);
  923. resultMap.put("totalPriceCount", totalPriceCount);
  924. resultMap.put("user", tokenUser);
  925. resultMap.put("message", "查询病人缴费记录成功");
  926. return resultMap;
  927. } catch (Exception e) {
  928. e.printStackTrace();
  929. resultMap.put("code", -1);
  930. resultMap.put("message", "查询病人缴费记录失败,系统出错,请联系管理员");
  931. log.error("查询病人缴费记录失败,系统异常,错误信息{}", e);
  932. return resultMap;
  933. }
  934. }
  935. private BigDecimal getBigDecimal(List<Map<String, Object>> data, BigDecimal totalPriceCount) {
  936. if (data != null && data.size() > 0) {
  937. for (Map<String, Object> entity : data) {
  938. Double totalPriceD = (Double) entity.get("total_price");
  939. BigDecimal totalPrice = BigDecimal.ZERO;
  940. if (totalPriceD != null) {
  941. totalPrice = BigDecimal.valueOf(totalPriceD);
  942. }
  943. if (totalPrice != null) {
  944. totalPriceCount = totalPriceCount.add(totalPrice);
  945. }
  946. }
  947. Employee employee = employeeService.queryByUserCode((String) data.get(0).get("doctor_code"));
  948. if (employee != null) {
  949. data.get(0).put("doctor_code", employee.getEmployeeName());
  950. }
  951. String warnDept = zdUnitCodeService.queryDeptNameByIdInCache((String) data.get(0).get("warn_dept"));
  952. if (StringUtils.isNotBlank(warnDept)) {
  953. data.get(0).put("warn_dept", warnDept);
  954. }
  955. Employee opEmployee = employeeService.queryByUserCode((String) data.get(0).get("op_id"));
  956. if (opEmployee != null) {
  957. data.get(0).put("op_id", opEmployee.getEmployeeName());
  958. }
  959. }
  960. return totalPriceCount.setScale(1, BigDecimal.ROUND_HALF_UP);
  961. }
  962. /**
  963. * 查询科室核算报表 caseType = 1 申请科室核算报表 0 执行科室核算报表
  964. *
  965. * @return
  966. */
  967. @UserLoginToken
  968. @RequestMapping(value = "/getDepetBusinessReport", method = {RequestMethod.POST})
  969. public Map<String, Object> getDepetBusinessReport(@RequestBody ThmzmxsrParamsVo thmzmxsrParamsVo, HttpServletRequest httpServletRequest) {
  970. Map<String, Object> resultMap = new HashMap<>();
  971. try {
  972. if (thmzmxsrParamsVo == null) {
  973. resultMap.put("code", -1);
  974. resultMap.put("message", "查询科室核算报表失败,参数为空");
  975. return resultMap;
  976. }
  977. if (thmzmxsrParamsVo.getBeginDate() == null) {
  978. resultMap.put("code", -1);
  979. resultMap.put("message", "查询科室核算报表失败,开始时间为空");
  980. return resultMap;
  981. }
  982. if (thmzmxsrParamsVo.getEndDate() == null) {
  983. resultMap.put("code", -1);
  984. resultMap.put("message", "查询科室核算报表失败,结束时间为空");
  985. return resultMap;
  986. }
  987. if (StringUtils.isBlank(thmzmxsrParamsVo.getCaseType())) {
  988. resultMap.put("code", -1);
  989. resultMap.put("message", "查询科室核算报表失败,核算报表类型为空");
  990. return resultMap;
  991. }
  992. if (StringUtils.isBlank(thmzmxsrParamsVo.getExecDept())) {
  993. thmzmxsrParamsVo.setExecDept(null);
  994. }
  995. //如果门诊医生或者科室核算标志不为空,设置科室或者医生信息
  996. if(thmzmxsrParamsVo.getType()!=null){
  997. User tokenUser = TokenUtil.getUser(httpServletRequest);
  998. if(thmzmxsrParamsVo.getType()==1){
  999. thmzmxsrParamsVo.setJzSqDoctor(tokenUser.getUserIdCode());
  1000. }else {
  1001. Employee employee= employeeService.queryByUserCode(tokenUser.getUserIdCode());
  1002. if(employee!=null){
  1003. thmzmxsrParamsVo.setExecDept(employee.getDeptCode());
  1004. }
  1005. }
  1006. }
  1007. resultMap.put("code", 0);
  1008. resultMap.put("message", "查询科室核算报表成功");
  1009. thmzmxsrParamsVo.setHisData();
  1010. List<Map<String, Object>> depetBusinessReports = mzChargeDetailService.queryDepetBusinessReport(thmzmxsrParamsVo);
  1011. // thmzmxsrParamsVo.setHisData(YesNoEnum.YES);
  1012. // //历史数据
  1013. // List<Map<String, Object>> depetBusinessReportsHis = mzChargeDetailService.queryDepetBusinessReport(thmzmxsrParamsVo);
  1014. if (fomartThmzBussinessReport(resultMap, depetBusinessReports)) {
  1015. return resultMap;
  1016. }
  1017. resultMap.put("code", -1);
  1018. resultMap.put("message", "未查询到科室核算报表");
  1019. return resultMap;
  1020. } catch (Exception e) {
  1021. e.printStackTrace();
  1022. log.error("查询科室核算报表失败,错误信息{}", e);
  1023. resultMap.put("code", -1);
  1024. resultMap.put("message", "查询科室核算报表失败");
  1025. return resultMap;
  1026. }
  1027. }
  1028. private boolean fomartThmzBussinessReport(Map<String, Object> resultMap, List<Map<String, Object>> depetBusinessReports) {
  1029. if (depetBusinessReports != null && depetBusinessReports.size() > 0) {
  1030. String defaultDept = "defaultDept";
  1031. List<BillItem> mzBillItems = mzBillItemService.queryZyBillItem();
  1032. Map<String, String> mzBillItemMap = null;
  1033. if (mzBillItems != null) {
  1034. mzBillItemMap = mzBillItems.stream().collect(Collectors.toMap(BillItem::getCode, BillItem::getName));
  1035. }
  1036. Set<Date> repeatSet = new HashSet<>();
  1037. //父类码列表
  1038. List<Map<String, Object>> parentList = new ArrayList<>();
  1039. //科室列表
  1040. List<Map<String, Object>> depetList = new ArrayList<>();
  1041. //科室排重集
  1042. Set<String> depetSet = new HashSet<>();
  1043. //父类码与核算码的关系
  1044. Map<String, List<String>> parentMap = new HashMap<>();
  1045. List<ZyZdAuditItem> zyZdAuditItems = zyZdAuditItemService.querytAll();
  1046. //实际项目与父类码对应关系,因为数据查询中的父类码不准
  1047. Map<String, ZyZdAuditItem> auditMap = zyZdAuditItems.stream().collect(Collectors.toMap(ZyZdAuditItem::getCode, zyZdAuditItem -> zyZdAuditItem));
  1048. if (depetBusinessReports.size() > 0) {
  1049. List<String> chargeBillCodes = new ArrayList<>(depetBusinessReports.stream().map(d -> (String) d.get("charge_bill_code")).collect(Collectors.toSet()));
  1050. //构造收费编码与核算码关系
  1051. List<ZdChargeItem> zdChargeItemList = zdChargeItemService.queryZdChargeItemByCodeList(chargeBillCodes);
  1052. Map<String, String> zdChargeItemMap = new HashMap<>();
  1053. for (ZdChargeItem zdChargeItem : zdChargeItemList) {
  1054. zdChargeItemMap.put(zdChargeItem.getCode(), zdChargeItem.getAuditCode());
  1055. }
  1056. // Map<String, String> zdChargeItemMap = zdChargeItemList.stream().collect(Collectors.toMap(ZdChargeItem::getCode, ZdChargeItem::getAuditCode));
  1057. for (Map<String, Object> map : depetBusinessReports) {
  1058. repeatSet.add((Date) map.get("charge_dcount_date"));
  1059. String auditCode = zdChargeItemMap.get(map.get("charge_bill_code"));
  1060. ZyZdAuditItem zyZdAuditItem = auditMap.get(auditCode);
  1061. if (zyZdAuditItem != null) {
  1062. map.put("parent", zyZdAuditItem.getParentCode());
  1063. map.put("audit_code", zyZdAuditItem.getName());
  1064. } else {
  1065. log.info(" 没有父类型{},{}", auditCode);
  1066. }
  1067. map.put("exec_dept", zdUnitCodeService.queryDeptNameByIdInCache((String) map.get("exec_dept")));
  1068. fomartData(mzBillItemMap, parentList, depetList, depetSet, parentMap, map);
  1069. }
  1070. }
  1071. // if (depetBusinessReportsHis != null && depetBusinessReportsHis.size() > 0) {
  1072. // List<String> chargeBillCodes = new ArrayList<>(depetBusinessReportsHis.stream().map(d -> (String) d.get("charge_bill_code")).collect(Collectors.toSet()));
  1073. // //构造收费编码与核算码关系
  1074. // List<ZdChargeItem> zdChargeItemList = zdChargeItemService.queryZdChargeItemByCodeList(chargeBillCodes);
  1075. // Map<String, String> zdChargeItemMap = new HashMap<>();
  1076. // for (ZdChargeItem zdChargeItem : zdChargeItemList) {
  1077. // zdChargeItemMap.put(zdChargeItem.getCode(), zdChargeItem.getAuditCode());
  1078. // }
  1079. // for (Map<String, Object> map : depetBusinessReportsHis) {
  1080. // if (repeatSet.contains(map.get("charge_dcount_date"))) {
  1081. // continue;
  1082. // }
  1083. // String auditCode = zdChargeItemMap.get(map.get("charge_bill_code"));
  1084. // ZyZdAuditItem zyZdAuditItem = auditMap.get(auditCode);
  1085. // if (zyZdAuditItem != null) {
  1086. // map.put("parent", zyZdAuditItem.getParentCode());
  1087. // map.put("audit_code", zyZdAuditItem.getName());
  1088. // } else {
  1089. // log.info("");
  1090. // }
  1091. // map.put("exec_dept", zdUnitCodeService.queryDeptNameByIdInCache((String) map.get("exec_dept")));
  1092. // depetBusinessReports.add(map);
  1093. // fomartData(mzBillItemMap, parentList, depetList, depetSet, parentMap, map);
  1094. // }
  1095. // }
  1096. Map<String, BigDecimal> formatMap = new HashMap<>();
  1097. StringBuffer sbf = new StringBuffer();
  1098. for (Map<String, Object> map : depetBusinessReports) {
  1099. sbf.setLength(0);
  1100. sbf.append(map.get("audit_code")).append("_").append(map.get("exec_dept"));
  1101. String key = sbf.toString();
  1102. BigDecimal hadAmount = formatMap.get(key);
  1103. BigDecimal thisAmount = (BigDecimal) map.get("total_charge");
  1104. if (hadAmount == null) {
  1105. hadAmount = BigDecimal.ZERO;
  1106. }
  1107. if (thisAmount == null) {
  1108. thisAmount = BigDecimal.ZERO;
  1109. }
  1110. hadAmount = hadAmount.add(thisAmount);
  1111. formatMap.put(key, hadAmount);
  1112. }
  1113. //按部门统计的总额
  1114. Map<String, BigDecimal> depeAmounts = new HashMap<>();
  1115. //按核算码统计的总额
  1116. Map<String, BigDecimal> auditCodeAmounts = new HashMap<>();
  1117. List<List<BigDecimal>> realDatas = new ArrayList<>();
  1118. boolean hasNullKey = false;
  1119. for (int j = 0; j < parentList.size(); j++) {
  1120. Map<String, Object> parent = parentList.get(j);
  1121. List<String> auditCodeList = (List<String>) parent.get("hsmList");
  1122. for (int k = 0; k < auditCodeList.size(); k++) {
  1123. List<BigDecimal> tempList = new ArrayList<>();
  1124. for (int i = 0; i < depetList.size(); i++) {
  1125. sbf.setLength(0);
  1126. sbf.append(auditCodeList.get(k)).append("_").append(depetList.get(i).get("exec_dept"));
  1127. BigDecimal tempAmount = formatMap.get(sbf.toString());
  1128. tempList.add(tempAmount);
  1129. if (tempAmount != null) {
  1130. String execDept = (String) depetList.get(i).get("exec_dept");
  1131. if (execDept == null) {
  1132. execDept = defaultDept;
  1133. hasNullKey = true;
  1134. }
  1135. BigDecimal countDeptAmont = depeAmounts.get(execDept);
  1136. if (countDeptAmont == null) {
  1137. countDeptAmont = BigDecimal.ZERO;
  1138. }
  1139. countDeptAmont = countDeptAmont.add(tempAmount);
  1140. depeAmounts.put(execDept, countDeptAmont);
  1141. BigDecimal countAuditAmont = auditCodeAmounts.get(auditCodeList.get(k));
  1142. if (countAuditAmont == null) {
  1143. countAuditAmont = BigDecimal.ZERO;
  1144. }
  1145. countAuditAmont = countAuditAmont.add(tempAmount);
  1146. auditCodeAmounts.put(auditCodeList.get(k), countAuditAmont);
  1147. }
  1148. }
  1149. realDatas.add(tempList);
  1150. }
  1151. }
  1152. BigDecimal totalAmount = BigDecimal.ZERO;
  1153. for (Map<String, Object> map : depetList) {
  1154. BigDecimal deptAmount = depeAmounts.get(map.get("exec_dept"));
  1155. if (hasNullKey && map.get("exec_dept") == null) {
  1156. deptAmount = depeAmounts.get(defaultDept);
  1157. }
  1158. if (deptAmount != null) {
  1159. totalAmount = totalAmount.add(deptAmount);
  1160. }
  1161. map.put("amount", deptAmount);
  1162. }
  1163. List<BigDecimal> hsmAmounts = new ArrayList<>();
  1164. for (Map<String, Object> map : parentList) {
  1165. List<String> auditCodeList = (List<String>) map.get("hsmList");
  1166. for (String str : auditCodeList) {
  1167. hsmAmounts.add(auditCodeAmounts.get(str));
  1168. }
  1169. }
  1170. resultMap.put("message", "查询科室核算报表成功");
  1171. resultMap.put("depetList", depetList);
  1172. resultMap.put("parentList", parentList);
  1173. resultMap.put("realDatas", realDatas);
  1174. resultMap.put("hsmAmounts", hsmAmounts);
  1175. resultMap.put("totalAmount", totalAmount);
  1176. return true;
  1177. }
  1178. return false;
  1179. }
  1180. /**
  1181. * 将数据库数据格式转成页面表格需要格式 结构化数据
  1182. *
  1183. * @param mzBillItemMap
  1184. * @param parentList
  1185. * @param depetList
  1186. * @param depetSet
  1187. * @param parentMap
  1188. * @param map
  1189. */
  1190. private void fomartData(Map<String, String> mzBillItemMap, List<Map<String, Object>> parentList, List<Map<String, Object>> depetList, Set<String> depetSet, Map<String, List<String>> parentMap, Map<String, Object> map) {
  1191. String execDept = (String) map.get("exec_dept");
  1192. if (!depetSet.contains(execDept)) {
  1193. depetSet.add(execDept);
  1194. Map<String, Object> deptTemp = new HashMap<>();
  1195. // deptTemp.put("execDeptName", zdUnitCodeService.queryDeptNameByIdInCache(execDept));
  1196. deptTemp.put("exec_dept", execDept);
  1197. depetList.add(deptTemp);
  1198. }
  1199. String parent = (String) map.get("parent");
  1200. List<String> auditCodeList = parentMap.get(parent);
  1201. if (auditCodeList == null) {
  1202. Map<String, Object> parentTemp = new HashMap<>();
  1203. parentTemp.put("parentName", mzBillItemMap.get(parent));
  1204. parentTemp.put("parentCode", parent);
  1205. auditCodeList = new ArrayList<>();
  1206. auditCodeList.add((String) map.get("audit_code"));
  1207. parentTemp.put("hsmList", auditCodeList);
  1208. parentList.add(parentTemp);
  1209. parentMap.put(parent, auditCodeList);
  1210. } else {
  1211. String auditCode = (String) map.get("audit_code");
  1212. if (!auditCodeList.contains(auditCode)) {
  1213. auditCodeList.add(auditCode);
  1214. }
  1215. }
  1216. }
  1217. /**
  1218. * 获取病人特门与自费金额
  1219. *
  1220. * @return
  1221. */
  1222. @UserLoginToken
  1223. @RequestMapping(value = "/getTmFee", method = {RequestMethod.POST})
  1224. public Map<String, Object> getTmFee(@RequestBody MzChargeDetailYb mzChargeDetailYb, HttpServletRequest httpServletRequest) {
  1225. Map<String, Object> resultMap = new HashMap<>();
  1226. try {
  1227. if (mzChargeDetailYb == null) {
  1228. resultMap.put("code", -1);
  1229. resultMap.put("message", "获取病人特门与自费金额参数不能为空");
  1230. return resultMap;
  1231. }
  1232. if (StringUtils.isBlank(mzChargeDetailYb.getPatientId())) {
  1233. resultMap.put("code", -1);
  1234. resultMap.put("message", "病人编码不能为空");
  1235. return resultMap;
  1236. }
  1237. if (mzChargeDetailYb.getTimes() == null) {
  1238. resultMap.put("code", -1);
  1239. resultMap.put("message", "病人就诊次数不能为空");
  1240. return resultMap;
  1241. }
  1242. if (mzChargeDetailYb.getReceiptNo() == null) {
  1243. resultMap.put("code", -1);
  1244. resultMap.put("message", "缴费次数不能为空");
  1245. return resultMap;
  1246. }
  1247. int count = mzChargeDetailYbService.queryTmCount(mzChargeDetailYb);
  1248. if (count > 0) {
  1249. String token = TokenUtil.getToken(httpServletRequest);
  1250. if (StringUtils.isBlank(token)) {
  1251. resultMap.put("code", -1);
  1252. resultMap.put("message", "获取病人特门与自费金额失败,用户Token不存在");
  1253. return resultMap;
  1254. }
  1255. DecodedJWT decodedJWT = TokenUtil.parseJWT(token);
  1256. User tokenUser = (User) JsonUtil.jsontoObject(decodedJWT.getSubject(), User.class);
  1257. PayInfo result = tsmzService.uploadFees(tokenUser.getUserIdCode(), mzChargeDetailYb.getPatientId(), mzChargeDetailYb.getTimes(), mzChargeDetailYb.getReceiptNo());
  1258. if (result == null) {
  1259. resultMap.put("code", -1);
  1260. resultMap.put("message", "获取特门费用失败");
  1261. return resultMap;
  1262. }
  1263. if (result.getCode() != 0) {
  1264. resultMap.put("code", -1);
  1265. resultMap.put("message", result.getErrorMessage());
  1266. return resultMap;
  1267. }
  1268. resultMap.put("data", result);
  1269. }
  1270. resultMap.put("code", 0);
  1271. resultMap.put("message", "获取病人特门与自费金额成功");
  1272. return resultMap;
  1273. } catch (Exception e) {
  1274. e.printStackTrace();
  1275. resultMap.put("code", -1);
  1276. resultMap.put("message", "获取病人特门与自费金额失败,系统出错,请联系管理员");
  1277. log.error("获取病人特门与自费金额失败,系统异常,错误信息{}", e);
  1278. return resultMap;
  1279. }
  1280. }
  1281. /**
  1282. * 取消病人特门费用上传 不使用了
  1283. *
  1284. * @return
  1285. */
  1286. @UserLoginToken
  1287. @RequestMapping(value = "/cancelTmFee", method = {RequestMethod.POST})
  1288. public Map<String, Object> cancelTmFee(@RequestBody MzChargeDetailYb mzChargeDetailYb, HttpServletRequest httpServletRequest) {
  1289. Map<String, Object> resultMap = new HashMap<>();
  1290. try {
  1291. if (mzChargeDetailYb == null) {
  1292. resultMap.put("code", -1);
  1293. resultMap.put("message", "取消病人特门费用上传参数不能为空");
  1294. return resultMap;
  1295. }
  1296. if (StringUtils.isBlank(mzChargeDetailYb.getPatientId())) {
  1297. resultMap.put("code", -1);
  1298. resultMap.put("message", "病人编码不能为空");
  1299. return resultMap;
  1300. }
  1301. if (mzChargeDetailYb.getTimes() == null) {
  1302. resultMap.put("code", -1);
  1303. resultMap.put("message", "病人就诊次数不能为空");
  1304. return resultMap;
  1305. }
  1306. if (mzChargeDetailYb.getReceiptNo() == null) {
  1307. resultMap.put("code", -1);
  1308. resultMap.put("message", "缴费次数不能为空");
  1309. return resultMap;
  1310. }
  1311. int count = mzChargeDetailYbService.queryTmCount(mzChargeDetailYb);
  1312. if (count > 0) {
  1313. String token = TokenUtil.getToken(httpServletRequest);
  1314. if (StringUtils.isBlank(token)) {
  1315. resultMap.put("code", -1);
  1316. resultMap.put("message", "取消病人特门费用上传失败,用户Token不存在");
  1317. return resultMap;
  1318. }
  1319. DecodedJWT decodedJWT = TokenUtil.parseJWT(token);
  1320. User tokenUser = (User) JsonUtil.jsontoObject(decodedJWT.getSubject(), User.class);
  1321. PayInfo result = tsmzService.retractFees(tokenUser.getUserIdCode(), mzChargeDetailYb.getPatientId(), mzChargeDetailYb.getTimes(), mzChargeDetailYb.getReceiptNo());
  1322. if (result == null) {
  1323. resultMap.put("code", -1);
  1324. resultMap.put("message", "获取特门费用失败");
  1325. return resultMap;
  1326. }
  1327. if (result.getCode() != 0) {
  1328. resultMap.put("code", -1);
  1329. resultMap.put("message", result.getErrorMessage());
  1330. return resultMap;
  1331. }
  1332. resultMap.put("data", result);
  1333. }
  1334. resultMap.put("code", 0);
  1335. resultMap.put("message", "取消病人特门费用上传成功");
  1336. return resultMap;
  1337. } catch (Exception e) {
  1338. e.printStackTrace();
  1339. resultMap.put("code", -1);
  1340. resultMap.put("message", "取消病人特门费用上传失败,系统出错,请联系管理员");
  1341. log.error("取消病人特门费用上传失败,系统异常,错误信息{}", e);
  1342. return resultMap;
  1343. }
  1344. }
  1345. /**
  1346. * 核酸申请
  1347. *
  1348. * @param patientId
  1349. * @return
  1350. */
  1351. @UserLoginToken
  1352. @RequestMapping(value = "/nucleicAcidApplication", method = {RequestMethod.GET})
  1353. public Map<String, Object> nucleicAcidApplication(@RequestParam("patientId") String patientId) {
  1354. Map<String, Object> results = new HashMap<>();
  1355. try {
  1356. if (StringUtils.isBlank(patientId)) {
  1357. results.put("code", -1);
  1358. results.put("message", "患者ID不能为空");
  1359. return results;
  1360. }
  1361. Clinic clinic = mzChargeDetailService.nucleicAcidApplication(patientId);
  1362. if (clinic != null && clinic.getId() != null) {
  1363. results.put("code", 0);
  1364. results.put("message", "核酸申请保存成功");
  1365. return results;
  1366. }
  1367. results.put("code", -1);
  1368. results.put("message", "核酸申请保存失败");
  1369. return results;
  1370. } catch (MzException e) {
  1371. results.put("code", -1);
  1372. results.put("message", e.getMessage());
  1373. log.error("系统异常,错误信息{}", e);
  1374. return results;
  1375. } catch (Exception e) {
  1376. e.printStackTrace();
  1377. results.put("code", -1);
  1378. results.put("message", "核酸申请保存失败,请联系管理员");
  1379. log.error("系统异常,错误信息{}", e);
  1380. return results;
  1381. }
  1382. }
  1383. /**
  1384. * 保存处方信息
  1385. *
  1386. * @param mzPrescriptionVo
  1387. * @return
  1388. */
  1389. @UserLoginToken
  1390. @RequestMapping(value = "/savePrescription", method = {RequestMethod.POST})
  1391. public Map<String, Object> savePrescription(@RequestBody MzPrescriptionVo mzPrescriptionVo) {
  1392. Map<String, Object> resultMap = new HashMap<>();
  1393. try {
  1394. if (StringUtils.isBlank(mzPrescriptionVo.getSerialNo())) {
  1395. resultMap.put("code", -1);
  1396. resultMap.put("message", "当前接诊患者的分诊流水号为空");
  1397. return resultMap;
  1398. }
  1399. Clinic clinic = null;
  1400. if (mzPrescriptionVo.getSerialNo().startsWith("clnicId_")) {
  1401. Long clnicId = Long.valueOf(mzPrescriptionVo.getSerialNo().replace("clnicId_", ""));
  1402. clinic = clinicService.queryById(clnicId);
  1403. mzPrescriptionVo.setDoctorCode(clinic.getDoctorCode());
  1404. mzPrescriptionVo.setVisitDeptCode(clinic.getDeptCode());
  1405. mzPrescriptionVo.setSerialNo(null);
  1406. } else {
  1407. MzfzPatientOrder mzfzPatientOrder = mzfzPatientOrderService.queryBySerialNo(mzPrescriptionVo.getSerialNo());
  1408. if (mzfzPatientOrder == null) {
  1409. resultMap.put("code", -1);
  1410. resultMap.put("message", "当前接诊患者的分诊记录不存在");
  1411. return resultMap;
  1412. }
  1413. mzPrescriptionVo.setDoctorCode(mzfzPatientOrder.getDoctorCode());
  1414. mzPrescriptionVo.setVisitDeptCode(mzfzPatientOrder.getDeptCode());
  1415. }
  1416. mzPrescriptionVo.setJzFlag(YesNoEnum.NO.code);
  1417. Clinic insertClinic = mzChargeDetailService.savePrescription(mzPrescriptionVo, clinic);
  1418. if (insertClinic != null && insertClinic.getId() != null) {
  1419. resultMap.put("code", 0);
  1420. resultMap.put("data", insertClinic);
  1421. resultMap.put("message", "门诊处方保存成功");
  1422. return resultMap;
  1423. }
  1424. resultMap.put("code", -1);
  1425. resultMap.put("message", "门诊处方保存失败");
  1426. return resultMap;
  1427. } catch (MzException e) {
  1428. resultMap.put("code", -1);
  1429. resultMap.put("message", e.getMessage());
  1430. log.error("系统异常,错误信息{}", e);
  1431. return resultMap;
  1432. } catch (Exception e) {
  1433. e.printStackTrace();
  1434. resultMap.put("code", -1);
  1435. resultMap.put("message", "门诊处方保存失败,请联系管理员");
  1436. log.error("系统异常,错误信息{}", e);
  1437. return resultMap;
  1438. }
  1439. }
  1440. /**
  1441. * 计算临时处方的中药,西药,诊疗以及总金额
  1442. *
  1443. * @param mzPrescriptionVo
  1444. * @return
  1445. */
  1446. @UserLoginToken
  1447. @RequestMapping(value = "/getAmountForTempPrescription", method = {RequestMethod.POST})
  1448. public Map<String, Object> getAmountForTempPrescription(@RequestBody MzPrescriptionVo mzPrescriptionVo) {
  1449. Map<String, Object> resultMap = new HashMap<>();
  1450. try {
  1451. //计算金额不需要真实的科室信息
  1452. mzPrescriptionVo.setJzFlag(YesNoEnum.NO.code);
  1453. mzPrescriptionVo.setDoctorCode(Constants.BRZZJF_CODE);
  1454. mzPrescriptionVo.setVisitDeptCode(Constants.ZZBM);
  1455. resultMap.put("code", 0);
  1456. resultMap.put("data", mzChargeDetailService.getAmountForTempPrescription(mzPrescriptionVo));
  1457. resultMap.put("message", "计算临时处方的中药,西药,诊疗以及总金额成功");
  1458. return resultMap;
  1459. } catch (MzException e) {
  1460. resultMap.put("code", -1);
  1461. resultMap.put("message", e.getMessage());
  1462. log.error("系统异常,错误信息{}", e);
  1463. return resultMap;
  1464. } catch (Exception e) {
  1465. e.printStackTrace();
  1466. resultMap.put("code", -1);
  1467. resultMap.put("message", "计算临时处方的中药,西药,诊疗以及总金额失败,请联系管理员");
  1468. log.error("系统异常,错误信息{}", e);
  1469. return resultMap;
  1470. }
  1471. }
  1472. /**
  1473. * 获取病人某次处方信息
  1474. *
  1475. * @param patientId
  1476. * @param times
  1477. * @param MzBlRecordFlag 如果是修改处方传false 如果是重复接诊传true; true 时,只需要构造病历信息,不需要设置用药和诊疗信息
  1478. * @param payMark 5 未缴费处 0 已缴费
  1479. * @param clnicId 就诊记录id 是否需要查询就诊记录信息
  1480. * @return
  1481. */
  1482. @UserLoginToken
  1483. @RequestMapping(value = "/getMzPrescriptionVo", method = {RequestMethod.GET})
  1484. public Map<String, Object> getMzPrescriptionVo(@RequestParam("patientId") String patientId, @RequestParam("times") Integer times, @RequestParam("MzBlRecordFlag") Boolean MzBlRecordFlag, @RequestParam("payMark") String payMark, @RequestParam("clnicId") String clnicId) {
  1485. Map<String, Object> resultMap = new HashMap<>();
  1486. try {
  1487. resultMap.put("code", 0);
  1488. resultMap.put("data", mzChargeDetailService.getMzPrescriptionVo(patientId, times, MzBlRecordFlag, payMark));
  1489. MzPatientMi mzPatientMi = mzPatientMiService.queryByPatientId(patientId);
  1490. if (PayMarkEnum.CHARGED.code.equals(payMark)) {
  1491. mzPatientMi.setGender(GenderEnum.getGenderByCode(mzPatientMi.getSex()).name);
  1492. }
  1493. Long clnicIdL = null;
  1494. if (!"null".equals(clnicId) && StringUtils.isNotBlank(clnicId)) {
  1495. clnicIdL = Long.valueOf(clnicId);
  1496. if (clnicIdL != null) {
  1497. Clinic clinic = clinicService.queryById(clnicIdL);
  1498. if (clinic != null) {
  1499. resultMap.put("opDate", DateUtil.fomart(clinic.getOpDay(), "yyyy-MM-dd HH:mm:ss"));
  1500. resultMap.put("deptName", zdUnitCodeService.queryDeptNameByIdInCache(clinic.getDeptCode()));
  1501. if (clinic.getDoctorCode() != null && StringUtils.isNotBlank(clinic.getDoctorCode())) {
  1502. Employee employee = employeeService.queryByUserCode(clinic.getDoctorCode());
  1503. resultMap.put("doctorName", employee != null ? employee.getEmployeeName() : "");
  1504. }
  1505. }
  1506. }
  1507. }
  1508. resultMap.put("mzPatientMi", mzPatientMi);
  1509. resultMap.put("message", "获取病人某次处方信息成功");
  1510. return resultMap;
  1511. } catch (MzException e) {
  1512. resultMap.put("code", -1);
  1513. resultMap.put("message", e.getMessage());
  1514. log.error("获取病人某次处方信息失败,错误信息{}", e);
  1515. return resultMap;
  1516. } catch (Exception e) {
  1517. e.printStackTrace();
  1518. resultMap.put("code", -1);
  1519. resultMap.put("message", "获取病人某次处方信息失败,请联系管理员");
  1520. log.error("系统异常,错误信息{}", e);
  1521. return resultMap;
  1522. }
  1523. }
  1524. /**
  1525. * 门诊缴费指引单查询
  1526. *
  1527. * @param patientId
  1528. * @param times
  1529. * @return
  1530. */
  1531. @UserLoginToken
  1532. @RequestMapping(value = "/getChargeDetailForGuideCard", method = {RequestMethod.GET})
  1533. public Map<String, Object> getChargeDetailForGuideCard(@RequestParam("patientId") String patientId, @RequestParam("times") Integer times) {
  1534. Map<String, Object> results = new HashMap<>();
  1535. if (times == null) {
  1536. results.put("code", -1);
  1537. results.put("message", "就诊次数为空");
  1538. return results;
  1539. }
  1540. if (StringUtils.isBlank(patientId)) {
  1541. results.put("code", -1);
  1542. results.put("message", "患者门诊ID不能为空");
  1543. return results;
  1544. }
  1545. try {
  1546. MzChargeDetail mzChargeDetail = new MzChargeDetail(patientId, times);
  1547. mzChargeDetail.setBillItemCode("100");
  1548. List<MzChargeDetail> mzChargeDetailList = mzChargeDetailService.getTempMzChargeDetailListForUnPaid(mzChargeDetail);
  1549. if (mzChargeDetailList == null || mzChargeDetailList.size() == 0) {
  1550. results.put("code", -2);
  1551. results.put("message", "未查询到门诊缴费指引单记录");
  1552. return results;
  1553. }
  1554. mzChargeDetailList = mzChargeDetailService.getMzChargeDetails(mzChargeDetailList);
  1555. List<Map<String, Object>> returnList = new ArrayList<>();
  1556. Map<String, ZdUnitCode> unitCodeMap = new HashMap<>();
  1557. Map<String, Map<String, Object>> tempMap = new HashMap<>();
  1558. List<BillItem> mzBillItems = mzBillItemService.queryMzBillItem();
  1559. Map<String, String> mzBillItemMap = null;
  1560. if (mzBillItems != null) {
  1561. mzBillItemMap = mzBillItems.stream().collect(Collectors.toMap(BillItem::getCode, BillItem::getName));
  1562. }
  1563. BigDecimal totalAmount = BigDecimal.ZERO;
  1564. for (MzChargeDetail mz : mzChargeDetailList) {
  1565. if (Arrays.asList(Constants.TC, Constants.SSWRF).contains(mz.getBillItemCode())) {
  1566. continue;
  1567. }
  1568. Map<String, Object> map = tempMap.get(mz.getBillItemCode());
  1569. if (map == null) {
  1570. map = new HashMap<>();
  1571. tempMap.put(mz.getBillItemCode(), map);
  1572. returnList.add(map);
  1573. if (mzBillItemMap != null) {
  1574. map.put("itemType", mzBillItemMap.get(mz.getBillItemCode()));
  1575. }
  1576. ZdUnitCode unitCode = unitCodeMap.get(mz.getExecDept());
  1577. if (unitCode == null && StringUtils.isNotBlank(mz.getExecDept())) {
  1578. unitCode = zdUnitCodeService.queryByCode(mz.getExecDept());
  1579. unitCodeMap.put(mz.getExecDept(), unitCode);
  1580. }
  1581. map.put("execDeptName", unitCode == null ? "" : unitCode.getName());
  1582. map.put("execDeptAddress", (unitCode == null || unitCode.getOfficePos() == null) ? "" : unitCode.getOfficePos());
  1583. }
  1584. BigDecimal unitPrice = mz.getUnitPrice().setScale(2, BigDecimal.ROUND_HALF_UP);
  1585. if (BigDecimal.ZERO.equals(unitPrice)) {
  1586. unitPrice = BigDecimal.valueOf(0.01D);
  1587. }
  1588. //unitPrice = unitPrice.multiply(BigDecimal.valueOf(100));
  1589. BigDecimal quantity = mz.getQuantity() == null ? BigDecimal.ONE : BigDecimal.valueOf(mz.getQuantity());
  1590. BigDecimal drugWin = mz.getDrugWin() == null ? BigDecimal.ONE : BigDecimal.valueOf(mz.getDrugWin());
  1591. BigDecimal amount = (BigDecimal) map.get("itemTotalFee");
  1592. if (amount == null) {
  1593. amount = BigDecimal.ZERO;
  1594. }
  1595. BigDecimal tempAmount = unitPrice.multiply(quantity).multiply(drugWin);
  1596. totalAmount = totalAmount.add(tempAmount);
  1597. map.put("itemTotalFee", amount.add(tempAmount));
  1598. }
  1599. totalAmount=totalAmount.setScale(1, BigDecimal.ROUND_HALF_UP);
  1600. String payQrcode = haiCiAdapterService.genMzPayQrcode(totalAmount.multiply(BigDecimal.valueOf(100)).intValue(), patientId, patientId + "_" + times + "_1");
  1601. results.put("code", 0);
  1602. results.put("message", "门诊缴费指引单查询成功");
  1603. results.put("totalAmount", totalAmount);
  1604. results.put("data", returnList);
  1605. if (payQrcode != null) {
  1606. results.put("payQrcode", payQrcode);
  1607. }
  1608. return results;
  1609. } catch (Exception e) {
  1610. e.printStackTrace();
  1611. results.put("code", -1);
  1612. results.put("message", "门诊缴费指引单查询失败,请联系管理员");
  1613. log.error("系统异常,错误信息{}", e);
  1614. return results;
  1615. }
  1616. }
  1617. /**
  1618. * 打印医技申请单
  1619. *
  1620. * @param patientId
  1621. * @param times
  1622. * @param reqType 申请单类型:2:检验;3:检查
  1623. * @return
  1624. */
  1625. @UserLoginToken
  1626. @RequestMapping(value = "/printYjReq", method = {RequestMethod.GET})
  1627. public Map<String, Object> printYjReq(@RequestParam("patientId") String patientId, @RequestParam("times") Integer times, @RequestParam("reqType") String reqType) {
  1628. Map<String, Object> results = new HashMap<>();
  1629. if (StringUtils.isBlank(patientId)) {
  1630. results.put("code", -1);
  1631. results.put("message", "患者门诊ID不能为空");
  1632. return results;
  1633. }
  1634. if (times == null) {
  1635. results.put("code", -1);
  1636. results.put("message", "就诊次数为空");
  1637. return results;
  1638. }
  1639. if (StringUtils.isBlank(reqType)) {
  1640. results.put("code", -1);
  1641. results.put("message", "报告类型不能为空");
  1642. return results;
  1643. }
  1644. try {
  1645. results.put("code", 0);
  1646. results.put("message", "查询医技申请单数据成功");
  1647. results.put("data", mzChargeDetailService.printYjReq(patientId, times, reqType));
  1648. return results;
  1649. } catch (MzException e) {
  1650. results.put("code", -1);
  1651. results.put("message", "查询医技申请单数据失败,请联系管理员");
  1652. return results;
  1653. } catch (Exception e) {
  1654. results.put("code", -1);
  1655. results.put("message", "查询医技申请单数据失败,请联系管理员");
  1656. log.error("系统异常,错误信息{}", e);
  1657. return results;
  1658. }
  1659. }
  1660. /**
  1661. * 修改收费方式
  1662. *
  1663. * @param chequeType 新收费方式
  1664. * @param receiptSn 流水号
  1665. * @param oldChequeType 原付费方式
  1666. * @return
  1667. */
  1668. @UserLoginToken
  1669. @RequestMapping(value = "/updateChequType", method = {RequestMethod.GET})
  1670. public Map<String, Object> updateChequType(@RequestParam String chequeType, @RequestParam Integer receiptSn, @RequestParam String oldChequeType, HttpServletRequest httpServletRequest) {
  1671. Map<String, Object> resultMap = new HashMap<>();
  1672. try {
  1673. if (StringUtils.isBlank(chequeType)) {
  1674. resultMap.put("code", -1);
  1675. resultMap.put("message", "新的收款方式不能为空");
  1676. return resultMap;
  1677. }
  1678. if (StringUtils.isBlank(oldChequeType)) {
  1679. resultMap.put("code", -1);
  1680. resultMap.put("message", "原收款方式不能为空");
  1681. return resultMap;
  1682. }
  1683. if (receiptSn == null) {
  1684. resultMap.put("code", -1);
  1685. resultMap.put("message", "流水号不能为空");
  1686. return resultMap;
  1687. }
  1688. User tokenUser = TokenUtil.getUser(httpServletRequest);
  1689. if (tokenUser == null) {
  1690. resultMap.put("code", -1);
  1691. resultMap.put("message", "修改收费方式失败,用户Token不存在");
  1692. return resultMap;
  1693. }
  1694. mzChargeDetailService.modifyChequType(chequeType, receiptSn, oldChequeType);
  1695. resultMap.put("code", 0);
  1696. resultMap.put("message", "修改收费方式成功");
  1697. return resultMap;
  1698. } catch (Exception e) {
  1699. e.printStackTrace();
  1700. resultMap.put("code", -1);
  1701. resultMap.put("message", e.getMessage());
  1702. log.error("修改收费方式失败,系统异常,错误信息{}", e);
  1703. return resultMap;
  1704. }
  1705. }
  1706. // /**
  1707. // * 同步备份库数据到正式库 修复记账的数据
  1708. // * @param mzChargeDetail 新收费方式
  1709. // * @return
  1710. // */
  1711. // @UserLoginToken
  1712. // @RequestMapping(value = "/reSaveDetailForByjz", method = {RequestMethod.POST})
  1713. // public Map<String, Object> reSaveDetailForByjz(@RequestBody MzChargeDetail mzChargeDetail) {
  1714. // Map<String, Object> resultMap = new HashMap<>();
  1715. // try {
  1716. // if(mzChargeDetail==null){
  1717. // resultMap.put("code", -1);
  1718. // resultMap.put("message", "参数不能为空");
  1719. // return resultMap;
  1720. // }
  1721. // if(StringUtils.isBlank(mzChargeDetail.getPatientId())){
  1722. // resultMap.put("code", -1);
  1723. // resultMap.put("message", "患者ID不能为空");
  1724. // return resultMap;
  1725. // }
  1726. // if(mzChargeDetail.getTimes()==null){
  1727. // resultMap.put("code", -1);
  1728. // resultMap.put("message", "就诊次数不能为空");
  1729. // return resultMap;
  1730. // }
  1731. // if (mzChargeDetail.getReceiptNo()==null) {
  1732. // resultMap.put("code", -1);
  1733. // resultMap.put("message", "缴费次数不能为空");
  1734. // return resultMap;
  1735. // }
  1736. // mzChargeDetailService.reSaveDetailFromBak(mzChargeDetail);
  1737. // resultMap.put("code", 0);
  1738. // resultMap.put("message", "同步备份库数据到正式库成功");
  1739. // return resultMap;
  1740. // } catch (Exception e) {
  1741. // e.printStackTrace();
  1742. // resultMap.put("code", -1);
  1743. // resultMap.put("message", e.getMessage());
  1744. // log.error("同步备份库数据到正式库失败,系统异常,错误信息{}", e);
  1745. // return resultMap;
  1746. // }
  1747. // }
  1748. /**
  1749. * 清洗历史数据
  1750. *
  1751. * @return
  1752. */
  1753. @RequestMapping(value = "/setPriceTime", method = {RequestMethod.GET})
  1754. public Map<String, Object> setPriceTime() {
  1755. Map<String, Object> resultMap = new HashMap<>();
  1756. try {
  1757. mzChargeDetailService.setPriceTime();
  1758. log.info("=====>>>>>全部清洗完成");
  1759. resultMap.put("code", 0);
  1760. resultMap.put("message", "已经初始化就诊记录表成功");
  1761. return resultMap;
  1762. } catch (Exception e) {
  1763. e.printStackTrace();
  1764. log.error("清洗历史数据失败,错误信息{}", e);
  1765. resultMap.put("code", -1);
  1766. resultMap.put("message", "清洗历史数据失败");
  1767. return resultMap;
  1768. }
  1769. }
  1770. }