QualificationManageServiceImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. package com.kcim.service.impl;
  2. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  3. import com.kcim.constants.NumberConstant;
  4. import com.kcim.controller.request.QualificationManageAdjustRequest;
  5. import com.kcim.controller.request.QualificationReAuthorizeRequest;
  6. import com.kcim.controller.response.QualificationManage;
  7. import com.kcim.controller.response.QualificationManageForDoctor;
  8. import com.kcim.dao.mapper.QualificationApplyMapper;
  9. import com.kcim.dao.model.*;
  10. import com.kcim.dao.repository.*;
  11. import com.kcim.service.QualificationManageService;
  12. import com.kcim.service.QualificationService;
  13. import com.kcim.util.BaseUtil;
  14. import com.kcim.util.PageUtils;
  15. import lombok.AllArgsConstructor;
  16. import lombok.extern.slf4j.Slf4j;
  17. import lombok.val;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.util.CollectionUtils;
  20. import org.springframework.util.StringUtils;
  21. import java.util.*;
  22. import java.util.stream.Collectors;
  23. @Service("QualificationManageService")
  24. @AllArgsConstructor
  25. @Slf4j
  26. public class QualificationManageServiceImpl extends ServiceImpl<QualificationApplyMapper, QualificationApply> implements QualificationManageService {
  27. QualificationRepository qualificationRepository;
  28. QualificationTypeRepository qualificationTypeRepository;
  29. QualificationApplyRepository qualificationApplyRepository;
  30. QualificationApplyAdjustRepository qualificationApplyAdjustRepository;
  31. UserInfoRepository userInfoRepository;
  32. DepartmentRepository departmentRepository;
  33. DoctorAttachmentRepository doctorAttachmentRepository;
  34. QualificationApplyAdjustRepository applyAdjustRepository;
  35. QualificationService qualificationService;
  36. @Override
  37. public Object listByQualification(String name, String qualificationTypeCode, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer current, Integer pageSize) {
  38. //返回的集合
  39. List<QualificationManage> listReturn = new ArrayList<>();
  40. //资质集合
  41. List<Qualification> qualificationList = qualificationRepository.list();
  42. //资质分类集合
  43. List<QualificationType> qualificationTypeList = qualificationTypeRepository.list();
  44. //人员列表
  45. List<UserInfo> empList = userInfoRepository.list();
  46. Map<Long,UserInfo> empMap = empList.stream().collect(Collectors.toMap(UserInfo::getId, vo -> vo, (a, b) -> b));
  47. //有效的资质授权
  48. List<QualificationApply> list = qualificationApplyRepository.listByQualification();
  49. for(QualificationApply qualificationApply : list){
  50. //医生信息
  51. //qualificationApply.setUserInfo(empMap.get(qualificationApply.getUserId()));
  52. //调整历史-调整人姓名
  53. // for(QualificationApplyAdjust adjust : qualificationApply.getApplyAdjust()){
  54. // adjust.setAdjustUserName(empMap.get(adjust.getUserId()).getName());
  55. // }
  56. //资质字典
  57. Qualification qualification = qualificationList.stream().filter(q -> q.getCode().equals(qualificationApply.getQualificationCode())).findFirst().get();
  58. //资质名称
  59. String qualificationName = qualification.getName();
  60. //资质分类
  61. QualificationType qualificationType = qualificationTypeList.stream().filter(t -> t.getCode().equals(qualification.getQualificationTypeCode())).findFirst().get();
  62. //资质分类编码
  63. String typeCode = qualificationType.getCode();
  64. //资质分类名称
  65. String typeName = qualificationType.getName();
  66. qualification.setQualificationTypeName(typeName);
  67. //名称过滤
  68. if(!StringUtils.isEmpty(name) && !qualificationName.contains(name)){
  69. continue;
  70. }
  71. //分类过滤
  72. if(!qualificationTypeCode.equals("0")){
  73. //List<String> typeCodeList = qualificationServiceImpl.getQualificationTypeCodeRecursion(qualificationTypeList,qualificationTypeCode);
  74. List<String> typeCodeList = qualificationService.getQualificationTypeCodeRecursion(qualificationTypeList,qualificationTypeCode);
  75. if(!typeCodeList.contains(typeCode)){
  76. continue;
  77. }
  78. }
  79. //手术标志过滤
  80. if(operationFlag != null && operationFlag.equals(NumberConstant.ONE) && qualification.getOperationFlag().equals(NumberConstant.ZERO)){
  81. continue;
  82. }
  83. //医疗技术标志过滤
  84. if(techFlag != null && techFlag.equals(NumberConstant.ONE) && qualification.getTechFlag().equals(NumberConstant.ZERO)){
  85. continue;
  86. }
  87. //手术级别过滤
  88. if(!StringUtils.isEmpty(operationLevelCode) && !qualification.getOperationLevelCode().equals(operationLevelCode)){
  89. continue;
  90. }
  91. Optional<QualificationManage> returnItem = listReturn.stream().filter(q -> q.getQualification().getCode().equals(qualificationApply.getQualificationCode())).findFirst();
  92. //添加1项
  93. if(!returnItem.isPresent()) {
  94. QualificationManage newItem = new QualificationManage();
  95. //资质字典
  96. newItem.setQualification(qualification);
  97. //医生列表
  98. // if(qualificationApply.getCurrentStatus().equals("授权中")){
  99. // newItem.setDoctorList(qualificationApply.getUserInfo().getName());
  100. // }
  101. // else{
  102. // newItem.setDoctorList(""); //新建时如果不是授权中状态,则给一个空字符串,避免出现null文本
  103. // }
  104. //申请列表
  105. // List<QualificationApply> applyList = new ArrayList<>();
  106. // applyList.add(qualificationApply);
  107. // newItem.setApplyList(applyList);
  108. listReturn.add(newItem);
  109. }
  110. //更新项
  111. // else{
  112. // //医生列表
  113. // if(qualificationApply.getCurrentStatus().equals("授权中")){
  114. // String newDoctorList = returnItem.get().getDoctorList() + "," + qualificationApply.getUserInfo().getName();
  115. // newDoctorList = StringUtils.trimLeadingCharacter(newDoctorList,','); //去掉最左边的逗号
  116. // returnItem.get().setDoctorList(newDoctorList);
  117. // }
  118. // //申请列表
  119. // returnItem.get().getApplyList().add(qualificationApply);
  120. // }
  121. }
  122. //设置「允许重新授权状态」,已过期的授权,如果没有对应的授权中的人时,才可以重新授权
  123. // for(QualificationManage item : listReturn ){
  124. // for(QualificationApply apply : item.getApplyList()){
  125. // if(apply.getCurrentStatus().equals("已过期")) {
  126. // if(item.getApplyList().stream().filter(a -> a.getCurrentStatus().equals("授权中"))
  127. // .noneMatch(a -> a.getUserId().equals(apply.getUserId()))) {
  128. // apply.setAllowReAuthorize(NumberConstant.ONE);
  129. // }
  130. // }
  131. // }
  132. // }
  133. return new PageUtils(listReturn, Math.toIntExact(listReturn.size()),pageSize,current);
  134. }
  135. @Override
  136. public Object listQualificationApplyByDoctor(String userId){
  137. List<QualificationApply> list = qualificationApplyRepository.listByQualification(null,userId);
  138. return geneQualificationStatus(list);
  139. }
  140. @Override
  141. public Object listQualificationApply(String qualificationCode){
  142. List<QualificationApply> list = qualificationApplyRepository.listByQualification(qualificationCode,null);
  143. return geneQualificationStatus(list);
  144. }
  145. private Object geneQualificationStatus(List<QualificationApply> list) {
  146. //设置「允许重新授权状态」,已过期的授权,如果没有对应的授权中的人时,才可以重新授权
  147. for(QualificationApply apply : list){
  148. if(apply.getCurrentStatus().equals("已过期")) {
  149. if(list.stream().filter(a -> a.getCurrentStatus().equals("授权中"))
  150. .noneMatch(a -> a.getUserId().equals(apply.getUserId()))) {
  151. apply.setAllowReAuthorize(NumberConstant.ONE);
  152. }
  153. }
  154. }
  155. return list;
  156. }
  157. @Override
  158. public Object listByDoctor(String deptCode, String userName, Integer current, Integer pageSize) {
  159. //返回的集合
  160. List<QualificationManageForDoctor> listReturn = new ArrayList<>();
  161. //资质集合
  162. List<Qualification> qualificationList = qualificationRepository.list();
  163. //有效的资质授权
  164. List<QualificationApply> list = qualificationApplyRepository.listByQualification();
  165. //过滤的科室代码和其下级代码组成的列表
  166. List<String> listDept = getDepartmentCodeRecursion(departmentRepository.list(),deptCode);
  167. //人员列表
  168. List<UserInfo> empList = userInfoRepository.list();
  169. Map<Long,UserInfo> empMap = empList.stream().collect(Collectors.toMap(UserInfo::getId, vo -> vo, (a, b) -> b));
  170. for(QualificationApply qualificationApply : list){
  171. //资质字典
  172. Qualification qualification = qualificationList.stream().filter(q -> q.getCode().equals(qualificationApply.getQualificationCode())).findFirst().get();
  173. //资质名称
  174. String qualificationName = qualification.getName();
  175. //科室过滤
  176. if(!StringUtils.isEmpty(deptCode) && !listDept.contains(qualificationApply.getUserInfo().getDeptCode())){
  177. continue;
  178. }
  179. //姓名过滤
  180. if(!StringUtils.isEmpty(userName) && !qualificationApply.getUserInfo().getName().contains(userName)){
  181. continue;
  182. }
  183. if(!CollectionUtils.isEmpty(qualificationApply.getApplyAdjust())){
  184. //调整历史-调整人姓名
  185. for(QualificationApplyAdjust adjust : qualificationApply.getApplyAdjust()){
  186. adjust.setAdjustUserName(empMap.get(adjust.getUserId()).getName());
  187. }
  188. }
  189. Optional<QualificationManageForDoctor> returnItem = listReturn.stream().filter(q -> q.getUserInfo().getId().equals(qualificationApply.getUserId())).findFirst();
  190. //添加1项
  191. if(!returnItem.isPresent()) {
  192. QualificationManageForDoctor newItem = new QualificationManageForDoctor();
  193. //医生信息
  194. newItem.setUserInfo(userInfoRepository.getUserInfoById(qualificationApply.getUserId()));
  195. //资质名称列表
  196. if(qualificationApply.getCurrentStatus().equals("授权中")){
  197. newItem.setQualificationList(qualificationName);
  198. }
  199. else{
  200. newItem.setQualificationList(""); //新建时如果不是授权中状态,则给一个空字符串,避免出现null文本
  201. }
  202. //申请列表
  203. List<QualificationApply> applyList = new ArrayList<>();
  204. applyList.add(qualificationApply);
  205. newItem.setApplyList(applyList);
  206. listReturn.add(newItem);
  207. }
  208. //更新项
  209. else{
  210. //资质名称列表
  211. if(qualificationApply.getCurrentStatus().equals("授权中")){
  212. String newQualificationList = returnItem.get().getQualificationList() + "," + qualificationName;
  213. newQualificationList = StringUtils.trimLeadingCharacter(newQualificationList,','); //去掉最左边的逗号
  214. returnItem.get().setQualificationList(newQualificationList);
  215. }
  216. //申请列表
  217. returnItem.get().getApplyList().add(qualificationApply);
  218. }
  219. }
  220. //设置「允许重新授权状态」,已过期的授权,如果没有对应的授权中的授权时,才可以重新授权
  221. for(QualificationManageForDoctor item : listReturn ){
  222. for(QualificationApply apply : item.getApplyList()){
  223. if(apply.getCurrentStatus().equals("已过期")) {
  224. if(item.getApplyList().stream().filter(a -> a.getCurrentStatus().equals("授权中"))
  225. .noneMatch(a -> a.getQualificationInfo().getCode().equals(apply.getQualificationInfo().getCode()))) {
  226. apply.setAllowReAuthorize(NumberConstant.ONE);
  227. }
  228. }
  229. }
  230. }
  231. return new PageUtils(listReturn, Math.toIntExact(listReturn.size()),pageSize,current);
  232. }
  233. /**
  234. * 递归获取的科室编码的下级编码列表
  235. */
  236. public List<String> getDepartmentCodeRecursion(List<Department> deptList,String deptCode){
  237. List<String> list = new ArrayList<>();
  238. //父节点为传入节点的节点数
  239. long count = deptList.stream().filter(t -> t.getParentCode().equals(deptCode)).count();
  240. //传入的是根节点
  241. if(count == 0){
  242. list.add(deptCode);
  243. return list;
  244. }
  245. //传入的不是根节点
  246. for(Department dept : deptList){
  247. //传入节点的直接下级
  248. if(dept.getParentCode().equals(deptCode)){
  249. long childCount = deptList.stream().filter(t -> t.getParentCode().equals(dept.getCode())).count();
  250. //是末级节点
  251. if(childCount == 0 && !list.contains(dept.getCode())){
  252. list.add(dept.getCode());
  253. }
  254. //递归
  255. else{
  256. list.addAll(getDepartmentCodeRecursion(deptList,dept.getCode()));
  257. }
  258. }
  259. }
  260. return list;
  261. }
  262. @Override
  263. public void adjust(QualificationManageAdjustRequest request) {
  264. QualificationApply apply = qualificationApplyRepository.getById(request.getQualificationApplyId());
  265. //更新调整记录
  266. QualificationApplyAdjust adjust = new QualificationApplyAdjust();
  267. adjust.setQualificationApplyId(request.getQualificationApplyId());
  268. adjust.setUserId(BaseUtil.getCurrentUser().getId());
  269. adjust.setQualificationPeriodBefore(apply.getQualificationPeriod());
  270. adjust.setQualificationPeriodAfter(request.getQualificationPeriod());
  271. adjust.setBeginDateBefore(apply.getBeginDate());
  272. adjust.setBeginDateAfter(request.getBeginDate());
  273. adjust.setEndDateBefore(apply.getEndDate());
  274. adjust.setEndDateAfter(request.getEndDate());
  275. adjust.setMemo(request.getMemo());
  276. adjust.setCreateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
  277. adjust.setCreateTime(new Date());
  278. adjust.setHospId(BaseUtil.getCurrentLoginHospId());
  279. qualificationApplyAdjustRepository.save(adjust);
  280. //更新资质申请
  281. apply.setQualificationPeriod(request.getQualificationPeriod());
  282. apply.setBeginDate(request.getBeginDate());
  283. apply.setEndDate(request.getEndDate());
  284. apply.setUpdateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
  285. apply.setUpdateTime(new Date());
  286. qualificationApplyRepository.updateById(apply);
  287. }
  288. @Override
  289. public void adjustBatch(List<QualificationManageAdjustRequest> request) {
  290. for(QualificationManageAdjustRequest r : request) {
  291. adjust(r);
  292. }
  293. }
  294. @Override
  295. public void reAuthorize(QualificationReAuthorizeRequest request) {
  296. //取原来的申请
  297. QualificationApply apply = qualificationApplyRepository.getById(request.getQualificationApplyId());
  298. //拷贝原来的属性
  299. QualificationApply newApply = new QualificationApply();
  300. newApply.setQualificationCode(apply.getQualificationCode());
  301. newApply.setUserId(apply.getUserId());
  302. //新授权属性
  303. newApply.setQualificationPeriod(request.getQualificationPeriod());
  304. newApply.setBeginDate(request.getBeginDate());
  305. newApply.setEndDate(request.getEndDate());
  306. newApply.setManagerOpinion(request.getMemo());
  307. newApply.setApplyDate(new Date());
  308. newApply.setApplyStatus(NumberConstant.FIVE);
  309. newApply.setCreateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
  310. newApply.setCreateTime(new Date());
  311. newApply.setHospId(BaseUtil.getCurrentLoginHospId());
  312. qualificationApplyRepository.save(newApply);
  313. }
  314. @Override
  315. public Object listAllDoctor(String queryCondition) {
  316. return userInfoRepository.listAllDoctor(queryCondition);
  317. }
  318. @Override
  319. public Object listAvailableQualification(String queryCondition, Date expireDate, Integer current, Integer pageSize) {
  320. return qualificationApplyRepository.listAvailableQualification(queryCondition,expireDate, current, pageSize);
  321. }
  322. @Override
  323. public Object getMyInfo() {
  324. UserInfo myInfo = userInfoRepository.getCurrentUserInfo();
  325. myInfo.setAttachments(doctorAttachmentRepository.listByUserId(BaseUtil.getCurrentUser().getId()));
  326. return myInfo;
  327. }
  328. @Override
  329. public Object listAllDepartment(String queryCondition) {
  330. //返回的集合
  331. List<Department> listReturn = new ArrayList<>();
  332. //先把所有科室都查询出来
  333. List<Department> listAll = departmentRepository.list();
  334. //需要检索
  335. if(!StringUtils.isEmpty(queryCondition)) {
  336. //生成检索字段的值
  337. for(Department department : listAll) {
  338. department.setFilter(getChildDepartmentFilter(department.getCode(),department.getName(),listAll));
  339. }
  340. //过滤得到子集
  341. List<Department> list = listAll.stream().filter(d -> d.getFilter().contains(queryCondition)).collect(Collectors.toList());
  342. //查无结果
  343. if((long) list.size() == 0){
  344. return listReturn;
  345. }
  346. //把子集填到返回放列表里
  347. //先添加根节点,因为根节点是必须有的
  348. Optional<Department> rootNode = list.stream().filter(d -> d.getCode().equals("0")).findFirst();
  349. if(rootNode.isPresent()){
  350. rootNode.get().setChildren(getChildrenDepartment("0",list));
  351. listReturn.add(rootNode.get());
  352. }
  353. }
  354. //不需要检索
  355. else{
  356. //先添加根节点,因为根节点是必须有的
  357. Optional<Department> rooNode = listAll.stream().filter(d -> d.getCode().equals("0")).findFirst();
  358. if(rooNode.isPresent()){
  359. rooNode.get().setChildren((getChildrenDepartment("0",listAll)));
  360. listReturn.add(rooNode.get());
  361. }
  362. }
  363. return listReturn;
  364. }
  365. @Override
  366. public Object listMyAvailableQualification(String qualificationName, String operationLevelCode, Integer techFlag, Integer operationFlag, Integer current, Integer pageSize) {
  367. return qualificationApplyRepository.listMyAvailableQualification(qualificationName, operationLevelCode, techFlag, operationFlag, current, pageSize);
  368. }
  369. @Override
  370. public Object getMyQualificationHistory(String qualificationCode) {
  371. return qualificationApplyRepository.getMyQualificationHistory(qualificationCode);
  372. }
  373. @Override
  374. public Object saveDoctorAttachment(DoctorAttachment doctorAttachments) {
  375. doctorAttachments.setHospId(BaseUtil.getCurrentLoginHospId());
  376. doctorAttachments.setCreateTime(new Date());
  377. doctorAttachments.setCreateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
  378. return doctorAttachmentRepository.save(doctorAttachments);
  379. }
  380. @Override
  381. public Object editDoctorAttachment(DoctorAttachment doctorAttachments) {
  382. doctorAttachments.setUpdateTime(new Date());
  383. doctorAttachments.setUpdateUser(String.valueOf(BaseUtil.getCurrentUser().getId()));
  384. return doctorAttachmentRepository.updateById(doctorAttachments);
  385. }
  386. @Override
  387. public Object deleteDoctorAttachment(Integer id){
  388. return doctorAttachmentRepository.removeById(id);
  389. }
  390. private String getChildDepartmentFilter(String code,String name,List<Department> list) {
  391. val filter = new StringBuilder();
  392. //先把自己的内容加上
  393. filter.append(code).append(",").append(name).append(",");
  394. //遍历所有项
  395. for(Department department : list) {
  396. //是传入code的直接子节点
  397. if(department.getParentCode().equals(code)) {
  398. //把当前节点的code和name拼到过滤串中
  399. filter.append(department.getCode()).append(",").append(department.getName()).append(",");
  400. //当前节点的子节点数量
  401. long childCount = list.stream().filter(d -> d.getParentCode().equals(department.getCode())).count();
  402. //不是末级节点,则递归
  403. if(childCount > 0){
  404. filter.append(getChildDepartmentFilter(department.getCode(),department.getName(),list)).append(",");
  405. }
  406. }
  407. }
  408. return filter.toString();
  409. }
  410. private List<Department> getChildrenDepartment(String code,List<Department> list){
  411. List<Department> listReturn = new ArrayList<>();
  412. for (Department department : list) {
  413. //如果传入的code是直接下级节点
  414. if(department.getParentCode().equals(code)) {
  415. //当前节点的子节点数量
  416. long childCount = list.stream().filter(d -> d.getParentCode().equals(department.getCode())).count();
  417. //不是末级节点,则递归
  418. if(childCount > 0) {
  419. department.setChildren(getChildrenDepartment(department.getCode(),list));
  420. }
  421. listReturn.add(department);
  422. }
  423. }
  424. return listReturn;
  425. }
  426. }