IsvPayServiceImpl.java 29 KB

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