QualificationManageServiceImpl.java 22 KB

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