IsvPayServiceImpl.java 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. package com.ywt.alipaympapi.service.impl;
  2. import com.alipay.api.domain.AlipayTradeCreateModel;
  3. import com.alipay.api.domain.AlipayTradeQueryModel;
  4. import com.alipay.api.response.AlipayTradeCreateResponse;
  5. import com.alipay.api.response.AlipayTradeQueryResponse;
  6. import com.ywt.alipaympapi.core.utils.*;
  7. import com.ywt.alipaympapi.face.IPayFace;
  8. import com.ywt.alipaympapi.models.Constants;
  9. import com.ywt.alipaympapi.models.enums.PaymentStatusEnum;
  10. import com.ywt.core.exception.AppMessageException;
  11. import com.ywt.gapi.Result;
  12. import com.ywt.gapi.ResultCode;
  13. import com.ywt.gapi.drug.GetOneKeyRegListRequest;
  14. import com.ywt.gapi.drug.GetOneKeyRegListResponse;
  15. import com.ywt.gapi.order.*;
  16. import com.ywt.gapi.order.OutpatientOrder;
  17. import com.ywt.gapi.ordercenter.*;
  18. import com.ywt.gapi.system.GetConfigByTypeRequest;
  19. import com.ywt.gapi.system.GetConfigByTypeResponse;
  20. import com.ywt.gapi.taihe.outpaitent.*;
  21. import com.ywt.gapi.taihe.outpaitent.BaseResult;
  22. import com.ywt.gapi.third.taihe.*;
  23. import com.ywt.gapi.third.taihe.GetOutpatientListRequest;
  24. import com.ywt.gapi.third.taihe.GetOutpatientListResponse;
  25. import com.ywt.gapi.wx_ins_pay.MarkOpOrderDeletedRequest;
  26. import com.ywt.gapi.wx_ins_pay.MarkOpOrderDeletedResponse;
  27. import com.ywt.gapi.wx_ins_pay.WxInsPayServiceGrpc;
  28. import com.ywt.model.PageVO;
  29. import com.ywt.model.Pagination;
  30. import com.ywt.request.pay.*;
  31. import com.ywt.response.inpatient.DepositTradeResponseData;
  32. import com.ywt.response.pay.*;
  33. import com.ywt.alipaympapi.service.IsvPayService;
  34. import com.ywt.response.report.QueryReportListResponseData;
  35. import lombok.extern.slf4j.Slf4j;
  36. import org.springframework.beans.factory.annotation.Autowired;
  37. import org.springframework.stereotype.Service;
  38. import org.springframework.util.StringUtils;
  39. import javax.annotation.Resource;
  40. import java.util.*;
  41. import java.util.stream.Collectors;
  42. @Slf4j
  43. @Service
  44. public class IsvPayServiceImpl implements IsvPayService {
  45. @Resource
  46. private IPayFace payFace;
  47. public static final int TYPE_UNPAID_WX = 1;
  48. private static final int TYPE_PAID_WX = 2;
  49. public static final int TYPE_UNPAID_ZFB = 0;
  50. private static final int TYPE_PAID_ZFB = 1;
  51. @Autowired
  52. private TaiheServiceGrpc.TaiheServiceBlockingStub taiheServiceBlockingStub;
  53. @Autowired
  54. private TaiheOutpatientServiceGrpc.TaiheOutpatientServiceBlockingStub taiheOutpatientServiceBlockingStub;
  55. @Autowired
  56. private com.ywt.gapi.drug.DrugServiceGrpc.DrugServiceBlockingStub drugServiceBlockingStub;
  57. @Autowired
  58. private OrderServiceGrpc.OrderServiceBlockingStub orderServiceBlockingStub;
  59. @Autowired
  60. private OrderCenterServiceGrpc.OrderCenterServiceBlockingStub orderCenterServiceBlockingStub;
  61. @Autowired
  62. private WxInsPayServiceGrpc.WxInsPayServiceBlockingStub wxInsPayServiceBlockingStub;
  63. // 商家订单号获取
  64. @Override
  65. public TradeNoResponseData queryTradeNo(OutTradeNoRequest request) throws Exception {
  66. int orderId = Integer.parseInt(request.getOrderId());
  67. if (orderId <= 0) {
  68. throw new AppMessageException("该订单不存在");
  69. }
  70. int userId = Integer.parseInt(request.getUserId());
  71. int amount = BizUtil.yuan2Cent(request.getAmount());
  72. CreateAlipayOrderResponse response = orderCenterServiceBlockingStub.createAlipayOrder(CreateAlipayOrderRequest.newBuilder()
  73. .setBody("预约挂号")
  74. .setAlipayUid(request.getAlipayUid())
  75. .setOrderId(orderId)
  76. .setOrderNo("")
  77. .setAmount(amount)
  78. .setUserId(userId)
  79. .setTerminal(ContextHelper.getCurrentTerminalWrapped())
  80. .build());
  81. if (response.getCode() != ResultCode.SUCCEED_VALUE)
  82. throw new AppMessageException("支付宝下单:" + response.getInfo());
  83. TradeNoResponseData data = new TradeNoResponseData();
  84. data.setOrderId(orderId);
  85. data.setOutTradeNo(response.getOrderNo());
  86. data.setTradeNo(response.getTradeNo());
  87. return data;
  88. }
  89. @Override
  90. public TradeResultResponseData informTradeResult(TradeResultRequest request) {
  91. TradeResultResponseData data = new TradeResultResponseData();
  92. AlipayTradeQueryModel alipayTradeQueryModel = new AlipayTradeQueryModel();
  93. alipayTradeQueryModel.setTradeNo(request.getTradeNo());
  94. AlipayTradeQueryResponse response = payFace.tradeQuery(request.getAppId(), alipayTradeQueryModel);
  95. if ("TRADE_SUCCESS".equals(response.getTradeStatus())) {
  96. data.setStatus("TRADE_SUCCESS");
  97. }
  98. return data;
  99. }
  100. @Override
  101. public PayDetailResponseData queryPayDetail(PayDetailRequest request) throws Exception {
  102. int userId = ContextHelper.getCurrentUserIdWrapped();
  103. int hospitalId = BizUtil.getCurrentHospitalId();
  104. if (Checker.isNone(request.getStatus())) {
  105. throw new RuntimeException("订单状态不能为空");
  106. }
  107. if (request.getStatus() == TYPE_UNPAID_ZFB) {
  108. PayDetailResponseData da = new PayDetailResponseData();
  109. da.setDepName(Checker.getStringValue(request.getDeptName()));
  110. if(!Checker.isNone(request.getAge()) && request.getAge() > 0){
  111. da.setAge(request.getAge());
  112. }
  113. da.setSex(Checker.getStringValue(request.getSex()));
  114. da.setStatus(request.getStatus());
  115. da.setDoctorName(Checker.getStringValue(request.getDoctorName()));
  116. da.setDoctorCode(Checker.getStringValue(request.getDoctorCode()));
  117. da.setHisClinicCode(Checker.getStringValue(request.getHisClinicCode()));
  118. da.setPrescribeDate(Checker.getStringValue(request.getPrescribeDate()));
  119. da.setTotal(request.getTotal());
  120. da.setUserName(Checker.getStringValue(request.getName()));
  121. da.setHisOrderNo(Checker.getStringValue(request.getHisOrderNo()));
  122. da.setAmount(Checker.getStringValue(request.getAmount()));
  123. return da;
  124. }
  125. if (Checker.isNone(request.getInvoiceNo()) && Checker.isNone(request.getOutTradeNo())) {
  126. throw new RuntimeException("订单发票号不存在");
  127. }
  128. List<OrderItem> list = new LinkedList<>();
  129. PayDetailResponseData da = new PayDetailResponseData();
  130. String hisPatientId = Checker.getStringValue(request.getHisPatientId());
  131. switch (hospitalId) {
  132. default:
  133. case Constants.HOSPITAL_ID_NFYYBYFY:
  134. // 白云从 HIS 接口获取门诊缴费详情
  135. String invoiceNo = Checker.getStringValue(request.getInvoiceNo());
  136. CheckUtil.ensureNotEmpty(invoiceNo, "发票号不能为空");
  137. CheckUtil.ensureNotEmpty(hisPatientId, "HIS 病人 id 不能为空");
  138. // 根据 his_patient_id 获取诊疗卡信息
  139. String pName = "";
  140. Integer pAge = 0;
  141. String pGender = "";
  142. String cardNum = "";
  143. GetMedicalCardInfoByPatientIdRequest gResp = GetMedicalCardInfoByPatientIdRequest.newBuilder()
  144. .setHisPatientId(hisPatientId)
  145. .setHospitalId(hospitalId)
  146. .setUserId(userId)
  147. .build();
  148. GetMedicalCardInfoByPatientIdResponse gmcResp = taiheOutpatientServiceBlockingStub.getMedicalCardInfoByPatientId(gResp);
  149. if (gmcResp.getCode() == ResultCode.SUCCEED_VALUE) {
  150. pName = gmcResp.getPatientName();
  151. pAge = getPatientAgeSafely(gmcResp.getIdNo(), gmcResp.getBirthday());
  152. pGender = IdCardUtil.getSex(gmcResp.getIdNo());
  153. cardNum = Checker.getStringValue(gmcResp.getCardNo());
  154. }
  155. GetPaymentDetailResponse response2 = taiheServiceBlockingStub.getPaymentDetail(GetPaymentDetailRequest.newBuilder()
  156. .setHospitalId(hospitalId)
  157. .setInvoiceNo(invoiceNo)
  158. .setHisPatientId(hisPatientId)
  159. .setType("2")
  160. .build());
  161. if (response2.getCode() != ResultCode.SUCCEED_VALUE)
  162. throw new RuntimeException(response2.getMsg());
  163. if (!Checker.isNone(response2.getDetailList())) {
  164. list = response2.getDetailList().stream()
  165. .map(i -> {
  166. OrderItem it = new OrderItem();
  167. it.setItemName(i.getItemName());
  168. it.setAmount(String.format("%.2f", i.getItemPrice() / 100d));
  169. it.setItemNum(String.valueOf(i.getItemNumber()));
  170. return it;
  171. })
  172. .collect(Collectors.toList());
  173. }
  174. da.setAge(pAge);
  175. da.setUserName(pName);
  176. da.setSex(pGender);
  177. da.setPayDate(request.getDate());
  178. da.setOrderItems(list);
  179. da.setCardNum(cardNum);
  180. da.setOrderId("");
  181. da.setStatus(request.getStatus());
  182. break;
  183. }
  184. return da;
  185. }
  186. @Override
  187. public PageVO<PayHistoryResponseData> queryPayHistory(PayHistoryRequest request) throws Exception {
  188. List<PayHistoryResponseData> list = new ArrayList<>();
  189. int pageIndex = request.getPageIndex();
  190. int pageSize = request.getPageSize();
  191. int total = 0;
  192. if (Checker.isNone(request.getStatus())) {
  193. throw new AppMessageException("订单状态不能为空");
  194. }
  195. int status = Integer.parseInt(Checker.getStringValue(request.getStatus()));
  196. if (Checker.isNone(request.getHisPatientId())) {
  197. throw new AppMessageException("hisPatientI不能为空");
  198. }
  199. String hisPatientId = Checker.getStringValue(request.getHisPatientId());
  200. int userId = ContextHelper.getCurrentUserIdWrapped();
  201. String pName = "";
  202. int pAge = 0;
  203. String pGender = "";
  204. int hospitalId = BizUtil.getCurrentHospitalId();
  205. GetMedicalCardInfoByPatientIdRequest gResp = GetMedicalCardInfoByPatientIdRequest.newBuilder()
  206. .setHisPatientId(hisPatientId)
  207. .setHospitalId(hospitalId)
  208. .setUserId(userId)
  209. .build();
  210. GetMedicalCardInfoByPatientIdResponse resp = taiheOutpatientServiceBlockingStub.getMedicalCardInfoByPatientId(gResp);
  211. if (resp.getCode() == ResultCode.SUCCEED_VALUE) {
  212. pName = resp.getPatientName();
  213. pAge = getPatientAgeSafely(resp.getIdNo(), resp.getBirthday());
  214. pGender = IdCardUtil.getSex(resp.getIdNo());
  215. }
  216. switch (status) {
  217. case TYPE_UNPAID_ZFB:
  218. // 待缴费列表从 HIS 获取数据
  219. GetOutpatientListRequest req = GetOutpatientListRequest.newBuilder()
  220. .setPatientId(hisPatientId)
  221. .setType(TYPE_UNPAID_WX)
  222. .setHospitalId(hospitalId)
  223. .build();
  224. GetOutpatientListResponse result = taiheServiceBlockingStub.getOutpatientList(req);
  225. if (result.getCode() != ResultCode.SUCCEED_VALUE) {
  226. throw new RuntimeException(result.getMsg());
  227. }
  228. List<Map<String, Object>> lst = new LinkedList<>();
  229. Map<String, Object> map;
  230. List<PaymentItem> paymentItems = result.getPaymentList();
  231. if (!Checker.isNone(paymentItems)) {
  232. // 过滤处方门诊缴费单
  233. GetOneKeyRegListRequest getOneKeyRegListRequest = GetOneKeyRegListRequest.newBuilder()
  234. .setUserId(userId)
  235. .build();
  236. GetOneKeyRegListResponse getOneKeyRegListResponse = drugServiceBlockingStub.getOneKeyRegList(getOneKeyRegListRequest);
  237. List<String> clinicCodes = getOneKeyRegListResponse.getCode() == ResultCode.SUCCEED_VALUE ? getOneKeyRegListResponse.getClinicCodeList() : new LinkedList<>();
  238. List<PaymentItem> payItems = paymentItems;
  239. if (!clinicCodes.isEmpty()) {
  240. payItems = paymentItems.stream()
  241. .filter(paymentItem -> !clinicCodes.contains(paymentItem.getClinicCode()))
  242. .collect(Collectors.toList());
  243. }
  244. total = payItems.size();
  245. for (PaymentItem payItem : payItems) {
  246. PayHistoryResponseData data = new PayHistoryResponseData();
  247. data.setStatus(status);
  248. data.setTitle("");
  249. data.setHisOrderNo(payItem.getHisOrdNum());
  250. data.setOrderId(payItem.getOrderId());
  251. data.setDepName(payItem.getDeptName());
  252. data.setPrescribeDate(payItem.getPrescriptionDate());
  253. data.setName(resp.getPatientName());
  254. data.setTotal(payItem.getTotalFee());
  255. data.setAmount(String.format("%.2f", payItem.getTotalFee() / 100d));
  256. data.setTradeNo(""); //Todo
  257. data.setOutTradeNo("");//Todo
  258. data.setIdNum("");//Todo
  259. data.setInvoiceNo(Checker.getStringValue(payItem.getInvoiceNo()));
  260. data.setHisPatientId(hisPatientId);
  261. data.setAge(pAge);
  262. data.setSex(pGender);
  263. data.setDoctorName(payItem.getDoctorName());
  264. data.setDoctorCode(payItem.getDoctorCode());
  265. data.setHisClinicCode(payItem.getClinicCode());
  266. list.add(data);
  267. // map.put("hisClinicCode", payItem.getClinicCode());
  268. // map.put("hisOrderNo", payItem.getHisOrdNum());
  269. // map.put("patientName", pName);
  270. // map.put("orderInsType", payItem.getOrderInsType());
  271. // map.put("patientAge", pAge);
  272. // map.put("patientSex", pGender);
  273. // map.put("doctorCode", payItem.getDoctorCode());
  274. List<PayDetailItem> detailItems = payItem.getItemListList();
  275. List<Map<String, Object>> items = new LinkedList<>();
  276. for (PayDetailItem detailItem : detailItems) {
  277. Map<String, Object> d = new HashMap<>();
  278. d.put("name", detailItem.getItemName());
  279. d.put("price", detailItem.getItemPrice());
  280. d.put("code", detailItem.getItemCode());
  281. d.put("number", detailItem.getItemNumber());
  282. d.put("spec", detailItem.getItemSpec());
  283. d.put("unit", detailItem.getItemUnit());
  284. d.put("totalFee", detailItem.getItemTotalFee());
  285. items.add(d);
  286. }
  287. // map.put("detailItems", items);
  288. // lst.add(map);
  289. // 保存门诊缴费明细到数据库
  290. SaveOutpatientOrderDetailsRequest sReq = SaveOutpatientOrderDetailsRequest.newBuilder()
  291. .setHisOrderNo(payItem.getHisOrdNum())
  292. .addAllDetail(payItem.getItemListList().stream()
  293. .map(i -> OutpatientOrderDetail.newBuilder()
  294. .setItemName(i.getItemName())
  295. .setItemPrice(i.getItemPrice())
  296. .setItemCode(i.getItemCode())
  297. .setItemNumber(i.getItemNumber())
  298. .setItemSpec(i.getItemSpec())
  299. .setItemUnit(i.getItemUnit())
  300. .setItemTotalFee(i.getItemTotalFee())
  301. .build()).collect(Collectors.toList()))
  302. .build();
  303. BaseResult baseResult = taiheOutpatientServiceBlockingStub.saveOutpatientOrderDetails(sReq);
  304. if (baseResult.getCode() != ResultCode.SUCCEED_VALUE) {
  305. throw new RuntimeException("保存门诊缴费明细失败");
  306. // logger.error("保存门诊缴费明细失败,hisOrderNo : {}", payItem.getHisOrdNum());
  307. }
  308. }
  309. }
  310. break;
  311. case TYPE_PAID_ZFB:
  312. switch (hospitalId) {
  313. default:
  314. case Constants.HOSPITAL_ID_NFYYBYFY:
  315. // v1.3.7 白云改为从 HIS 接口读取数据
  316. String startDate = request.getStartTime();
  317. String endDate = request.getEndTime();
  318. Date start = DateUtil.parseDate(startDate, DateUtil.DADE_FROMAT_YMD);
  319. Date end = DateUtil.parseDate(endDate, DateUtil.DADE_FROMAT_YMD);
  320. CheckUtil.ensureNotNull(start, "请选择时间");
  321. CheckUtil.ensureNotNull(end, "请选择时间");
  322. long day = 0;
  323. day = DateUtil.getDaySub(request.getEndTime(), request.getStartTime());
  324. if (day < -15) {
  325. throw new AppMessageException("请选择15天以内");
  326. }
  327. GetOutpatientListRequest req3 = GetOutpatientListRequest.newBuilder()
  328. .setPatientId(hisPatientId)
  329. .setType(TYPE_PAID_WX)
  330. .setHospitalId(hospitalId)
  331. .setStartDate(startDate)
  332. .setEndDate(endDate)
  333. .build();
  334. GetOutpatientListResponse res3 = taiheServiceBlockingStub.getOutpatientList(req3);
  335. if (res3.getCode() != ResultCode.SUCCEED_VALUE) {
  336. throw new RuntimeException(res3.getMsg());
  337. }
  338. total = res3.getPaymentList().size();
  339. for (PaymentItem payItem : res3.getPaymentList()) {
  340. PayHistoryResponseData data = new PayHistoryResponseData();
  341. data.setStatus(status);
  342. data.setTitle("");
  343. data.setDepName(payItem.getDeptName());
  344. data.setPrescribeDate(payItem.getPrescriptionDate());
  345. data.setName(resp.getPatientName());
  346. data.setAmount(String.format("%.2f", payItem.getTotalFee() / 100d));
  347. data.setTradeNo(""); //Todo
  348. data.setOutTradeNo("");//Todo
  349. data.setIdNum("");//Todo
  350. data.setInvoiceNo(payItem.getInvoiceNo());
  351. data.setHisPatientId(hisPatientId);
  352. data.setPayTime(payItem.getPrescriptionDate());
  353. list.add(data);
  354. }
  355. break;
  356. }
  357. break;
  358. }
  359. Pagination pagination = new Pagination(pageIndex, pageSize, total);
  360. PageVO<PayHistoryResponseData> res = new PageVO<>(pagination, list);
  361. return res;
  362. }
  363. @Override
  364. public ComputeSelfPaidOrderResponseData computeSelfPaidOrder(ComputeSelfPaidOrderRequest request) {
  365. return null;
  366. }
  367. @Override
  368. public ComputeMedicarePayOrderResponseData computeMedicarePayOrder(ComputeMedicarePayOrderRequest request) {
  369. return null;
  370. }
  371. @Override
  372. public TradeNoForOrderResponseData tradeNoForOrder(TradeNoForOrderRequest request) throws Exception {
  373. TradeNoForOrderResponseData data = new TradeNoForOrderResponseData();
  374. int userId = ContextHelper.getCurrentUserIdWrapped();
  375. int hospitalId = BizUtil.getCurrentHospitalId();
  376. int terminal = ContextHelper.getCurrentTerminalWrapped();
  377. String invoiceNo = prePayConfirm(request.getHisPatientId(), request.getHisClinicCode(), request.getHisOrderNo(), hospitalId, terminal);
  378. Date pDate = DateUtil.parseDate(request.getPrescribeDate(), "yyyy-MM-dd HH:mm:ss");
  379. int sex = 1;
  380. if (request.getSex().equals("女")) {
  381. sex = 2;
  382. }
  383. //该版本只有
  384. CreateOutpatientOrderRequest req = CreateOutpatientOrderRequest.newBuilder()
  385. .setDeptCode("")
  386. .setDeptName(request.getDeptName())
  387. .setDoctorCode(request.getDoctorCode())
  388. .setDoctorName(request.getDoctorName())
  389. .setTotal(request.getTotal())
  390. .setReimbursement(0)
  391. .setIndividual(request.getTotal())
  392. .setHisPatientId(request.getHisPatientId())
  393. .setHisClinicCode(request.getHisClinicCode())
  394. .setHisOrderNo(request.getHisOrderNo())
  395. .setPayName(request.getName())
  396. .setPrescriptionDate(Checker.isNone(pDate)? 0L : pDate.getTime())
  397. .setPatientName(request.getName())
  398. .setPatientAge(request.getAge())
  399. .setPatientSex(sex)
  400. .setOrderInsType("自费")
  401. .setInvoiceNo(invoiceNo)
  402. .setPayInsType(1)
  403. .setHospitalId(hospitalId)
  404. .setTerminal(terminal)
  405. .build();
  406. Result result = orderServiceBlockingStub.createOutpatientOrder(req);
  407. if (result.getCode() != ResultCode.SUCCEED) {
  408. throw new AppMessageException(result.getInfo());
  409. }
  410. String orderNo = result.getValue();
  411. int orderId = getOrderIdByOrderNo(orderNo);
  412. //判断是否已线下缴费
  413. com.ywt.gapi.taihe.outpaitent.GetOutpatientDetailRequest requ =
  414. com.ywt.gapi.taihe.outpaitent.GetOutpatientDetailRequest.newBuilder()
  415. .setOrderId(orderId).build();
  416. com.ywt.gapi.taihe.outpaitent.GetOutpatientDetailResponse res = taiheOutpatientServiceBlockingStub.getOutpatientDetail(requ);
  417. if (res.getCode() != ResultCode.SUCCEED_VALUE) {
  418. throw new AppMessageException(res.getMsg());
  419. }
  420. com.ywt.gapi.taihe.outpaitent.OutpatientOrder order = res.getOrder();
  421. if (order.getPaymentStatus() == PaymentStatusEnum.Success.getValue()) {
  422. throw new AppMessageException("该订单已缴费");
  423. }
  424. CreateAlipayOrderResponse response = orderCenterServiceBlockingStub.createAlipayOrder(CreateAlipayOrderRequest.newBuilder()
  425. .setBody("门诊缴费")
  426. .setAlipayUid(request.getAlipayUid())
  427. .setOrderId(orderId)
  428. .setOrderNo(orderNo)
  429. .setAmount(request.getTotal())
  430. .setUserId(userId)
  431. .setTerminal(ContextHelper.getCurrentTerminalWrapped())
  432. .build());
  433. if (response.getCode() != ResultCode.SUCCEED_VALUE) {
  434. throw new AppMessageException(response.getInfo());
  435. }
  436. data = new TradeNoForOrderResponseData();
  437. data.setNeedPay(true);//设置是否需要支付宝自费支付
  438. data.setOutTradeNo(orderNo);
  439. data.setTradeNo(response.getTradeNo());
  440. return data;
  441. }
  442. /**
  443. * 根据身份证或出生日期获取年龄,避免当身份证为空的情况下获取年龄会返回奇怪的值
  444. *
  445. * @param idNo 身份证
  446. * @param birthday 出生年月日,格式 yyyy-MM-dd
  447. * @return
  448. */
  449. private int getPatientAgeSafely(String idNo, String birthday) {
  450. if (!Checker.isNone(idNo)) {
  451. return IdCardUtil.getCurrentAge(idNo);
  452. } else {
  453. // logger.info("DHOutpatientController#getPatientAgeSafely(birthday = {}): 身份证为空", birthday);
  454. return IdCardUtil.getCurrentAgeByBirthday(birthday, IdCardUtil.DATE_PATTERN2);
  455. }
  456. }
  457. private String prePayConfirm(String patientId, String clinicCode, String hisOrdNum, int hospitalId, int orderSum) throws AppMessageException {
  458. PrePayConfirmRequest req = PrePayConfirmRequest.newBuilder()
  459. .setCardNo("")
  460. .setPatientId(patientId)
  461. .setStartDate("")
  462. .setEndDate("")
  463. .setClinicCode(clinicCode)
  464. .setHisOrdNum(hisOrdNum)
  465. .setOrderSum(orderSum)
  466. .setHospitalId(hospitalId)
  467. .setPayMode(Constants.HIS_PAY_MODE_ALIPAY)
  468. .build();
  469. PrePayConfirmResponse response = taiheServiceBlockingStub.prePayConfirm(req);
  470. if (response.getCode() == ResultCode.SUCCEED_VALUE) {
  471. if (!Checker.isNone(response.getListList())) {
  472. // 预结算成功,自动取消之前生成的未支付订单,让前端可以重新创建订单
  473. autoCancelPrevOrder(hisOrdNum);
  474. PrePayConfirm p = response.getListList().get(0);
  475. String invoiceNo = p.getInvoiceNo();
  476. return invoiceNo;
  477. }
  478. }
  479. throw new AppMessageException("预结算:HIS 返回列表数据为空");
  480. }
  481. private void autoCancelPrevOrder(String hisOrderNo) throws AppMessageException {
  482. GetOutpatientOrderByHisOrderNoRequest request = GetOutpatientOrderByHisOrderNoRequest.newBuilder()
  483. .setHisOrderNo(hisOrderNo)
  484. .setHospitalId(BizUtil.getHospitalIdByTerminalId(BizUtil.getCurrentTerminalWrapped()))
  485. .build();
  486. GetOutpatientOrderByHisOrderNoResponse response = taiheOutpatientServiceBlockingStub.getOutpatientOrderByHisOrderNo(request);
  487. if (response.getCode() == ResultCode.SUCCEED_VALUE) {
  488. String orderNo = response.getOrderNo();
  489. if (!StringHelper.isNullOrEmpty(orderNo)) {
  490. // logger.info("DHOutpatientController#autoCancelPrevOrder(): 预结算自动取消之前生成的订单 orderNo = {}", orderNo);
  491. MarkOpOrderDeletedResponse markOpOrderDeletedResponse = wxInsPayServiceBlockingStub.markOpOrderDeleted(
  492. MarkOpOrderDeletedRequest.newBuilder()
  493. .setOrderNo(orderNo)
  494. .build());
  495. if (markOpOrderDeletedResponse.getCode() != ResultCode.SUCCEED_VALUE) {
  496. throw new AppMessageException(markOpOrderDeletedResponse.getMsg());
  497. }
  498. }
  499. } else {
  500. throw new AppMessageException(response.getMsg());
  501. }
  502. }
  503. //判断是否已线下缴费
  504. public GetOutpatientListResponse getOutpatientList(String hisPatientId, int type, Integer hospitalId) {
  505. int hid = Checker.getIntegerValue(hospitalId) > 0 ? hospitalId : Constants.TAIHE_HOSPITAL_ID;
  506. GetOutpatientListRequest req = GetOutpatientListRequest.newBuilder()
  507. .setPatientId(hisPatientId)
  508. .setType(type)
  509. .setHospitalId(hid)
  510. .build();
  511. return taiheServiceBlockingStub.getOutpatientList(req);
  512. }
  513. public int getOrderIdByOrderNo(String orderNo) {
  514. GetOrderInfoRequest request = GetOrderInfoRequest.newBuilder().setOrderNo(orderNo).build();
  515. GetOrderInfeResponse getOrderInfeResponse = orderCenterServiceBlockingStub.getOrderInfo(request);
  516. return getOrderInfeResponse.getOrderId();
  517. }
  518. }