IsvMedicCardServiceImpl.java 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. package com.ywt.alipaympapi.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.ywt.alipaympapi.core.utils.*;
  4. import com.ywt.alipaympapi.models.BaseResponse;
  5. import com.ywt.alipaympapi.models.enums.RelationshipEnum;
  6. import com.ywt.alipaympapi.models.enums.SexEnum;
  7. import com.ywt.alipaympapi.models.enums.SmsCodeTypeEnum;
  8. import com.ywt.alipaympapi.service.AuthService;
  9. import com.ywt.alipaympapi.service.IsvMedicCardService;
  10. import com.ywt.alipaympapi.service.services.MessageSrv;
  11. import com.ywt.core.exception.AppMessageException;
  12. import com.ywt.gapi.Result;
  13. import com.ywt.gapi.ResultCode;
  14. import com.ywt.gapi.ResultInt;
  15. import com.ywt.gapi.taihe.register.CreateMedicalCardRequest;
  16. import com.ywt.gapi.taihe.register.CreateMedicalCardResponse;
  17. import com.ywt.gapi.taihe.register.TaiheRegisterServiceGrpc;
  18. import com.ywt.gapi.third.taihe.GetPatientInfoRequest;
  19. import com.ywt.gapi.third.taihe.GetPatientInfoResponse;
  20. import com.ywt.gapi.third.taihe.TaiheServiceGrpc;
  21. import com.ywt.gapi.user.*;
  22. import com.ywt.model.PageVO;
  23. import com.ywt.model.Pagination;
  24. import com.ywt.request.card.UpdatePatientRequest;
  25. import com.ywt.request.card.*;
  26. import com.ywt.response.card.*;
  27. import lombok.extern.slf4j.Slf4j;
  28. import org.slf4j.Logger;
  29. import org.slf4j.LoggerFactory;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.stereotype.Service;
  32. import java.util.ArrayList;
  33. import java.util.Comparator;
  34. import java.util.LinkedList;
  35. import java.util.List;
  36. import java.util.stream.Collectors;
  37. @Slf4j
  38. @Service
  39. public class IsvMedicCardServiceImpl implements IsvMedicCardService {
  40. @Autowired
  41. private TaiheRegisterServiceGrpc.TaiheRegisterServiceBlockingStub taiheRegisterServiceBlockingStub;
  42. @Autowired
  43. private UserServiceGrpc.UserServiceBlockingStub userServiceBlockingStub;
  44. @Autowired
  45. private MessageSrv messageSrv;
  46. @Autowired
  47. private TaiheServiceGrpc.TaiheServiceBlockingStub taiheServiceBlockingStub;
  48. public static final int CARD_TYPE_NORMAL = 0; // 普通卡
  49. public static final int CARD_TYPE_MED_INSU = 1; // 医保卡
  50. public static final String CARD_TYPE_STR_NORMAL = "0"; // 普通卡
  51. public static final String CARD_TYPE_STR_MED_INSU = "1"; // 医保卡
  52. @Override
  53. public CreateOrBindCardResponseData createOrBindMedicCard(CreateOrBindCardRequest request) throws Exception {
  54. //用户唯一id
  55. // String userId = request.getUserId();
  56. //标志新建or绑定操作; 0=新建 1=绑定
  57. Integer type = request.getType();
  58. //就诊卡卡号,仅绑定操作时有效
  59. String cardNum = request.getCardNum();
  60. //性别; 男|女
  61. String sex = request.getSex();
  62. //生日(yyyy-MM-dd)
  63. String birthDay = request.getBirthDay();
  64. //验证码
  65. String authCode = request.getAuthCode();
  66. //关系
  67. String relationShip = request.getRelationShip();
  68. //是否默认(1-是,2-否)
  69. String defaultCard = request.getDefaultCard();
  70. //手机号
  71. String phoneNo = request.getPhoneNumber();
  72. //身份证号码
  73. String idNo = request.getIdCardNo();
  74. //姓名
  75. String patientName = Checker.getStringValue(request.getName());
  76. int hospitalId = BizUtil.getCurrentHospitalId();
  77. int userId = ContextHelper.getCurrentUserIdWrapped();
  78. CreateOrBindCardResponseData resp = new CreateOrBindCardResponseData();
  79. // type: 标志新建or绑定操作; 0=新建 1=绑定
  80. if (type == 0) {
  81. String city = "广州市";
  82. String address = "默认详情地址";
  83. String isInsu = "";
  84. if (!IdCardUtil.verify(idNo)) {
  85. throw new AppMessageException(String.format("身份证不合法:%s", idNo));
  86. }
  87. CheckUtil.ensureValidPhoneNumber(phoneNo, String.format("手机号不合法:%s", phoneNo));
  88. CheckUtil.ensureNotEmpty(patientName, "请完善姓名");
  89. CreateMedicalCardResponse response = taiheRegisterServiceBlockingStub.createMedicalCard(CreateMedicalCardRequest.newBuilder()
  90. .setPhoneNo(phoneNo)
  91. .setIdNo(idNo)
  92. .setPatientName(patientName)
  93. .setCity(city)
  94. .setAddress(address)
  95. .setIsInsu(isInsu)
  96. .setHospitalId(hospitalId)
  97. .setUserId(userId)
  98. .build());
  99. if (response.getCode() == BaseResponse.SUCCEED) {
  100. resp.setUserId(request.getUserId());
  101. resp.setCardNum(response.getMedicalCardNo());
  102. resp.setName(patientName);
  103. resp.setSex(sex);
  104. resp.setBirthDay(birthDay);
  105. resp.setIdCardNo(idNo);
  106. resp.setPhoneNumber(phoneNo);
  107. resp.setBalance("0.00");
  108. } else {
  109. throw new AppMessageException(response.getInfo());
  110. }
  111. return resp;
  112. }
  113. // type: 标志新建or绑定操作; 0=新建 1=绑定
  114. if (type == 1) {
  115. if (hospitalId < 1) {
  116. throw new AppMessageException("请选择医院");
  117. }
  118. if (StringHelper.isNullOrWhiteSpace(cardNum)) {
  119. throw new AppMessageException("请填写就诊卡号");
  120. }
  121. if (StringHelper.isNullOrWhiteSpace(patientName)) {
  122. throw new AppMessageException("请填写真实的姓名");
  123. }
  124. if (StringHelper.isNullOrWhiteSpace(phoneNo)) {
  125. throw new AppMessageException("请填写在医院预留的手机号");
  126. }
  127. if (StringHelper.isNullOrWhiteSpace(authCode)) {
  128. throw new AppMessageException("请输入验证码");
  129. }
  130. BaseResponse response = messageSrv.checkSmsCode(phoneNo, authCode, SmsCodeTypeEnum.Medical_Card_Bind.getValue());
  131. if (response.getCode() != BaseResponse.SUCCEED) {
  132. throw new AppMessageException(response.getInfo());
  133. }
  134. // 通过枚举类的方法,将文字转换成数字
  135. int relationshipInt = RelationshipEnum.valueOf(relationShip).getValue();
  136. // defaultCardInt: 1-是,0-否
  137. int defaultCardInt = "1".equals(defaultCard) ? 1 : 0;
  138. AddMedicalCardRequest addMedicalCardRequest = AddMedicalCardRequest.newBuilder()
  139. .setUserId(userId)
  140. .setHospitalId(hospitalId)
  141. .setCardNo(cardNum)
  142. .setRealName(patientName)
  143. .setMobile(phoneNo)
  144. .setRelationship(relationshipInt)
  145. .setDefaultCard(defaultCardInt)
  146. .build();
  147. ResultInt resultInt = userServiceBlockingStub.addMedicalCard(addMedicalCardRequest);
  148. if (resultInt.getCode() == ResultCode.SUCCEED) {
  149. int cent = Checker.parseInt(resultInt.getInfo());
  150. double balance = cent / 100d;
  151. resp.setUserId(request.getUserId());
  152. resp.setCardNum(request.getCardNum());
  153. resp.setName(patientName);
  154. resp.setSex(sex);
  155. resp.setBirthDay(birthDay);
  156. resp.setIdCardNo(idNo);
  157. resp.setPhoneNumber(phoneNo);
  158. resp.setBalance(String.format("%.2f", balance));
  159. } else {
  160. throw new AppMessageException(response.getInfo());
  161. }
  162. }
  163. return resp;
  164. }
  165. @Override
  166. public UpdateCardResponseData updateMedicCard(UpdateCardRequest request) throws Exception {
  167. throw new AppMessageException("暂不支持修改诊疗卡功能");
  168. }
  169. @Override
  170. public QuerySingleCardResponseData querySingleMedicCard(QuerySingleCardRequest request) throws Exception {
  171. // 此处传诊疗卡ID和userId
  172. String cardNum = request.getCardNum();
  173. CheckUtil.ensureNotEmpty(cardNum, "诊疗卡号不能为空");
  174. int hospitalId = BizUtil.getCurrentHospitalId();
  175. int userId = ContextHelper.getCurrentUserIdWrapped();
  176. List<MedicalCard> list = getUserMedCardList(userId, hospitalId).stream()
  177. .filter(c -> Checker.getStringValue(c.getCardNo()).equals(cardNum))
  178. .collect(Collectors.toList());
  179. if (list.isEmpty()) return null;
  180. MedicalCard medicalCard = list.get(0);
  181. double balance = medicalCard.getBalance() / 100d;
  182. QuerySingleCardResponseData item = new QuerySingleCardResponseData();
  183. item.setCardNum(medicalCard.getCardNo());//就诊卡卡号/医保卡卡号
  184. item.setType(CARD_TYPE_STR_NORMAL);// 标记查询卡类型
  185. item.setName(medicalCard.getPatientName());//姓名
  186. item.setSex(SexEnum.getSexDisplayName(medicalCard.getSex()));//性别
  187. item.setBirthDay(medicalCard.getBirthday());//生日
  188. item.setIdCardNo(medicalCard.getIdNo());//身份证号码
  189. item.setPhoneNumber(medicalCard.getMobile());//手机号
  190. item.setBalance(balance + "");//卡内余额
  191. item.setRelationShip(RelationshipEnum.valueOf(medicalCard.getRelationship()).getDisplayName()); // 关系
  192. item.setDefaultCard(medicalCard.getIsDefault() ? "是" : "否");// FIXME: 是否是默认就诊卡
  193. item.setId(medicalCard.getCardId());
  194. return item;
  195. }
  196. // 查询用户默认就诊卡,获取用户就诊卡列表,用身份证匹配
  197. @Override
  198. public QueryDefaultCardResponseData queryDefaultMedicCard(QueryDefaultCardRequest request) throws Exception {
  199. int hospitalId = BizUtil.getCurrentHospitalId();
  200. int userId = ContextHelper.getCurrentUserIdWrapped();
  201. // 获取用户身份证
  202. User user = getUserInfoById(userId);
  203. String idNo = Checker.getStringValue(user.getIdno());
  204. MedicalCard medicalCard = getUserMedCardList(userId, hospitalId).stream()
  205. .filter(c -> idNo.equals(c.getIdNo()))
  206. .findFirst()
  207. .orElse(null);
  208. QueryDefaultCardResponseData item = new QueryDefaultCardResponseData();
  209. if (medicalCard == null) return item;
  210. double balance = medicalCard.getBalance() / 100d;
  211. item.setCardNum(medicalCard.getCardNo());//就诊卡卡号/医保卡卡号
  212. item.setType(CARD_TYPE_STR_NORMAL);// 标记查询卡类型,默认普通卡
  213. item.setName(medicalCard.getPatientName());//姓名
  214. item.setSex(SexEnum.getSexDisplayName(medicalCard.getSex()));//性别
  215. item.setBirthDay(medicalCard.getBirthday());//生日
  216. item.setIdCardNo(medicalCard.getIdNo());//身份证号码
  217. item.setPhoneNumber(medicalCard.getMobile());//手机号
  218. item.setBalance(balance + "");//卡内余额
  219. item.setRelationShip(RelationshipEnum.valueOf(medicalCard.getRelationship()).getDisplayName()); // 关系
  220. item.setDefaultCard(medicalCard.getIsDefault() ? "是" : "否");//是否是默认就诊卡
  221. item.setPatientId("");//如果是医保卡,传参保城市
  222. item.setId(medicalCard.getCardId());
  223. item.setHisPatientId(medicalCard.getHisPatientId());
  224. return item;
  225. }
  226. @Override
  227. public PageVO<QueryListCardResponseData> queryListMedicCard(QueryListCardRequest request) throws Exception {
  228. int hospitalId = BizUtil.getCurrentHospitalId();
  229. int userId = ContextHelper.getCurrentUserIdWrapped();
  230. int total;
  231. List<QueryListCardResponseData> lst = new LinkedList<>();
  232. List<MedicalCard> medicalCards = getUserMedCardList(userId, hospitalId);
  233. total = medicalCards.size();
  234. for (MedicalCard medicalCard : medicalCards) {
  235. double balance = medicalCard.getBalance() / 100d;
  236. QueryListCardResponseData item = new QueryListCardResponseData();
  237. item.setCardNum(medicalCard.getCardNo());//就诊卡卡号/医保卡卡号
  238. item.setType(CARD_TYPE_NORMAL);//标记查询卡类型
  239. item.setName(medicalCard.getPatientName());//姓名
  240. item.setSex(SexEnum.getSexDisplayName(medicalCard.getSex()));//性别
  241. item.setBirthDay(medicalCard.getBirthday());//生日
  242. item.setIdCardNo(medicalCard.getIdNo());//身份证号码
  243. item.setPhoneNumber(medicalCard.getMobile());//手机号
  244. item.setBalance(balance + "");//卡内余额
  245. item.setIsDefault(medicalCard.getIsDefault());//是否是默认就诊卡
  246. item.setCity("");//如果是医保卡,传参保城市
  247. item.setCardOrgName("");//如果是医保卡,传发卡机构
  248. lst.add(item);
  249. }
  250. Pagination pagination = new Pagination(1, 1, total);
  251. return new PageVO<>(pagination, lst);
  252. }
  253. @Override
  254. public DeleteCardResponseData deleteMedicCard(DeleteCardRequest request) throws Exception {
  255. int cardId = Checker.parseInt(request.getCardId());
  256. CheckUtil.ensureLargerThanZero(cardId, "诊疗卡 id 不正确");
  257. int userId = ContextHelper.getCurrentUserIdWrapped();
  258. DeleteCardResponseData responseData = new DeleteCardResponseData();
  259. DeleteMedicalCardRequest deleteMedicalCardRequest = DeleteMedicalCardRequest.newBuilder()
  260. .setCardId(cardId)
  261. .setUserId(userId)
  262. .build();
  263. Result result = userServiceBlockingStub.deleteMedicalCard(deleteMedicalCardRequest);
  264. responseData.setIsSuccess(result.getCode() == ResultCode.SUCCEED);
  265. responseData.setInfo(result.getInfo());
  266. return responseData;
  267. }
  268. @Override
  269. public BindMedInsuranceCardResponseData bindMedInsuranceCard(BindMedInsuranceCardRequest request) throws Exception {
  270. BindMedInsuranceCardResponseData resp = new BindMedInsuranceCardResponseData();
  271. String patientName = request.getName();//姓名
  272. String sex = request.getSex();//性别
  273. String birthDay = request.getBirthDay();//生日
  274. String idCardNo = request.getIdCardNo();//身份证号码
  275. String phoneNo = request.getPhoneNumber();//手机号
  276. String cardNum = request.getMedInsuranceNum();//医保卡识别号
  277. int hospitalId = BizUtil.getCurrentHospitalId();
  278. int userId = ContextHelper.getCurrentUserIdWrapped();
  279. if (hospitalId < 1) {
  280. throw new AppMessageException("请选择医院");
  281. }
  282. if (StringHelper.isNullOrWhiteSpace(cardNum)) {
  283. throw new AppMessageException("请填写就诊卡号");
  284. }
  285. if (StringHelper.isNullOrWhiteSpace(patientName)) {
  286. throw new AppMessageException("请填写真实的姓名");
  287. }
  288. if (StringHelper.isNullOrWhiteSpace(phoneNo)) {
  289. throw new AppMessageException("请填写在医院预留的手机号");
  290. }
  291. // 通过枚举类的方法,将文字转换成数字
  292. int relationshipInt = 0;
  293. // defaultCardInt: 1-是,0-否
  294. int defaultCardInt = 0;
  295. AddMedicalCardRequest addMedicalCardRequest = AddMedicalCardRequest.newBuilder()
  296. .setUserId(userId)
  297. .setHospitalId(hospitalId)
  298. .setCardNo(cardNum)
  299. .setRealName(patientName)
  300. .setMobile(phoneNo)
  301. .setRelationship(relationshipInt)
  302. .setDefaultCard(defaultCardInt)
  303. .build();
  304. ResultInt resultInt = userServiceBlockingStub.addMedicalCard(addMedicalCardRequest);
  305. if (resultInt.getCode() == ResultCode.SUCCEED) {
  306. resp.setUserId(request.getUserId());
  307. resp.setCardNum(request.getMedInsuranceNum());
  308. resp.setName(patientName);
  309. resp.setSex(sex);
  310. resp.setBirthDay(birthDay);
  311. resp.setIdCardNo(idCardNo);
  312. resp.setPhoneNumber(phoneNo);
  313. } else {
  314. throw new AppMessageException(resultInt.getInfo());
  315. }
  316. return resp;
  317. }
  318. // 就诊人列表
  319. @Override
  320. public List<QueryPatientListResponse> queryPatientList(QueryPatientListRequest request) throws Exception {
  321. int hospitalId = BizUtil.getCurrentHospitalId();
  322. int userId = ContextHelper.getCurrentUserIdWrapped();
  323. return getUserMedCardList(userId, hospitalId).stream()
  324. .map(c -> {
  325. QueryPatientListResponse r = new QueryPatientListResponse();
  326. List<MedicCard> medicCards = new ArrayList<>();
  327. r.setId(String.valueOf(c.getCardId()));
  328. r.setName(c.getPatientName());
  329. r.setAge(getAgeFromMedicalCard(c));
  330. r.setSex(SexEnum.getSexDisplayName(c.getSex()));
  331. r.setPhoneNumber(BizUtil.masked(c.getMobile()));
  332. r.setBirthDay(c.getBirthday());
  333. r.setIdCardNo(BizUtil.masked(c.getIdNo()));
  334. r.setRelationShip(RelationshipEnum.valueOf(c.getRelationship()).getDisplayName());
  335. r.setDefaultPatient(false); // TODO: 怎么确定默认就诊人
  336. r.setBindCardNum(c.getCardNo());
  337. r.setHisPatientId(c.getHisPatientId());
  338. MedicCard card = new MedicCard();
  339. card.setCardNum(c.getCardNo());
  340. card.setType(CARD_TYPE_NORMAL);
  341. card.setBalance(String.valueOf(c.getBalance() / 100d));
  342. card.setHisPatientId(c.getHisPatientId());
  343. medicCards.add(card);
  344. r.setMedicCards(medicCards);
  345. return r;
  346. })
  347. .collect(Collectors.toList());
  348. }
  349. private String getAgeFromMedicalCard(MedicalCard card) {
  350. int age = -1;
  351. String idNo = card.getIdNo();
  352. String birthday = card.getBirthday();
  353. if (!StringHelper.isNullOrEmpty(idNo)) {
  354. try {
  355. age = IdCardUtil.getCurrentAge(idNo);
  356. } catch (Exception e) {
  357. log.error("IsvMedicCardServiceImpl#getAgeFromMedicalCard(idNo = {}): 无法获取年龄 {}", idNo, e.getMessage(), e);
  358. }
  359. } else if (!StringHelper.isNullOrEmpty(birthday)) {
  360. try {
  361. age = IdCardUtil.getCurrentAgeByBirthday(birthday, IdCardUtil.DATE_PATTERN2);
  362. } catch (Exception e) {
  363. log.error("IsvMedicCardServiceImpl#getAgeFromMedicalCard(birthday = {}): 无法获取年龄 {}", birthday, e.getMessage(), e);
  364. }
  365. }
  366. // 不返回年龄为 "-1"
  367. if (age < 0) {
  368. return "";
  369. }
  370. return String.valueOf(age);
  371. }
  372. @Override
  373. public PatientBindCardResponse bindMedicCard(PatientBindCardRequest request) throws Exception {
  374. return null;
  375. }
  376. // 删除就诊人
  377. @Override
  378. public DeletePatientResponse deletePatient(DeletePatientRequest request) throws Exception {
  379. int cardId = Checker.parseInt(request.getId()); // 诊疗卡 id
  380. CheckUtil.ensureLargerThanZero(cardId, "诊疗卡 id 不正确");
  381. int userId = ContextHelper.getCurrentUserIdWrapped();
  382. DeletePatientResponse responseData = new DeletePatientResponse();
  383. DeleteMedicalCardRequest deleteMedicalCardRequest = DeleteMedicalCardRequest.newBuilder()
  384. .setCardId(cardId)
  385. .setUserId(userId)
  386. .build();
  387. Result result = userServiceBlockingStub.deleteMedicalCard(deleteMedicalCardRequest);
  388. responseData.setIsSuccess(result.getCode() == ResultCode.SUCCEED);
  389. responseData.setInfo(result.getInfo());
  390. return responseData;
  391. }
  392. // 添加就诊人
  393. @Override
  394. public AddPatientResponse addPatient(AddPatientRequest request) throws Exception {
  395. String name = Checker.getStringValue(request.getName());
  396. String idCardType = Checker.getStringValue(request.getIdCardType()); // 目前小程序只支持身份证
  397. String idCardNo = Checker.getStringValue(request.getIdCardNo());
  398. String sex = Checker.getStringValue(request.getSex());
  399. String phoneNumber = Checker.getStringValue(request.getPhoneNumber());
  400. String relationShip = Checker.getStringValue(request.getRelationShip());
  401. int userId = ContextHelper.getCurrentUserIdWrapped();
  402. int hospitalId = BizUtil.getCurrentHospitalId();
  403. boolean isSelf = relationShip.equals(RelationshipEnum.MYSELF.getDisplayName());
  404. if (!isSelf && (StringHelper.isNullOrEmpty(idCardNo) || StringHelper.isNullOrEmpty(name))) {
  405. // 非本人,必须填写身份证和姓名
  406. throw new AppMessageException("添加非本人就诊卡必须填写身份证或姓名");
  407. }
  408. // 根据身份证和姓名从 HIS 获取 hisPatientId
  409. if (isSelf) {
  410. // 添加本人,前端没有传入姓名和身份证,需要查询
  411. User user = getUserInfoById(userId);
  412. if (user == null) throw new AppMessageException("用户状态异常,请联系管理员");
  413. name = Checker.getStringValue(user.getRealname());
  414. idCardNo = Checker.getStringValue(user.getIdno());
  415. phoneNumber = Checker.getStringValue(user.getMobile());
  416. }
  417. GetPatientInfoResponse response = taiheServiceBlockingStub.getPatientInfo(GetPatientInfoRequest.newBuilder()
  418. .setPatientName(name)
  419. .setIdNo(idCardNo)
  420. .setHospitalId(hospitalId)
  421. .build());
  422. if (response.getCode() != ResultCode.SUCCEED_VALUE) throw new AppMessageException(response.getMsg());
  423. String hisPatientId = response.getPatientInfo().getPatientId();
  424. if (StringHelper.isNullOrEmpty(hisPatientId)) throw new AppMessageException("无法从 HIS 获取患者 id");
  425. ResultInt result = userServiceBlockingStub.addTaiheMedicalCard(AddTaiheMedicalCardRequest.newBuilder()
  426. .setHisPatientId(hisPatientId)
  427. .setUserId(userId)
  428. .setHospitalId(hospitalId)
  429. .setIdNo(idCardNo)
  430. .setMobile(phoneNumber)
  431. .setRealName(name)
  432. .setRelationship(RelationshipEnum.getByName(relationShip).getValue())
  433. .build());
  434. if (result.getCode() != ResultCode.SUCCEED) throw new AppMessageException(result.getInfo());
  435. AddPatientResponse r = new AddPatientResponse();
  436. r.setIsSuccess(true);
  437. return r;
  438. }
  439. // 修改就诊人
  440. @Override
  441. public UpdatePatientResponse updatePatient(UpdatePatientRequest request) throws Exception {
  442. int cardId = Checker.parseInt(request.getId()); // 支付宝就诊人 id 对应系统的诊疗卡 id
  443. CheckUtil.ensureLargerThanZero(cardId, "就诊人 id 有误: " + request.getId());
  444. String mobile = Checker.getStringValue(request.getPhoneNumber());
  445. String relationship = Checker.getStringValue(request.getRelationShip());
  446. int relInt = 1;
  447. if (Checker.isNone(request.getRelationShip())){
  448. relInt = 0;
  449. }
  450. Result result = userServiceBlockingStub.updateMedicalCardRequest(UpdateMedicalCardRequest.newBuilder()
  451. .setCardId(cardId)
  452. .setUserId(ContextHelper.getCurrentUserIdWrapped())
  453. .setMobile(mobile)
  454. .setRelationship(relInt == 0 ? 0:RelationshipEnum.getByName(relationship).getValue())
  455. .build());
  456. if (result.getCode() != ResultCode.SUCCEED) throw new AppMessageException(result.getInfo());
  457. UpdatePatientResponse response = new UpdatePatientResponse();
  458. response.setIsSuccess(true);
  459. return response;
  460. }
  461. // 查看就诊人详情
  462. @Override
  463. public QueryPatientDetailResponse querySinglePatient(QueryPatientDetailRequest request) throws Exception {
  464. String id = request.getId(); // 对应 medicalCard 的 id
  465. int userId = ContextHelper.getCurrentUserIdWrapped();
  466. int hospitalId = BizUtil.getCurrentHospitalId();
  467. // 如果不传诊疗卡 id,则查询本人诊疗卡
  468. MedicalCard c;
  469. if (StringHelper.isNullOrEmpty(id)) {
  470. // 获取用户身份证
  471. User user = getUserInfoById(userId);
  472. String idNo = Checker.getStringValue(user.getIdno());
  473. c = getUserMedCardList(userId, hospitalId).stream()
  474. .filter(i -> idNo.equals(i.getIdNo()))
  475. .findFirst()
  476. .orElse(null);
  477. } else {
  478. c = getUserMedCardList(userId, hospitalId).stream()
  479. .filter(i -> i.getCardId() == Checker.parseInt(id))
  480. .findFirst()
  481. .orElse(null);
  482. }
  483. if (c == null) throw new AppMessageException("找不到诊疗卡信息");
  484. QueryPatientDetailResponse r = new QueryPatientDetailResponse();
  485. List<MedicCard> medicCards = new ArrayList<>();
  486. r.setId(String.valueOf(c.getCardId()));
  487. r.setName(BizUtil.masked(c.getPatientName(), 1));
  488. r.setAge(getAgeFromMedicalCard(c));
  489. r.setSex(SexEnum.getSexDisplayName(c.getSex()));
  490. r.setPhoneNumber(BizUtil.masked(c.getMobile()));
  491. r.setBirthDay(c.getBirthday());
  492. r.setIdCardNo(BizUtil.masked(c.getIdNo()));
  493. r.setRelationShip(RelationshipEnum.valueOf(c.getRelationship()).getDisplayName());
  494. r.setBindCardNum(c.getCardNo());
  495. r.setHisPatientId(c.getHisPatientId());
  496. MedicCard card = new MedicCard();
  497. card.setCardNum(c.getCardNo());
  498. card.setType(CARD_TYPE_NORMAL);
  499. card.setBalance(String.valueOf(c.getBalance() / 100d));
  500. medicCards.add(card);
  501. r.setMedicCards(medicCards);
  502. return r;
  503. }
  504. // 查询登录用户就诊卡列表
  505. @Override
  506. public List<MyCardListResponse> myCardList(MyCardListRequest request) throws Exception {
  507. int hospitalId = BizUtil.getCurrentHospitalId();
  508. int userId = ContextHelper.getCurrentUserIdWrapped();
  509. // 获取用户身份证
  510. User user = getUserInfoById(userId);
  511. String idNo = Checker.getStringValue(user.getIdno());
  512. return getUserMedCardList(userId, hospitalId).stream()
  513. .filter(c -> idNo.equals(c.getIdNo()))
  514. .map(c -> {
  515. MyCardListResponse r = new MyCardListResponse();
  516. r.setCardNum(c.getCardNo());
  517. r.setBalance(String.valueOf(c.getBalance() / 100d));
  518. r.setType(CARD_TYPE_NORMAL);
  519. r.setCardId(c.getCardId());
  520. r.setHisPatientId(c.getHisPatientId());
  521. return r;
  522. })
  523. .collect(Collectors.toList());
  524. }
  525. /**
  526. * 根据 userId & hospitalId 获取用户可用就诊卡列表
  527. */
  528. public List<MedicalCard> getUserMedCardList(int userId, int hospitalId) throws AppMessageException {
  529. GetMedicalCardListRequest getMedicalCardListRequest = GetMedicalCardListRequest.newBuilder()
  530. .setHospitalId(hospitalId)
  531. .setUserId(userId)
  532. .build();
  533. GetMedicalCardListResponse getMedicalCardListResponse = userServiceBlockingStub.getMedicalCardList(getMedicalCardListRequest);
  534. Result result = getMedicalCardListResponse.getResult();
  535. if (result.getCode() != ResultCode.SUCCEED) throw new AppMessageException(result.getInfo());
  536. return getMedicalCardListResponse.getMedicalCardsList();
  537. }
  538. /**
  539. * 根据用户 id 获取用户信息
  540. */
  541. public User getUserInfoById(int userId) throws AppMessageException {
  542. UserResponse response = userServiceBlockingStub.findByUserId(UserRequest.newBuilder().setUserid(userId).build());
  543. if (response.getResult().getCode() != ResultCode.SUCCEED)
  544. throw new AppMessageException("无法获取用户信息:" + response.getResult().getInfo());
  545. return response.getUser();
  546. }
  547. }