IsvPayServiceImpl.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  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.core.exception.AppMessageException;
  10. import com.ywt.gapi.Result;
  11. import com.ywt.gapi.ResultCode;
  12. import com.ywt.gapi.drug.GetOneKeyRegListRequest;
  13. import com.ywt.gapi.drug.GetOneKeyRegListResponse;
  14. import com.ywt.gapi.order.GetOutpatientOrderListRequest;
  15. import com.ywt.gapi.order.GetOutpatientOrderListResponse;
  16. import com.ywt.gapi.order.OrderServiceGrpc;
  17. import com.ywt.gapi.order.OutpatientOrder;
  18. import com.ywt.gapi.ordercenter.CreateAlipayOrderRequest;
  19. import com.ywt.gapi.ordercenter.CreateAlipayOrderResponse;
  20. import com.ywt.gapi.ordercenter.OrderCenterServiceGrpc;
  21. import com.ywt.gapi.system.GetConfigByTypeRequest;
  22. import com.ywt.gapi.system.GetConfigByTypeResponse;
  23. import com.ywt.gapi.taihe.outpaitent.*;
  24. import com.ywt.gapi.taihe.outpaitent.BaseResult;
  25. import com.ywt.gapi.third.taihe.*;
  26. import com.ywt.gapi.third.taihe.GetOutpatientListRequest;
  27. import com.ywt.gapi.third.taihe.GetOutpatientListResponse;
  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. // 商家订单号获取
  62. @Override
  63. public TradeNoResponseData queryTradeNo(OutTradeNoRequest request) throws Exception {
  64. int orderId = Integer.parseInt(request.getOrderId());
  65. if (orderId <= 0) {
  66. throw new AppMessageException("该订单不存在");
  67. }
  68. int userId = Integer.parseInt(request.getUserId());
  69. int amount = BizUtil.yuan2Cent(request.getAmount());
  70. CreateAlipayOrderResponse response = orderCenterServiceBlockingStub.createAlipayOrder(CreateAlipayOrderRequest.newBuilder()
  71. .setBody("预约挂号")
  72. .setAlipayUid(request.getAlipayUid())
  73. .setOrderId(orderId)
  74. .setOrderNo("")
  75. .setAmount(amount)
  76. .setUserId(userId)
  77. .setTerminal(ContextHelper.getCurrentTerminalWrapped())
  78. .build());
  79. if (response.getCode() != ResultCode.SUCCEED_VALUE)
  80. throw new AppMessageException("支付宝下单:" + response.getInfo());
  81. TradeNoResponseData data = new TradeNoResponseData();
  82. data.setOrderId(orderId);
  83. data.setOutTradeNo(response.getOrderNo());
  84. data.setTradeNo(response.getTradeNo());
  85. return data;
  86. }
  87. @Override
  88. public TradeResultResponseData informTradeResult(TradeResultRequest request) {
  89. TradeResultResponseData data = new TradeResultResponseData();
  90. AlipayTradeQueryModel alipayTradeQueryModel = new AlipayTradeQueryModel();
  91. alipayTradeQueryModel.setTradeNo(request.getTradeNo());
  92. AlipayTradeQueryResponse response = payFace.tradeQuery(request.getAppId(), alipayTradeQueryModel);
  93. if ("TRADE_SUCCESS".equals(response.getTradeStatus())) {
  94. data.setStatus("TRADE_SUCCESS");
  95. }
  96. return data;
  97. }
  98. @Override
  99. public PayDetailResponseData queryPayDetail(PayDetailRequest request) throws Exception {
  100. int userId = ContextHelper.getCurrentUserIdWrapped();
  101. int hospitalId = BizUtil.getCurrentHospitalId();
  102. if (Checker.isNone(request.getStatus())) {
  103. throw new RuntimeException("订单状态不能为空");
  104. }
  105. if (request.getStatus() == TYPE_UNPAID_ZFB) {
  106. PayDetailResponseData da = new PayDetailResponseData();
  107. da.setDepName(Checker.getStringValue(request.getDepName()));
  108. da.setAge(request.getAge().toString());
  109. da.setSex(request.getSex());
  110. da.setStatus(request.getStatus());
  111. return da;
  112. }
  113. if (Checker.isNone(request.getInvoiceNo()) && Checker.isNone(request.getOutTradeNo())) {
  114. throw new RuntimeException("订单发票号不存在");
  115. }
  116. List<OrderItem> list = new LinkedList<>();
  117. PayDetailResponseData da = new PayDetailResponseData();
  118. String hisPatientId = Checker.getStringValue(request.getHisPatientId());
  119. switch (hospitalId) {
  120. default:
  121. case Constants.HOSPITAL_ID_NFYYBYFY:
  122. // 白云从 HIS 接口获取门诊缴费详情
  123. String invoiceNo = Checker.getStringValue(request.getInvoiceNo());
  124. CheckUtil.ensureNotEmpty(invoiceNo, "发票号不能为空");
  125. CheckUtil.ensureNotEmpty(hisPatientId, "HIS 病人 id 不能为空");
  126. // 根据 his_patient_id 获取诊疗卡信息
  127. String pName = "";
  128. Integer pAge = 0;
  129. String pGender = "";
  130. String cardNum = "";
  131. GetMedicalCardInfoByPatientIdRequest gResp = GetMedicalCardInfoByPatientIdRequest.newBuilder()
  132. .setHisPatientId(hisPatientId)
  133. .setHospitalId(hospitalId)
  134. .setUserId(userId)
  135. .build();
  136. GetMedicalCardInfoByPatientIdResponse gmcResp = taiheOutpatientServiceBlockingStub.getMedicalCardInfoByPatientId(gResp);
  137. if (gmcResp.getCode() == ResultCode.SUCCEED_VALUE) {
  138. pName = gmcResp.getPatientName();
  139. pAge = getPatientAgeSafely(gmcResp.getIdNo(), gmcResp.getBirthday());
  140. pGender = IdCardUtil.getSex(gmcResp.getIdNo());
  141. cardNum = Checker.getStringValue(gmcResp.getCardNo());
  142. }
  143. GetPaymentDetailResponse response2 = taiheServiceBlockingStub.getPaymentDetail(GetPaymentDetailRequest.newBuilder()
  144. .setHospitalId(hospitalId)
  145. .setInvoiceNo(invoiceNo)
  146. .setHisPatientId(hisPatientId)
  147. .setType("2")
  148. .build());
  149. if (response2.getCode() != ResultCode.SUCCEED_VALUE)
  150. throw new RuntimeException(response2.getMsg());
  151. if (!Checker.isNone(response2.getDetailList())) {
  152. list = response2.getDetailList().stream()
  153. .map(i -> {
  154. OrderItem it = new OrderItem();
  155. it.setItemName(i.getItemName());
  156. it.setAmount(String.format("%.2f", i.getItemPrice() / 100d));
  157. it.setItemNum(String.valueOf(i.getItemNumber()));
  158. return it;
  159. })
  160. .collect(Collectors.toList());
  161. }
  162. da.setAge(pAge.toString());
  163. da.setUserName(pName);
  164. da.setSex(pGender);
  165. da.setPayDate(request.getDate());
  166. da.setOrderItems(list);
  167. da.setCardNum(cardNum);
  168. da.setOrderId("");
  169. da.setStatus(request.getStatus());
  170. break;
  171. }
  172. return da;
  173. }
  174. @Override
  175. public PageVO<PayHistoryResponseData> queryPayHistory(PayHistoryRequest request) throws Exception {
  176. List<PayHistoryResponseData> list = new ArrayList<>();
  177. int pageIndex = request.getPageIndex();
  178. int pageSize = request.getPageSize();
  179. int total = 0;
  180. if (Checker.isNone(request.getStatus())) {
  181. throw new RuntimeException("订单状态不能为空");
  182. }
  183. int status = Integer.parseInt(Checker.getStringValue(request.getStatus()));
  184. if (Checker.isNone(request.getHisPatientId())) {
  185. throw new RuntimeException("hisPatientI不能为空");
  186. }
  187. String hisPatientId = Checker.getStringValue(request.getHisPatientId());
  188. int userId = ContextHelper.getCurrentUserIdWrapped();
  189. String pName = "";
  190. int pAge = 0;
  191. String pGender = "";
  192. int hospitalId = BizUtil.getCurrentHospitalId();
  193. GetMedicalCardInfoByPatientIdRequest gResp = GetMedicalCardInfoByPatientIdRequest.newBuilder()
  194. .setHisPatientId(hisPatientId)
  195. .setHospitalId(hospitalId)
  196. .setUserId(userId)
  197. .build();
  198. GetMedicalCardInfoByPatientIdResponse resp = taiheOutpatientServiceBlockingStub.getMedicalCardInfoByPatientId(gResp);
  199. if (resp.getCode() == ResultCode.SUCCEED_VALUE) {
  200. pName = resp.getPatientName();
  201. pAge = getPatientAgeSafely(resp.getIdNo(), resp.getBirthday());
  202. pGender = IdCardUtil.getSex(resp.getIdNo());
  203. }
  204. switch (status) {
  205. case TYPE_UNPAID_ZFB:
  206. // 待缴费列表从 HIS 获取数据
  207. GetOutpatientListRequest req = GetOutpatientListRequest.newBuilder()
  208. .setPatientId(hisPatientId)
  209. .setType(TYPE_UNPAID_WX)
  210. .setHospitalId(hospitalId)
  211. .build();
  212. GetOutpatientListResponse result = taiheServiceBlockingStub.getOutpatientList(req);
  213. if (result.getCode() != ResultCode.SUCCEED_VALUE) {
  214. throw new RuntimeException(result.getMsg());
  215. }
  216. List<Map<String, Object>> lst = new LinkedList<>();
  217. Map<String, Object> map;
  218. List<PaymentItem> paymentItems = result.getPaymentList();
  219. if (!Checker.isNone(paymentItems)) {
  220. // 过滤处方门诊缴费单
  221. GetOneKeyRegListRequest getOneKeyRegListRequest = GetOneKeyRegListRequest.newBuilder()
  222. .setUserId(userId)
  223. .build();
  224. GetOneKeyRegListResponse getOneKeyRegListResponse = drugServiceBlockingStub.getOneKeyRegList(getOneKeyRegListRequest);
  225. List<String> clinicCodes = getOneKeyRegListResponse.getCode() == ResultCode.SUCCEED_VALUE ? getOneKeyRegListResponse.getClinicCodeList() : new LinkedList<>();
  226. List<PaymentItem> payItems = paymentItems;
  227. if (!clinicCodes.isEmpty()) {
  228. payItems = paymentItems.stream()
  229. .filter(paymentItem -> !clinicCodes.contains(paymentItem.getClinicCode()))
  230. .collect(Collectors.toList());
  231. }
  232. total = payItems.size();
  233. for (PaymentItem payItem : payItems) {
  234. PayHistoryResponseData data = new PayHistoryResponseData();
  235. data.setStatus(status);
  236. data.setTitle("");
  237. data.setDepName(payItem.getDeptName());
  238. data.setPrescribeDate(payItem.getPrescriptionDate());
  239. data.setName(resp.getPatientName());
  240. data.setAmount(String.format("%.2f", payItem.getTotalFee() / 100d));
  241. data.setTradeNo(""); //Todo
  242. data.setOutTradeNo("");//Todo
  243. data.setIdNum("");//Todo
  244. data.setInvoiceNo(Checker.getStringValue(payItem.getInvoiceNo()));
  245. data.setHisPatientId(hisPatientId);
  246. data.setAge(pAge);
  247. data.setSex(pGender);
  248. list.add(data);
  249. // map.put("hisClinicCode", payItem.getClinicCode());
  250. // map.put("hisOrderNo", payItem.getHisOrdNum());
  251. // map.put("patientName", pName);
  252. // map.put("orderInsType", payItem.getOrderInsType());
  253. // map.put("patientAge", pAge);
  254. // map.put("patientSex", pGender);
  255. // map.put("doctorCode", payItem.getDoctorCode());
  256. List<PayDetailItem> detailItems = payItem.getItemListList();
  257. List<Map<String, Object>> items = new LinkedList<>();
  258. for (PayDetailItem detailItem : detailItems) {
  259. Map<String, Object> d = new HashMap<>();
  260. d.put("name", detailItem.getItemName());
  261. d.put("price", detailItem.getItemPrice());
  262. d.put("code", detailItem.getItemCode());
  263. d.put("number", detailItem.getItemNumber());
  264. d.put("spec", detailItem.getItemSpec());
  265. d.put("unit", detailItem.getItemUnit());
  266. d.put("totalFee", detailItem.getItemTotalFee());
  267. items.add(d);
  268. }
  269. // map.put("detailItems", items);
  270. // lst.add(map);
  271. // 保存门诊缴费明细到数据库
  272. SaveOutpatientOrderDetailsRequest sReq = SaveOutpatientOrderDetailsRequest.newBuilder()
  273. .setHisOrderNo(payItem.getHisOrdNum())
  274. .addAllDetail(payItem.getItemListList().stream()
  275. .map(i -> OutpatientOrderDetail.newBuilder()
  276. .setItemName(i.getItemName())
  277. .setItemPrice(i.getItemPrice())
  278. .setItemCode(i.getItemCode())
  279. .setItemNumber(i.getItemNumber())
  280. .setItemSpec(i.getItemSpec())
  281. .setItemUnit(i.getItemUnit())
  282. .setItemTotalFee(i.getItemTotalFee())
  283. .build()).collect(Collectors.toList()))
  284. .build();
  285. BaseResult baseResult = taiheOutpatientServiceBlockingStub.saveOutpatientOrderDetails(sReq);
  286. if (baseResult.getCode() != ResultCode.SUCCEED_VALUE) {
  287. throw new RuntimeException("保存门诊缴费明细失败");
  288. // logger.error("保存门诊缴费明细失败,hisOrderNo : {}", payItem.getHisOrdNum());
  289. }
  290. }
  291. }
  292. break;
  293. case TYPE_PAID_ZFB:
  294. switch (hospitalId) {
  295. default:
  296. case Constants.HOSPITAL_ID_NFYYBYFY:
  297. // v1.3.7 白云改为从 HIS 接口读取数据
  298. String startDate = request.getStartTime();
  299. String endDate = request.getEndTime();
  300. Date start = DateUtil.parseDate(startDate, DateUtil.DADE_FROMAT_YMD);
  301. Date end = DateUtil.parseDate(endDate, DateUtil.DADE_FROMAT_YMD);
  302. CheckUtil.ensureNotNull(start, "请选择时间");
  303. CheckUtil.ensureNotNull(end, "请选择时间");
  304. long day = 0;
  305. day = DateUtil.getDaySub(request.getEndTime(), request.getStartTime());
  306. if(day > 15){
  307. throw new AppMessageException("请选择15天以内");
  308. }
  309. GetOutpatientListRequest req3 = GetOutpatientListRequest.newBuilder()
  310. .setPatientId(hisPatientId)
  311. .setType(TYPE_PAID_WX)
  312. .setHospitalId(hospitalId)
  313. .setStartDate(startDate)
  314. .setEndDate(endDate)
  315. .build();
  316. GetOutpatientListResponse res3 = taiheServiceBlockingStub.getOutpatientList(req3);
  317. if (res3.getCode() != ResultCode.SUCCEED_VALUE) {
  318. throw new RuntimeException(res3.getMsg());
  319. }
  320. for (PaymentItem payItem : res3.getPaymentList()) {
  321. PayHistoryResponseData data = new PayHistoryResponseData();
  322. data.setStatus(status);
  323. data.setTitle("");
  324. data.setDepName(payItem.getDeptName());
  325. data.setPrescribeDate(payItem.getPrescriptionDate());
  326. data.setName(payItem.getPatientName());
  327. data.setAmount(String.format("%.2f", payItem.getTotalFee() / 100d));
  328. data.setTradeNo(""); //Todo
  329. data.setOutTradeNo("");//Todo
  330. data.setIdNum("");//Todo
  331. data.setInvoiceNo(payItem.getInvoiceNo());
  332. data.setHisPatientId(hisPatientId);
  333. data.setPayTime(payItem.getPrescriptionDate());
  334. list.add(data);
  335. }
  336. break;
  337. }
  338. break;
  339. }
  340. Pagination pagination = new Pagination(pageIndex, pageSize, total);
  341. PageVO<PayHistoryResponseData> res = new PageVO<>(pagination, list);
  342. return res;
  343. }
  344. @Override
  345. public ComputeSelfPaidOrderResponseData computeSelfPaidOrder(ComputeSelfPaidOrderRequest request) {
  346. return null;
  347. }
  348. @Override
  349. public ComputeMedicarePayOrderResponseData computeMedicarePayOrder(ComputeMedicarePayOrderRequest request) {
  350. return null;
  351. }
  352. @Override
  353. public TradeNoForOrderResponseData tradeNoForOrder(TradeNoForOrderRequest request) {
  354. TradeNoForOrderResponseData data = new TradeNoForOrderResponseData();
  355. data.setNeedPay(true);//设置是否需要支付宝自费支付
  356. data.setOutTradeNo("查询订单系统获取订单号");
  357. data.setTradeNo(null);
  358. if (data.isNeedPay()) {
  359. String tradeNo = getTradeNo(request.getAppId(), data.getOutTradeNo());
  360. data.setTradeNo(tradeNo);
  361. }
  362. return data;
  363. }
  364. private String getTradeNo(String appId, String outTradeNo) {
  365. AlipayTradeCreateModel createModel = new AlipayTradeCreateModel();
  366. createModel.setOutTradeNo(outTradeNo);
  367. createModel.setTotalAmount("使用真正的系统");
  368. createModel.setSubject("主题主题");
  369. createModel.setBuyerId("购买者UID");
  370. AlipayTradeCreateResponse response = payFace.tradeCreate(appId, createModel);
  371. if (!StringUtils.isEmpty(response.getOutTradeNo())) {
  372. return response.getTradeNo();// 获取返回的tradeNO。
  373. } else {
  374. throw new RuntimeException("查询交易失败");
  375. }
  376. }
  377. /**
  378. * 根据身份证或出生日期获取年龄,避免当身份证为空的情况下获取年龄会返回奇怪的值
  379. *
  380. * @param idNo 身份证
  381. * @param birthday 出生年月日,格式 yyyy-MM-dd
  382. * @return
  383. */
  384. private int getPatientAgeSafely(String idNo, String birthday) {
  385. if (!Checker.isNone(idNo)) {
  386. return IdCardUtil.getCurrentAge(idNo);
  387. } else {
  388. // logger.info("DHOutpatientController#getPatientAgeSafely(birthday = {}): 身份证为空", birthday);
  389. return IdCardUtil.getCurrentAgeByBirthday(birthday, IdCardUtil.DATE_PATTERN2);
  390. }
  391. }
  392. }