QualificationManageServiceImpl.java 20 KB

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