IsvPayServiceImpl.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  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.setDeptName(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.setName(Checker.getStringValue(request.getName()));
  122. da.setHisOrderNo(Checker.getStringValue(request.getHisOrderNo()));
  123. da.setAmount(Checker.getStringValue(request.getAmount()));
  124. da.setCreateTime(Checker.getStringValue(request.getPrescribeDate()));
  125. da.setHisPatientId(request.getHisPatientId());
  126. return da;
  127. }
  128. if (Checker.isNone(request.getInvoiceNo()) && Checker.isNone(request.getOutTradeNo())) {
  129. throw new RuntimeException("订单发票号不存在");
  130. }
  131. List<OrderItem> list = new LinkedList<>();
  132. PayDetailResponseData da = new PayDetailResponseData();
  133. String hisPatientId = Checker.getStringValue(request.getHisPatientId());
  134. switch (hospitalId) {
  135. default:
  136. case Constants.HOSPITAL_ID_NFYYBYFY:
  137. // 白云从 HIS 接口获取门诊缴费详情
  138. String invoiceNo = Checker.getStringValue(request.getInvoiceNo());
  139. CheckUtil.ensureNotEmpty(invoiceNo, "发票号不能为空");
  140. CheckUtil.ensureNotEmpty(hisPatientId, "HIS 病人 id 不能为空");
  141. // 根据 his_patient_id 获取诊疗卡信息
  142. String pName = "";
  143. Integer pAge = 0;
  144. String pGender = "";
  145. String cardNum = "";
  146. GetMedicalCardInfoByPatientIdRequest gResp = GetMedicalCardInfoByPatientIdRequest.newBuilder()
  147. .setHisPatientId(hisPatientId)
  148. .setHospitalId(hospitalId)
  149. .setUserId(userId)
  150. .build();
  151. GetMedicalCardInfoByPatientIdResponse gmcResp = taiheOutpatientServiceBlockingStub.getMedicalCardInfoByPatientId(gResp);
  152. if (gmcResp.getCode() == ResultCode.SUCCEED_VALUE) {
  153. pName = gmcResp.getPatientName();
  154. pAge = getPatientAgeSafely(gmcResp.getIdNo(), gmcResp.getBirthday());
  155. pGender = IdCardUtil.getSex(gmcResp.getIdNo());
  156. cardNum = Checker.getStringValue(gmcResp.getCardNo());
  157. }
  158. GetPaymentDetailResponse response2 = taiheServiceBlockingStub.getPaymentDetail(GetPaymentDetailRequest.newBuilder()
  159. .setHospitalId(hospitalId)
  160. .setInvoiceNo(invoiceNo)
  161. .setHisPatientId(hisPatientId)
  162. .setType("2")
  163. .build());
  164. if (response2.getCode() != ResultCode.SUCCEED_VALUE)
  165. throw new RuntimeException(response2.getMsg());
  166. if (!Checker.isNone(response2.getDetailList())) {
  167. list = response2.getDetailList().stream()
  168. .map(i -> {
  169. OrderItem it = new OrderItem();
  170. it.setItemName(i.getItemName());
  171. it.setAmount(String.format("%.2f", i.getItemPrice() / 100d));
  172. it.setItemNum(String.valueOf(i.getItemNumber()));
  173. return it;
  174. })
  175. .collect(Collectors.toList());
  176. }
  177. da.setAge(Checker.getIntegerValue(pAge));
  178. da.setUserName(Checker.getStringValue(pName));
  179. da.setSex(pGender);
  180. da.setPayDate(request.getDate());
  181. da.setOrderItems(list);
  182. da.setCardNum(cardNum);
  183. da.setOrderId("");
  184. da.setTotal(request.getTotal());
  185. da.setStatus(request.getStatus());
  186. da.setAmount(request.getAmount());
  187. da.setHisPatientId(request.getHisPatientId());
  188. break;
  189. }
  190. return da;
  191. }
  192. @Override
  193. public PageVO<PayHistoryResponseData> queryPayHistory(PayHistoryRequest request) throws Exception {
  194. List<PayHistoryResponseData> list = new ArrayList<>();
  195. int pageIndex = request.getPageIndex();
  196. int pageSize = request.getPageSize();
  197. int total = 0;
  198. if (Checker.isNone(request.getStatus())) {
  199. throw new AppMessageException("订单状态不能为空");
  200. }
  201. int status = Integer.parseInt(Checker.getStringValue(request.getStatus()));
  202. if (Checker.isNone(request.getHisPatientId())) {
  203. throw new AppMessageException("hisPatientI不能为空");
  204. }
  205. String hisPatientId = Checker.getStringValue(request.getHisPatientId());
  206. int userId = ContextHelper.getCurrentUserIdWrapped();
  207. String pName = "";
  208. int pAge = 0;
  209. String pGender = "";
  210. int hospitalId = BizUtil.getCurrentHospitalId();
  211. GetMedicalCardInfoByPatientIdRequest gResp = GetMedicalCardInfoByPatientIdRequest.newBuilder()
  212. .setHisPatientId(hisPatientId)
  213. .setHospitalId(hospitalId)
  214. .setUserId(userId)
  215. .build();
  216. GetMedicalCardInfoByPatientIdResponse resp = taiheOutpatientServiceBlockingStub.getMedicalCardInfoByPatientId(gResp);
  217. if (resp.getCode() == ResultCode.SUCCEED_VALUE) {
  218. pName = resp.getPatientName();
  219. pAge = getPatientAgeSafely(resp.getIdNo(), resp.getBirthday());
  220. pGender = IdCardUtil.getSex(resp.getIdNo());
  221. }
  222. switch (status) {
  223. case TYPE_UNPAID_ZFB:
  224. // 待缴费列表从 HIS 获取数据
  225. GetOutpatientListRequest req = GetOutpatientListRequest.newBuilder()
  226. .setPatientId(hisPatientId)
  227. .setType(TYPE_UNPAID_WX)
  228. .setHospitalId(hospitalId)
  229. .build();
  230. GetOutpatientListResponse result = taiheServiceBlockingStub.getOutpatientList(req);
  231. if (result.getCode() != ResultCode.SUCCEED_VALUE) {
  232. throw new RuntimeException(result.getMsg());
  233. }
  234. List<Map<String, Object>> lst = new LinkedList<>();
  235. Map<String, Object> map;
  236. List<PaymentItem> paymentItems = result.getPaymentList();
  237. if (!Checker.isNone(paymentItems)) {
  238. // 过滤处方门诊缴费单
  239. GetOneKeyRegListRequest getOneKeyRegListRequest = GetOneKeyRegListRequest.newBuilder()
  240. .setUserId(userId)
  241. .build();
  242. GetOneKeyRegListResponse getOneKeyRegListResponse = drugServiceBlockingStub.getOneKeyRegList(getOneKeyRegListRequest);
  243. List<String> clinicCodes = getOneKeyRegListResponse.getCode() == ResultCode.SUCCEED_VALUE ? getOneKeyRegListResponse.getClinicCodeList() : new LinkedList<>();
  244. List<PaymentItem> payItems = paymentItems;
  245. if (!clinicCodes.isEmpty()) {
  246. payItems = paymentItems.stream()
  247. .filter(paymentItem -> !clinicCodes.contains(paymentItem.getClinicCode()))
  248. .collect(Collectors.toList());
  249. }
  250. total = payItems.size();
  251. for (PaymentItem payItem : payItems) {
  252. PayHistoryResponseData data = new PayHistoryResponseData();
  253. data.setStatus(status);
  254. data.setTitle("");
  255. data.setHisOrderNo(payItem.getHisOrdNum());
  256. data.setOrderId(payItem.getOrderId());
  257. data.setDeptName(payItem.getDeptName());
  258. data.setPrescribeDate(payItem.getPrescriptionDate());
  259. data.setName(resp.getPatientName());
  260. data.setTotal(payItem.getTotalFee());
  261. data.setAmount(String.format("%.2f", payItem.getTotalFee() / 100d));
  262. data.setTradeNo(""); //Todo
  263. data.setOutTradeNo("");//Todo
  264. data.setIdNum("");//Todo
  265. data.setInvoiceNo(Checker.getStringValue(payItem.getInvoiceNo()));
  266. data.setHisPatientId(hisPatientId);
  267. data.setAge(Checker.getIntegerValue(pAge));
  268. data.setSex(pGender);
  269. data.setDoctorName(payItem.getDoctorName());
  270. data.setDoctorCode(payItem.getDoctorCode());
  271. data.setHisClinicCode(payItem.getClinicCode());
  272. data.setType(0);
  273. list.add(data);
  274. // map.put("hisClinicCode", payItem.getClinicCode());
  275. // map.put("hisOrderNo", payItem.getHisOrdNum());
  276. // map.put("patientName", pName);
  277. // map.put("orderInsType", payItem.getOrderInsType());
  278. // map.put("patientAge", pAge);
  279. // map.put("patientSex", pGender);
  280. // map.put("doctorCode", payItem.getDoctorCode());
  281. List<PayDetailItem> detailItems = payItem.getItemListList();
  282. List<Map<String, Object>> items = new LinkedList<>();
  283. for (PayDetailItem detailItem : detailItems) {
  284. Map<String, Object> d = new HashMap<>();
  285. d.put("name", detailItem.getItemName());
  286. d.put("price", detailItem.getItemPrice());
  287. d.put("code", detailItem.getItemCode());
  288. d.put("number", detailItem.getItemNumber());
  289. d.put("spec", detailItem.getItemSpec());
  290. d.put("unit", detailItem.getItemUnit());
  291. d.put("totalFee", detailItem.getItemTotalFee());
  292. items.add(d);
  293. }
  294. // map.put("detailItems", items);
  295. // lst.add(map);
  296. // 保存门诊缴费明细到数据库
  297. SaveOutpatientOrderDetailsRequest sReq = SaveOutpatientOrderDetailsRequest.newBuilder()
  298. .setHisOrderNo(payItem.getHisOrdNum())
  299. .addAllDetail(payItem.getItemListList().stream()
  300. .map(i -> OutpatientOrderDetail.newBuilder()
  301. .setItemName(i.getItemName())
  302. .setItemPrice(i.getItemPrice())
  303. .setItemCode(i.getItemCode())
  304. .setItemNumber(i.getItemNumber())
  305. .setItemSpec(i.getItemSpec())
  306. .setItemUnit(i.getItemUnit())
  307. .setItemTotalFee(i.getItemTotalFee())
  308. .build()).collect(Collectors.toList()))
  309. .build();
  310. BaseResult baseResult = taiheOutpatientServiceBlockingStub.saveOutpatientOrderDetails(sReq);
  311. if (baseResult.getCode() != ResultCode.SUCCEED_VALUE) {
  312. throw new RuntimeException("保存门诊缴费明细失败");
  313. // logger.error("保存门诊缴费明细失败,hisOrderNo : {}", payItem.getHisOrdNum());
  314. }
  315. }
  316. }
  317. break;
  318. case TYPE_PAID_ZFB:
  319. switch (hospitalId) {
  320. default:
  321. case Constants.HOSPITAL_ID_NFYYBYFY:
  322. // v1.3.7 白云改为从 HIS 接口读取数据
  323. String startDate = request.getStartTime();
  324. String endDate = request.getEndTime();
  325. Date start = DateUtil.parseDate(startDate, DateUtil.DADE_FROMAT_YMD);
  326. Date end = DateUtil.parseDate(endDate, DateUtil.DADE_FROMAT_YMD);
  327. CheckUtil.ensureNotNull(start, "请选择时间");
  328. CheckUtil.ensureNotNull(end, "请选择时间");
  329. long day = 0;
  330. day = DateUtil.getDaySub(request.getEndTime(), request.getStartTime());
  331. if (day < -15) {
  332. throw new AppMessageException("请选择15天以内");
  333. }
  334. GetOutpatientListRequest req3 = GetOutpatientListRequest.newBuilder()
  335. .setPatientId(hisPatientId)
  336. .setType(TYPE_PAID_WX)
  337. .setHospitalId(hospitalId)
  338. .setStartDate(startDate)
  339. .setEndDate(endDate)
  340. .build();
  341. GetOutpatientListResponse res3 = taiheServiceBlockingStub.getOutpatientList(req3);
  342. if (res3.getCode() != ResultCode.SUCCEED_VALUE) {
  343. throw new RuntimeException(res3.getMsg());
  344. }
  345. total = res3.getPaymentList().size();
  346. for (PaymentItem payItem : res3.getPaymentList()) {
  347. PayHistoryResponseData data = new PayHistoryResponseData();
  348. data.setStatus(status);
  349. data.setTitle("");
  350. data.setDeptName(payItem.getDeptName());
  351. data.setPrescribeDate(payItem.getPrescriptionDate());
  352. data.setName(resp.getPatientName());
  353. data.setAmount(String.format("%.2f", payItem.getTotalFee() / 100d));
  354. data.setTradeNo(""); //Todo
  355. data.setOutTradeNo("");//Todo
  356. data.setIdNum("");//Todo
  357. data.setInvoiceNo(payItem.getInvoiceNo());
  358. data.setHisPatientId(hisPatientId);
  359. data.setPayTime(payItem.getPrescriptionDate());
  360. data.setTotal(Checker.getIntegerValue(payItem.getTotalFee()));
  361. data.setDoctorName(Checker.getStringValue(payItem.getDoctorName()));
  362. data.setDoctorCode(Checker.getStringValue(payItem.getDoctorCode()));
  363. data.setHisClinicCode(Checker.getStringValue(payItem.getClinicCode()));
  364. data.setAge(Checker.getIntegerValue(pAge));
  365. data.setType(0);
  366. list.add(data);
  367. }
  368. break;
  369. }
  370. break;
  371. }
  372. Pagination pagination = new Pagination(pageIndex, pageSize, total);
  373. PageVO<PayHistoryResponseData> res = new PageVO<>(pagination, list);
  374. return res;
  375. }
  376. @Override
  377. public ComputeSelfPaidOrderResponseData computeSelfPaidOrder(ComputeSelfPaidOrderRequest request) {
  378. return null;
  379. }
  380. @Override
  381. public ComputeMedicarePayOrderResponseData computeMedicarePayOrder(ComputeMedicarePayOrderRequest request) {
  382. return null;
  383. }
  384. @Override
  385. public TradeNoForOrderResponseData tradeNoForOrder(TradeNoForOrderRequest request) throws Exception {
  386. TradeNoForOrderResponseData data = new TradeNoForOrderResponseData();
  387. int userId = ContextHelper.getCurrentUserIdWrapped();
  388. int hospitalId = BizUtil.getCurrentHospitalId();
  389. int terminal = ContextHelper.getCurrentTerminalWrapped();
  390. String invoiceNo = prePayConfirm(request.getHisPatientId(), request.getHisClinicCode(), request.getHisOrderNo(), hospitalId, request.getTotal());
  391. Date pDate = DateUtil.parseDate(request.getPrescribeDate(), "yyyy-MM-dd HH:mm:ss");
  392. int sex = 1;
  393. if (request.getSex().equals("女")) {
  394. sex = 2;
  395. }
  396. //该版本只有自费,没有医保
  397. CreateOutpatientOrderRequest req = CreateOutpatientOrderRequest.newBuilder()
  398. .setDeptCode("")
  399. .setDeptName(request.getDeptName())
  400. .setDoctorCode(request.getDoctorCode())
  401. .setDoctorName(request.getDoctorName())
  402. .setTotal(request.getTotal())
  403. .setReimbursement(0)
  404. .setIndividual(request.getTotal())
  405. .setHisPatientId(request.getHisPatientId())
  406. .setHisClinicCode(request.getHisClinicCode())
  407. .setHisOrderNo(request.getHisOrderNo())
  408. .setPayName(request.getName())
  409. .setPrescriptionDate(Checker.isNone(pDate)? 0L : pDate.getTime())
  410. .setPatientName(request.getName())
  411. .setPatientAge(request.getAge())
  412. .setPatientSex(sex)
  413. .setOrderInsType("自费")
  414. .setInvoiceNo(invoiceNo)
  415. .setPayInsType(1)
  416. .setHospitalId(hospitalId)
  417. .setTerminal(terminal)
  418. .build();
  419. Result result = orderServiceBlockingStub.createOutpatientOrder(req);
  420. if (result.getCode() != ResultCode.SUCCEED) {
  421. throw new AppMessageException(result.getInfo());
  422. }
  423. String orderNo = result.getValue();
  424. int orderId = getOrderIdByOrderNo(orderNo);
  425. //判断是否已线下缴费
  426. com.ywt.gapi.taihe.outpaitent.GetOutpatientDetailRequest requ =
  427. com.ywt.gapi.taihe.outpaitent.GetOutpatientDetailRequest.newBuilder()
  428. .setOrderId(orderId).build();
  429. com.ywt.gapi.taihe.outpaitent.GetOutpatientDetailResponse res = taiheOutpatientServiceBlockingStub.getOutpatientDetail(requ);
  430. if (res.getCode() != ResultCode.SUCCEED_VALUE) {
  431. throw new AppMessageException(res.getMsg());
  432. }
  433. com.ywt.gapi.taihe.outpaitent.OutpatientOrder order = res.getOrder();
  434. if (order.getPaymentStatus() == PaymentStatusEnum.Success.getValue()) {
  435. throw new AppMessageException("该订单已缴费");
  436. }
  437. CreateAlipayOrderResponse response = orderCenterServiceBlockingStub.createAlipayOrder(CreateAlipayOrderRequest.newBuilder()
  438. .setBody("门诊缴费")
  439. .setAlipayUid(request.getAlipayUid())
  440. .setOrderId(orderId)
  441. .setOrderNo(orderNo)
  442. .setAmount(request.getTotal())
  443. .setUserId(userId)
  444. .setTerminal(ContextHelper.getCurrentTerminalWrapped())
  445. .build());
  446. if (response.getCode() != ResultCode.SUCCEED_VALUE) {
  447. throw new AppMessageException(response.getInfo());
  448. }
  449. data = new TradeNoForOrderResponseData();
  450. data.setNeedPay(true);//设置是否需要支付宝自费支付
  451. data.setOutTradeNo(orderNo);
  452. data.setTradeNo(response.getTradeNo());
  453. return data;
  454. }
  455. /**
  456. * 根据身份证或出生日期获取年龄,避免当身份证为空的情况下获取年龄会返回奇怪的值
  457. *
  458. * @param idNo 身份证
  459. * @param birthday 出生年月日,格式 yyyy-MM-dd
  460. * @return
  461. */
  462. private int getPatientAgeSafely(String idNo, String birthday) {
  463. if (!Checker.isNone(idNo)) {
  464. return IdCardUtil.getCurrentAge(idNo);
  465. } else {
  466. // logger.info("DHOutpatientController#getPatientAgeSafely(birthday = {}): 身份证为空", birthday);
  467. return IdCardUtil.getCurrentAgeByBirthday(birthday, IdCardUtil.DATE_PATTERN2);
  468. }
  469. }
  470. private String prePayConfirm(String patientId, String clinicCode, String hisOrdNum, int hospitalId, int orderSum) throws AppMessageException {
  471. PrePayConfirmRequest req = PrePayConfirmRequest.newBuilder()
  472. .setCardNo("")
  473. .setPatientId(patientId)
  474. .setStartDate("")
  475. .setEndDate("")
  476. .setClinicCode(clinicCode)
  477. .setHisOrdNum(hisOrdNum)
  478. .setOrderSum(orderSum)
  479. .setHospitalId(hospitalId)
  480. .setPayMode(Constants.HIS_PAY_MODE_ALIPAY)
  481. .build();
  482. PrePayConfirmResponse response = taiheServiceBlockingStub.prePayConfirm(req);
  483. if (response.getCode() == ResultCode.SUCCEED_VALUE) {
  484. if (!Checker.isNone(response.getListList())) {
  485. // 预结算成功,自动取消之前生成的未支付订单,让前端可以重新创建订单
  486. autoCancelPrevOrder(hisOrdNum);
  487. PrePayConfirm p = response.getListList().get(0);
  488. String invoiceNo = p.getInvoiceNo();
  489. return invoiceNo;
  490. }
  491. throw new AppMessageException("预结算:HIS 返回列表数据为空");
  492. }
  493. throw new AppMessageException(response.getMsg());
  494. }
  495. private void autoCancelPrevOrder(String hisOrderNo) throws AppMessageException {
  496. GetOutpatientOrderByHisOrderNoRequest request = GetOutpatientOrderByHisOrderNoRequest.newBuilder()
  497. .setHisOrderNo(hisOrderNo)
  498. .setHospitalId(BizUtil.getHospitalIdByTerminalId(BizUtil.getCurrentTerminalWrapped()))
  499. .build();
  500. GetOutpatientOrderByHisOrderNoResponse response = taiheOutpatientServiceBlockingStub.getOutpatientOrderByHisOrderNo(request);
  501. if (response.getCode() == ResultCode.SUCCEED_VALUE) {
  502. String orderNo = response.getOrderNo();
  503. if (!StringHelper.isNullOrEmpty(orderNo)) {
  504. // logger.info("DHOutpatientController#autoCancelPrevOrder(): 预结算自动取消之前生成的订单 orderNo = {}", orderNo);
  505. MarkOpOrderDeletedResponse markOpOrderDeletedResponse = wxInsPayServiceBlockingStub.markOpOrderDeleted(
  506. MarkOpOrderDeletedRequest.newBuilder()
  507. .setOrderNo(orderNo)
  508. .build());
  509. if (markOpOrderDeletedResponse.getCode() != ResultCode.SUCCEED_VALUE) {
  510. throw new AppMessageException(markOpOrderDeletedResponse.getMsg());
  511. }
  512. }
  513. } else {
  514. throw new AppMessageException(response.getMsg());
  515. }
  516. }
  517. //判断是否已线下缴费
  518. public GetOutpatientListResponse getOutpatientList(String hisPatientId, int type, Integer hospitalId) {
  519. int hid = Checker.getIntegerValue(hospitalId) > 0 ? hospitalId : Constants.TAIHE_HOSPITAL_ID;
  520. GetOutpatientListRequest req = GetOutpatientListRequest.newBuilder()
  521. .setPatientId(hisPatientId)
  522. .setType(type)
  523. .setHospitalId(hid)
  524. .build();
  525. return taiheServiceBlockingStub.getOutpatientList(req);
  526. }
  527. public int getOrderIdByOrderNo(String orderNo) {
  528. GetOrderInfoRequest request = GetOrderInfoRequest.newBuilder().setOrderNo(orderNo).build();
  529. GetOrderInfeResponse getOrderInfeResponse = orderCenterServiceBlockingStub.getOrderInfo(request);
  530. return getOrderInfeResponse.getOrderId();
  531. }
  532. }