NucleicServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. package com.ywt.alipaympapi.service.impl;
  2. import com.google.protobuf.StringValue;
  3. import com.ywt.alipaympapi.core.utils.*;
  4. import com.ywt.alipaympapi.models.Constants;
  5. import com.ywt.alipaympapi.models.enums.PaymentChannelEnum;
  6. import com.ywt.alipaympapi.service.services.DoctorSrv;
  7. import com.ywt.alipaympapi.service.services.SystemSrv;
  8. import com.ywt.core.exception.AppMessageException;
  9. import com.ywt.gapi.ResultCode;
  10. import com.ywt.gapi.system.Dept;
  11. import com.ywt.gapi.system.SystemServiceGrpc;
  12. import com.ywt.gapi.taihe.register.CreateRegisteredRequest;
  13. import com.ywt.gapi.taihe.register.CreateRegisteredResponse;
  14. import com.ywt.gapi.taihe.register.TaiheRegisterServiceGrpc;
  15. import com.ywt.gapi.third.taihe.GetScheduleListRequest;
  16. import com.ywt.gapi.third.taihe.GetScheduleListResponse;
  17. import com.ywt.gapi.third.taihe.Schedule;
  18. import com.ywt.gapi.third.taihe.TaiheServiceGrpc;
  19. import com.ywt.gapi.user.DeptScheduleDoctor;
  20. import com.ywt.gapi.user.DoctorServiceGrpc;
  21. import com.ywt.gapi.user.GetDoctorByHisCodeRequest;
  22. import com.ywt.gapi.user.GetDoctorByHisCodeResponse;
  23. import com.ywt.request.nucleic.NucleicItemListRequest;
  24. import com.ywt.request.nucleic.NucleicOrderConfirmRequest;
  25. import com.ywt.request.nucleic.NucleicQuestionnaireRequest;
  26. import com.ywt.request.nucleic.NucleicQuestionnaireResultRequest;
  27. import com.ywt.request.nucleic.NucleicTimeListRequest;
  28. import com.ywt.response.nucleic.NucleicItemResponseData;
  29. import com.ywt.response.nucleic.NucleicOrderConfirmResponseData;
  30. import com.ywt.response.nucleic.NucleicQuestionnaireResponseData;
  31. import com.ywt.response.nucleic.NucleicQuestionnaireResultResponseData;
  32. import com.ywt.response.nucleic.NucleicTimeListResponseData;
  33. import com.ywt.alipaympapi.service.NucleicService;
  34. import lombok.extern.slf4j.Slf4j;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.stereotype.Service;
  37. import redis.clients.jedis.JedisCommands;
  38. import java.text.SimpleDateFormat;
  39. import java.util.*;
  40. import java.util.stream.Collectors;
  41. import java.util.stream.IntStream;
  42. /**
  43. * @author
  44. */
  45. @Slf4j
  46. @Service
  47. public class NucleicServiceImpl implements NucleicService {
  48. @Autowired
  49. private SystemServiceGrpc.SystemServiceBlockingStub systemServiceBlockingStub;
  50. @Autowired
  51. private JedisCommands jedisCommands;
  52. @Autowired
  53. private SystemSrv systemSrv;
  54. @Autowired
  55. private DoctorSrv doctorSrv;
  56. @Autowired
  57. private TaiheServiceGrpc.TaiheServiceBlockingStub taiheServiceBlockingStub;
  58. @Autowired
  59. private DoctorServiceGrpc.DoctorServiceBlockingStub doctorServiceBlockingStub;
  60. @Autowired
  61. private TaiheRegisterServiceGrpc.TaiheRegisterServiceBlockingStub taiheRegisterServiceBlockingStub;
  62. @Override
  63. public List<NucleicItemResponseData> itemList(NucleicItemListRequest request) throws Exception {
  64. int hospitalId = BizUtil.getCurrentHospitalId();
  65. if (Checker.isNone(request.getDeptCode())) {
  66. throw new AppMessageException("deptCode不能为空");
  67. }
  68. String doctorCode = "";
  69. String serviceCode = "";
  70. List<NucleicItemResponseData> list = new ArrayList<>();
  71. list = getScheduleListCommon(hospitalId, request.getDeptCode(), doctorCode, serviceCode, -1, -1);
  72. return list;
  73. }
  74. @Override
  75. public NucleicTimeListResponseData testTimeList(NucleicTimeListRequest request) {
  76. return null;
  77. }
  78. @Override
  79. public NucleicQuestionnaireResponseData questionnaire(NucleicQuestionnaireRequest request) {
  80. return null;
  81. }
  82. @Override
  83. public NucleicQuestionnaireResultResponseData questionnaireResult(NucleicQuestionnaireResultRequest request) {
  84. return null;
  85. }
  86. @Override
  87. public NucleicOrderConfirmResponseData orderConfirm(NucleicOrderConfirmRequest request) throws Exception {
  88. int hospitalId = BizUtil.getCurrentHospitalId();
  89. String deptCode = Checker.getStringValue(request.getDeptCode());
  90. String deptName = Checker.getStringValue(request.getDeptName());
  91. if (Checker.isNone(deptCode) || Checker.isNone(deptName)) {
  92. throw new AppMessageException("科室不存在");
  93. }
  94. String doctorCode = Checker.getStringValue(request.getDoctorCode());
  95. String doctorName = Checker.getStringValue(request.getDoctorName());
  96. if (Checker.isNone(doctorCode) || Checker.isNone(doctorName)) {
  97. throw new AppMessageException("医生不存在");
  98. }
  99. Date date = new Date();
  100. int deptId = 668;
  101. if (request.getDeptCode().equals("500")) {
  102. deptId = 670;
  103. }
  104. int paymentChannel = request.getFee() > 0
  105. ? PaymentChannelEnum.ALI_PAY.getValue()
  106. : PaymentChannelEnum.FREE.getValue();
  107. String startTime = Checker.getStringValue(request.getStartTime());
  108. String endTime = Checker.getStringValue(request.getEndTime());
  109. int userId = ContextHelper.getCurrentUserIdWrapped();
  110. int source = ContextHelper.getCurrentTerminalWrapped();
  111. CreateRegisteredRequest req = CreateRegisteredRequest.newBuilder()
  112. .setDeptCode(deptCode)
  113. .setDeptName(deptName)
  114. .setDoctorCode(doctorCode)
  115. .setDoctorName(doctorName)
  116. .setTotal(Checker.getIntegerValue(request.getFee()))
  117. .setRegisteredFee(Checker.getIntegerValue(request.getFee()))
  118. .setMedicalFee(0)
  119. .setRegisteredDate(date.getTime())
  120. .setStartTime(startTime)
  121. .setEndTime(endTime)
  122. .setUserId(userId)
  123. .setMedicalCardId(request.getMedicalId())
  124. .setScheduleItemCode(request.getNucleicItemId())
  125. .setPaymentChannel(paymentChannel)
  126. .setSource(source)
  127. .setPeriod(request.getDatePeriod())
  128. .setDoctorTitle("")
  129. .setDeptId(Checker.getIntegerValue(deptId))
  130. .setLockQueueNo("")
  131. .setAvailableNumStr(request.getAvailableNumStr())
  132. .setHospitalId(hospitalId)
  133. .build();
  134. CreateRegisteredResponse res = taiheRegisterServiceBlockingStub.createRegistered(req);
  135. if (res.getCode() != ResultCode.SUCCEED_VALUE) {
  136. //预约失败
  137. throw new AppMessageException(res.getMsg());
  138. }
  139. //非互联网医院名医诊区挂号
  140. NucleicOrderConfirmResponseData data = new NucleicOrderConfirmResponseData();
  141. data.setAmount(String.format("%.2f", request.getFee() / 100d));
  142. data.setOrderId(String.valueOf(res.getOrderId()));
  143. data.setOrderNo(res.getOrderNo());
  144. return data;
  145. }
  146. private List<NucleicItemResponseData> getScheduleListCommon(int hospitalId, String deptCode, String doctorCode,
  147. String serviceCode, int startOffset, int endOffset) throws AppMessageException {
  148. //支付宝核酸
  149. // String redisKeyPattern = "ALI_HS_SCHEDULE_LIST_%s_%s_%d_%s";
  150. // String key = String.format(redisKeyPattern, deptCode, doctorCode, hospitalId, serviceCode);
  151. // if (startOffset >= 0 && endOffset >= 0) {
  152. // redisKeyPattern = "ALI_HS_SCHEDULE_LIST_%s_%s_%d_%s_%d_%d";
  153. // key = String.format(redisKeyPattern, deptCode, doctorCode, hospitalId, serviceCode, startOffset, endOffset);
  154. // }
  155. // String value = jedisCommands.get(key);
  156. // if (!StringHelper.isNullOrWhiteSpace(value)) {
  157. // List<NucleicItemResponseData> lss = JsonSerializer.from(value, List.class);
  158. // if (lss != null) {
  159. // return lss;
  160. // }
  161. // }
  162. List<Dept> deptList = systemSrv.getDeptListByHospitalId(hospitalId);
  163. if (deptList == null || deptList.size() == 0) {
  164. throw new AppMessageException(String.format("无法获取科室数据(%d)", hospitalId));
  165. }
  166. List<Dept> tmpDeptList = deptList.stream().filter(p -> p.getDeptCode().equals(deptCode)).collect(Collectors.toList());
  167. if (tmpDeptList.size() == 0) {
  168. throw new AppMessageException("暂无出诊信息");
  169. }
  170. Dept secDept = tmpDeptList.get(0);
  171. tmpDeptList = deptList.stream().filter(p -> p.getDeptId() == secDept.getParentId()).collect(Collectors.toList());
  172. if (tmpDeptList.size() == 0) {
  173. throw new AppMessageException("暂无出诊信息");
  174. }
  175. Map<String, Object> map = new HashMap<>();
  176. map.put("hospitalId", hospitalId);
  177. map.put("hospitalName", BizUtil.getHospitalNameByIdSimply(hospitalId));
  178. map.put("deptCode", deptCode);
  179. map.put("deptName", secDept.getDeptName());
  180. List<DeptScheduleDoctor> doctorList = doctorSrv.getDeptScheduleDoctorListFromCache();
  181. // doctorList = doctorList.stream().filter(p -> p.getDeptCode().equals(deptCode)).collect(Collectors.toList());
  182. // 批量日期查询 HIS 接口
  183. boolean isTaihe = hospitalId == Constants.TAIHE_HOSPITAL_ID;
  184. if (startOffset < 0 || endOffset < 0) {
  185. startOffset = isTaihe ? 1 : 0;
  186. endOffset = isTaihe ? 9 : 7;
  187. }
  188. List<NucleicItemResponseData> lst = getConvertedScheduleList(hospitalId, startOffset, endOffset, deptCode,
  189. doctorCode, serviceCode);
  190. // jedisCommands.set(key, JsonSerializer.toJson(lst));
  191. // jedisCommands.expire(key, 3 * 60);
  192. return lst;
  193. }
  194. private List<NucleicItemResponseData> getConvertedScheduleList(int hospitalId, int startOffset, int endOffset, String deptCode,
  195. String doctorCode, String serviceCode) {
  196. Calendar calendar = Calendar.getInstance();
  197. if (startOffset > 0) {
  198. calendar.add(Calendar.DATE, startOffset);
  199. }
  200. String startDate = DateUtil.formatDate(calendar.getTime(), "yyyy-MM-dd"); //日期
  201. calendar = Calendar.getInstance();
  202. calendar.add(Calendar.DATE, endOffset);
  203. String endDate = DateUtil.formatDate(calendar.getTime(), "yyyy-MM-dd"); //日期
  204. GetScheduleListRequest getScheduleListRequest = GetScheduleListRequest.newBuilder()
  205. .setDeptCode(deptCode)
  206. .setDoctorCode(doctorCode)
  207. .setServiceDate(startDate)
  208. .setServiceEndDate(endDate)
  209. .setHospitalId(hospitalId)
  210. .setServiceCode(serviceCode)
  211. .build();
  212. GetScheduleListResponse getScheduleListResponse = taiheServiceBlockingStub.getScheduleList(getScheduleListRequest);
  213. List<Schedule> scheduleList;
  214. Date date = getCurrentDate();
  215. if (getScheduleListResponse.getCode() == ResultCode.SUCCEED_VALUE) {
  216. scheduleList = getScheduleListResponse.getSchedulesList();
  217. scheduleList = scheduleList.stream()
  218. .filter(p -> date.compareTo(DateUtil.parseDate(p.getServiceDate() + " " + p.getEndTime(), "yyyy-MM-dd HH:mm")) < 0)
  219. .sorted(Comparator.comparing(Schedule::getServiceDate).thenComparing(Schedule::getDatePeriod)).collect(Collectors.toList());
  220. } else {
  221. scheduleList = new LinkedList<>();
  222. }
  223. return convertToScheduleMap(scheduleList, hospitalId);
  224. }
  225. /**
  226. * 排班记录转为Map
  227. */
  228. private List<NucleicItemResponseData> convertToScheduleMap(List<Schedule> scheduleList, int hospitalId) {
  229. List<NucleicItemResponseData> list = new ArrayList<>();
  230. List<Map<String, Object>> forenoonList = new LinkedList<>();
  231. List<Map<String, Object>> afternoonList = new LinkedList<>();
  232. List<Map<String, Object>> nightList = new LinkedList<>();
  233. List<Map<String, Object>> afterMidnightList = new LinkedList<>(); // 下半夜排班
  234. List<Map<String, Object>> midnoonList = new ArrayList<>(); //午间排班记录
  235. GetDoctorByHisCodeResponse getDoctorByHisCodeResponse;
  236. String avatar;
  237. int doctorId;
  238. boolean hasScheduling = scheduleList.size() > 0; //当期日期是否有排班
  239. for (Schedule s : scheduleList) {
  240. doctorId = 0;
  241. avatar = Constants.DOCTOR_AVATAR_URL;
  242. getDoctorByHisCodeResponse = getDoctorByHisCode(s.getDoctorCode(), hospitalId);
  243. if (getDoctorByHisCodeResponse.getResult().getCode() == ResultCode.SUCCEED) {
  244. if (!StringHelper.isNullOrWhiteSpace(getDoctorByHisCodeResponse.getAvatar())) {
  245. avatar = getDoctorByHisCodeResponse.getAvatar();
  246. }
  247. doctorId = getDoctorByHisCodeResponse.getDoctorId();
  248. }
  249. if (doctorId <= 0) {
  250. continue;
  251. }
  252. NucleicItemResponseData data = new NucleicItemResponseData();
  253. Map<String, Object> scheduleMap = new HashMap<>();
  254. data.setNucleicItemId(s.getScheduleItemCode());
  255. Integer fee = s.getFee();
  256. data.setFee(Checker.getIntegerValue(fee));
  257. String feeStr = fee.toString();
  258. data.setNucleicItemFee(feeStr);
  259. data.setNucleicItemDesc(Checker.getStringValue(s.getServiceDate()) + " " + Checker.getStringValue(s.getDatePeriodName()));
  260. data.setNucleicDate(DateUtil.stringToDate(s.getServiceDate(), "yyyy-MM-dd"));
  261. data.setNucleicItemName(Checker.getStringValue(s.getDoctorName()));
  262. data.setStartTime(Checker.getStringValue(s.getStartTime()));
  263. data.setEndTime(Checker.getStringValue(s.getEndTime()));
  264. data.setDatePeriod(s.getDatePeriod());
  265. data.setDeptCode(Checker.getStringValue(s.getDeptCode()));
  266. data.setAvailableNumStr(Checker.getStringValue(s.getAvailableNumStr()));
  267. data.setDeptName(Checker.getStringValue(s.getDeptName()));
  268. data.setDoctorCode(Checker.getStringValue(s.getDoctorCode()));
  269. data.setDoctorName(Checker.getStringValue(s.getDoctorName()));
  270. data.setNucleicItemId(Checker.getStringValue(s.getScheduleItemCode()));
  271. list.add(data);
  272. }
  273. return list;
  274. }
  275. private GetDoctorByHisCodeResponse getDoctorByHisCode(String doctorCode, int hospitalId) {
  276. GetDoctorByHisCodeRequest getDoctorByHisCodeRequest = GetDoctorByHisCodeRequest.newBuilder()
  277. .setHospitalId(hospitalId)
  278. .setHisCode(doctorCode)
  279. .build();
  280. return doctorServiceBlockingStub.getDoctorByHisCode(getDoctorByHisCodeRequest);
  281. }
  282. private Date getCurrentDate() {
  283. try {
  284. String value = DateUtil.formatDate(new Date(), DateUtil.DADE_FROMAT_YMDHMS);
  285. return DateUtil.parseDate(value, DateUtil.DADE_FROMAT_YMDHMS);
  286. } catch (Exception e) {
  287. e.printStackTrace();
  288. }
  289. return null;
  290. }
  291. }